<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:admin="http://webns.net/mvcb/" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:atom="http://www.w3.org/2005/Atom">

    <channel>
        <title>Sencha Blog</title>
        <link>http://www.sencha.com/blog/</link>
        <description>
            Technical articles, company news, and customer spotlights from Sencha.
        </description>
        <dc:language>en-us</dc:language>
        <dc:creator>tommy@extjs.com</dc:creator>
        <dc:rights>Copyright 2012</dc:rights>
        <dc:date>2012-05-21T16:22:31+00:00</dc:date>
        <admin:generatorAgent rdf:resource="http://expressionengine.com/" />
        <atom:link href="http://www.sencha.com/blog/" rel="self" type="application/rss+xml" />

        
        <item>
        <title>Architecting your app with Sencha Touch 2 MVC, Part 4</title>
        <author>Tommy Maintz</author>
        <description>
            In the previous series of articles Part 1, Part 2, and Part 3, we explored architecting a Pandora&#45;style application using the new features of Ext JS 4. We started by applying the Model&#45;View&#45;Controller architecture to a complex UI that has multiple views, stores and models. We looked at the basic techniques of architecting your application, like controlling your views from Controllers and firing application&#45;wide events that controllers can listen to. We also discussed how to get references to views, controllers, models and the application itself. Lastly, we implemented several controllers to get a feel for how to implement basic application logic.

In Sencha Touch 2, we introduced the newest iteration of our MVC architecture. Based on the same concepts found in the Ext JS 4 and Sencha Touch 1 MVC package, we have simplified existing features like control and reference syntaxes, and introduced new functionality like routes and history support.

In this article, we will take the existing code we have created and upgrade it to use Sencha Touch 2 and the updated application architecture. We will discuss some of the differences in syntax and talk about some of the new concepts to consider. At the end of this article, you should be better prepared to go into your existing Sencha Touch 1 app and upgrade it to Sencha Touch 2, provided it is architected based on the principles discussed in the previous articles.
        </description>
        <link>http://www.sencha.com/blog/architecting-your-app-with-sencha-touch-2-mvc/</link>
        <content:encoded>
            <![CDATA[
                <p>In the previous series of articles Part 1, Part 2, and Part 3, we explored architecting a Pandora-style application using the new features of Ext JS 4. We started by applying the Model-View-Controller architecture to a complex UI that has multiple views, stores and models. We looked at the basic techniques of architecting your application, like controlling your views from Controllers and firing application-wide events that controllers can listen to. We also discussed how to get references to views, controllers, models and the application itself. Lastly, we implemented several controllers to get a feel for how to implement basic application logic.</p>

<p>In Sencha Touch 2, we introduced the newest iteration of our MVC architecture. Based on the same concepts found in the Ext JS 4 and Sencha Touch 1 MVC package, we have simplified existing features like control and reference syntaxes and introduced new functionality like routes and history support.</p>

<p>In this article, we will take the existing code we have created and upgrade it to use Sencha Touch 2 and the updated application architecture. We will discuss some of the differences in syntax and talk about some of the new concepts to consider. At the end of this article, you should be better prepared to go into your existing app Sencha Touch 1 app and upgrade it to Sencha Touch 2, provided it is architected based on the principles discussed in the previous articles.</p>

<h2>Ext.application</h2>

<p>Initializing your application has remained much the same compared to Ext JS 4. Controllers, views and models are included the same way, and you continue to define the launch and init methods. For a detailed overview of the capabilities in the new application object, I suggest you read the following http://docs.sencha.com/touch/2-0/#!/guide/apps_intro guide. We used used autoCreateViewport in our app which has been deprecated. You are now expected to instantiate your main view. The following code shows how we instantiate our Main view in the launch method.</p>

<p><em>/app/app.js</em></p>

<pre><code>Ext.application(&#123;
    name: 'Pandora',

    views: ['Main'],
    models: ['Station', 'Song'],
    stores: ['Stations', 'RecentSongs', 'SearchResults'],
    controllers: ['Station', 'Song'],

    launch: function() &#123;
        Ext.create('Pandora.view.Main');
    &#125;
&#125;);
</code></pre>

<h2>The config object</h2>

<p>In Sencha Touch 2, we are fully relying on the class system&#8217;s config system. This not only has several benefits to the frameworks code base but also for your application code. It makes your views, controllers and models more consistent and predictable. I recommend reading the http://docs.sencha.com/touch/2-0/#!/guide/class_system guide, as it thoroughly explains the capabilities of the class system, including the configuration system.</p>

<h2>Views</h2>

<p>So let&#8217;s start by converting our Main view to the new config system.</p>

<p><em>app/view/Main.js</em></p>

<pre><code>Ext.define('Pandora.view.Main', &#123;
    extend: 'Ext.Container',

    requires: [
        'Pandora.view.NewStation',
        'Pandora.view.SongControls',
        'Pandora.view.StationsList',
        'Pandora.view.RecentlyPlayedScroller',
        'Pandora.view.SongInfo'
    ],

    config: &#123;
        fullscreen: true,
        layout: &#123;
            type: 'hbox',
            align: 'stretch'
        &#125;,
        items: [&#123;
            docked: 'top',
            xtype: 'toolbar',
            height: 80,
            items: [&#123;
                xtype: 'newstation',
                width: 150
            &#125;, &#123;
                xtype: 'songcontrols',
                flex: 1
            &#125;, &#123;
                xtype: 'component',
                html: 'Pandora&lt;br&gt;Internet Radio'
            &#125;]
        &#125;, &#123;
            width: 250,
            xtype: 'panel',
            id: 'west-region',
            layout: &#123;
                type: 'vbox',
                align: 'stretch'
            &#125;,
            items: [&#123;
                xtype: 'stationslist',
                flex: 1
            &#125;, &#123;
                html: 'Ad',
                height: 250,
                xtype: 'panel'
            &#125;]
        &#125;, &#123;
            xtype: 'container',
            flex: 1,
            layout: &#123;
                type: 'vbox',
                align: 'stretch'
            &#125;,
            items: [&#123;
                xtype: 'recentlyplayedscroller',
                height: 250
            &#125;, &#123;
                xtype: 'songinfo',
                flex: 1
            &#125;]
        &#125;]
    &#125;
&#125;);
</code></pre>

<p>The first thing to note is that we are extending Ext.Container instead of Ext.Viewport. In Sencha Touch 2, there is always a Viewport instantiated. It takes up the full screen by default and uses the card layout. By defining the <strong><em>fullscreen</em></strong> property on a component, it will automatically be added to this Viewport.</p>

<p>We also see that we have defined all of our item configurations inline in the config block. In Ext JS, we have always required that you define any complex configurations (Objects and Functions) inside the <strong><em>initComponent</em></strong> method. This was required because we needed a unique copy of these complex objects in each prototype. However, the class system in Sencha Touch 2 will deeply merge the config block when you create a subclass. This allows the View files to become cleaner and easier to understand.</p>

<p>Since our current app was written for Ext JS, and Sencha Touch has some minor differences in item configurations, it is also useful to note that <strong><em>dockedItems</em></strong> has been deprecated and you are able to just define docked items inside the <strong><em>items</em></strong> collection. The <strong><em>docked</em></strong> configuration will allow you to dock any item to any side of the container.</p>

<p>I won&#8217;t go into the details of each View definition in this article, but you can browse through the attached source code to see the changes I had to make to convert the Views from Ext JS to Sencha Touch 2.</p>

<h2>Stores and Models</h2>

<p>Even though the data package has been updated to use the configuration system, and in the process has been entirely refactored and cleaned up, the API has stayed identical to Sencha Touch 1 and Ext JS 4. This means that in order to update our Stores and Models, we only have to worry about moving all the configurations into the config blocks. Here are the Station model and the Stations store after making these changes.</p>

<p><strong><em>app/model/Station.js</em></strong></p>

<pre><code>Ext.define('Pandora.model.Station', &#123;
    extend: 'Ext.data.Model',

    config: &#123;
        fields: ['id', 'name'],

        proxy: &#123;
            type: 'ajax',
            url: 'data/stations.json',
            reader: &#123;
                type: 'json',
                rootProperty: 'results'
            &#125;
        &#125;
    &#125;
&#125;);
</code></pre>

<p><strong><em>app/store/Stations.js</em></strong></p>

<pre><code>Ext.define('Pandora.store.Stations', &#123;
    extend: 'Ext.data.Store',
    requires: 'Pandora.model.Station',

    config: &#123;
        model: 'Pandora.model.Station'
    &#125;
&#125;);
</code></pre>

<h2>Controllers</h2>

<p>So far we have looked at Views, Stores and Models. Although there are minor differences in these elements between Ext JS 4 and Sencha Touch 2, most of the new functionality and syntax has been introduced in the Controllers. Let&#8217;s start by converting one of our existing controllers to the new syntax and discuss the changes.</p>

<pre><code>    Ext.define('Pandora.controller.Station', &#123;
        extend: 'Ext.app.Controller',

        config: &#123;
            stores: ['Stations', 'SearchResults'],

            refs: &#123;
                stationsList: 'stationslist',
                newStationSelect: 'newstation'
            &#125;,

            control: &#123;
                stationsList: &#123;
                    select: 'onStationSelect'
                &#125;,
                newStationSelect: &#123;
                    change: 'onNewStationSelect'
                &#125;
            &#125;
        &#125;,

        launch: function() &#123;
            console.log(this);
            debugger;
            var stationsStore = Ext.getStore('Stations');
            stationsStore.on(&#123;
                load: 'onStationsLoad',
                scope: this
            &#125;);
            stationsStore.load();
        &#125;,

        onStationsLoad: function() &#123;
            var stationsList = this.getStationsList();
            stationsList.select(0);
        &#125;,

        onStationSelect: function(list, record) &#123;
            // Fire an application wide event
            this.getApplication().fireEvent('stationstart', record);
        &#125;,

        onNewStationSelect: function(field) &#123;
            var station = field.getRecord(),
                store = Ext.getStore('Stations'),
                list = this.getStationsList();

            if (station &amp;&amp; !store.getById(station.getId())) &#123;
               store.add(station);
            &#125;
            list.select(station);
        &#125;
    &#125;);
</code></pre>

<p><strong><em>References</em></strong></p>

<p>As you can see, the syntax for references has slightly changed. The old refs block looked like the following.</p>

<pre><code>refs: [&#123;
    ref: 'stationsList',
    selector: 'stationslist'
&#125;]
</code></pre>

<p>The <strong><em>refs</em></strong> value has changed from being an array to being an object. Each key in the object represents the name of the references and the value is the ComponentQuery. In the previous articles, we also explained how you can leverage <strong><em>autoCreate</em></strong> and <strong><em>forceCreate</em></strong> to automatically create instances of the components you are selecting if they don&#8217;t exist on the page yet. In the new syntax, you could achieve that by doing the following.</p>

<pre><code>refs: &#123;
    stationsList: &#123;
        selector: 'stationslist',
        autoCreate: true
    &#125;
&#125;
</code></pre>

<p>The value here becomes a configuration object where the selector is your ComponentQuery.</p>

<p><strong><em>Controlling views</em></strong></p>

<p>Another thing to note is the new control config. Instead of defining your view control listeners inside the init method like we did previously, we now define these listeners directly as part of the controller configuration. Let&#8217;s have a look at the old &#123;Sencha Touch 1?&#125; control code.</p>

<pre><code>init: function() &#123;
    this.control(&#123;
        'stationslist': &#123;
            selectionchange: this.onStationSelect
        &#125;,
        'newstation': &#123;
            select: this.onNewStationSelect
        &#125;
    &#125;);
&#125;
</code></pre>

<p>It&#8217;s possible for this logic to be moved into the controller configuration because the listener functions can now be simply referenced as strings. The keys in the control object can still be strings, in which case we assume they are component queries. We did however add the capability to use the reference that you have set up in the <strong><em>refs</em></strong> block. We did this because we saw that people had to write out the same component query most of the time both for setting up a reference and actually controlling an event for the same view referenced.</p>

<p><strong><em>Getters</em></strong></p>

<p>In the Ext JS 4 controller class, we automatically generated getters for any stores, models and controllers defined in the controller&#8217;s configuration. However, we have found that generating these getters can be quite expensive at the start of the application, so we have deprecated this automatic generation for Store, Model and Controller getters. We still generate the getters for all of the defined references in the <strong><em>refs</em></strong> configuration. To get a reference to a store, you should use the <strong><em>Ext.getStore()</em></strong> method. Models can be referenced by just using the class name. For example, to call a static method on the Station model we could just use <strong><em>Pandora.model.Station.someStaticMethod()</em></strong>. A controller can be retrieved by calling <strong><em>this.getController()</em></strong>.</p>

<p>Also, instead of referencing the application instance by using <strong><em>this.application</em></strong>, you should now use the getter <strong><em>this.getApplication()</em></strong>. This is useful when binding to or firing application-wide events.</p>

<h2>Summary</h2>

<p>In this part of the series, we looked at the differences between Ext JS 4 and the new Sencha Touch 2 application framework. We&#8217;ve reviewed some slight differences in syntax, some deprecated functionality, as well as new functionality in Views and Controllers.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Mon, 21 May 2012 16:22 GMT</pubDate>
        <guid>http://www.sencha.com/blog/architecting-your-app-with-sencha-touch-2-mvc/#date:16:22</guid>
        </item>
        
        <item>
        <title>Deft JS: Loosely Coupled MVC through Dependency Injection</title>
        <author>John Yanarella</author>
        <description>
            That application you just deployed? As experienced software developers, we all know it won’t be long before you’re going to need make to significant UI changes. Regardless of the amount of painstaking forethought, consensus gathering and planning backing it, no software design ever survives first contact with its users unscathed. To deliver truly effective software, we have to be prepared to adapt to an evolving understating of our users’ needs.
        </description>
        <link>http://www.sencha.com/blog/deftjs-loosely-coupled-mvc-through-dependency-injection/</link>
        <content:encoded>
            <![CDATA[
                <figure class="aligncenter" style="position:relative;">
    <img src="http://cdn.sencha.io/img/20120424-deftjs-logo.png" alt="DeftJS" width="500" width="height">
</figure>
<p>
That application you just deployed? As experienced software developers, we all know it won’t be long before you’re going to need make to significant UI changes. Regardless of the amount of painstaking forethought, consensus gathering and planning backing it, no software design ever survives first contact with its users unscathed. To deliver truly effective software, we have to be prepared to adapt to an evolving understating of our users’ needs.</p>

<p>So… how do we architect our software, so we can rapidly implement UI changes without breaking the underlying business logic?</p>

<h3>Model View Controller (MVC)</h3>

<p>It starts by applying structure to our code, separating it into manageable units where each is responsible for a specific application concern. To this end, most software applications employ the Model View Controller architectural pattern. There are a wide variety of implementations of this pattern; software development pundit Martin Fowler has catalogued many of those variations <a href="http://martinfowler.com/eaaDev/uiArchs.html">here</a>.</p>

<p>Typically, with an MVC architecture, the:</p>
<ul>
    <li>Model describes and manages application domain data behaviors and state, and responds to requests to retrieve or persist changes to that state.</li>
    <li>View presents model data to the user, accepts user input, and announces high-level user gestures such as clicks or selection changes.</li>
     <li>Controller mediates between the model and view, listening for user gestures to initiate actions on the Model, and instructing the View to reflect Model changes.</li>
</ul>

<p>By separating the user interface components and layout (the View) from the logic that observes corresponding user gestures (the Controller) ands triggers business logic or changes to application domain data (the Model), your application is better positioned to adapt to inevitable changes.</p>

<h3>Deft JS MVC</h3>
<p>Deft JS enhances the Model View Controller (MVC) within Sencha Frameworks, where the:</p>
<ul>
    <li>Model is expressed using ‘faceless’ business logic components, such as Ext.data.Store and Ext.data.Model.</li>
    <li>View is realized using any of the rich suite of Ext JS or Sencha Touch containers and components.</li>
    <li>Controller is implemented by creating view-specific controllers that extend the Deft.mvc.ViewController class.</li>
</ul>

<h3>Deft JS View Controllers</h3>
<p>Consider a view to be a composition of multiple components in a container. A View Controller is a lightweight controller responsible for managing the state of a specific view and its child components, listening for events dispatched by the view and its child components in response to user gestures, and delegating work to injected business models and services (such as <tt>Ext.data.Stores</tt>, <tt>Ext.data.Models</tt>, etc.).</p>

<p>With Deft JS, a view is typically a subclass of an Ext JS container class, populated with component items. The view is configured to use the Deft.mixin.Controllable mix-in, and annotated with the class name of the associated View Controller. For each view, you would create a corresponding View Controller class that extends Deft.mvc.ViewController. This view-specific view controller would be configured to reference relevant view components and register view controller methods to handle view component events.</p>

<p>The Deft JS View Controller and Controllable mix-in:</p>
<ul>
    <li>Provide class annotation driven association between a given view and its view controller</li>
    <li>Clarify the role of controller classes – i.e. controlling a specific view</li>
    <li>Support multiple independent instances of a given view, each with its own unique view controller instance</li>
    <li>Reduce memory usage by automatically creating and destroying view controllers in tandem with their associated views</li>
    <li>Offer concise configuration for referencing view components and registering event listeners with view controller methods</li>
    <li>Integrate with the view destruction lifecycle to allow the view controller to potentially cancel removal and destruction</li>
    <li>Simplify cleanup by automatically removing view and view component references and event listeners</li>
</ul>

<h3>Deft JS Dependency Injection</h3>

<p>Most model, view and controller objects are not self-contained; they reference and delegate some of their work to other objects; these objects are referred to as dependencies. Typically, you might explicitly create instances of these dependencies or manually request them from a service locator.</p> 

<p>To encourage loose coupling between application components, Deft JS includes a lightweight Inversion of Control (IoC) container for dependency injection. When applying the principal of Inversion of Control, you annotate your class with a list of its dependencies instead of manually creating or obtaining them. When your class is later instantiated, the IoC container is then responsible for resolving those dependencies with the correct object instances, injecting those values into your class at runtime.</p>

<p>With IoC, your class is no longer responsible for creating its dependencies or knowing where its dependencies are defined. Further, it is no longer bound to a specific implementation of a dependency. Provided it offers the expected API, you can configure the IoC container to inject a totally different implementation.</p>

<p>Consequently, you can easily test your classes in isolation by configuring the IoC container with mock versions of any dependencies. You can also create multiple variants of your application, where the IoC container in each is configured to use different implementations of shared dependencies such as Stores or Proxies; one might be configured to use mock Stores and Proxies driven by static JSON files, and another configured to use Stores and Proxies that access production services via JSONP.</p>

<p>The Deft JS IoC Container and Injectable mix-in:</p>
<ul>
    <li>Provide class annotation driven dependency injection</li>
    <li>Map dependencies by user-defined identifiers</li>
    <li>Resolve dependencies by class instance, factory function or value</li>
    <li>Support singleton and prototype resolution of class instance and factory function dependencies</li>
    <li>Offer eager and lazy instantiation of dependencies</li>
    <li>Inject dependencies into Ext JS class configurations and properties before the class constructor is executed</li>
</ul>

<h3>Example</h3>
<p>Imagine a view within a Contact Manager application containing a grid of contacts:</p>
<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">Ext.<span class="me1">define</span><span class="br0">&#40;</span> <span class="st0">'ContactsApp.view.ContactGridView'</span><span class="sy0">,</span>
    extend<span class="sy0">:</span> <span class="st0">'Ext.container.Container'</span><span class="sy0">,</span>
    mixins<span class="sy0">:</span> <span class="br0">&#91;</span> <span class="st0">'Deft.mixin.Controllable'</span><span class="sy0">,</span> <span class="st0">'Deft.mixin.Injectable'</span> <span class="br0">&#93;</span><span class="sy0">,</span>
    inject<span class="sy0">:</span> <span class="br0">&#91;</span> <span class="st0">'contactStore'</span> <span class="br0">&#93;</span><span class="sy0">,</span>
    controller<span class="sy0">:</span> <span class="st0">'ContactsApp.controller.ContactGridViewController'</span><span class="sy0">,</span>
&nbsp;
    config<span class="sy0">:</span> <span class="br0">&#123;</span>
        contactStore<span class="sy0">:</span> <span class="kw2">null</span>
    <span class="br0">&#125;</span><span class="sy0">,</span>
    ...
    <span class="me1">initComponent</span><span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">this</span>.<span class="me1">items</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#123;</span>
            itemId<span class="sy0">:</span> <span class="st0">'contactsGrid'</span><span class="sy0">,</span>
            xtype<span class="sy0">:</span> <span class="st0">'gridpanel'</span><span class="sy0">,</span>
            store<span class="sy0">:</span> <span class="kw1">this</span>.<span class="me1">getContactStore</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>
            ...<span class="sy0">,</span>
            bbar<span class="sy0">:</span> Ext.<span class="me1">create</span><span class="br0">&#40;</span> <span class="st0">'Ext.PagingToolbar'</span><span class="sy0">,</span> <span class="br0">&#123;</span>
                store<span class="sy0">:</span> <span class="kw1">this</span>.<span class="me1">getContactStore</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>
                ...
            <span class="br0">&#125;</span><span class="br0">&#41;</span>
        <span class="br0">&#125;</span><span class="sy0">,</span>
        ...
        <span class="br0">&#123;</span>
            xtype<span class="sy0">:</span> <span class="st0">'container'</span><span class="sy0">,</span>
            ...
            <span class="me1">items</span><span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#123;</span>
                itemId<span class="sy0">:</span> <span class="st0">'editButton'</span><span class="sy0">,</span>
                xtype<span class="sy0">:</span> <span class="st0">'button'</span><span class="sy0">,</span>
                text<span class="sy0">:</span> <span class="st0">'Edit'</span>
            <span class="br0">&#125;</span><span class="br0">&#93;</span><span class="sy0">,</span>
            ...
        <span class="br0">&#125;</span><span class="br0">&#93;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#41;</span><span class="sy0">;</span></pre>

<p>This view class is configured to be injectable, using the Deft.mixin.Injectable mix-in, and its dependencies are described using the ‘inject’ class annotation.</p>

<p>When this view is instantiated via either <tt>Ext.create()</tt> or <tt>Ext.widget()</tt>, the IoC container will resolve the ‘contactStore’ dependency and inject the associated value into the ‘contactStore’ configuration. The generated <tt>getContactStore()</tt> accessor  function will return that injected value.</p>

<p>Additionally, this view class is configured to be controllable, using the <tt>Deft.mixin.Controllable</tt> mix-in, and its controller is specified using the ‘controller’ class annotation.</p>

<p>When this view is instantiated, an instance of the specified view controller class will also be created and configured with a reference to the view. When the view is destroyed, the view controller will also be destroyed.</p>
<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">Ext.<span class="me1">define</span><span class="br0">&#40;</span> <span class="st0">'ContactsApp.controller.ContactGridViewController'</span><span class="sy0">,</span>
    extend<span class="sy0">:</span> <span class="st0">'Deft.mvc.ViewController'</span><span class="sy0">,</span>
    mixins<span class="sy0">:</span> <span class="br0">&#91;</span> <span class="st0">'Deft.mixin.Injectable'</span> <span class="br0">&#93;</span><span class="sy0">,</span>
    inject<span class="sy0">:</span> <span class="br0">&#91;</span> <span class="st0">'contactStore'</span> <span class="br0">&#93;</span><span class="sy0">,</span>
&nbsp;
    config<span class="sy0">:</span> <span class="br0">&#123;</span>
        contactStore<span class="sy0">:</span> <span class="kw2">null</span>
    <span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
    control<span class="sy0">:</span> <span class="br0">&#123;</span>
        contactsGrid<span class="sy0">:</span> <span class="br0">&#123;</span>
            click<span class="sy0">:</span> <span class="st0">'onContactsGridClick'</span>
        <span class="br0">&#125;</span>
        editButton<span class="sy0">:</span> <span class="br0">&#123;</span>
            click<span class="sy0">:</span> <span class="st0">'onEditButtonClick'</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span><span class="sy0">,</span>
    ...
    <span class="me1">destroy</span><span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
       <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">hasUnsavedChanges</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
           <span class="co1">// cancel destruction</span>
           <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
       <span class="br0">&#125;</span>
       <span class="co1">// allow destruction</span>
       <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">callParent</span><span class="br0">&#40;</span> arguments <span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="sy0">,</span>
    ...
    <span class="me1">onEditButtonClick</span><span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">this</span>.<span class="me1">getEditButton</span>.<span class="me1">setDisabled</span><span class="br0">&#40;</span> <span class="kw2">false</span> <span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="sy0">,</span>
&nbsp;
    onContactsGridClick<span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="co1">// add a ContactEditorView to the TabPanel for the selected item</span>
        ...
    <span class="br0">&#125;</span><span class="sy0">,</span>
<span class="br0">&#41;</span><span class="sy0">;</span></pre>

<p>This view controller extends the <tt>Deft.mvc.ViewController</tt> abstract base class, which provides a ‘control’ configuration that simplifies the creation of view component accessors and registering view component event listeners.</p> 

<p>In this example, the grid and button are referenced implicitly by their itemId (custom selectors are also supported) and their ‘click’ events are configured to be handled by corresponding view controller methods. Two accessor functions will automatically be created: getContactsGrid() and getEditButton(). When the view is destroyed, the view controller's destroy() method will be called, allowing it to cancel view destruction. If this method returns true, the view will be destroyed, and all references and event listeners created in the view controller using the ‘control’ configuration will automatically be removed.</p>

<p>The IoC container is typically configured in the main application JavaScript file, within <tt>Ext.onReady()</tt>, using the <tt>Deft.Injector.configure()</tt> method.</p>
<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">Ext.<span class="me1">onReady</span><span class="br0">&#40;</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    Deft.<span class="me1">Injector</span>.<span class="me1">configure</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        contactStore<span class="sy0">:</span> <span class="st0">'ContactsApp.store.ContactStore'</span>
        <span class="co1">// contactStore: 'ContactsApp.store.MockContactStore'</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>

<p>In this example, the Deft JS IoC container has been configured to fulfill all requests for ‘contactStore’ with a singleton instance of <tt>ContactsApp.store.ContactStore</tt>. The commented line shows how simple it would be to specify a mock class instead.</p>

<h3>About Deft JS</h3>

<p><a href="http://deftjs.org/">Deft JS</a> is an MIT-licensed open source framework that extends the Ext JS and Sencha Touch APIs to provide:<br>
<ul>
    <li>Loose-coupling and dependency injection via an Inversion of Control (IoC) container</li>
    <li>Flexible component-oriented architecture through an alternative Model View Controller (MVC) implementation</li>
    <li>Elegant asynchronous operation chaining and data processing using Promises and Deferreds</li>
</ul>

<p>Created by a team of software architects working at the innovative digital solutions agency <a href="http://universalmind.com">Universal Mind</a>, Deft JS leverages best practices and proven patterns refined over years of delivering cutting edge solutions across a wide range of platforms and devices.</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Mon, 14 May 2012 13:50 GMT</pubDate>
        <guid>http://www.sencha.com/blog/deftjs-loosely-coupled-mvc-through-dependency-injection/#date:13:50</guid>
        </item>
        
        <item>
        <title>Sencha Customer Spotlight: Burrows/Ford</title>
        <author>Ricky Clegg</author>
        <description>
            Burrows is a full service communications agency which helps its clients give their customers key information and creative content to inform their purchase decisions. Our latest application is  known as ‘Ford Showroom’ and is a portal for all things Ford. The main goals for this app were to help dealers sell cars, while immersing customers in the Ford brand.
        </description>
        <link>http://www.sencha.com/blog/sencha-customer-spotlight-burrows-ford/</link>
        <content:encoded>
            <![CDATA[
                <p>
<img class="alignright" src="http://cdn.sencha.io/img/20120424-spotlight-burrows-feature.png" alt="Sencha Customer Spotlight: Burrows/Ford" height="321" width="357">
<a href="http://www.burrows.info/">Burrows</a> is a full service communications agency which helps its clients give their customers key information and creative content to inform their purchase decisions. Our latest application is  known as ‘Ford Showroom’ and is a portal for all things Ford. The main goals for this app were to help dealers sell cars, while immersing customers in the Ford brand.</p>
 
<p>Our new application has two versions, a consumer experience and a dealer experience. One of the features that makes the dealer experience unique is the ability to send parts of the application to large screen televisions placed around the dealership. The app takes full advantage of the real estate that a tablet computer has to offer and provides immersive experiences to the user via full screen images, serving video and a wealth of information. The application contains up to ten different car nameplates.</p>

<p>Burrows used the card layout and new Viewport floating panel system to create overlays. With the Sencha Touch swipe event, navigating through the pages is fast and smooth.</p>

<h3>Why We Chose Sencha Touch 2</h3>
<p>In 2011, we chose Sencha Touch as our mobile framework. It was light years ahead of the other JavaScript frameworks on the market and provided a great API to aid in the transition of our Flash Platform developers to JavaScript. As a company, we really aim for a ‘one codebase’ to fit all solutions, and Sencha was our best chance of achieving this goal. We built apps in Sencha Touch 1 for clients including Ford.</p>
 
<p>With the prospects of the new Ford Showroom App, we did some thorough testing and found that Sencha Touch 2 continued to offer the best components and features. As a company, we made the decision to use Sencha Touch 2. If you want to write object oriented JavaScript, there is no easier place to start. The ‘extends’, ‘requires’, ‘statics’ and ‘constructor’ is the best foundation any JavaScript novice or pro could ask for. What we have learned is every byte counts, and using the lazy loading AJAX and JSONP features in Sencha Touch 2 to request your JavaScript files and data is a great way to keep memory down and only request code when needed.</p> 

<p>Layouts are our most utilized feature in Sencha Touch 2, due to their flexibility to create cross platform applications. The Showroom application will be available on both Android and iOS. We make great use of the VBox and HBox layouts along with the flex configuration property to make the app resolution-independent. The layouts allow the app to stretch to any size easily and handle the content within the containers. Switching through the views and getting the data is easy using Sencha MVC technology which is built right into the framework.</p> 

<p>Throughout the application, we built custom components. DotNavigation is one of my favorites. It’s a simple dynamic indicator for a toolbar that we used for a card layout or carousel to show which page the user is viewing. It helps users easily navigate around views in a very app-like fashion, taking advantage of CSS3 animations.</p> 

<p>In the dealer release of the application, we allow communication to a server through the Sencha Touch web API that enables the dealer to send high res images and videos to large screen televisions around the dealership.</p> 

<figure class="aligncenter">
	<img src="http://cdn.sencha.io/img/20120424-spotlight-burrows-fig1.png" width="636" height="273">
	<figcaption>Burrows took advantage of the Sencha VBox and HBox layouts with box flex set on each component to make a completely flexible menu system that fit both iOS and Android.
Business Value of Using Sencha Touch 2</figcaption>
</figure>

<h3>Business Value of Using Sencha Touch 2</h3>
<p>The value goes first and foremost to our clients. The days of companies just wanting an iOS based application are over. Now, it’s all about cross platform and how many Android tablets and iPads you can support. The cost savings of not developing twice can add up to the hundreds of thousands and during a recession every penny counts.</p>
 
<p>For our developers, the efficiency gain is almost immeasurable. Without Sencha Touch, we would still be working out how to make a momentum-based touch scroller. Instead, using Sencha technologies we can make prototypes in hours, not days.</p>
 
<h3>Our Advice to New Developers</h3>
<p>The biggest piece of advice we have for other developers is: go with the framework, do not fight against it. It is easy as a web developer to dive in and start forcing your own CSS and HTML into components to bend views to your will. Littering your CSS files with position absolute and float left. The layouts and components provided with Sencha Touch are fantastic and really flexible. Read all about them in the Sencha documentation, and you will love the framework.</p>
 
<p>For all newcomers, read the API. Sencha offers great documentation and support forums. Read through the ‘Hello World’ examples and watch the videos. You don’t need to know a lot to get started, but with a few fundamentals you will go a long way. The built-in MVC architecture is great and a rapid way to develop. However if you are new to design patterns, do not confuse yourself, take the time to get familiar and read about the pattern first.</p>
 
<h3>Final Thoughts</h3>
<p>Burrows recommends Sencha Touch 2 to any company or developer. Whether for speed, platform penetration, or just the need to make JavaScript an easier transition from developing in another language. Sencha products have a great community, are full featured and for Burrows, the only JavaScript framework for creating mobile applications.</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Wed, 09 May 2012 17:20 GMT</pubDate>
        <guid>http://www.sencha.com/blog/sencha-customer-spotlight-burrows-ford/#date:17:20</guid>
        </item>
        
        <item>
        <title>Behind the Sencha Command Utility and the Build Process</title>
        <author>Jacky Nguyen</author>
        <description>
            The Sencha command utility is a cross&#45;platform command line tool that helps make it easier than ever to develop applications with Sencha Touch 2. The tool consists of many useful automated tasks around the full lifecycle of your applications, from generating a fresh new project to deploying for production.

This article will help you understand the Sencha command utility as well as your Sencha Touch 2 application&apos;s production build process.
        </description>
        <link>http://www.sencha.com/blog/behind-sencha-command-and-the-build-process/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright" src="http://cdn.sencha.io/img/20120424-sdk-tools-thumb.png" alt="Behind Sencha Command and the Build Process" height="180" width="240"> The Sencha command utility is a cross-platform command line tool that helps make it easier than ever to develop applications with Sencha Touch 2. The tool consists of many useful automated tasks around the full lifecycle of your applications, from generating a fresh new project to deploying an app for production.</p>

<p>This article will help you understand the Sencha command utility as it&#8217;s used for your Sencha Touch 2 application&#8217;s build process.</p>

<p>This article is written with the assumption that you are already familiar with <a href="http://www.sencha.com/products/touch/download/">Sencha Touch 2 SDK</a>, <a href="http://www.sencha.com/products/sdk-tools/download/">SDK Tools</a> and <a href="http://docs.sencha.com/touch/2-0/#!/guide/command">basic operations using the Sencha command utility</a>. If you aren&#8217;t familiar with these topics yet, head to the <a href="http://docs.sencha.com/touch/2-0/#!/guide/getting_started">Getting Started Guide</a> and learn how to quickly setup your development environment and generate a working Sencha Touch 2 application.</p>

<h3>How It Works</h3>

<p>The Sencha command utility is a pure JavaScript application running within the Node.js runtime. The source code is located inside the <code>command</code> directory of the Sencha Touch 2 SDK. This application requires that Node.js and other tools exist on your system, such as PhantomJS, Open-vcdiff, Closure Compiler, YUICompressor, etc. These binaries are included in the SDK Tools installer, so you don&#8217;t have to worry about downloading them yourself.</p>

<p>After the SDK Tools is installed, from a command line or Terminal, <code>sencha</code> command simply delegates to the following:</p>

<pre><code>/path/to/sdk_tools/bin/node /path/to/sdk/command/sencha.js [arguments…]
</code></pre>

<p>with <code>/path/to/sdk_tools</code> being where the SDK Tools were installed, and <code>/path/to/sdk/command</code> being the path to a Sencha command utility directory. It is that simple.</p>

<h3>Application Structure</h3>

<p>The Sencha command utility helps you create a fresh new application with a one-line command:</p>

<pre><code>sencha app create MyApp /path/to/myapp
</code></pre>

<p>Two of the most important parts from the output are the <code>sdk</code> directory and the <code>app.json</code> file.</p>

<h4>The &#8216;sdk&#8217; directory</h4>

<p>This directory is a copy of the SDK from which the application was generated. This way all your application source code is self-contained which makes it easy to archive, share and version-control. Also, to upgrade or downgrade an existing application, you simply replace the <code>sdk</code> directory.</p>

<p>However, if for some reason you need to change the name of this directory or store it in a different location outside of the application, simply edit its path in the <code>.senchasdk</code> file. This special file gives the Sencha command utility a hint on where to look for the SDK within the current working directory.</p>

<h4>The &#8216;app.json&#8217; file</h4>

<p>Getting a Sencha Touch 2 application up and running can be as simple as creating an HTML document and including a bunch of JavaScript / CSS files in the right order. However, when it comes to deployment, things can get complex quickly, and there is a lot of work involved in optimizing your application in a production environment. Usually pre-production optimization boils down to:</p>

<ul>
<li>Minimizing network payload size</li>
<li>Minimizing the number of HTTP requests</li>
<li>Providing instant UI feedback when the application is loaded for the first time</li>
<li>Caching non-frequently changed resources on the client, when possible</li>
<li>Minimizing network transfer when updating between different versions</li>
</ul>

<p>In other words, that means:</p>

<ul>
<li>Figuring out a minimal list of dependencies your application needs instead of including the whole library</li>
<li>Concatenating separate JavaScript/CSS assets into single bundles and minifying them</li>
<li>Using asynchronous loading mechanism </li>
<li>Storing all JavaScript/CSS assets locally on first load and evaluating them on subsequent access without any network connection required</li>
<li>Generating deltas between all versions of your application and automatically instructing the client to download and then patch their local copies</li>
</ul>

<p>In order to automate all of that for you in just one single command (<code>sencha app build</code>), the Sencha command utility needs to know everything about your application&#8217;s structure, for example:</p>

<ul>
<li>Where the required JavaScript/CSS files are, and in what order to include them</li>
<li>What update mechanism to use for each of these assets</li>
<li>What files and directories to copy along when doing the build</li>
<li>Where to generate the builds</li>
</ul>

<p>All of this information is contained inside a JSON-formatted configuration file named <code>app.json</code>. Two of the most important configuration items to be highlighted here are &#8220;<code>js</code>&#8221; and &#8220;<code>css</code>&#8221;.</p>

<p>With the new application structure, JavaScript and CSS assets should never be physically linked inside the HTML document (for example, manually added as <code>&lt;script&gt;</code>, <code>&lt;style&gt;</code> or <code>&lt;link&gt;</code> tags). Instead, they should be specified and maintained inside <code>app.json</code> as array of JavaScript and CSS items in the right execution order for the &#8220;<code>js</code>&#8221; and &#8220;<code>css</code>&#8221; keys, respectively. Such items may look like this:</p>

<pre><code>"js": [
    &#123;
        "path": "sdk/sencha-touch.js"
    &#125;,
    &#123;
        "path": "app.js"
    &#125;,
    &#123;
        "path": "vendor/foo-library.js"
    &#125;,
    &#123;
        "path": "3rd-party/analytics.js"
    &#125;
]
</code></pre>

<p>This enables the use of the micro-loader, as described below:</p>

<h3>The Micro-loader</h3>

<p>The micro-loader was first introduced in Sencha Touch 2.0.0-GA. It is a small script that is responsible for loading up all JavaScript/CSS assets asynchronously, caching them locally, and updating their local copies when a new version of the application is deployed.</p>

<p>In fact, it is, and should be, the only script that is physically included inside your HTML document. During development, every time the application loads, the micro-loader simply requests and parses your <code>app.json</code> file, then dynamically loads all of your JavaScript/CSS assets in the specified order.</p>

<p>In a production environment, however, this process only happens once. Upon completion of the first load, the content of each asset is stored locally inside the client browser&#8217;s Local Storage. As a result, subsequent access to the application requires absolutely no network connection. The asset&#8217;s content is retrieved locally and evaluated immediately, still in the right execution order, and as fast as the device&#8217;s CPU can handle. Your application not only is offline-capable, it also loads in a &#8220;blink&#8221; on mobile devices.</p>

<p>But, you may wonder, doesn&#8217;t HTML5 application cache already provide all of those features? That question brings us to the next section.</p>

<h3>The Delta-update Mechanism</h3>

<p><a href="http://www.w3.org/TR/offline-webapps/">HTML 5 Application Cache</a> seemed like a dream come true to web developers when it was first introduced. If you are new to this feature, we highly recommend that you read <a href="http://www.html5rocks.com/en/tutorials/appcache/beginner/">this beginner-friendly article</a> to have a better understanding of the subject. As a quick summary, your web application can finally run without the device always having to be online. All specified assets inside the manifest file will be retrieved for the first time and cached locally. Sounds perfect, but what happens when an asset&#8217;s content changes on the server-side?</p>

<p>When using HTML5 Application Cache, a GET request is made in the background to retrieve the content of your manifest file every time your application loads. This newly retrieved content is then compared to the old one that was stored locally from the last time your application was used. Any difference in the comparison indicates that something has changed, and an update is required. The browser then makes a new GET request for each and every cached item listed in the manifest file to retrieve its latest content and refresh the cache.</p>

<p>In other words:</p>

<ul>
<li>The browser knows something has changed but doesn&#8217;t know exactly what. That could mean all of your images and JavaScript files have to be pulled down again, even if you only tweak some styling in one CSS file. With the current state of this feature and the current format of the manifest file, there is no way to specify only the items that were modified and reduce all the unnecessary requests.</li>
<li>The update mechanism is still a full update. The whole file content is downloaded again even if you might only have changed a few lines of code. In reality, for rich web applications such as those written with Sencha Touch, that means hundreds of KB wasted for a few KB of code change. This becomes a serious drawback especially for mobile devices when cellular data connections are often slow, unreliable, and expensive with limited bandwidth. For businesses, rolling out updates as frequently as possible with small and incremental changes has always been a rule-of-thumb. Yet, this limitation makes that practice painful to watch.</li>
</ul>

<p>That is where Sencha Touch 2 micro-loader comes into play with its built in delta-update mechanism. This simplified diagram illustrates the process:</p>

<p><figure class="aligncenter">
  <a class="lightbox" href="http://cdn.sencha.io/img/20120424-build-archive-delta-process-diagram.png"><img src="http://src.sencha.io/636/http://cdn.sencha.io/img/20120424-build-archive-delta-process-diagram.png" alt="Diagram illustrates how users are served only the small delta update file corresponding to their current version. This saves them from having to re-download the entire app.js."></a>
  <figcaption>The above diagram illustrates how users are served only the small delta update file corresponding to their current version. This saves them from having to re-download the entire app.js.</figcaption>
</figure></p>

<p><img class="alignright" src="http://cdn.sencha.io/img/20120424-deltas-thumb.png" alt="Delta update files" height="180" width="240"> Each time you make code changes and build the application for production, the Sencha command utility stores a copy of each asset that has been changed. This is called archiving. By keeping all previous versions of the assets in the <code>archive</code> directory, it can then generate a delta between each version. Client devices will then download the right delta content and patch their own Local Storage copies to become identical with the latest ones.</p>

<p>Similarly to the manifest file mechanism in HTML5 Application Cache, once your application finishes loading, the micro-loader issues a GET request in the background to check if there&#8217;s any update (only if the device is currently online). This information is presented in JSON format, with each asset having its latest checksum values. By comparing these checksum values with the previously cached ones, it knows exactly what asset has changed and proceeds with the patching process.</p>

<p>This solves both problems we mentioned earlier in the most optimal way. Even better, it is not meant to replace HTML5 Application Cache. In fact, both mechanisms are used together to perfect the solution. Local Storage caching and delta-update are only suitable for text-based assets such as JavaScript and CSS. Binary resources like images and videos should still be handled using the manifest file.</p>

<h3>Summary</h3>

<p>The Sencha command utility was born to automate many of your repetitive tasks during a project development cycle, while ensuring the outputs are optimized. I hope this article helps you gain some essential understanding of the work that the Sencha command utility does behind the scenes.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Wed, 02 May 2012 17:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/behind-sencha-command-and-the-build-process/#date:17:00</guid>
        </item>
        
        <item>
        <title>Announcing Sencha GXT 3.0</title>
        <author>Darrell Meyer</author>
        <description>
            We&apos;re excited to announce the general availability of Sencha GXT 3.0! Sencha GXT, previously known as Ext GWT, is our Java based web application framework that leverages the Google Web Toolkit compiler. With the Sencha GXT 3.0 framework, developers can build high performance web applications with cross&#45;browser compatibility across all desktop browsers.
        </description>
        <link>http://www.sencha.com/blog/announcing-sencha-gxt-3-0/</link>
        <content:encoded>
            <![CDATA[
                <figure class="aligncenter" style="position:relative;">
    <img class="alignright" src="http://cdn.sencha.io/img/gxt3/gxt-hero-overview.png" alt="Sencha GXT 3.0" style="margin-left: 50px; margin-right: 50px;">
</figure> 

<p>We're excited to announce the general availability of Sencha GXT 3.0! Sencha GXT, previously known as Ext GWT, is our popular Java based web application framework that leverages the Google Web Toolkit compiler. With Sencha GXT 3.0, developers can build high performance web applications with cross-browser compatibility across all desktop browsers.</p>

<p class="button-group"> 
    <a class="button-link inline small arrow" href="http://www.sencha.com/products/gxt/download/" title="Download Sencha GXT"><span>Download Sencha GXT</span></a>
</p> 

<h3>Easier to Learn</h3>

<p>This major release has given the GXT team a chance to take a step back and reconsider existing features and API design. We’ve made a number of breaking changes from Ext GWT to better support current GWT features and best practices, to make the library easier to use and theme, and to plan for future improvements both in GWT and GXT.</p>

<p>To make existing projects easier to upgrade, we’ve also ensured that Ext GWT 2 and GXT 3 can be run in the same project. Check out <a href="http://www.sencha.com/learn/running-ext-gwt-2-and-3-together/">Running Version 2 and 3 together</a> for more information.</p>

<h4>GWT Events & Handlers</h4>

<p>Ext GWT 2.0 had a custom event and listener API that was written before GWT released its Events & Handler API. With GXT 3.0, we have replaced this custom event system in favor of the built-in GWT Handler API. Now GXT components accept handlers and fire events in the same way as other GWT widgets. This makes adding event handler methods in uibinder-enabled projects easier, and removes the need to send some events through an EventBus and others through Observable objects. This change also makes it easier for a developer’s IDE to give them hints about events that can be fired, and assists users with autocomplete to quickly write strongly typed handlers for these events.</p>

<h4>GWT Based Rendering</h4>

<p>With Ext GWT 2.0, components rendered their DOM structure lazily. That is, the component’s DOM elements were not created when the component was constructed. This behavior differed from that of GWT Widgets, which create their DOM elements immediately. This difference managed to confuse some users, and required them to take special precautions in order not to access components that had not yet been created.</p>

<p>With GXT 3.0 we're opting for the GWT model which means that there is consistent behavior when working with both GXT Components and GWT Widgets. This makes use of the widgets more predictable, as there is no need to be certain that some calls are only made pre- or post-render.</p>

<h4>Strongly Typed Layout Engine</h4>

<p>GXT 3.0 introduces strongly typed layout containers. This is in contrast to Ext GWT 2.0, where a generic layout container could be given any layout. Because the container was generic and not strongly typed, it was possible to use the API incorrectly. For example, in 2.0, it was possible to use the wrong type of layout data for a given layout. With 3.0, the API now forces the correct use of layout data for each container type.</p>

<h4>Full UiBinder Support</h4>

<p> GWT 2.0 introduced the ability to construct user interfaces in a declarative way using XML files. To support UiBinder in Widgets, several conventions had to be followed. These included implementing HasWidgets to allow a Widget to behave as a container, implementing HasHTML to allow raw HTML directly in panels, and adding <code>@UiConstructor</code> and <code>@UiChild</code> annotations in widgets to support custom behavior.</p>

<p>Ext GWT 2 was released prior to GWT 2.0 and thus did not have support for UiBinder. UiBinder support has been one of the major driving factors for many of the API changes in Sencha GXT 3.</p>

<p>GXT 3 has a library to make it easier to create complex layouts in UiBinder files. These changes have been accepted by the GWT team for their upcoming 2.5 release, and in the meantime, are available in the uibinder-bridge jar, available as part of the GXT 3 download.</p>

<p>For a more detailed look, see our Learn article about <a href="http://www.sencha.com/learn/ext-gwt-3-declarative-markup-with-uibinder/">Declarative Markup with UiBinder in Sencha GXT 3</a>.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">&lt;ui:UiBinder</span>
    <span style="color: #7D9029">xmlns:ui=</span><span style="color: #BA2121">&quot;urn:ui:com.google.gwt.uibinder&quot;</span>
    <span style="color: #7D9029">xmlns:gxt=</span><span style="color: #BA2121">&quot;urn:import:com.sencha.gxt.widget.core.client&quot;</span>
    <span style="color: #7D9029">xmlns:button=</span><span style="color: #BA2121">&quot;urn:import:com.sencha.gxt.widget.core.client.button&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>
 
<span style="color: #008000; font-weight: bold">&lt;gxt:FramedPanel</span> <span style="color: #7D9029">collapsible=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">headingText=</span><span style="color: #BA2121">&quot;Example&quot;</span> <span style="color: #7D9029">pixelSize=</span><span style="color: #BA2121">&quot;100, 80&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;button:TextButton</span> <span style="color: #7D9029">ui:field=</span><span style="color: #BA2121">&quot;exampleButton&quot;</span> <span style="color: #7D9029">text=</span><span style="color: #BA2121">&quot;Click Me&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;/gxt:FramedPanel&gt;</span>
 
<span style="color: #008000; font-weight: bold">&lt;/ui:UiBinder&gt;</span>
</pre></div>

<img src="http://img1.sencha.com/files/misc/ext-gwt-3-declarative-markup-with-uibinder-01.png" alt="UiBinder example result" height="97" width="114"  />

<h3>Core Improvements</h3>

<h4>Improved Model Support</h4>

<p>In Ext GWT 2, several model object interfaces and base classes were provided, such as ModelData, TreeModel, BaseModelData. These types allowed for a species of pseudo-reflection by making each model responsible for tracking the mapping from a String key to the referred property. This could make it difficult to use existing POJO beans and to write code in a type-safe way.  It also made it difficult to effectively use AutoBeans and RequestFactory.</p>

<p>GXT 3 now supports any bean-like object, with public accessors (getters and setters) through its XTemplates. PropertyAccess also provides a mechanism to generate ValueProvider instances. ValueProvider handles changing and reading values from outside the models in a generic way.</p>

<p>With these changes, users have the flexibility to use their own domain objects without being required to use GXT model classes or implement GXT model interfaces.</p>

<h3>Data Loading, Reading, & Writing</h3>

<p>The Store classes continue to be the basis for client-side data management in GXT 3. Loaders, DataProxys, and Readers are still the ideal way to provide the data for Stores. As in 2.0, there is no requirement to use them - data can be added directly to the stores. However, we’ve greatly improved their generics and made it easier to send data to and from the server in a variety of ways. For those who choose to take advantage of these classes, the GXT 3.0 data classes are a huge improvement in developer convenience and productivity.</p>

<p>Ext GWT 2.0 used the introspection-like features of ModelData to allow access to data within an object. With GXT 3.0, ValueProvider instances can be used to generically refer to individual nested properties, and GWT’s AutoBean functionality can be used to turn bean interfaces into data loaded to and from the server. The HttpProxy and ScriptTagProxy classes can both generate XML or JSON for the objects sent to the server. Alternatively, they can also generate simple URL-encoded data. Furthermore, readers can easily map JSON properties or simple XML x-paths to bean properties.</p>

<p>Loaders and Proxies now use specific generics to avoid confusion about the type of model or data that is expected from or that will be produced by any particular object. This avoids many common problems, such as class cast exceptions, that occur when less stringent typing is used. These additional type parameters can make object declarations more verbose, but also more precise. These changes result in better static code checking from your IDE or compiler. The Explorer demo shows how to turn both XML and JSON into trees or lists to be consumed by their appropriate Stores.</p>

<p>For additional information, see our introduction to Data in our blog post for <a href="http://www.sencha.com/blog/ext-gwt-3-dev-preview-1/#data">Developer Preview 1</a>.</p>

<h3>Interface Based Design</h3>

<p>Projects using GXT often work with large, complex user interfaces, and to keep these projects easy to maintain and test it is important to separate discrete units of functionality. In this way, any unit can be tested or replaced without greatly affecting other units. GXT 3 makes it easier to mock and replace the components and event sources by implementing meaningful interfaces wherever possible. For many events, we implement a HasHandlers interface from GWT, such as for HasSelectionHandlers on components that allow logical selection of data, whereas for others such as the Stores, we provide our own events and handler interfaces to accurately describe what is happening in each case.</p>

<p>In some instances where GWT provides interfaces for events that seem reasonable, we avoid using them in favor of more comprehensive events. For example, TextButton implements HasSelectHandlers rather than HasClickHandlers, because buttons can be selected through the mouse or keyboard. If handlers were only added for ClickEvents, a user interface could miss keyboard selection of their forms.</p>

<p>Where possible, we declare many GXT 3 classes in a shared package, indicating that this code does not require being run in GWT, though it is designed for it. Stores and Loaders are two examples of this - they do not require actual GWT support so presenter classes that use them can be tested on a JVM instead of the much slower GWTTestCase.</p>

<h4>Compile Time Templates</h4>

<p>XTemplates are a powerful feature in GXT 3.0. Prior to 3.0, XTemplates were implemented using the same design and code as Ext JS. For 3.0, we decided to replace this JavaScript-based implementation with a solution better fitting GWT and the features it offers.</p>

<p>The new XTemplate design uses GWT Deferred Binding to process a template and generate GWT-optimizable Java to retrieve the data from any Java Bean. Data can be read from any Java Bean, ClientBundle or CssResources to make theming elements easier. Furthermore, there is no need to “convert” the data to a JavaScriptObject. The new design supports virtually all of the old XTemplate features and functionality, and now can be better optimized by the compiler.</p>

<p>In summary, the new XTemplate design is a much improved design over the previous XTemplate. We are leveraging GWT Deferred Binding to provide a GWT like solution.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">interface</span> <span style="color: #0000FF; font-weight: bold">TemplateTest</span> <span style="color: #008000; font-weight: bold">extends</span> XTemplates <span style="color: #666666">{</span>
  <span style="color: #AA22FF">@XTemplate</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;&lt;div&gt;&lt;span&gt;{name}&lt;/span&gt;&lt;/div&gt;&quot;</span><span style="color: #666666">)</span>
  SafeHtml <span style="color: #0000FF">renderStock</span><span style="color: #666666">(</span>StockProxy stock<span style="color: #666666">);</span>

  <span style="color: #AA22FF">@XTemplate</span><span style="color: #666666">(</span>source<span style="color: #666666">=</span><span style="color: #BA2121">&quot;template.html&quot;</span><span style="color: #666666">)</span>
  SafeHtml <span style="color: #0000FF">renderStockExternal</span><span style="color: #666666">(</span>StockProxy stock<span style="color: #666666">);</span>
<span style="color: #666666">}</span>
</pre></div>

<p>For additional information, see our <a href="http://www.sencha.com/blog/ext-gwt-3-xtemplate-redesign/">XTemplate blog post</a>.</p>

<h3>New Features</h3>

<h4>Cell Enhancements</h4>

<p>GWT 2.1 introduced the Cell API, a sort of ‘Widget Lite’ mechanism to allow large numbers of elements to be rendered efficiently. These were often wrapped in a widget of some kind, yielding “high-performance, lightweight widgets composed of Cells for displaying data.” See this <a href="https://developers.google.com/web-toolkit/doc/latest/DevGuideUiCellWidgets">guide</a> for background information on cells.</p>

<p>Cells use the flyweight pattern to use a single object to render many elements, and to handle incoming events for all of them in a consistent way. Many fields and other components in GXT 3 are implemented first in Cells, then wrapped in a Cell widget, allowing them to be drawn cheaply in a grid, or used as a field in a form, with the same basic features available in either case.</p>

<p>All GXT 3 data components support using Cells to draw their content, including ListView, Tree, Grid, and TreeGrid. (In contrast, Ext GWT 2 used either a GridCellRenderer to put together HTML content or a widget drawn in each cell, resulting in simple content, or very heavy grid elements). By using Cells instead, GXT 3 supports the best of both worlds, providing a solution to handle any high-performance interactive content. Take a look at the <a href="http://www.sencha.com/examples/#ExamplePlace:cellgrid">Cell Grid example</a>. Fields can still be created as an editor for a column, allowing grid cells to alternate between rendered data and editable content, as in Ext GWT 2. Check out our examples of <a href="http://www.sencha.com/examples-dev/#ExamplePlace:inlineeditablegrid">inline grid editing</a> and <a href="http://www.sencha.com/examples-dev/#ExamplePlace:roweditablegrid">row grid editing</a> for details.</p>

<a href="http://www.sencha.com/examples/#ExamplePlace:cellgrid"><img src="http://img1.sencha.com/files/misc/Screen_Shot_2012-04-29_at_4.08.39_PM.png" alt="Cell grid" height="334" width="636"  /></a>

<h4>Custom Theming and Appearances</h4>

<p>GXT 3 components and cells are responsible only for handling events and managing the data they are given. In Ext GWT 2, they also drew their html elements and css class names, resulting in components that could be difficult to modify, extend, and restyle. Through the use of the GWT <a href="http://code.google.com/p/google-web-toolkit/wiki/CellBackedWIdgets#Appearance_Pattern">Appearance pattern</a>, we have factored out this content and style, and it is now easy to re-theme any widget, or all widgets of the same type in an application.</p>

<p>By using XTemplates and ClientBundles, we further ensure that elements are rendered from strings, not manipulated DOM elements, and that only the CSS and images which are presently being used are loaded into the DOM.</p>

<p>For additional information, see our <a href="http://www.sencha.com/blog/ext-gwt-3-appearance-design/">Appearance blog post</a>.</p>

<h4>Plugin-free Charting</h4>

<p>One of the most exciting new features of GXT 3 is the brand new, plug-in free, charting package. Built on web technologies (SVG and VML), the new charting package is a write-once, run-anywhere solution that doesn’t have third party dependencies. It works on every browser down to IE6, and because it’s all written in GXT it’s completely customizable and very easy to extend.</p>

<p>We’ve created pie charts, lines charts, area charts, radar charts and more — all animated, all easy to configure and all very extensible. We’ve included <a href="http://www.sencha.com/examples/">23 charting and drawing examples</a> for this release that show off many of the configurations available to you.</p>

<a href="http://www.sencha.com/examples/#ExamplePlace:areachart"><img src="http://img1.sencha.com/files/misc/Screen_Shot_2012-04-29_at_4.21.56_PM.png" alt="Area chart" height="431" width="601"  /></a>

<p>For additional information, see our <a href="http://www.sencha.com/blog/ext-gwt-3-drawing-and-charting/">Charting blog post</a>.</p>

<h3>Maven Support</h3>

<p>As with our beta and release candidates, GXT 3.0.0 is available through maven central as well as through a downloadable zip. The groupId and artifactId are unchanged, and the new version is 3.0.0:</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">&lt;dependency&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;groupId&gt;</span>com.sencha.gxt<span style="color: #008000; font-weight: bold">&lt;/groupId&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;artifactId&gt;</span>gxt<span style="color: #008000; font-weight: bold">&lt;/artifactId&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;version&gt;</span>3.0.0<span style="color: #008000; font-weight: bold">&lt;/version&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;/dependency&gt;</span>
</pre></div>

<p>The version in Maven Central is covered under GPLv3, and we’re now hosting our own repository for commercially licensed artifacts.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">&lt;repository&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;id&gt;</span>sencha-commercial-release<span style="color: #008000; font-weight: bold">&lt;/id&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;name&gt;</span>Sencha commercial releases<span style="color: #008000; font-weight: bold">&lt;/name&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;url&gt;</span>https://maven.sencha.com/repo/commercial-release/<span style="color: #008000; font-weight: bold">&lt;/url&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;/repository&gt;</span>
</pre></div>

<p> Please note that full Maven support for both GPL and Commercial will be available within a week of the Sencha GXT 3.0 release. Please subscribe to the <a href="http://www.sencha.com/forum/showthread.php?199816-Sencha-GXT-3.0-Maven-support">forum post</a> to get notified when full Maven support is available.</p>

<h3>The GXT 3.x Roadmap</h3>

<p>Sencha GXT 3.0 lays the groundwork for the next generation of web application frameworks. We are planning to add support for the Gray theme, and  following that, we plan to introduce RTL and ARIA support.</p>

<p>Again, we thank the community for your bug reports, questions, and suggestions which have helped us in delivering this release. Sencha GXT 3 is a major advancement in the product line and we hope you enjoy using it.</p>

<ul>
<li><a href="http://www.sencha.com/products/gxt/">Sencha GXT</a></li>
<li><a href="http://www.sencha.com/examples/">Explorer Demo</a></li>
<li><a href="http://dev.sencha.com/deploy/gxt-3.0.0/javadoc/gxt/index.html">GXT API Documentation</a></li>
</ul>

<p class="button-group"><a class="button-link inline small arrow" href="http://www.sencha.com/products/gxt/download/" title="Download Sencha GXT"><span>Download Sencha GXT</span></a></p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Fri, 27 Apr 2012 21:50 GMT</pubDate>
        <guid>http://www.sencha.com/blog/announcing-sencha-gxt-3-0/#date:21:50</guid>
        </item>
        
        <item>
        <title>HTML5 Scorecard: RIM BlackBerry PlayBook OS 2.0</title>
        <author>Michael Mullany</author>
        <description>
            Last month, RIM released OS 2.0 for the BlackBerry PlayBook. We were already very impressed with the PlayBook 1.0 browser, and we were anticipating more, new and better. We put it through our HTML5 test wringer, and were pleased to find that the PlayBook 2.0 browser is an excellent upgrade, adding new features and upgraded performance in several areas. Notably, it features the first HTML5 color picker input type that we&apos;ve seen on mobile, advanced SVG filters as well as a perfect Acid 3 score.
        </description>
        <link>http://www.sencha.com/blog/html5-scorecard-rim-blackberry-playbook-2/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright" src="http://cdn.sencha.io/img/20120426-blackberry-playbook-sm.jpg" alt="20120426-blackberry-playbook-sm" width="280" height="326"> Last month, RIM released OS 2.0 for the BlackBerry PlayBook. We were already very impressed with the PlayBook 1.0 browser, and we were anticipating more, new and better. We put it through our HTML5 test wringer, and were pleased to find that the PlayBook 2.0 browser is an excellent upgrade, adding new features and upgraded performance in several areas. Notably, it features the first HTML5 color picker input type that we&#8217;ve seen on mobile, advanced SVG filters as well as a perfect Acid 3 score.</p>

<p>The original Blackberry PlayBook browser, released this time last year, was already a very solid HTML5 browser. In our original <a href="http://www.sencha.com/blog/blackberry-playbook-the-html5-developer-scorecard/">PlayBook HTML5 scorecard</a>, we noted that it was far superior to the Android 3 browser and overall, an excellent HTML5 platform. We were particularly impressed with the quality of its SVG, Canvas and CSS3 Animation implementations. In this review, we&#8217;ll mostly concentrate on what&#8217;s new and improved.</p>

<blockquote class="pullquote right">
    <p><span>&#8220;</span>In our original BlackBerry PlayBook HTML5 scorecard, we noted that it was far superior to the Android 3 browser and overall, an excellent HTML5 platform.&#8221;</p>
</blockquote>

<p>Our HTML5 scorecard consists of a series of tests aimed to help mobile web developers understand new devices and new form factors as they come to market. We test in an number of areas, namely JavaScript performance, HTML5/CSS3 features, rendering performance and rendering accuracy. We also use a variety of homegrown and third party test-sites, including Modernizr, Acid3, and our own Sencha Animator demos and Sencha Touch Kitchen Sink.</p>

<h3>Device Essentials</h3>

<p>But first up, some essentials for the web developer. If you&#8217;re looking for traffic from the PlayBook OS 2, search for the following user agent string:</p>

<pre><code>Mozilla/5.0 (PlayBook; U; RIM tablet  OS 2.0.0; en-US) Apple/Webkit/535.1+ (KHTML, like Gecko) Version/7.2.0.0 Safari/535.1)
</code></pre>

<p>The PlayBook OS 2 supports up to 4 simultaneous touches, so interactions that rely on two simultaneous pinch/zooms are possible.</p>

<p>Next, JavaScript timer resolution. We&#8217;ve been looking at timer resolution on mobile lately and it can vary widely by device. For example, iOS 5.1 currently has a 4ms timer resolution with high consistency, Android 4 has a 10ms timer with low consistency. In contrast, the PlayBook 2.0 appears to have a 17ms timer. This means that script animations paced by a <code>setTimeout()</code> loop will run about 4x slower on the PlayBook 2 by default; a good reason to use explicit time in your web animations whether via JavaScript or time-based CSS3 animation. The PlayBook 2 browser doesn&#8217;t yet support the relatively new requestAnimationFrame API. For developers looking to use requestAnimationFrame cross-browser, we suggest that you use a polyfill to get the advantages of requestAnimationFrame when you can.</p>

<p><figure class="aligncenter">
    <img src="http://src.sencha.io/636/http://cdn.sencha.io/img/20120426-blackberry-playbook-acid3.png" alt="Perfect 100/100 Acid3 Test in the BlackBerry PlayBook OS 2 browser">
    <figcaption>Perfect 100/100 Acid3 Test in the BlackBerry PlayBook OS 2 browser</figcaption>
</figure></p>

<h3>Acid3 and Feature Detection</h3>

<p>Just like the original PlayBook, the PlayBook OS 2 has a perfect Acid 3 score, with no rendering artifacts. Our favorite modernizr check sites, <a href="http://haz.io">haz.io</a> and HTML5Test report a very complete set of HTML5 features, including 3D transforms, HTML5 audio and video, web sockets, workers, web intents, SMIL, SVG and WebGL. What&#8217;s particularly nice to see is an almost complete implementation of HTML5 input types such as color picker and time.</p>

<p>Some minor missing features from the modernizr feature check: File API support, background-repeat, and IndexedDB. Since the only implementation of IndexedDB on major mobile platforms is the beta of Chrome for Android, this is not a very surprising omission (and WebSQL is still available anyway).</p>

<p>However, as we&#8217;ve noted before, just because a feature is detected, it doesn&#8217;t mean it&#8217;s working. WebGL, for example, won&#8217;t execute in a normal browser page on the PlayBook OS 2, and only activates when used in a WebWorks hybrid application. Similarly, some of the HTML5 input elements exist but you probably wouldn&#8217;t use them in their default style. For example, the time input has the unsettling habit of rewinding back to 0 when you spin past the highest value rather than looping. The color picker, while functional, is probably too spartan for use in a consumer application.</p>

<p><figure class="aligncenter">
    <img src="http://src.sencha.io/636/http://cdn.sencha.io/img/20120426-blackberry-playbook-svg-filters.jpg" alt="SVG Filters in the BlackBerry PlayBook OS 2 browser">
    <figcaption>SVG Filters in the BlackBerry PlayBook OS 2 browser</figcaption>
</figure></p>

<h3>Graphics Performance</h3>

<p>In real world tests, Canvas and SVG performance was excellent, even on stressful demos like Canvas color cycle and the classic <a href="http://srufaculty.sru.edu/david.dailey/svg/balloon.svg">SVG floating balloon</a>. CSS Animation performance was equally excellent. The only graphics effect we could see missing was robust support for image slicing in <code>border-image</code>. But no WebKit browser supports this feature properly yet, with the exception of recent desktop Chromes. We&#8217;re happy to report that the PlayBook 2 also has an excellent implementation of advanced SVG filters&#8211;morphology, diffuse lighting, specular lighting, custom composition filters&#8211;they&#8217;re all here. As with desktop browsers, it&#8217;s not possible yet to animate filters at an acceptable FPS, but even having static filters of this sophistication is an amazing advance for web developers everywhere. Instagram-like image effects are now available for anyone with the two to three days it takes to learn the physics and syntax of SVG filters.</p>

<p>Here is a screenshot from the PlayBook 2.0 of a morphology filter (from <a href="http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_svg-filter-effects.htm">IE10&#8217;s SVG Filter demo page</a>.)</p>

<p>The code for this is simple:</p>

<pre><code>&lt;filter id="demo"&gt;
     &lt;feMorphology operator="dilate" radius ="4" /&gt;
 &lt;filter/&gt;
</code></pre>

<p>Just like in the original PlayBook, Sencha Animator CSS3 Animation demos work very well, handling multiple simultaneous animations smoothly and consistently.</p>

<p>We&#8217;re also happy to say that the PlayBook OS 2 has a rock solid implementation of <code>position: fixed</code>. Even with the fastest scrolling, we were unable to dislodge fixed content from its place on screen. <code>overflow: scroll</code> and <code>overflow: auto</code> also work smoothly (with one fingered scrolling vs. iOS&#8217;s two fingered scroll).</p>

<h3>Removal of Non-Standards Track Features</h3>

<p>A last note&#8211;in a move that&#8217;s guaranteed to make anti-prefixers happy, the PlayBook  OS 2 browser has removed support for <code>-webkit-mask</code>. CSS masks are very handy but have been hanging out as a WebKit only feature for nigh on four years. Although there is a new standards draft for filters and effects that aims to regularize this feature, since other engines do not appear to be on track to support the feature (Gecko wants you to use SVG masks instead), it&#8217;s probably a good idea to remove any critical dependencies on masks if you want your app to work cross platform in the future.</p>

<p><img class="alignright" src="http://src.sencha.io/636/http://cdn.sencha.io/img/20120426-blackberry-playbook-2-badge.png" alt="20120426-blackberry-playbook-2-badge" width="108" height="108"></p>

<h3>A Very Fine HTML5 Browser</h3>

<p>With the release of BlackBerry PlayBook OS 2, the RIM browser team once again delivers a high performance and up-to-date HTML5 platform for web app developers. For businesses that want to bet on a stable, state of the art device for HTML5 applications, the BlackBerry PlayBook with OS 2 is an excellent choice.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Thu, 26 Apr 2012 17:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/html5-scorecard-rim-blackberry-playbook-2/#date:17:00</guid>
        </item>
        
        <item>
        <title>Ext JS 4.1 Final Released</title>
        <author>Don Griffin</author>
        <description>
            It is with pleasure that we announce today the general availability of Ext JS 4.1. This release represents a significant step forward for performance of Ext JS 4 as well as several new features and numerous other improvements.
        </description>
        <link>http://www.sencha.com/blog/ext-js-4-1-final-released/</link>
        <content:encoded>
            <![CDATA[
                <figure class="aligncenter" style="position:relative;">
    <img src="http://cdn.sencha.io/img/20120423-extjs-41-hero-blog.png" width="636" height="367">
    <img class="alignright rounded shadow" src="http://img1.sencha.com/files/misc/whats-new-ext-js-4-1.jpg" alt="What's New in Ext JS 4.1" width="125" height="94" style="position: absolute; bottom: 0; right: 100px;">
</figure> 

<p>It is with pleasure that we announce today the general availability of Ext JS 4.1. This release represents a significant step forward for the performance of Ext JS 4, including several new features and numerous other improvements. With the three betas and the three RCs, we’re also extremely thankful to the community members who have helped us with bug reports, forum posts, emails, tweets, and field testing on production applications to make this a huge step forward for Ext JS!</p>

<p class="button-group"> 
    <a class="button-link inline small arrow" href="http://www.sencha.com/products/extjs/download/" title="Download Ext JS 4.1"><span>Download Ext JS 4.1</span></a>
    <a class="button-link inline small blue" href="http://docs.sencha.com/ext-js/4-1/#!/guide/upgrade_41" title="Download Ext JS 4.1"><span>Ext JS 4.1 Upgrade Guide</span></a>  
</p> 

<h3>Performance</h3>
This release focused primarily on improving performance of the rendering and layout processes. On our test applications and community contributed tests, we're seeing anywhere from a 30% to a 100% improvement in end-to-end display time. The new bulk rendering mechanism allows us to render the right markup initially and avoid expensive manipulations of the resulting DOM elements. The new layout engine is designed to minimize the number of costly browser reflows required to layout components and containers.

While many other, smaller, optimizations made it into this release as well, the focus of the release was on layout and DOM performance optimizations. We’ll continue working on further performance improvements in subsequent releases, and we’re always open to your input in the forums to see what areas you think need our attention next.

<h3>Grid</h3>
The return of native scrolling for grids has been covered previously so I won’t go into that further. The many improvements to infinite/buffered scrolling will be great news for applications with <a href="http://www.sencha.com/blog/optimizing-ext-js-4-1-based-applications/">large data sets</a>. For grids that use the “locking” feature, many other features now work properly on the locked and unlocked sides of the grid.

<h3>Layouts</h3>
<p>Most of the work on layouts has been to make them faster by avoiding browser reflows. In the process, however, most layouts benefited from the refactor in other ways. Most notably, the “border” layout’s new features have been <a href="http://www.sencha.com/blog/whats-new-in-ext-js-4-1/">covered</a> previously. In addition, the width shrink-wrapping that used to be handled by specialized components (e.g., tooltip or menu) is now properly handled by the core layouts. Not only did this change make those use-cases much more efficient (by avoiding repeated layouts), but now this functionality is more generally available in your applications.</p>


<h3>Core</h3>
<p>There have also been significant improvements in XTemplates and overrides. Much of this has been <a href="http://www.sencha.com/blog/whats-new-in-ext-js-4-1/">covered</a> before; however, <tt>Ext.override</tt> has also gained a new bit of useful functionality: it can now override instance methods (e.g., on a singleton), allowing the overridden methods to be called using the standard callParent method.</p>

<p>Another handy addition to event listeners is that the use of method names (rather than function references) is now supported. For example:</p>
<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">listeners<span class="sy0">:</span> <span class="br0">&#123;</span>
    click<span class="sy0">:</span> <span class="st0">'onClick'</span><span class="sy0">,</span>
    change<span class="sy0">:</span> <span class="st0">'onChange'</span><span class="sy0">,</span>
    scope<span class="sy0">:</span> someObject
<span class="br0">&#125;</span></pre>

<p>In previous versions, the above would have looked like this (which is, of course, still valid):</p>
<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">listeners<span class="sy0">:</span> <span class="br0">&#123;</span>
    click<span class="sy0">:</span> someObject.<span class="me1">onClick</span><span class="sy0">,</span>
    change<span class="sy0">:</span> someObject.<span class="me1">onChange</span><span class="sy0">,</span>
    scope<span class="sy0">:</span> someObject
<span class="br0">&#125;</span></pre>

<p>The use of method names gives better diagnostic messages in development mode for missing methods.</p>

<h3>Tooling</h3>
<p>We’re also excited to release alongside Ext JS 4.1 the new release of the SDK Tools, Beta 3. The new version of the SDK Tools is required to generate images for custom themes using Ext JS 4.1. This same version of the SDK Tools is also compatible with the latest release of Sencha Touch 2.</p>

<p>Included in the example folder of the Ext JS 4.1 download is a web page-based tool called the Page Analyzer. This has been <a href="http://www.sencha.com/blog/optimizing-ext-js-4-1-based-applications/">covered</a> as well, but its use is highly recommended to get the best performance out of Ext JS 4.1. It is also invaluable for diagnosing layout problems.</p>

<h3>Docs and Guides</h3>
<p>Of course, the documentation center has been updated to use Ext JS 4.1! In addition, there is new content important for moving to the new release. There is a new Optimization Guide based on the related <a href="http://www.sencha.com/blog/optimizing-ext-js-4-1-based-applications/">blog post</a> and <a href="http://vimeo.com/37636229">webinar</a>. Reference it for the latest advice on tuning your applications for best performance. There is also an Upgrade Guide covering the API changes that will likely impact your move to Ext JS 4.1.</p>

<h3>Conclusion</h3>
<p>Ext JS 4.1 brings significant improvement to your applications, and we are investing heavily in exceeding our customer's usability and performance expectations.</p>
<p>We want to take this moment to reiterate our commitment to our customers on various versions of Ext JS. We <a href="http://www.sencha.com/blog/sencha-company-update">blogged</a> about extending support of Ext JS 3 for 12 months beyond the next major release after Ext JS 4, and support subscribers will continue to receive patch updates for Ext JS 3.4.x, including support for IE 10.</p>
<p>We are very excited about Ext JS 4.1 and are looking forward to your feedback. Go to the <a href="http://www.sencha.com/forum/forumdisplay.php?79-Ext-JS-Community-Forums-4.x">forum</a> and let us and the rest of the community know about your experience with Ext JS 4.1!</p>

<p class="button-group"> 
    <a class="button-link inline small arrow" href="http://www.sencha.com/products/extjs/download/" title="Download Ext JS 4.1"><span>Download Ext JS 4.1</span></a>
    <a class="button-link inline small blue" href="http://docs.sencha.com/ext-js/4-1/#!/guide/upgrade" title="Download Ext JS 4.1"><span>Ext JS 4.1 Upgrade Guide</span></a>  
</p> 
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 24 Apr 2012 17:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/ext-js-4-1-final-released/#date:17:00</guid>
        </item>
        
        <item>
        <title>Introducing Sencha Architect 2: A Massive Upgrade of Ext Designer</title>
        <author>Luca Candela</author>
        <description>
            It is our pleasure to introduce the all&#45;new Sencha Architect 2, building on our innovation in Ext Designer. When we started working on the next release of Ext Designer, we had very ambitious goals: we wanted to build a great visual tool to help you build web applications faster that didn’t get in your way. Take a look at how far we&apos;ve come.
        </description>
        <link>http://www.sencha.com/blog/sencha-architect-html5-app-builder-for-touch-and-ext-js/</link>
        <content:encoded>
            <![CDATA[
                <p><figure class="aligncenter">
<img src="http://cdn.sencha.io/img/20120417-architect-2-hero-blog.jpg" width="636" height="333">
<figcaption>Sencha Architect 2.0 builds on our innovation in Ext Designer. Now, you can build Touch and Ext JS apps through drag and drop. Available for Mac, Windows, and Linux. <a class="more-icon" href="http://www.sencha.com/products/architect/">Download Sencha Architect 2</a></figcaption>
</figure></p>

<p>When we started working on the next release of Ext Designer, we had very ambitious goals: we wanted to build a great visual tool to help you build web applications faster that didn’t get in the way. We wanted to make the development process more inclusive by lowering the barrier to collaborate, allowing UX designers to work effectively in the same environment that you use.</p>

<p>We wanted you to be able to create complete applications &#8211; not just the UI. We wanted a tool that would let you build an application quickly out of standard components, but also allow you to easily customize those components with your own code, right from within the tool.</p>

<p>What we created is no longer just a rapid interface designer, but a complete application builder, a place where the architecture <em>and</em> the interface of an application can be created and properly structured for development.</p>

<p>For this reason, the name “Designer” no longer accurately captured what the product enabled: it’s now much, much more than a simple UI designer. And so, it is our pleasure to introduce the <strong><a href="http://www.sencha.com/products/architect/">all-new Sencha Architect 2</a></strong>.</p>

<h3>Sencha Architect 2: What&#8217;s Changed, What’s New</h3>

<h4>A tool that works the way you do.</h4>

<p><figure class="alignright"></p>

<iframe src="http://player.vimeo.com/video/40480556" width="300" height="169" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

<p><figcaption><a href="http://vimeo.com/40480556" class="more-icon">Click to watch our launch video</a></figcaption>
</figure></p>

<p><figure class="alignright">
</figure></p>

<p>The foundational concept behind Architect 2 is simple: a visual app building tool that creates code as clean and well structured as the code that a Lead Architect at Sencha would write by hand. Architect 2 is visual where it makes sense, but also gets out of your way when you need to dive into code.</p>

<p>This philosophy led to the creation of a tool that lets you iterate solutions with very low overhead and with instant visual feedback; all assisted by inline documentation and quick links to the API reference.</p>

<p>But the best part is that it’s a tool where experimentation is safe. All code generated by Architect is guaranteed to work out of the box. You can’t arrange components in a way that will break the frameworks’ conventions. There’s also a wealth of new features that makes the experience of creating apps a lot more enjoyable and immediate.</p>

<h4>The hub of all activity: the Project Inspector</h4>

<p><img class="alignright" src="http://cdn.sencha.io/img/20120417-project-inspector.png" alt="Sencha Architect project inspector" height="300" width="200"></p>

<p>The Project Inspector has been greatly enhanced to show views, controllers, models, and stores all in one place, along with information about the project’s structure. All components and their relationships are right there, where you can see and analyze them.</p>

<h4>Framework Support &amp; Creation Tools</h4>

<p>Architect can create applications for Ext JS 4 and Sencha Touch 2. The Toolbox has been improved dramatically to make the richness of both frameworks more accessible. Categories now make searching for a component quicker, and it’s possible to create new groups of components for your personal workflow.</p>

<p>Architect also includes a built-in JavaScript editor, so you can work on your code without switching back and forth between different tools, although it’s still easy to switch between Architect and your favorite IDE.</p>

<h4>In-line Documentation</h4>

<p>Now every component, property and configuration comes with handy inline documentation, and if you need more, there are quick links to go deep into the API reference. The documentation is available as a part of the main UI, and appears as tool-tips and hovers as you need it.</p>

<h4>Source Control-Friendly File Format</h4>

<p>Architect 2 projects are easier to manage and track via source control. The single file archive we had in Ext Designer 1 has been replaced by a file for each view, model, and store. This decision was intended to make it easier to work on a project where more than a single developer is involved.</p>

<h4>Native Mobile Packaging &amp; iOS Simulation</h4>

<p>You can now package applications for iOS and Android directly from Architect 2. Using technology we released with Sencha Touch 2, Architect lets you take a finished application and get it ready for deployment on a mobile device quickly and easily. And if you’re on OS X and you have Xcode 4 installed, Architect starts the iOS simulator for you and loads your application automatically.</p>

<p><figure class="aligncenter">
<a class="lightbox" href="http://cdn.sencha.io/img/20120417-architect-ui-feature.png"><img src="http://cdn.sencha.io/img/20120417-architect-ui-feature.png" width="636" height="350"></a>
<figcaption><a class="more-icon" href="http://cdn.sencha.io/img/20120417-architect-ui-feature.png">Click to explore the user interface of Sencha Architect 2</a></figcaption>
</figure></p>

<h4>A Better UX to Make Development Fun</h4>

<p>Several weeks ago, we asked for volunteers to help user-test our beta version. Thanks to their help and our extensive set of usability studies, we were able to zero in on the biggest user experience issues and to design better solutions for commonly performed tasks.</p>

<p>Here are just a few of the user experience improvements we made. We added a highlight for new components that are added to the Project Inspector: this helps you see where the component is added in the hierarchy. We added a toggle to the property panel that lets you switch between commonly used configurations vs. the comprehensive set. We also enhanced our component icons to improve readability. These were just a few of a long list of detail improvements.</p>

<p>Countless hours went into making Architect 2 a beautiful and easy to use application. User experience is never complete but we know you will notice right away how our new process has made the tool as easy to use as it is powerful.</p>

<h4>We couldn’t have done it without you&#8230;</h4>

<p>On top of our formal user studies, we want to say thank you to our community for helping and guiding us with their constant feedback: first with the private beta program for SenchaCon 2011 attendees (it rocked to meet you in person in Austin!) to the later open beta. Your suggestions and questions helped make Architect 2 what it is today.</p>

<p>We also want to thank you for your patience and your incredibly insightful comments, and we ask you to keep it up: Architect 2 will be evolving over the course of 2012 and we need your continued support and feedback to make all the things we have dreamed during the last months a reality.</p>

<p>Keep asking for new features, keep reporting bugs, keep showing us your examples.</p>

<p><figure class="aligncenter">
  <img src="http://cdn.sencha.io/img/20120417-architect-team.jpg" alt="" height="358" width="636">
  <figcaption>Sencha Architect team members; (left to right) Aaron Conran, Luca Candela, David Foelber, Katherine Chu</figcaption>
</figure></p>

<h3>Getting Started with Sencha Architect 2</h3>

<p>This version of Architect ships with a significant number of <a href="http://cdn.sencha.io/architect/architect-examples.zip">examples</a> for Ext JS 4 and Sencha Touch 2 alike. We have re-created a few of the frameworks’ demos in Architect 2 including GeoCongress and the Feed Reader, and it’s all available from Architect&#8217;s product page (close to the bottom). Just unzip it and open the .xda files to see great examples of entire applications.</p>

<p>The <a href="http://docs.sencha.com/architect/2-0/">online documentation</a> is also a significant step forward. All our technical docs are now hosted online, just like the API docs, which makes them easier to search and easier to keep updated. While the docs are already much better, we are committed to improve them and expand them significantly over time. Please let us know where you find the current documentation lacking or unclear, and we will concentrate our efforts where it’s most useful.</p>

<p>We also want to let you know that, if you have an example you are particularly proud of, and you want to share it with the community, submit it to the dev team for inclusion with the set that comes with Architect 2: if we like it, we’ll add it to the downloadable package and of course give you credit in the notes. It’s your chance to shine, don’t miss out on it!</p>

<h3>Pricing &amp; Availability</h3>

<p>Individual copies of Sencha Architect 2 cost $399, with discounts for 5 and 20 packs. If you are upgrading from an old copy of Ext Designer 1, please read the following carefully:</p>

<ul>
<li>If you bought Ext Designer 1.0 after January 1st, 2012, you’re already entitled to Sencha Architect 2! Your license will be sent shortly to your email address, but in case it doesn’t after a few days for any reason (typos, spam filters, etc) please contact <a href="mailto:designer.upgrade@sencha.com?Subject=Architect%20License">designer.upgrade@sencha.com</a> and we will take care of everything for you.</li>
<li>If you purchased an Ext Designer 1.x license prior to January 1st, 2012, you can upgrade to Architect 2 for $279 in our online store.</li>
</ul>

<p>Please note that Sencha Complete includes Architect 2, and remains priced at $995. So, go ahead, buy Sencha Architect 2 from the <a href="http://www.sencha.com/store">Sencha Store</a>, or <a href="http://www.sencha.com/products/architect">download the trial</a> and share your experiences with us!</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 17 Apr 2012 10:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/sencha-architect-html5-app-builder-for-touch-and-ext-js/#date:10:00</guid>
        </item>
        
        <item>
        <title>Building SharePoint Web Apps using Sencha Touch</title>
        <author>Luc Stakenborg</author>
        <description>
            In this post we will explore how to build a SharePoint mobile web app using the Sencha Touch mobile JavaScript framework for HTML5 apps.
        </description>
        <link>http://www.sencha.com/blog/building-sharepoint-web-apps-using-sencha-touch/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright rounded shadow" src="http://img1.sencha.com/files/misc/sharepoint-thumb.png" alt="Building SharePoint Web Apps using Sencha Touch" height="180" width="240"> In this post we will explore how to build a SharePoint mobile web app using Sencha Touch, a great mobile JavaScript framework for building HTML5 apps. SharePoint 2010 is a very comprehensive platform, but mobile support is fairly limited. Although it is technically possible to customize the mobile user interface on the server side, this is not allowed in cloud-based SharePoint (e.g. in Office365).</p>

	<p>An alternative approach is to build a web app where the UI is generated in the browser and connects to one of the SharePoint <span class="caps">API</span>s to access data stored in SharePoint. SharePoint 2010 offers three data <span class="caps">API</span>s which can be used in web apps:</p>

	<ul>
		<li>SP Web Services (<span class="caps">SOAP</span>)</li>
		<li><span class="caps">REST</span> (ListData.svc)</li>
		<li><span class="caps">CSOM</span> (Client Side Object Model)</li>
	</ul>

	<p>Although each of the <span class="caps">API</span>s offer a distinct set of capabilities, the <span class="caps">REST</span> interface is simple and lightweight and I prefer this for mobile use. The SharePoint <span class="caps">REST</span> interface offers full <span class="caps">CRUD</span> access to items in SharePoint lists and libraries, which might be all that you need for your mobile web app.</p>

	<h3>Getting Started</h3>

	<p>Because of the Same Origin Policy, your html file must be served from the same domain as the SharePoint site you want to access. You can place your html file containing your app on the server file system or in a SharePoint document library (e.g. site assets).</p>

	<p>If you are using SharePoint Online (Office365), you will notice that when you select a .html file in a doc library, it is presented as a download, not opened in the browser. This is due to SharePoint settings which you are not allowed to change in SharePoint Online. As a workaround, simply use an <code>.aspx</code> file extension, instead of <code>.html</code>. This way, you can start your single page SharePoint application from a file in an asset library.</p>

	<p>So, to get going, you need to create an <code>app.aspx</code> file to include all the <span class="caps">CSS</span> and JavaScript for your Sencha Touch app.</p>

 <style><!-- GeSHi could not find the language {LANGUAGE} (using path {PATH}) --></style><pre class="html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
    &lt;title&gt;SharePoint web app example&lt;/title&gt;
       &lt;link rel=&quot;stylesheet&quot; href=&quot;sencha-touch.css&quot; type=&quot;text/css&quot; /&gt;
       &lt;link rel=&quot;stylesheet&quot; href=&quot;app.css&quot; type=&quot;text/css&quot; /&gt;
       &lt;script src=&quot;sencha-touch.js&quot;&gt;&lt;/script&gt;
       &lt;script src=&quot;app.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>

	<p>The <code>app.js</code> file contains the basic Sencha Touch start-up and shows an alert:</p>

 <style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="kw2">new</span> Ext.<span class="me1">Application</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
  launch<span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    Ext.<span class="me1">Msg</span>.<span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">'Hello world'</span><span class="sy0">,</span> <span class="st0">'Ready for action!'</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>

	<p>You can put these files in any SP doc library. Let’s assume you have put this file in the Site Assets library of a SP site called demo:</p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/image1.png" alt="image" width="575" height="484"></p>

	<p>Now you can open up the following url on your iPhone or Android device:</p>

<pre><code>http://[[SPserver]]/demo/siteassets/app.aspx</code></pre>

	<p>After logon, you will see the following result:</p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/img_07241.png" alt="IMG_0724" width="324" height="484"></p>

	<p>Not quite what we expected&#8230; SharePoint has detected that we accessed the page with a mobile device and responds with the default mobile UI. You can suppress the default mobile UI by appending <code>?mobile=0</code> to the url.</p>

	<p>So, let’s try: <code>http://[[SPserver]]/demo/siteassets/app.aspx</code><span style="color:#ff0000;"><code>?mobile=0</code></span></p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/img_07251.png" alt="IMG_0725" width="324" height="484"></p>

	<p>Yes! We now have a Sencha Touch web app running off a SharePoint server.</p>

	<h3>OData proxy</h3>

	<p>The next step is to connect Sencha Touch models and stores to SharePoint items and lists through the <span class="caps">REST</span> interface using the <a href="http://www.odata.org/">OData protocol</a>. For this, you will need an OData proxy. I developed an OData proxy as an Ext user extension. It is designed to access SharePoint data using the SharePoint ListData.svc <span class="caps">REST</span> service which is based on <a href="http://www.odata.org">OData</a>. You may use it for other OData sources.</p>

	<p>You can find the <a href="https://github.com/lstak/SharePoint-proxy-for-Sencha-Touch">OData SharePoint proxy for Sencha Touch on GitHub</a>.</p>

	<p>Ext.ux.ODataProxy features:</p>

 <ul>
 <li>create, read, update and delete SharePoint items as Sencha Touch models</li>
 <li>fetch multiple items from a SharePoint list in a Sencha Touch store</li>
 <li><span class="caps">JSON</span> payloads</li>
 <li>partial updates: only changed attributes are sent to the server during an update</li>
 <li>fixes issues in Sencha Touch data Model implementation (e.g. missing destroy() method)</li>
 </ul>

	<p>Let’s look at some examples of how you can use the SharePoint proxy. In these examples, we will assume you have a subsite ‘/teamsite’ in which you have created a Contacts list based on the standard Contacts list template.</p>

	<p>First, we need to define the Model.</p>

 <style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="kw2">var</span> Contact <span class="sy0">=</span> Ext.<span class="me1">regModel</span><span class="br0">&#40;</span><span class="st0">'Contact'</span><span class="sy0">,</span> <span class="br0">&#123;</span>
  fields<span class="sy0">:</span> <span class="br0">&#91;</span>
      <span class="co1">// please note CamelCase convention for SharePoint column names</span>
      <span class="br0">&#123;</span> <span class="kw3">name</span><span class="sy0">:</span> <span class="st0">'Id'</span><span class="sy0">,</span> type<span class="sy0">:</span> <span class="st0">'int'</span> <span class="br0">&#125;</span><span class="sy0">,</span>
      <span class="st0">'LastName'</span><span class="sy0">,</span>
      <span class="st0">'FirstName'</span>
    <span class="br0">&#93;</span><span class="sy0">,</span>
&nbsp;
  idProperty<span class="sy0">:</span> <span class="st0">'Id'</span><span class="sy0">,</span>
&nbsp;
  proxy<span class="sy0">:</span> <span class="br0">&#123;</span>
    <span class="co1">// use the special odata proxy defined in odataproxy.js</span>
    type<span class="sy0">:</span> <span class="st0">'odata'</span><span class="sy0">,</span>
&nbsp;
    <span class="co1">// the proxy will connect to the List</span>
    <span class="co1">// named 'Contacts' in the /teamsite subsite</span>
    url<span class="sy0">:</span> <span class="st0">'/teamsite/_vti_bin/ListData.svc/Contacts'</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>

	<p>We can now use the following <span class="caps">CRUD</span> operations on the Contact data model:</p>

 <style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"> <span class="co1">// Create an instance</span>
 <span class="kw2">var</span> contact <span class="sy0">=</span> <span class="kw2">new</span> Contact<span class="br0">&#40;</span><span class="br0">&#123;</span> LastName<span class="sy0">:</span> <span class="st0">'Johnson'</span><span class="sy0">,</span> FirstName<span class="sy0">:</span> <span class="st0">'Al'</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>
 contact.<span class="me1">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 …
&nbsp;
 <span class="co1">// Read an instance from the server by id</span>
 <span class="kw2">var</span> id <span class="sy0">=</span> <span class="nu0">200</span><span class="sy0">;</span>
 Contact.<span class="me1">load</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="sy0">;</span>
 …
&nbsp;
 <span class="co1">// Update an instance, loaded from the server</span>
 Contact.<span class="me1">load</span><span class="br0">&#40;</span>id<span class="sy0">,</span> <span class="br0">&#123;</span>
     success<span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span>contact<span class="br0">&#41;</span> <span class="br0">&#123;</span>
         contact.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&quot;LastName&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Maxwell&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
         contact.<span class="me1">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
     <span class="br0">&#125;</span>
 <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 …
&nbsp;
 <span class="co1">// Delete an instance</span>
 Contact.<span class="me1">load</span><span class="br0">&#40;</span>id<span class="sy0">,</span> <span class="br0">&#123;</span>
     success<span class="sy0">:</span> <span class="kw2">function</span> <span class="br0">&#40;</span>contact<span class="br0">&#41;</span> <span class="br0">&#123;</span>
         contact.<span class="me1">destroy</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
     <span class="br0">&#125;</span>
 <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 …</pre>

	<p>Using the Contact model, you can now easily define a Store to fetch multiple items:</p>

 <style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="kw2">var</span> store <span class="sy0">=</span> <span class="kw2">new</span> Ext.<span class="me1">data</span>.<span class="me1">Store</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    model<span class="sy0">:</span> <span class="st0">'Contact'</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
store.<span class="me1">load</span><span class="br0">&#40;</span><span class="br0">&#41;</span></pre>

	<h3>Build Your Application</h3>

	<p>Using the odata proxy to configure your Models and Stores that connect to the SharePoint server, you can develop your app further just like any other Sencha Touch app. Check out the tutorials on <a href="http://www.sencha.com">Sencha.com</a> for more info.</p>

	<p>I will conclude with an example of a contact list through the normal SharePoint UI and through a Sencha Touch app:</p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/image152.png" alt="image" width="484" height="372"></p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/img_07431.png" alt="image" width="324" height="484"></p>

	<p>Just as easily, you can expose the content of document libraries:</p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/image18.png" alt="image" width="429" height="328"></p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/img_07441.png" alt="image" width="324" height="484"></p>

	<h3>Live Demo</h3>

	<p>A live demo is available at <a href="http://oxida.sharepoint.com/demo">http://oxida.sharepoint.com/demo</a>. You can open the mobile web app and also explore the content of the SharePoint site with a desktop browser.</p>

	<p><img class="aligncenter" src="http://allthatjs.files.wordpress.com/2012/01/image6.png" alt="image" width="611" height="484"></p>

	<p>Sencha Touch and SharePoint are a great combination and open up exciting new opportunities for companies using SharePoint. Give it a try!</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 10 Apr 2012 17:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/building-sharepoint-web-apps-using-sencha-touch/#date:17:00</guid>
        </item>
        
        <item>
        <title>Sencha On The Road: Upcoming Events in Q2 2012</title>
        <author>Jessica Liu</author>
        <description>
            We&apos;re excited to meet you in person at one of our upcoming events this quarter! Stop by our booth for a demo, or attend one of our sessions to learn more about Sencha. We hope to see you!
        </description>
        <link>http://www.sencha.com/blog/sencha-on-the-road-upcoming-events-q2-2012/</link>
        <content:encoded>
            <![CDATA[
                <p>We&#8217;re excited to meet you in person at one of our upcoming events this quarter! Stop by our booth for a demo, or attend one of our sessions to learn more about Sencha. We hope to see you!</p>

	<h3>360|Flex</h3>

	<p><strong>April 15-18, Denver, CO</strong><br />
<a href="http://www.360flex.com/"><img src="http://img1.sencha.com/files/misc/360flex.jpeg" alt="360|Flex" width="100" class="alignright" /></a>360|Flex has quickly become <span class="caps">THE</span> conference for Flex/AIR/ActionScript developers to attend to connect with the community, learn from the Adobe Engineers, as well as community experts, and get the deepest, most technical understanding of Flex and what’s coming for Flex, anywhere.</p>

	<p><a href="http://www.360flex.com/" class="more-icon">Learn more about 360|Flex</a></p>

	<h3>Devoxx</h3>

	<p><strong>April 18-20, Paris, France</strong><br />
<a href="http://www.devoxx.com/"><img src="http://img1.sencha.com/files/misc/DV11.png" alt="Devoxx France" width="150" class="alignright" /></a>Devoxx France is a conference for Developers organized by the Paris <span class="caps">JUG</span> team in Paris, France. With 25% talks in English and 75% talks in French, we will however propose top quality speakers for English speaking attendees. The conference takes place in central Paris, from the 18th to the 20th of April 2012, in the Marriott Hotel “Paris Rive gauche”</p>

	<p><a href="http://www.devoxx.com/" class="more-icon">Learn more about Devoxx</a></p>

	<h3><span class="caps">FITC</span> Toronto </h3>

	<p><strong>April 23-25, Toronto, Canada</strong><br />
<a href="http://www.fitc.ca/events/about/?event=124"><img src="http://img1.sencha.com/files/misc/fitc_logo_redspot_150.jpg" alt="FITC Toronto" width="150" class="alignright" /></a>The game has changed and <span class="caps">FITC</span> is on it! Featuring over 70 renowned digital creators from around the globe, <span class="caps">FITC</span> Toronto 2012 attendees will be privy to the knowledge of the best and brightest in the digital space. Covering everything from HTML5 to making digital art, this three day festival will leave attendees inspired to create in new and innovative ways. There will also be plenty of opportunities for networking at the legendary <span class="caps">FITC</span> parties and through chance encounters during the day – meet your next boss, business partner or employee.</p>

	<p><a href="http://www.fitc.ca/events/about/?event=124" class="more-icon">Learn more about <span class="caps">FITC</span> Toronto</a></p>

	<h3>DevCon5</h3>

	<p><strong>April 25, Santa Clara, CA</strong><br />
<a href="http://html5.tmcnet.com/conference/california/"><img src="http://img3.sencha.com/files/conferences/DevCon5.jpg" alt="DevCon5" width="150" class="alignright" /></a>DevCon5 provides you with the information and tools you need to exploit the capabilities of revolutionary HTML5 technology. Learn from Adobe, Microsoft, and other top names, while networking with your colleagues and community. Spend two days immersed in HTML5 topics, including; user experience design and security, building new business models for the Mobile Web, browser compatibility with HTML5 and more. Sessions are hands on and demonstrate how to write code that makes the user’s screen come alive.</p>

	<p>Prepare for the evolution to HTML5 <span class="caps">NOW</span>. Join fellow web developers, designers, and architects, as well as technology leaders and business strategists who will gather in California to learn strategies and tactics to implement and execute HTML5. DevCon5 is an HTML5 Designer’s and Developer’s Conference that assembles some of the premier thinkers and speakers on this new revolutionary technology.</p>

	<p><a href="http://html5.tmcnet.com/conference/california/" class="more-icon">Learn more about DevCon5</a></p>

	<h3>Adobe Camp Brazil</h3>

	<p><strong>April 27-28, Maceió, Alagoas, Brazil</strong><br />
<a href="http://events.actioncreations.com/adobecampbrasil2012/english/"><img src="http://img1.sencha.com/files/misc/adobe-camp-brazil.png" alt="Adobe Camp Brazil" width="150" class="alignright" /></a><br />
Adobe Camp Brazil 2012 will offer tracks in Development, Design and Digital Video. Held for the third time, the 2012 camp brings together some of the best professionals in the world to present and discuss the latest trends and innovations in the creative and technical space. As a pioneering event in the Brazil, we are inviting professionals and students from all over the world to learn from the best minds in the market. With full support and supervision from Adobe Systems <span class="caps">USA</span>, speakers at Adobe Camp Brazil include Adobe employees, creative directors, movie directors, designers, photographers, video makers, <span class="caps">CTO</span>s, and <span class="caps">CEO</span>s from Brazil, Europe and the United States. The event was considered the best Adobe Camp ever, and organizers are extremely excited to offer this event again in Brazil.</p>

	<p><a href="http://events.actioncreations.com/adobecampbrasil2012/english/" class="more-icon">Learn more about Adobe Camp Brazil</a></p>

	<h3>Joint Webinar with Macadamian</h3>

	<p><strong>May 2</strong><br />
Learn how Sencha Touch 2 helped Macadamian build their first version of <span class="caps">ARIA</span>, an oncology information system for Varian to run on an iPad.</p>

	<p>Join Dan Menard, Software Developer at Macadamian, Erwin Nell, Director of User Experience at Varian and Aditya Bansod, Senior Director of Product Management at Sencha as they discuss why they picked Sencha Touch and the implementation process. The group will discuss why Sencha Touch was the right choice, how to extend Sencha Touch to support the vast needs of a complex electronic medical record system, and how Sencha Touch 2 makes large-scale projects more manageable.</p>

	<p><a href="https://senchaevents.webex.com/senchaevents/onstage/g.php?t=a&amp;d=667068645" class="more-icon">Learn more about this webinar</a></p>

	<h3>Source DevCon</h3>

	<p><strong>May 2-5, 2012, London, UK</strong><br />
<a href="http://www.sourcedevcon.eu/"><img src="http://img1.sencha.com/files/misc/source2012.png" alt="Source DevCon" width="150" class="alignright" /></a>Join Platinum Sponsors, Sencha, in the magnificent London for 2012 SourceDevCon mobile and desktop web application conference. Built on the last year’s success story in Split, Croatia, Sourc&#123; will deliver three days of ultimate informational, educational, and fun experience in the beautiful Park Plaza Riverbank Hotel.</p>

	<p>As a Sencha community member, you’ll save 25% off the full conference rate of £799 by using the coupon code <strong>sencha</strong>, that’s a savings of more than £200 ($300). Conference attendees can also take advantage of special lodging rates at the venue, so get your tickets now!</p>

	<p><a href="http://www.sourcedevcon.eu/" class="more-icon">Learn more about Source DevCon</a></p>

	<h3>WebDU</h3>

	<p><strong>May 3-4, Sydney, Australia</strong><br />
<a href="http://www.webdu.com.au/"><img src="http://img1.sencha.com/files/misc/WebDU_2011.png" alt="WebDU" width="150" class="alignright" /></a>WebDU is the premier Asia Pacific Web Technology Conference taking place 3-4 May 2012 at Four Points Sheraton, Sydney Australia. This will be the tenth year the conference is being held and each year it has grown to be bigger and better, and its thanks to all our sponsors! There are three tiers of sponsorship available; Gold, Silver and Bronze. In addition, there are a variety of miscellaneous sponsorship opportunities to consider.</p>

	<p><a href="http://www.webdu.com.au/" class="more-icon">Learn more about WebDU</a></p>

	<h3>O&#8217;Reilly Fluent &#8211; JavaScript and Beyond</h3>

	<p><strong>May 29-31, San Francisco</strong><br />
<a href="http://fluentconf.com/fluent2012"><img src="http://img1.sencha.com/files/misc/fluent.png" alt="O'Reilly Fluent" width="150" class="alignright"/></a>The O’Reilly Fluent Conference is about everything JavaScript. If you’re developing for the Web, desktop, or mobile, knowing the ins and outs of JavaScript and related technologies is critical. Come to Fluent to learn from expert developers who are using JavaScript in all kinds of contexts, to do things that no one ever expected JavaScript could do, and do so well.</p>

	<p><a href="http://fluentconf.com/fluent2012/" class="more-icon">Learn more about O&#8217;Reilly Fluent</a></p>

	<h3>Dutch Mobile Conference</h3>

	<p><strong>June 7-9, Amsterdam, Netherlands</strong><br />
<a href="http://www.mobileconference.nl/"><img src="http://img6.sencha.com/files/logos/events/Unknown.jpg" alt="Dutch Mobile Conference" width="150" class="alignright" /></a>We are proud to announce the first edition of the Dutch Mobile Conference. A 3-day conference about technologies used for mobile websites and mobile web application development focussed on developers. The first day wil be packed with in-depth tutorials. On the other 2 days talks will be given on various subjects regarding mobile web development. Our aim is to deliver an awesome quality conference to inspire, inform and teach our visitors.</p>

	<p><a href="http://www.mobileconference.nl/" class="more-icon">Learn more about the Dutch Mobile Conference</a></p>

	<h3>Microsoft TechEd North America</h3>

	<p><strong>June 11-14, Orlando, FL</strong><br />
<a href="http://northamerica.msteched.com/"><img src="http://img1.sencha.com/files/misc/microsoft-teched-NA.png" alt="Microsoft TechEd North America" width="150" class="alignright" /></a>Celebrate 20 years of Microsoft TechEd North America! TechEd is Microsoft’s premier technology conference for IT professionals and developers, offering the most comprehensive technical education across Microsoft’s current and soon-to-be-released suite of products, solutions, tools, and services. Our four day event in Orlando, Florida offers hands-on learning, deep product exploration and countless opportunities to connect with a community of industry and Microsoft experts.</p>

	<p><a href="http://northamerica.msteched.com/" class="more-icon">Learn more about Microsoft TechEd North America</a></p>

	<h3>QCon New York</h3>

	<p><strong>June 18-20, New York, NY</strong><br />
<a href="http://www.qconnewyork.com/"><img src="http://img6.sencha.com/files/logos/events/logo_qcon.png" alt="QCon New York" width="150" class="alignright" /></a>QCon is a practitioner-driven conference designed for team leads, architects, and project management. The program includes two tutorial days led by over 80 industry experts and authors, and three days with 18 tracks and over 80 speakers covering a wide variety of relevant and exciting topics in software development today.</p>

	<p><a href="http://www.qconnewyork.com/" class="more-icon">Learn more about QCon New York</a></p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Fri, 06 Apr 2012 14:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/sencha-on-the-road-upcoming-events-q2-2012/#date:14:00</guid>
        </item>
        
        <item>
        <title>Ext GWT 3.0 State API</title>
        <author>Darrell Meyer</author>
        <description>
            The Ext GWT 3.0 State API provides the ability to persist state information. The API supports saving state data to different persistence providers. These include providers based on cookies and HTML5 local storage. The data are saved and retrieved as a map from string keys to string values.  State data are serialized to strings and deserialized to objects via the bean&#45;like interfaces of GWT AutoBeans. This data is retrieved asynchronously, and this allows for asynchronous providers such as those that communicate via RPC.
        </description>
        <link>http://www.sencha.com/blog/ext-gwt-3-0-state-api/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright shadow rounded" src="http://cdn.sencha.io/img/20120207-extgwt3-alt.jpg"> The Ext GWT 3.0 State API provides the ability to persist state information. The API supports saving state data to different persistence providers. These include providers based on cookies and HTML5 local storage.</p>

<p>The data is saved and retrieved as a map from string keys to string values.  State data is serialized to strings and deserialized to objects via the bean-like interfaces of GWT <code><a href="http://code.google.com/p/google-web-toolkit/wiki/AutoBean#GWT_AutoBean_framework">AutoBeans</a></code>. This data is retrieved asynchronously, and this allows for asynchronous providers such as those that communicate via RPC.</p>

<h3>Differences with Ext GWT 2.0</h3>
<p>With 2.0, Components work directly with the StateManager, restoring and saving state directly as part of the Component lifecycle. With 3.0, this functionality was moved out of Component and is now managed via state handlers (<code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/AbstractStateHandler.html">AbstractStateHandler</a></code>). 3.0 Component has two state related methods:

<ul>
  <li><code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/widget/core/client/Component.html#setStateful%28boolean%29">setStateful(boolean stateful)</a></code> - specifies if state should be enabled</li>
  <li><code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/widget/core/client/Component.html#setStateId%28java.lang.String%29">setStateId(String stateId)</a></code> - provides a unique id in which state data is keyed</li>
</ul>

<h3>StateManager & Providers</h3>

<img src="http://img1.sencha.com/files/misc/state.gif" alt="State API" height="374" width="650"  />

<p>The <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/StateManager.html">StateManager</a></code> is a singleton that delegates the action of saving and retrieving data to its <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/Provider.html">Provider</a></code>. Ext GWT ships with two concrete <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/Provider.html">Provider</a></code> implementations and an abstract base on which to build your own:</p>

<ul>
<li><code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/CookieProvider.html">CookieProvider</a></code></li>
<li><code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/HtmlStorageProvider.html">HtmlStorageProvider</a></code></li>
<li><code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/AbstractRpcProvider.html">AbstractRpcProvider</a></code></li>
</ul>

<h3>Window State Example</h3>

<p><strong>Example URL:</strong> <a href="http://staging.sencha.com:8080/examples-dev/#ExamplePlace:windowstate">http://staging.sencha.com:8080/examples-dev/#ExamplePlace:windowstate</a></p>

<p>This article demonstrates how to use the State API. We’ll create a new example that uses the State API to maintain state. In this example, <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/widget/core/client/Window.html">Window</a></code> components will remember their last size and position when closed. If a user returns to the example and opens a window, that window will be initialized to its previous size and position.</p>

<p>You can test the code by opening a window. Close the window after moving and resizing it. Then, refresh the browser and open the same window again. The size and position should match the window when it was last closed.</p>

<h4>Define Data Structure & AutoBeanFactory</h4>

<p>First, we’ll define the data we want to persist using these interfaces:</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">interface</span> <span style="color: #0000FF; font-weight: bold">ExampleAutoBeanFactory</span> <span style="color: #008000; font-weight: bold">extends</span> DefaultStateAutoBeanFactory <span style="color: #666666">{</span>

  AutoBean<span style="color: #666666">&lt;</span>WindowsState<span style="color: #666666">&gt;</span> windowsState<span style="color: #666666">();</span>

  AutoBean<span style="color: #666666">&lt;</span>WindowState<span style="color: #666666">&gt;</span> windowState<span style="color: #666666">();</span>

<span style="color: #666666">}</span></pre></div>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">static</span> <span style="color: #008000; font-weight: bold">interface</span> <span style="color: #0000FF; font-weight: bold">WindowState</span> <span style="color: #666666">{</span>

  <span style="color: #B00040">int</span> <span style="color: #0000FF">getHeight</span><span style="color: #666666">();</span>

  <span style="color: #B00040">int</span> <span style="color: #0000FF">getWidth</span><span style="color: #666666">();</span>

  <span style="color: #B00040">int</span> <span style="color: #0000FF">getX</span><span style="color: #666666">();</span>

  <span style="color: #B00040">int</span> <span style="color: #0000FF">getY</span><span style="color: #666666">();</span>

  <span style="color: #B00040">void</span> <span style="color: #0000FF">setHeight</span><span style="color: #666666">(</span><span style="color: #B00040">int</span> height<span style="color: #666666">);</span>

  <span style="color: #B00040">void</span> <span style="color: #0000FF">setWidth</span><span style="color: #666666">(</span><span style="color: #B00040">int</span> width<span style="color: #666666">);</span>

  <span style="color: #B00040">void</span> <span style="color: #0000FF">setX</span><span style="color: #666666">(</span><span style="color: #B00040">int</span> x<span style="color: #666666">);</span>

  <span style="color: #B00040">void</span> <span style="color: #0000FF">setY</span><span style="color: #666666">(</span><span style="color: #B00040">int</span> y<span style="color: #666666">);</span>

<span style="color: #666666">}</span></pre></div>

<p>The data will be a list of WindowState instances stored in a map. This map will be keyed by state ID. The state ID is a unique key given to each window in the example using the <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/widget/core/client/Component.html#setStateId%28java.lang.String%29">setStateId</a></code> method defined in <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/widget/core/client/Component.html">Component</a></code>.</p>

<p>Next, we define our AutoBean factory. Note that we subclass <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/DefaultStateAutoBeanFactory.html">DefaultStateAutoBeanFactory</a></code>. This is necessary to take advantage of the Ext GWT State code.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">interface</span> <span style="color: #0000FF; font-weight: bold">ExampleAutoBeanFactory</span> <span style="color: #008000; font-weight: bold">extends</span> DefaultStateAutoBeanFactory <span style="color: #666666">{</span>

  AutoBean<span style="color: #666666">&lt;</span>WindowsState<span style="color: #666666">&gt;</span> windowsState<span style="color: #666666">();</span>

  AutoBean<span style="color: #666666">&lt;</span>WindowState<span style="color: #666666">&gt;</span> windowState<span style="color: #666666">();</span>

<span style="color: #666666">}</span></pre></div>

<p>Now that we’ve defined our data and factory, we need to tell the StateManger code to use our AutoBean factory and not the Ext GWT default. We do this by setting the appropriate configuration property in our module XML file:</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">&lt;set-configuration-property</span> <span style="color: #7D9029">name=</span><span style="color: #BA2121">&quot;GXT.state.autoBeanFactory&quot;</span> <span style="color: #7D9029">value=</span><span style="color: #BA2121">&quot;com.sencha.gxt.explorer.client.misc.WindowStateExample.ExampleAutoBeanFactory&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span></pre></div>

<h4>State Handler</h4>

<p>Next, we create the class that will load and save our state information. This is done by subclassing <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/AbstractStateHandler.html">AbstractStateHandler</a></code>.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">class</span> <span style="color: #0000FF; font-weight: bold">StateExampleHandler</span> <span style="color: #008000; font-weight: bold">extends</span> AbstractStateHandler<span style="color: #666666">&lt;</span>WindowsState<span style="color: #666666">,</span> WindowStateExample<span style="color: #666666">&gt;</span> <span style="color: #666666">{</span>

  <span style="color: #008000; font-weight: bold">public</span> <span style="color: #0000FF">StateExampleHandler</span><span style="color: #666666">(</span>WindowStateExample example<span style="color: #666666">,</span> String key<span style="color: #666666">)</span> <span style="color: #666666">{</span>
    <span style="color: #008000; font-weight: bold">super</span><span style="color: #666666">(</span>WindowsState<span style="color: #666666">.</span><span style="color: #7D9029">class</span><span style="color: #666666">,</span> example<span style="color: #666666">,</span> key<span style="color: #666666">);</span>
  <span style="color: #666666">}</span>

  <span style="color: #AA22FF">@Override</span>
  <span style="color: #008000; font-weight: bold">public</span> <span style="color: #B00040">void</span> <span style="color: #0000FF">applyState</span><span style="color: #666666">()</span> <span style="color: #666666">{</span>
    Map<span style="color: #666666">&lt;</span>String<span style="color: #666666">,</span> WindowState<span style="color: #666666">&gt;</span> windows <span style="color: #666666">=</span> getState<span style="color: #666666">().</span><span style="color: #7D9029">getWindowState</span><span style="color: #666666">();</span>
    <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>windows <span style="color: #666666">==</span> <span style="color: #008000; font-weight: bold">null</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
      windows <span style="color: #666666">=</span> <span style="color: #008000; font-weight: bold">new</span> HashMap<span style="color: #666666">&lt;</span>String<span style="color: #666666">,</span> WindowState<span style="color: #666666">&gt;();</span>
      getState<span style="color: #666666">().</span><span style="color: #7D9029">setWindowState</span><span style="color: #666666">(</span>windows<span style="color: #666666">);</span>
    <span style="color: #666666">}</span>
  <span style="color: #666666">}</span>

<span style="color: #666666">}</span></pre></div>

<p>AbstractStateHandler has two type parameters. The first represents the AutoBean state type (<code>WindowState</code>). The second represents the target object that will use this state information (<code>WindowStateExample</code>).</p>

<p>When we instantiate the handler, we pass the target object and a key to identify the saved and retrieved state.</p>

<p>In the <code><a href="http://dev.sencha.com/deploy/gxt-3.0.0-rc2/javadoc/gxt/com/sencha/gxt/state/client/AbstractStateHandler.html#applyState%28%29">applyState</a></code> method, we simply ensure that we have our state map instantiated. We will retrieve the actual state and use it in other code.</p>

<p>State handlers supports 4 event types: <code>BeforeRestoreState</code>, <code>RestoreState</code>, <code>BeforeSaveState</code> and <code>SaveState</code>.</p>

<h4>Opening a Window</h4>

<p>Before a window is opened, we check to see if that window has any state information. If it does, we initialize the window before it is shown.</p>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">private</span> <span style="color: #B00040">void</span> <span style="color: #0000FF">onBeforeShowWindow</span><span style="color: #666666">(</span>Window window<span style="color: #666666">)</span> <span style="color: #666666">{</span>
  <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>stateHandler<span style="color: #666666">.</span><span style="color: #7D9029">getState</span><span style="color: #666666">()</span> <span style="color: #666666">!=</span> <span style="color: #008000; font-weight: bold">null</span> <span style="color: #666666">&amp;&amp;</span> stateHandler<span style="color: #666666">.</span><span style="color: #7D9029">getState</span><span style="color: #666666">().</span><span style="color: #7D9029">getWindowState</span><span style="color: #666666">()</span> <span style="color: #666666">!=</span> <span style="color: #008000; font-weight: bold">null</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
    String stateId <span style="color: #666666">=</span> window<span style="color: #666666">.</span><span style="color: #7D9029">getStateId</span><span style="color: #666666">();</span>
    WindowState state <span style="color: #666666">=</span> stateHandler<span style="color: #666666">.</span><span style="color: #7D9029">getState</span><span style="color: #666666">().</span><span style="color: #7D9029">getWindowState</span><span style="color: #666666">().</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span>stateId<span style="color: #666666">);</span>
    <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>state <span style="color: #666666">!=</span> <span style="color: #008000; font-weight: bold">null</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
      window<span style="color: #666666">.</span><span style="color: #7D9029">setPixelSize</span><span style="color: #666666">(</span>state<span style="color: #666666">.</span><span style="color: #7D9029">getWidth</span><span style="color: #666666">(),</span> state<span style="color: #666666">.</span><span style="color: #7D9029">getHeight</span><span style="color: #666666">());</span>
      window<span style="color: #666666">.</span><span style="color: #7D9029">setPagePosition</span><span style="color: #666666">(</span>state<span style="color: #666666">.</span><span style="color: #7D9029">getX</span><span style="color: #666666">(),</span> state<span style="color: #666666">.</span><span style="color: #7D9029">getY</span><span style="color: #666666">());</span>
    <span style="color: #666666">}</span>
  <span style="color: #666666">}</span>
<span style="color: #666666">}</span></pre></div>

<h4>Hiding a Window</h4>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">private</span> <span style="color: #B00040">void</span> <span style="color: #0000FF">onBeforeHideWindow</span><span style="color: #666666">(</span>Window window<span style="color: #666666">)</span> <span style="color: #666666">{</span>
  String stateId <span style="color: #666666">=</span> window<span style="color: #666666">.</span><span style="color: #7D9029">getStateId</span><span style="color: #666666">();</span>

  WindowsState state <span style="color: #666666">=</span> stateHandler<span style="color: #666666">.</span><span style="color: #7D9029">getState</span><span style="color: #666666">();</span>
  Map<span style="color: #666666">&lt;</span>String<span style="color: #666666">,</span> WindowState<span style="color: #666666">&gt;</span> windows <span style="color: #666666">=</span> state<span style="color: #666666">.</span><span style="color: #7D9029">getWindowState</span><span style="color: #666666">();</span>
  WindowState windowState <span style="color: #666666">=</span> windows<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span>stateId<span style="color: #666666">);</span>
  <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>windowState <span style="color: #666666">==</span> <span style="color: #008000; font-weight: bold">null</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
    windowState <span style="color: #666666">=</span> factory<span style="color: #666666">.</span><span style="color: #7D9029">windowState</span><span style="color: #666666">().</span><span style="color: #7D9029">as</span><span style="color: #666666">();</span>
    windows<span style="color: #666666">.</span><span style="color: #7D9029">put</span><span style="color: #666666">(</span>stateId<span style="color: #666666">,</span> windowState<span style="color: #666666">);</span>
  <span style="color: #666666">}</span>

  Rectangle rect <span style="color: #666666">=</span> window<span style="color: #666666">.</span><span style="color: #7D9029">getElement</span><span style="color: #666666">().</span><span style="color: #7D9029">getBounds</span><span style="color: #666666">();</span>

  windowState<span style="color: #666666">.</span><span style="color: #7D9029">setHeight</span><span style="color: #666666">(</span>rect<span style="color: #666666">.</span><span style="color: #7D9029">getHeight</span><span style="color: #666666">());</span>
  windowState<span style="color: #666666">.</span><span style="color: #7D9029">setWidth</span><span style="color: #666666">(</span>rect<span style="color: #666666">.</span><span style="color: #7D9029">getWidth</span><span style="color: #666666">());</span>
  windowState<span style="color: #666666">.</span><span style="color: #7D9029">setX</span><span style="color: #666666">(</span>rect<span style="color: #666666">.</span><span style="color: #7D9029">getX</span><span style="color: #666666">());</span>
  windowState<span style="color: #666666">.</span><span style="color: #7D9029">setY</span><span style="color: #666666">(</span>rect<span style="color: #666666">.</span><span style="color: #7D9029">getY</span><span style="color: #666666">());</span>

  stateHandler<span style="color: #666666">.</span><span style="color: #7D9029">saveState</span><span style="color: #666666">();</span>
<span style="color: #666666">}</span></pre></div>

<h3>Summary</h3>

<p>In this article, we introduced the Ext GWT 3.0 State API by working through an example. The example is running <a href="http://staging.sencha.com:8080/examples-dev/#ExamplePlace:windowstate">here</a>, and you can view the source code of the example by clicking the Source tab below the example. One note, the example and event support was recently added to the state handlers and is not in the last public release (beta 2).</p>

<p>This particular example uses a cookie provider to persist the state data. You use use a developer tool such as Firebug to inspect the request to see the cookies that are being set by the example.  The provider can be easily changed to use a different persistence strategy such as a server side RPC provider or an HTML5 local storage provider.</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Thu, 05 Apr 2012 18:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/ext-gwt-3-0-state-api/#date:18:00</guid>
        </item>
        
        <item>
        <title>Ext JS 4.1 RC2 Released</title>
        <author>Nige "Animal" White</author>
        <description>
            Today we&apos;re making available Ext JS 4.1 RC2, which contains bug fixes, enhancements and documentation improvements based on your feedback on our first Release Candidate two weeks ago. Download it today.
        </description>
        <link>http://www.sencha.com/blog/ext-js-4-1-rc-2-released/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright rounded shadow" src="http://img1.sencha.com/files/misc/ext-js-4.1-rc-2.jpg" alt="Ext JS 4.1 RC 2 Released" height="180" width="240"> Today we&#8217;re making available Ext JS 4.1 RC2, which contains bug fixes, enhancements and documentation improvements based on your feedback on our first Release Candidate two weeks ago.</p>

<p>The Release Candidate stage is all about polish, whether it&#8217;s on the framework, the examples or other sections like the documentation. Much of the work we have done since RC1 has been driven by the feedback we&#8217;ve received from the community; we&#8217;re always grateful for your bug reports and suggestions on the forums and we&#8217;re working hard to make the framework deliver based on your feedback.</p>

<p>Today we&#8217;d like to ask you to download RC2 and test it against your apps. If you haven&#8217;t used a 4.1 release yet we hope you&#8217;ll be pleasantly surprised by the performance improvements over 4.0.x, and if you have then we hope the additional polish since RC1 will make your apps feel and behave even better.</p>

<p>As we close in on a 4.1 GA release your feedback is more important than ever so we hope you&#8217;ll take a little time to test RC2 with your apps and let us know how it feels. We&#8217;ve prepared a full set of release notes and known issues for RC2, and we&#8217;ve put the latest examples online too.</p>

<p>Let us know what you think in the comments and the forums!</p>

<p><a class="button-link small inline arrow disabled download" href="#"><span>Download Ext JS 4.1 RC 2</span></a>&nbsp;&nbsp;&nbsp;<a class="button-link small inline arrow download" href="http://cdn.sencha.io/ext-4.1-rc3.zip"><span>Download Ext JS 4.1 RC 3</span></a></p>

<h3 class="meta">Release Notes for Ext JS 4.1.0 RC 2</h3>

<p class="notes">
    Release Date: March 30, 2012<br>
    Version Number: 4.1.0 RC 2
</p>

<h4>Bugs Fixed</h4>

<ul>
    <li class="component">Animation (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5523</span>&nbsp;<span class="ticket-notes">Animation Incorrectly Positions Windows</span>
            </li>
        </ul>
    </li>
    <li class="component">Button (3)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5429</span>&nbsp;<span class="ticket-notes">Button with an icon can not be properly resized.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5432</span>&nbsp;<span class="ticket-notes">Button icons are clipped at times (varying between browsers)</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5600</span>&nbsp;<span class="ticket-notes">Feed Viewer- Button names are left aligned in Add feed popup</span>
            </li>
        </ul>
    </li>
    <li class="component">Charts (20)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3617</span>&nbsp;<span class="ticket-notes">Rendering issue with stacked column chart without animation</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3783</span>&nbsp;<span class="ticket-notes">Area Chart - Farthest right tick not firing mouse events, showing tooltip, etc.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4459</span>&nbsp;<span class="ticket-notes"> If you try to render a chart in internet explorer 8 and you have animate=true, the markers will render, but lines themselves will never render</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4544</span>&nbsp;<span class="ticket-notes">Charts : Rich Tips - No tool tips are displayed upon mouse hovering on graph nodes for the second time.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4730</span>&nbsp;<span class="ticket-notes">Combination Examples - Ext JS 3&amp;4 on one page : Issue reloading legends inside Charts</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4779</span>&nbsp;<span class="ticket-notes">Bar Chart does not render correctly when all yField data points are equal</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5007</span>&nbsp;<span class="ticket-notes">Save button in chart examples should display popup panel to confirm save and then save image.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5024</span>&nbsp;<span class="ticket-notes">Charts: Themed Line Charts: Wrong information shown on mouse hover in simple styling chart</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5360</span>&nbsp;<span class="ticket-notes">Stacked column with two series values incorrect</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5462</span>&nbsp;<span class="ticket-notes">Custom Pie Charts: Browser is forcibly closed when clicked multiple times on Reload Data button</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5474</span>&nbsp;<span class="ticket-notes">Chart - left axis not showing the max value</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5499</span>&nbsp;<span class="ticket-notes">Set width of column charts not working correctly</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5571</span>&nbsp;<span class="ticket-notes">Chart problems with decimals on bottom axis</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5575</span>&nbsp;<span class="ticket-notes">Grouped Bar charts: Incorrect values shown in series labels</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5580</span>&nbsp;<span class="ticket-notes">Charts : Area Charts:  Chart &#8220;Legends &#8221; are not displaying properly in the  downloaded files.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5623</span>&nbsp;<span class="ticket-notes">Column charts displays wrong values/tips when disabling series </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5633</span>&nbsp;<span class="ticket-notes">Charts - Filled Radar charts - Chart is not displaying in Filled Radar chart example</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5655</span>&nbsp;<span class="ticket-notes">Charts- Column Custom Back ground - Save Chart button is not working.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5670</span>&nbsp;<span class="ticket-notes">Charts - Stacked Bar Charts - Chart is not displaying upon hiding and unhiding the legends in the chart.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5706</span>&nbsp;<span class="ticket-notes">Line series offset one sample to the left</span>
            </li>
        </ul>
    </li>
    <li class="component">Coding Style (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5682</span>&nbsp;<span class="ticket-notes">Remove extra comma in Ext.view.TableChunker</span>
            </li>
        </ul>
    </li>
    <li class="component">Core (11)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4966</span>&nbsp;<span class="ticket-notes">Global var in Renderable</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5000</span>&nbsp;<span class="ticket-notes">Problems with DOM Id containing colon and DomeQuery.jsSelect with CSS escape notation</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5350</span>&nbsp;<span class="ticket-notes">ItemSelector returns [undefined] when empty</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5444</span>&nbsp;<span class="ticket-notes">onReady Firing Twice</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5460</span>&nbsp;<span class="ticket-notes">FF 3.6&#8217;s Number.toJSON violates standards. We must programatically encode Numbers.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5538</span>&nbsp;<span class="ticket-notes">Themes examples has large memory leak when switching themes in IE</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5552</span>&nbsp;<span class="ticket-notes">Thousand separator and decimal separator are wrong for Chinese languages</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5630</span>&nbsp;<span class="ticket-notes">Observable broken for class observation</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5641</span>&nbsp;<span class="ticket-notes">CompositeElementLite: filter method is broken</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5705</span>&nbsp;<span class="ticket-notes">Document Element Mistakenly Garbage Collected</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5765</span>&nbsp;<span class="ticket-notes">Error when loading Ext later than initial page load</span>
            </li>
        </ul>
    </li>
    <li class="component">Data (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5224</span>&nbsp;<span class="ticket-notes">Store.removeAll does not remove any prefetched data</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5415</span>&nbsp;<span class="ticket-notes">Store load not triggered when opening ListMenu in FilterFeature</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5508</span>&nbsp;<span class="ticket-notes">Issue with Ext.data.reader.Reader onMetaChange listener and idProperty</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5585</span>&nbsp;<span class="ticket-notes">Sorters are not applied after using FilterBy() method</span>
            </li>
        </ul>
    </li>
    <li class="component">DataView (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4854</span>&nbsp;<span class="ticket-notes">LoadMask does not manage its z-index correctly WRT its client Component&#8217;s z-index.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5667</span>&nbsp;<span class="ticket-notes">Nested data is unavailable to templates in DataView</span>
            </li>
        </ul>
    </li>
    <li class="component">Documentation (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5069</span>&nbsp;<span class="ticket-notes">Ext.grid.feature.Grouping docs need to be clearer</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5553</span>&nbsp;<span class="ticket-notes">Miscellaneous: History - Page is redirecting to Home page when click on &#8220;History&#8221; Example  </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5584</span>&nbsp;<span class="ticket-notes">Ext.Array.toArray end parameter incorrectly documented</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5745</span>&nbsp;<span class="ticket-notes">Grid Grouping collapse() is private, when it should be public</span>
            </li>
        </ul>
    </li>
    <li class="component">Draw (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-2097</span>&nbsp;<span class="ticket-notes">viewbox: true ignores padding</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5078</span>&nbsp;<span class="ticket-notes">Missing scale/scaling support in Ext.fx.target.Sprite.setAttr</span>
            </li>
        </ul>
    </li>
    <li class="component">Events (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5194</span>&nbsp;<span class="ticket-notes">Card layout does not fire activate on initial view</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5271</span>&nbsp;<span class="ticket-notes">ComponentQuery &#8220;is&#8221; method fails if selector contains a comma</span>
            </li>
        </ul>
    </li>
    <li class="component">Examples (9)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-1146</span>&nbsp;<span class="ticket-notes">Editor Grid Example: Clicking from Common Name in an editor to Light doesn&#8217;t invoke an editor</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4136</span>&nbsp;<span class="ticket-notes">Portal demo :Unable to close the portlets in a specific scenario.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4533</span>&nbsp;<span class="ticket-notes">Combination Examples : Kitchen Sink : Tabs : Titled Tab Panels: Not displaying complete text in Ext.tab.Panel with frame:true Panel</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5529</span>&nbsp;<span class="ticket-notes">Combination Examples : Image Viewer : Tool tip is stretched while trying to drag more than one image </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5614</span>&nbsp;<span class="ticket-notes">Combination Examples : Theme viewer : By default Slider values are displaying behind the resizable handles.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5617</span>&nbsp;<span class="ticket-notes">Combination Examples : Image Viewer:   By default  Albums should display with expand and collapse  (&#8220;+&#8221;, &#8220;-&#8220;)  buttons when user drag and drop the files in to the albums.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5650</span>&nbsp;<span class="ticket-notes">Example - Nested Loading shows a blank page </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5666</span>&nbsp;<span class="ticket-notes">PageAnalyzer hangs when loading pages (busy-spin)</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5769</span>&nbsp;<span class="ticket-notes">Combinatiion Examples - Ext JS Calender Sample- &#8220;Delete Button &#8221; is Missing on Edit Event dialog</span>
            </li>
        </ul>
    </li>
    <li class="component">Forms (15)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4911</span>&nbsp;<span class="ticket-notes">Resizers on TextFields do not always work properly</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4940</span>&nbsp;<span class="ticket-notes">Ext.form.TimeField class contained typeAhead, later releases the Ext.form.field.Time class this functionality is missing</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5433</span>&nbsp;<span class="ticket-notes">ChekboxGroup with all fixed width columns does not width the columns correctly.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5439</span>&nbsp;<span class="ticket-notes">Hover icon changes to select when combo editor is disabled.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5530</span>&nbsp;<span class="ticket-notes">Forms- Dynamic forms- Field headers and borders are not displaying properly.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5557</span>&nbsp;<span class="ticket-notes">trackResetOnLoad has no affect on radiogroup after loadrecord()</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5567</span>&nbsp;<span class="ticket-notes">allowBlank not part of the default labelableRenderProps </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5570</span>&nbsp;<span class="ticket-notes">HtmlEditor: Tab and Enter presses aren&#8217;t being correctly handled in readOnly state</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5578</span>&nbsp;<span class="ticket-notes">Forms File Upload Field Button names are truncated in IE 7</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5618</span>&nbsp;<span class="ticket-notes">Forms Custom Form Field: Search text is not deleting upon clicking on cross button(X)</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5634</span>&nbsp;<span class="ticket-notes">Forms - Shopping Chart Checkout- Text boxes and label captions are disappearing after uncheck and check Same as Mailing Address checkbox</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5643</span>&nbsp;<span class="ticket-notes">Forms : Checkbox/ Radio Groups : Contents under the Radio groups are not  aligned properly.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5651</span>&nbsp;<span class="ticket-notes">Checkbox Focus Class Malformed</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5703</span>&nbsp;<span class="ticket-notes">Selected form component/editor loses focus if grid in edit mode</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5712</span>&nbsp;<span class="ticket-notes">Forms Checkout Form Text alignment is disturbed for payment radio buttons</span>
            </li>
        </ul>
    </li>
    <li class="component">Grid (31)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-1679</span>&nbsp;<span class="ticket-notes">Extra padding seen in grid for IE 6 &amp; 7 versus all other browsers</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3766</span>&nbsp;<span class="ticket-notes">Not possible to set &#8216;cursor&#8217; attribute on a Column chart series</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3998</span>&nbsp;<span class="ticket-notes">Vertical scrollbar doesn&#8217;t appear when it should when using Row Expander plugin</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4189</span>&nbsp;<span class="ticket-notes">Field used as an editor in a Grid will fire change event when the field&#8217;s value is initially set</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4371</span>&nbsp;<span class="ticket-notes">Grid Plugin Example: Bug in RowWrap. Hidden columns are not being hidden in data.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4564</span>&nbsp;<span class="ticket-notes">Lockable grid does not register features</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5003</span>&nbsp;<span class="ticket-notes">Cell editor does not always work correctly with locked grid</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5151</span>&nbsp;<span class="ticket-notes">Unwanted sortchange and resize events on gridcolumns</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5169</span>&nbsp;<span class="ticket-notes">hide/show causes error when using a table layout</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5251</span>&nbsp;<span class="ticket-notes">Can&#8217;t theme height of grid rows</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5303</span>&nbsp;<span class="ticket-notes">Remote filtering doesn&#8217;t work quite right with infinite scrolling.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5313</span>&nbsp;<span class="ticket-notes">injectCheckbox:false prevents check rendering in data rows</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5323</span>&nbsp;<span class="ticket-notes">grid.RowEditing plugin: error tooltip&#8217;s arrow is misplaced on 1st show</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5324</span>&nbsp;<span class="ticket-notes">Missing grid loadMask on first load</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5348</span>&nbsp;<span class="ticket-notes">Error when using buffered grid + locking columns</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5349</span>&nbsp;<span class="ticket-notes">Can not control the style emptyText displayed in the grid.  Need x-grid-empty support</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5397</span>&nbsp;<span class="ticket-notes">Problem setting grid column filters programmatically.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5398</span>&nbsp;<span class="ticket-notes">CellEditing plugin+textfield editor doesn&#8217;t completeEdit on header click.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5404</span>&nbsp;<span class="ticket-notes">Grids : RESTful Store with GridPanel and RowEditor : Not able to add rows with data to the grid in a particular scenario</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5510</span>&nbsp;<span class="ticket-notes">Scrollbar in a grid defined with no header overlaps the grid row</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5531</span>&nbsp;<span class="ticket-notes">Grids: Grid with Locking Capability -The browser session is get killed once all the unlock columns are changed as lock columns</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5573</span>&nbsp;<span class="ticket-notes">Using loadingHeight keeps grid at loading height, doesn&#8217;t recalculate after load complete.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5576</span>&nbsp;<span class="ticket-notes">groupgrid is not showing properly in beta3</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5581</span>&nbsp;<span class="ticket-notes">Grid Live Search Grid : Find Previous Row [&lt;] button is truncated </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5586</span>&nbsp;<span class="ticket-notes">Store remote filtering doesn&#8217;t work with infinite scrolling. </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5598</span>&nbsp;<span class="ticket-notes">Grid Row Editing- Displaying Js Error when click on add Employee button or double click on any row in the grid</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5599</span>&nbsp;<span class="ticket-notes">Grids- Infinite Scroll Grid- All the topic links are changing to visited state if single topic link is visited / clicked</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5616</span>&nbsp;<span class="ticket-notes">Grid- Infinite Scrolling Grid - Sort Ascending / Sort Descending is not working for Author field</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5707</span>&nbsp;<span class="ticket-notes">CellEditing plugin needs to be more robust in case intervening listeners delete the targeted record.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5717</span>&nbsp;<span class="ticket-notes">Grids Custom Grid Filters Displaying JS error while mouse hovering on filters option from Size column header drop down </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5739</span>&nbsp;<span class="ticket-notes">Grids : Grid Plugins : Collapse button &#8216;-&#8217; is moving to middle of the row, while the row is expanded</span>
            </li>
        </ul>
    </li>
    <li class="component">Layouts (15)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4751</span>&nbsp;<span class="ticket-notes">Layout issues in application upon clicking on one of the results in the grid.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5182</span>&nbsp;<span class="ticket-notes">Toolbar layout is unexpected after first render</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5270</span>&nbsp;<span class="ticket-notes">Problem using table layout in center panel of a border layout</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5274</span>&nbsp;<span class="ticket-notes">Margin with fit layout and shrink wrap</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5318</span>&nbsp;<span class="ticket-notes">Layout Managers : Border Layout : &#8220;South Eastern&#8221; panel&#8217;s UI is disturbed when collapsed and expanded the &#8220;South&#8221; panel</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5320</span>&nbsp;<span class="ticket-notes">Anchor Layout on a window, the title bar is rolled up into a circular header.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5435</span>&nbsp;<span class="ticket-notes">Box layout interferes with layout of shrinkwrap items</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5455</span>&nbsp;<span class="ticket-notes">Configured placeholder for border region not respected</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5551</span>&nbsp;<span class="ticket-notes">Hbox layout doesn&#8217;t recalculate height when align:stretchmax is set</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5589</span>&nbsp;<span class="ticket-notes">Container with vbox layout with minHeight set will not grow past minHeight when auto sized children added to this container</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5665</span>&nbsp;<span class="ticket-notes">Wrong priority of &#8216;flex&#8217; vs fixed size in h/vbox layouts</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5679</span>&nbsp;<span class="ticket-notes">Hbox does not stretch vertically in a specific configuration</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5711</span>&nbsp;<span class="ticket-notes">Layout Browser Custom layouts.    Center incorrect to the specification defined for Inner centered Panel width </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5724</span>&nbsp;<span class="ticket-notes">Layout Failure for Collapsed Fieldsets</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5753</span>&nbsp;<span class="ticket-notes">Layout Managers: Table Layout : Blank page when resizing the  browser in IE Quirks</span>
            </li>
        </ul>
    </li>
    <li class="component">MVC (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-2311</span>&nbsp;<span class="ticket-notes">Verify the focus on the tabs when user click on open all button</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-2312</span>&nbsp;<span class="ticket-notes">Verify the tabs display when user click&#8217;s on open all button.</span>
            </li>
        </ul>
    </li>
    <li class="component">Menu (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5689</span>&nbsp;<span class="ticket-notes">Large menus don&#8217;t constrain to viewport</span>
            </li>
        </ul>
    </li>
    <li class="component">Misc (65)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3782</span>&nbsp;<span class="ticket-notes">MVC Feed Viewer - Load mask appears when switching feeds even if not viewing the feed tab</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3943</span>&nbsp;<span class="ticket-notes">Keyboard Feed Viewer - Highlighted color is not displaying correctly in IE 6 </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3990</span>&nbsp;<span class="ticket-notes">Editor - Label captions are overlapping on the text fields when long label caption is entered without any space.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4022</span>&nbsp;<span class="ticket-notes">Add &#8220;refresh&#8221; event to Store to match &#8220;datachanged&#8221; in v3</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4123</span>&nbsp;<span class="ticket-notes">Ext.Array.from() with function gives empty array</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4125</span>&nbsp;<span class="ticket-notes">getNode return wrong record after add new record</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4171</span>&nbsp;<span class="ticket-notes">User details - Drop down items are displaying at the top of the page when double-click on the Editor panel   </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4175</span>&nbsp;<span class="ticket-notes">Button doesn&#8217;t have proper markup or styling in IE in sandbox mode</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4288</span>&nbsp;<span class="ticket-notes">Grid row selection is cleared after store sync.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4397</span>&nbsp;<span class="ticket-notes">Drag Drop Manager doesn&#8217;t select correct drop target</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4419</span>&nbsp;<span class="ticket-notes">MessageBox doesn&#8217;t fire callback when top-right close button clicked</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4426</span>&nbsp;<span class="ticket-notes">Problem with column header grouping at level 3. Columns can not be hidden.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4455</span>&nbsp;<span class="ticket-notes">App freezes when an incorrect query is passed to Ext.app.Controller.control()</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4555</span>&nbsp;<span class="ticket-notes">Loading the Finnish locale file will crash an application using Ext.util.Format.date</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4594</span>&nbsp;<span class="ticket-notes">Transform of combo does not use configured store </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4602</span>&nbsp;<span class="ticket-notes">Syntax errors when compiling SASS themes</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4845</span>&nbsp;<span class="ticket-notes">Vml Draw/Sprite images not using X/Y offset in Vml</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4847</span>&nbsp;<span class="ticket-notes">Ext.Loader doesn&#8217;t recognize files that are not under /app</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4953</span>&nbsp;<span class="ticket-notes">Localization(dynamic) : Displaying JS error upon selecting &#8220;Hebrew&#8221; from the Language selector.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4955</span>&nbsp;<span class="ticket-notes">Checkboxgroups W/ More Columns Than Checkboxes Throws JS Error</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4956</span>&nbsp;<span class="ticket-notes">Creating A Checkbox Group /w Hidden Field Throws JS Error</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5103</span>&nbsp;<span class="ticket-notes">Bug with Implicit Model / Store / MixedCollection / Proxy</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5138</span>&nbsp;<span class="ticket-notes">Reader needs to read records even when success:false</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5233</span>&nbsp;<span class="ticket-notes">Combination Examples : Ext JS Calendar : Displaying  JS error  while upon click and hold the mouse on day event matrix.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5247</span>&nbsp;<span class="ticket-notes">Border of child hidden if border of container is hidden</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5383</span>&nbsp;<span class="ticket-notes">Using two panels for both drag and drop fails</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5441</span>&nbsp;<span class="ticket-notes">Viewport with a configured height width sets the height and width on the document body causing the viewport to not fit the browser window in firefox quirks mode</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5468</span>&nbsp;<span class="ticket-notes">Loading indicator still visible with panel collapsed</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5490</span>&nbsp;<span class="ticket-notes">Possible bug when grouping by a template column in a grid</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5497</span>&nbsp;<span class="ticket-notes">Bug when centering components in vbox/hbox layouts</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5506</span>&nbsp;<span class="ticket-notes">Datepicker displays Invalid date format when chinese or japanese localization applied</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5513</span>&nbsp;<span class="ticket-notes">Miscellaneous : Editor : Displaying JS error upon double clicking on text labels</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5522</span>&nbsp;<span class="ticket-notes">Ext.String.htmlDecode / Ext.String.htmlEncode should operate on a larger set of characters/entities</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5537</span>&nbsp;<span class="ticket-notes">Ext.form.DateField returns incorrect value when localized</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5546</span>&nbsp;<span class="ticket-notes">dirtyCls style not applied to slider field</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5559</span>&nbsp;<span class="ticket-notes">Ghost image while dragging a panel</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5564</span>&nbsp;<span class="ticket-notes">All Date pickers: Not able to select date from date picker by using key board navigation keys, in all examples</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5566</span>&nbsp;<span class="ticket-notes">ComponentLoader should suspend layouts when adding/removing items</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5568</span>&nbsp;<span class="ticket-notes">ToolbarDroppable.calculateEntryIndex gets wrong index</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5572</span>&nbsp;<span class="ticket-notes">Issue with listeners for the store.load() event</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5583</span>&nbsp;<span class="ticket-notes">Accessibility : Binding Grid to a form : Month and Today button names are truncated in IE 7</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5610</span>&nbsp;<span class="ticket-notes">Web Desktop - Displaying Js Error upon double clicking close button of Accordion Window.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5631</span>&nbsp;<span class="ticket-notes">Combination Examples - Portal Demo - Graph is not displaying in Stock Portlet </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5635</span>&nbsp;<span class="ticket-notes">Grids:Column swapping disturb the data in the Grid</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5645</span>&nbsp;<span class="ticket-notes">Bug when collapsing the only panel in an accordion layout.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5652</span>&nbsp;<span class="ticket-notes">Toolbar that contains the error in datefield</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5661</span>&nbsp;<span class="ticket-notes">Syntax errors when compiling SASS themes</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5663</span>&nbsp;<span class="ticket-notes">Global leak in injectLockable</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5669</span>&nbsp;<span class="ticket-notes">Grids :Grouping with Remote Summary -The data in the grid get disturb while checking the Project column</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5671</span>&nbsp;<span class="ticket-notes">Combination examples: Kitchensink: Locking grid: lock/unlock options in the drop-down menu seen only first time.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5685</span>&nbsp;<span class="ticket-notes">Grouping Feature error after remote data update.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5687</span>&nbsp;<span class="ticket-notes">Ext.core.DomHelper overwrite only accepts DOM elements not Ext.Element instances</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5693</span>&nbsp;<span class="ticket-notes">Setting initially active tab using a string ID caused JS error.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5696</span>&nbsp;<span class="ticket-notes">Return false on Tab beforeactivate not handled properly</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5698</span>&nbsp;<span class="ticket-notes">Drag/Drop Information Box hides in Ext.Window</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5710</span>&nbsp;<span class="ticket-notes">Grids :All Grids :The data under the columns get disturb while checking and un-checking the columns.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5714</span>&nbsp;<span class="ticket-notes">Strange behaviour of DatePicker placing in Panel with vbox layout.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5718</span>&nbsp;<span class="ticket-notes">Toolbars and Menus:Basic Toolbar: The page UI get disturb while mouse over on Choose a Date.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5730</span>&nbsp;<span class="ticket-notes">Charts dont fire click/dblclick events</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5732</span>&nbsp;<span class="ticket-notes">Simple Tasks : Text Editor is displaying in the task list panel.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5737</span>&nbsp;<span class="ticket-notes">Simple Task - Creation of New Folder/New List is displaying in wrong location</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5740</span>&nbsp;<span class="ticket-notes">Validation error message tool tip has truncated height</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5751</span>&nbsp;<span class="ticket-notes">Layout problems in PortalPanel with an anchor layout </span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5768</span>&nbsp;<span class="ticket-notes">Combo Box - ComboBox Templates - Search results are disappearing on double clicking page next icon on pagination panel.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5773</span>&nbsp;<span class="ticket-notes">Misc- Quick tips - Displaying JS error upon click on Rich Content Tooltip link after mouse hover on Anchor right, rich content button under callout Tip</span>
            </li>
        </ul>
    </li>
    <li class="component">Panel (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5149</span>&nbsp;<span class="ticket-notes">&#8220;mini&#8221; collapseMode in border layout doesn&#8217;t seem to work</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5312</span>&nbsp;<span class="ticket-notes">Ext.form.Panel.getValues() does not respect isDirty argument</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5445</span>&nbsp;<span class="ticket-notes">Panels with html are 2px too high in IE quirks</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5505</span>&nbsp;<span class="ticket-notes">Corners of framed headers don&#8217;t display correctly in old IE</span>
            </li>
        </ul>
    </li>
    <li class="component">Tabs (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4178</span>&nbsp;<span class="ticket-notes">Positioning problem when using TabPanel and a custom stylesheet</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5315</span>&nbsp;<span class="ticket-notes"> Closing a tab moves to the first tab rather than going to the previous tab</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5448</span>&nbsp;<span class="ticket-notes">Tab icon is cut off in IE8 strict and IE9 strict</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5613</span>&nbsp;<span class="ticket-notes">Tabs - Advance Tab - All tabs are closing when closable check box is selected from submenu </span>
            </li>
        </ul>
    </li>
    <li class="component">Theme (3)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5542</span>&nbsp;<span class="ticket-notes">Hard coded value in variables/_grid.scss</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5547</span>&nbsp;<span class="ticket-notes">Some values are hard-coded values in the SASS files</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5590</span>&nbsp;<span class="ticket-notes">Opacity is compounding for components in a deeply nested disabled container</span>
            </li>
        </ul>
    </li>
    <li class="component">ToolTips (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5408</span>&nbsp;<span class="ticket-notes">Show delay not always working for qtips in tree grid </span>
            </li>
        </ul>
    </li>
    <li class="component">Toolbars (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5742</span>&nbsp;<span class="ticket-notes">Toolbars and Menus : Basic Toolbar : Top and Bottom arrows are not displaying when click on the scrolling menu button for the second time.</span>
            </li>
        </ul>
    </li>
    <li class="component">Tree (7)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-1887</span>&nbsp;<span class="ticket-notes">Tree does not allow horizontal scrolling</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3935</span>&nbsp;<span class="ticket-notes">TreeStore doesn&#8217;t allow root property to be an object path</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4437</span>&nbsp;<span class="ticket-notes">BorderLayout accordion region has buggy expand/collapse behavior when floated</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4476</span>&nbsp;<span class="ticket-notes">NodeInterface can lose dirty state and fail to send batched updates</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4815</span>&nbsp;<span class="ticket-notes">Trees : Drag and Drop reordering : After clicking on &#8216;Expand All&#8217; and &#8216;Collapse All&#8217; tree is not behaving as expected.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5219</span>&nbsp;<span class="ticket-notes">Problem whith TreeGrid node (greater than 600 leafs)</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5387</span>&nbsp;<span class="ticket-notes">Trees : Drag and Drop Reordering:  Expand All button is not responding for the second time.</span>
            </li>
        </ul>
    </li>
    <li class="component">Window (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-1732</span>&nbsp;<span class="ticket-notes">Hiding the progress dialog window while it is being dragged breaks draggability</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5310</span>&nbsp;<span class="ticket-notes">Window position changes when resized</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5507</span>&nbsp;<span class="ticket-notes">Drag and drop on overlapped windows fires events in both windows</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5608</span>&nbsp;<span class="ticket-notes">zIndex is wrong for floated windows</span>
            </li>
        </ul>
    </li>
Total: 212</ul>

<pre><code>            &lt;h4&gt;Known Issues&lt;/h4&gt;
</code></pre>

<ul>
    <li class="component">Animation (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5487</span>&nbsp;<span class="ticket-notes">accordion animation doesn&#8217;t always complete if you click frequently</span>
            </li>
        </ul>
    </li>
    <li class="component">Button (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4768</span>&nbsp;<span class="ticket-notes">Layout Managers - Border Layout: &#8220;Center&#8221; layout and &#8220;Splitter above me&#8221; layouts are overlapping when clicking three times on &#8220;Add Region&#8221; button.</span>
            </li>
        </ul>
    </li>
    <li class="component">Charts (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5108</span>&nbsp;<span class="ticket-notes">can&#8217;t create label for  type area series</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5657</span>&nbsp;<span class="ticket-notes">Charts : Grouped Bar :Displaying Js error upon clicking on &#8220;Legends&#8221; in the &#8220;grouped bar&#8221; chart on IE9</span>
            </li>
        </ul>
    </li>
    <li class="component">Core (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4942</span>&nbsp;<span class="ticket-notes">Element#tgetWidth() returns an incorrect result for naturally widthed absolutely positioned elements in some cases.</span>
            </li>
        </ul>
    </li>
    <li class="component">Data (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3316</span>&nbsp;<span class="ticket-notes">Ext.ux.grid.FiltersFeature cannot restore state</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4319</span>&nbsp;<span class="ticket-notes">Use a parameter other than &#8216;id&#8217; for server calls</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4335</span>&nbsp;<span class="ticket-notes">Duplicate records when calling sync() on a autoSync store</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4372</span>&nbsp;<span class="ticket-notes">Grid Filtering Example: Bug with database return packet</span>
            </li>
        </ul>
    </li>
    <li class="component">Documentation (3)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4296</span>&nbsp;<span class="ticket-notes">Ext JS 4 and Sencha Touch Docs examples fail on Chromebook, can&#8217;t use Example viewer, ReferenceError: Ext is not defined</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5148</span>&nbsp;<span class="ticket-notes">Ext.selection.Model documentation bug</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5156</span>&nbsp;<span class="ticket-notes">Update documentation that fields (id,text,leaf) are expected</span>
            </li>
        </ul>
    </li>
    <li class="component">Examples (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4951</span>&nbsp;<span class="ticket-notes">ToolBars and Menus : Basic Tool Bar : All States are not displaying in the combo box once the state is selected in the &#8220;Button w/ Menu&#8221; through key board .</span>
            </li>
        </ul>
    </li>
    <li class="component">Forms (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-2081</span>&nbsp;<span class="ticket-notes">Issue with &#8220;Bullet list&#8221; in the form widget editor</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-2425</span>&nbsp;<span class="ticket-notes">HTMLEditor corrupted when changing background color of selection</span>
            </li>
        </ul>
    </li>
    <li class="component">Grid (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5595</span>&nbsp;<span class="ticket-notes">Last selected row maintains selection after unchecked on column sort</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5607</span>&nbsp;<span class="ticket-notes">Grid: getEditorParent is ignored - nested cell editing is not possible</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5776</span>&nbsp;<span class="ticket-notes">Bug relating to a stateful grid with a checkbox selection mode - in applyColumnsState function</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5783</span>&nbsp;<span class="ticket-notes">Grid header resizer chooses incorrect resize target when hovering left edge next to a group header</span>
            </li>
        </ul>
    </li>
    <li class="component">Layouts (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3704</span>&nbsp;<span class="ticket-notes">Ext.layout.container.Box: wrong children margins if using CSS rules</span>
            </li>
        </ul>
    </li>
    <li class="component">Misc (12)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3932</span>&nbsp;<span class="ticket-notes">dom.style.setExpression not implemented in IE8</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4091</span>&nbsp;<span class="ticket-notes">Grid filters: initial value can be set, but it is not applied</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4421</span>&nbsp;<span class="ticket-notes">x-tab-top-over never inserted into any element</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4545</span>&nbsp;<span class="ticket-notes">Kitchen Sink - Basic Tabs :  By default  tab headers are not displaying in Basic tabs.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4873</span>&nbsp;<span class="ticket-notes">Errors calling add method in a checkboxgroup</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4937</span>&nbsp;<span class="ticket-notes">Combination Examples : Web Desktop : Notepad :Displaying errors in error console upon double clicking on empty space in the note pad.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4954</span>&nbsp;<span class="ticket-notes">Store Grouping Not Cleared Properly</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5075</span>&nbsp;<span class="ticket-notes">&nbsp;NodeInterface &#8220;deep&#8221; copy only copies a single level</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5125</span>&nbsp;<span class="ticket-notes">FiltersFeature - Updating column header class when using a column group</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5130</span>&nbsp;<span class="ticket-notes">Neptune theme missing resources</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5254</span>&nbsp;<span class="ticket-notes">&nbsp;HTMLEditor.insertAtCursor issues in &#8220;Source Edit&#8221;; mode</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5484</span>&nbsp;<span class="ticket-notes">Ext.form.field.File buttons don&#8217;t get the mouse over effect that buttons do</span>
            </li>
        </ul>
    </li>
    <li class="component">Panel (4)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5488</span>&nbsp;<span class="ticket-notes">Panel collapse/expand behavior not as expected when called on hidden panel</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5489</span>&nbsp;<span class="ticket-notes">preventHeader not honored when panel is programmatically collapsed.</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5544</span>&nbsp;<span class="ticket-notes">Intermittent issue with collapseOnDblClick set to true on IE</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5716</span>&nbsp;<span class="ticket-notes">Panels with min/max constraints misbehave in a box layout with stretchmax</span>
            </li>
        </ul>
    </li>
    <li class="component">Tabs (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3625</span>&nbsp;<span class="ticket-notes">TabPanel: defaults: closable true not configurable</span>
            </li>
        </ul>
    </li>
    <li class="component">Theme (2)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-3712</span>&nbsp;<span class="ticket-notes">4.0.5 tabpanel shows blue strip in header in IE</span>
            </li>
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-5764</span>&nbsp;<span class="ticket-notes">Theme slicer requires new build of SDK Tools</span>
            </li>
        </ul>
    </li>
    <li class="component">Tree (1)
        <ul class="tickets">
            <li class="ticket">
                <span class="ticket-number">EXTJSIV-4243</span>&nbsp;<span class="ticket-notes">Synchronous loading fails if async loading of same class is on going</span>
            </li>
        </ul>
    </li>
Total: 40</ul>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 03 Apr 2012 15:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/ext-js-4-1-rc-2-released/#date:15:00</guid>
        </item>
        
        <item>
        <title>SourceDevCon Returns, Join Us in London May 2-5</title>
        <author>Donovan Erba</author>
        <description>
            Get your tickets now for the 2012 SourceDevCon developer&apos;s conference May 2&#45;5 in London, UK. The beautiful Park Plaza Hotel, overlooking Big Ben and the London Eye, will host a four&#45;day program of intermediate to advanced level sessions to web application developers, presented by the true authorities in the industry. Sencha is the platinum sponsor, and Sencha’s CEO Michael Mullany will present the keynote.
        </description>
        <link>http://www.sencha.com/blog/sourcedevcon-london-may-2012/</link>
        <content:encoded>
            <![CDATA[
                <p><figure class="aligncenter">
    <img src="http://img1.sencha.com/files/misc/london-bridges-med.jpg" alt="London Bridge" height="477" width="636">
    <figcaption>SourceDevCon will take place in London, England this May 2-5, 2012.</figcaption><br />
</figure></p>

	<p><img src="http://img1.sencha.com/files/misc/source-2012-200.png" alt="SourceDevCon 2012" height="61" width="200" class="alignright"> We&#8217;re very excited to announce that Sencha is a Platinum sponsor at this year&#8217;s, <a href="http://www.sourcedevcon.eu/">SourceDevCon</a> May 2-5 2012 in London, UK and Sencha&#8217;s <span class="caps">CEO</span> Michael Mullany will present the keynote. Building on the success of last year&#8217;s SourceDevCon in Split, Croatia, this year’s conference is a four-day program of intermediate to advanced-level sessions and brings speakers from around the globe to present on topics of interest to web developers. Topics include client and server side JavaScript, modern HTML5 and <span class="caps">CSS</span> techniques, unit testing, mobile application packaging, web games development, and more.</p>

	<p><b>Get your tickets now and save 25%</b><br />

As a Sencha community member, you&#8217;ll save 25% off the full conference rate of £799 by using the coupon code <b>sencha</b>, that&#8217;s a savings of more than £200 ($300). Conference attendees can also take advantage of special lodging rates at the venue, so <a href="http://sourcedevcon.eventbrite.com/">get your tickets now!</a></p>

	<p><b>Sencha Focused Topics</b><br />

Just like last year, this year&#8217;s SourceDevCon has Sencha-focused tracks and sessions. There are over 17 sessions on topics devoted to Sencha Touch 2, Ext JS 4.1, Sencha.io, and Sencha Designer. And, the content will be delivered by Sencha’s core dev team and some of the most prominent Sencha community members, such as Brian Moeskau, Jay Garcia, Mats Bryntse, Shea Frederick, Rich Waters, Nick Cooley, Nils Dehl, and Frederic Berling.</p>

	<p><b>Community-driven Event</b><br />

SourceDevCon 2012 has an intensive schedule of 37 presentation-style sessions spanning across three tracks mark the central two days of the conference. There&#8217;s a stellar lineup of speakers from the JavaScript, web development, and design communities, including <a href="http://www.crockford.com/">Douglas Crockford</a>, <a href="http://remysharp.com/">Remy Sharp</a>, <a href="https://twitter.com/#!/joemccann">Joe McCann</a>, <a href="http://paul.kinlan.me/">Paul Kinlan</a>, <a href="http://seb.ly/">Seb Lee-Delisle</a>, and <a href="http://blogs.nitobi.com/anis/">Anis Kadri</a>. Highlights of their industry-related presentations include sessions on reaching excellence with JavaScript, Node.JS, MongoDb, PhoneGap, and CanvasJS.</p>

	<p><b>Training Available</b><br />

Prior to the event, Sencha partner <a href="http://moduscreate.com/">Modus Creates</a> will be conducting a two-day Sencha Touch 2 and Ext JS 4 training session. <a href="http://st2london-eorg.eventbrite.co.uk/">Register now</a> to get up and running quickly with this pre-event bootcamp.</p>

	<p><b>Join us. Get your tickets now.</b><br />

SourceDevCon is a great opportunity for networking with your colleagues and learning from industry leaders. <a href="http://sourcedevcon.eventbrite.com/">Reserve your spot now and save 25%</a> off the full conference rate of £799 by using the coupon code <b>sencha</b>. We look forward to seeing you!</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Mon, 02 Apr 2012 17:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/sourcedevcon-london-may-2012/#date:17:00</guid>
        </item>
        
        <item>
        <title>HTML5 Scorecard: The New iPad and iOS 5.1 &#8212; A Mixed Bag</title>
        <author>Aditya Bansod</author>
        <description>
            Our HTML5 scorecard typically focuses on what HTML5 developers need to consider when developing for a platform or mobile operating system. Both iPad 3 and iOS 5.1 are significant updates in the Apple ecosystem, and they impact HTML5 developers. In today&apos;s HTML5 scorecard we&apos;ll look at them independently, explore a few of the issues we found and give developers some guidance on how to work both the new iPad and with iOS 5.1.
        </description>
        <link>http://www.sencha.com/blog/html5-scorecard-the-new-ipad-and-ios-5-1/</link>
        <content:encoded>
            <![CDATA[
                <p><figure class="aligncenter">
    <img src="http://cdn.sencha.io/img/20120327-Sencha-html5-iPad-3-ios-5-1.jpg" alt="Apple iPad, 3rd generation" height="496" width="636">
    <figcaption>Apple’s new iPad has a beautiful screen, but often struggles to smoothly display and scale even average webpages.</figcaption>
</figure></p>

<p>This month, Apple released the &#8220;new iPad&#8221;, its newest and latest tablet device, featuring a high resolution &#8220;Retina Display&#8221;, an updated CPU and GPU and more memory. A few weeks before the launch of the iPad, Apple also released iOS 5.1, a mostly maintenance release that included fixes for battery life among various others. 61% of devices are now upgraded to iOS 5.1.</p>

<p>Our HTML5 scorecard typically focuses on what HTML5 developers need to consider when developing for a platform or mobile operating system. Both the new iPad and iOS 5.1 are significant updates in the Apple ecosystem. In this HTML5 scorecard, we&#8217;ll look at them independently, explore a few of the issues we found and give developers some guidance on how to work both the new iPad and with iOS 5.1.</p>

<p>In a nutshell, the new iPad is a mixed bag. The new iPad&#8217;s display is incredibly fine grained and web site text now appears unbelievably sharp. On the other hand, the browser experience is noticeably slower with stutters and redraws on complex web pages and web apps. Images that haven&#8217;t been updated for retina displays now appear blurry in contrast to the sharp text. iOS 5.1 doesn&#8217;t offer many new features, and it does take a step backwards. For hybrid apps (web apps packaged in a native shell), iOS 5.1 breaks localStorage and WebSQL persistence, so developers can&#8217;t rely on them anymore.</p>

<h3>iOS 5.1</h3>

<p>As has been <a href="http://stackoverflow.com/questions/9664392/phonegap-ios-5-1-and-localstorage">widely reported</a> by web developers, iOS 5.1 has <a href="https://groups.google.com/forum/?fromgroups#!topic/phonegap/RJC2qA9sDnw">changed the behavior</a> of an embedded WebView. WebViews power HTML5 applications that live inside of native packages, such as PhoneGap or Sencha Touch native packaging. They provide an embedded web browser that is hosted within a native application, permitting the distribution of web apps to native app stores. WebViews are a feature of all modern mobile operating systems.</p>

<p>Prior to iOS 5.1, when an embedded WebView was used, data stored locally using HTML5 storage was kept persistent. Specifically, if your application used localStorage or WebSQL, it was considered part of the application&#8217;s data. When a new version of the app was installed or the app was hard-closed, the persistent data was kept around. The next time the app started, the localStorage would appear as if it had never gone away, exactly as what happens in Mobile Safari.</p>

<p>In iOS 5.1, this data is no longer considered persistent and is treated as temporary or transitory data, so iOS can destroy it at any time, without warning, including during low memory scenarios. This is probably because Apple can&#8217;t reliably iCloud backup, or iCloud sync from anything that&#8217;s not stored in the native CoreData storage. As such, they&#8217;re pushing developers to move to Apple native data systems to make apps iCloud-ready. Of course not everybody will want to do this. For developers who relied on localStorage or WebSQL as their mechanism to store data in their app, breaking this mechanism is a big deal. There are various workarounds, such as using the PhoneGap-SQLPlugin which uses the underlying SQLite, or writing your own JavaScript bridge to CoreData.</p>

<p>We also poked around iOS 5.1 to see if there were new HTML5 features like CSS regions or support for the File API or any other new web platform features. We used our favorite tool, haz.io which builds on the open source Modernizr detection library to see what&#8217;s new under the hood. In short: nothing. No new features showed up between iOS 5.0 and iOS 5.1. iOS still features some of the best HTML5 support on any mobile browser, but this latest incarnation hasn&#8217;t increased the depth of Mobile Safari&#8217;s support for the standards. We&#8217;re hoping to see CSS Regions come to iOS soon, as it&#8217;s supported in Safari 6. Mobile Safari reports &#8220;5.1&#8221; as its version number, so it&#8217;s likely only a matter of time until we get the ability to use the Regions feature. We were also looking to see if WebGL, which is currently only available for Apple iAds, is available in the public browser. haz.io reports that WebGL is supported in Mobile Safari, but when we used the <a href="http://www.khronos.org/webgl/wiki/Demo_Repository">Khronos demo</a> repository to test, we were unable to get any of the demos to work.</p>

<p>For the HTML5 developer out there, heed the warnings when using localStorage or WebSQL in a packaged app on iOS 5.1, and don&#8217;t expect any new HTML5 features in iOS5.1 Mobile Safari.</p>

<h3>Retina iPad</h3>

<p>For HTML5 developers, the most obvious thing about the Retina Display iPad is the huge number of pixels that the device now manages. The new iPad sports a resolution higher than a 1080p television. User interfaces are doing more than 4x the work pushing all the new pixels around. The new iPad houses an Apple A5X CPU together with a PowerVR SGX543MP2. The A5X is a dual core ARM-Cortex A9 design, running at 1GHz, and the GPU is a quad-core design running in roughly the same graphics class as the Nvidia Tegra line. From what we can tell, the main difference between the A5 (which powers the iPad 2 and the iPhone 4S) and the A5X is the new quad-core GPU. Given the new pixel density, it stands to reason that it&#8217;s the most upgraded component of the new iPad&#8217;s processing subsystem.</p>

<p>Since we&#8217;re focusing on HTML5 developers, we focus on web benchmarks for performance. We re-ran the iPad 2 with iOS 5.1 along with the new iPad with iOS 5.1 and found a set of interesting results. As usual, we turned to SunSpider and the V8 Benchmark Suite for raw JavaScript processing power. We found (and perhaps given the new display&#8217;s tax on the whole system this is unsurprising) that new iPad was marginally slower than the iPad 2. The SunSpider score is about 150 points slower than the iPad 2, and the V8 Benchmark was 45 points slower. We ran the tests a few times and while the specific numbers were a bit different each time the overall result was the same: on pure JavaScript processing, the new iPad is slower than the iPad 2.</p>

<p><figure class="aligncenter">
    <img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/Screen_Shot_2012-03-24_at_7.55.46_AM.png" alt="SunSpider Results">
    <figcaption>SunSpider v0.91 Results, smaller is better.</figcaption>
</figure></p>

<p><figure class="aligncenter">
    <img src="http://img1.sencha.com/files/misc/Screen_Shot_2012-03-21_at_6.20.48_PM.png" alt="Benchmark">
    <figcaption>V8 Benchmark Suite v6, bigger is better.</figcaption>
</figure></p>

<p>We then turned our attention to some complex web sites and apps to see how the new iPad performed with graphics. We turned to our Sencha Animator Kickfu demo, which is a very complex CSS3 animation, and were pleased that it ran reasonably well. Wanting to push it a bit further, we decided to pinch-zoom in and try to play the game again and this time we saw an immense amount of tiling occurring. This severe tiling seems to have been introduced in iOS 5, so it&#8217;s not a new iPad thing, but definitely an artifact introduced in newer iOS&#8217; that hasn&#8217;t gotten better with new hardware.</p>

<p>Our tests always include Canvas, and we tested our two current favorite Canvas apps, <a href="http://canvasrider.com/">Canvas Rider</a> and <a href="http://www.effectgames.com/demos/canvascycle/">Canvas Cycle</a>. Both of them test the CPU/GPU and the browser&#8217;s Canvas drawing engine. The new iPad does fine here, rendering both of these examples with the same performance as the iPad 2. Given how fast the iPad 2 is, it&#8217;s impossible to visually discern any difference in Canvas performance between the two devices.</p>

<p>In general web browsing, we did notice one notable difference between the iPad 2 and the new iPad. It draws much more slowly on complex pages. For example, on the <a href="http://www.sencha.com/products/extjs/examples/">Ext JS examples page</a>, when scrolling the page, it visibly loads in new tiles at the bottom of the page while moving. Also, when zooming in on image rich pages such as our <a href="http://www.sencha.com/products/touch/">Sencha Touch 2 product page</a>, the same tiling behavior occurs again that rarely occurred on the iPad 2. It&#8217;s clear that this is due to the the new Retina Display. It&#8217;s very likely that images and other assets being transferred to the GPU are taking more time (and bus bandwidth) than the device can handle in real time.</p>

<p>We&#8217;re definitely not hardware or chip experts here, but we figured we&#8217;d dig a little with the iFixit breakdowns to see why this might happen and if were parts on the new iPad that were not upgraded to match the new resolution. The iPad 2 uses an <a href="http://en.wikipedia.org/wiki/Apple_A5">Apple A5 System on a Chip</a>, which includes 512 MB of DDR2 RAM in the SoC package. Compare that to the new iPad which has an A5X SoC, which does not include the memory in the SoC package. Rather <a href="http://www.ifixit.com/Teardown/iPad-3-4G-Teardown/8277/2">there are two 512 MB Elpida DDR2 chips</a>. The new iPad has two times the memory, and four times the pixels to push, but runs the memory bus at the same speed as the iPad 2. Again, we&#8217;re not experts on embedded systems design, but it stands to reason that some of the graphics performance issues we are seeing, (especially tiling and performance degradation from box shadows) might be caused by this system imbalance.</p>

<h3>The New iPad and iOS 5.1: tips for the HTML5 developers</h3>

<p>We&#8217;re usually effusive about the latest mobile browser and hardware from Apple. But this latest offering is a mixed bag at best and a disappointment at worst. For the last few years, we&#8217;ve grown accustomed to Apple leapfrogging the competition each year with superior hardware and even better HTML5 browser software. The latest set of Apple hardware has regressions compared to the iPad 2 including slower JavaScript performance. And with iOS 5.1, the removal (or breaking) of features that developers have trusted is a real letdown. While we believe that the iPad is still the best tablet in the market, it&#8217;s the first time a new Apple product hasn&#8217;t categorically outshone its predecessor. Particularly for business applications, there is no reason to choose the new iPad over the iPad 2.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Fri, 30 Mar 2012 15:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/html5-scorecard-the-new-ipad-and-ios-5-1/#date:15:00</guid>
        </item>
        
        <item>
        <title>The AT&amp;T API Platform SDK for HTML5</title>
        <author>Michael Mullany</author>
        <description>
            At CES this year, AT&amp;T introduced a new SDK to help web application developers quickly and easily connect their applications to AT&amp;T API services. The SDK is based on Sencha Touch and the initial APIs available include billing, location, MMS and device capabilities.
        </description>
        <link>http://www.sencha.com/blog/the-att-api-platform-sdk-for-html5/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright" src="http://img1.sencha.com/files/misc/att.gif" alt="AT&T logo" height="48" width="119"> At CES this year, AT&amp;T introduced the <a href="http://developer.att.com/developer/tierNpage.jsp?passedItemId=9700232">AT&amp;T API Platform SDK for HTML5</a>, a new SDK based on Sencha Touch that allows developers to easily create apps that connect to its network services. The initial set of APIs introduced are: billing, location, device identity, SMS, MMS, Wap Push and Notary. The Platform SDK is composed of a client SDK and a set of server-side components for developers in Java, Ruby and PHP. Unlimited access to these APIs costs just $99 for the first year. And more APIs are on their way!</p>

<p>The current AT&amp;T API Platform SDK is based on Sencha Touch 1.1, but will be upgraded to Sencha Touch 2, once the release passes the AT&amp;T validation process.</p>

<h3>Network Services for HTML5</h3>

<p><img class="alignright" src="http://src.sencha.io/jpg100/250/http://img1.sencha.com/files/misc/sencha-att-payment-auth.jpg" alt="Payment Authentication on AT&T"></p>

<p>Web apps and carrier network APIs are a match made in heaven. The strength of the web has always been that content is easy to publish and users can access that content from any browser, anywhere. The downside of the web has been the difficulty of identifying end users&#8217; identity and location. Before Facebook, it was difficult to create applications that relied on peoples&#8217; real identities. And even now, payments on the web is often a tedious multi-step process, with repetitive entry of personal details and credit card information.</p>

<p>With the AT&amp;T network services APIs, however, we think that this can become a thing of the past. Because your mobile service provider knows which device belongs to whom, and already has a billing relationship with you, it&#8217;s now possible to simplify the creation of apps that provide easy billing and device identification (among other capabilities) to developers. While it&#8217;s been possible for a while to include carrier billing using other payment services, we think the fact that the service is coming directly from your mobile provider <em>and</em> it&#8217;s easy to integrate, makes all the difference.</p>

<h3>The Platform SDK APIs</h3>

<p>Here&#8217;s the run down and a brief description of the APIs, as well as why you might consider using them.</p>

<ul>
<li>The <a href="http://developer.att.com/developer/apiDetailPage.jsp?passedItemId=10500111">Payments API</a> is perhaps the biggest draw for developers. Using it, you can create one time, recurring and subscription charges. You can also even process refunds directly through the API. Today the API is limited to virtual goods transactions only, between $0.99 and $25.</li>
<li><a href="http://developer.att.com/developer/apiDetailPage.jsp?passedItemId=10100301">Device capabilities</a> allows you to look up the make and model (and other capabilities) of the device that your application is running on. The benefit of a network API vs. a useragent lookup is that it&#8217;s non-spoofable.</li>
<li><a href="http://developer.att.com/developer/apiDetailPage.jsp?passedItemId=9700300">MMS and SMS APIs</a> are available and easily integrated (we show an SMS example below)</li>
<li>And finally, an <a href="http://developer.att.com/developer/apiDetailPage.jsp?passedItemId=10500015">Oauth 2.0 service</a> allows users to authenticate against their AT&amp;T account for access to a third party service.</li>
</ul>

<p>There is also a device location API which allows non-spoofable location information to be returned to an application, although we imagine in most cases, browser-based geolocation suffices for most applications.</p>

<h4>Sample Code to Access SMS</h4>

<p>The code to access network APIs is quite simple. Below is the code required to create and send an SMS from the AT&amp;T Network SDK. It&#8217;s just six lines of code.</p>

<p><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">MyApp.<span class="me1">provider</span> <span class="sy0">=</span> <span class="kw2">new</span> Att.<span class="me1">Provider</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
MyApp.<span class="me1">provider</span>.<span class="me1">sendSms</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
  address <span class="sy0">:</span> <span class="st0">&quot;5555555555&quot;</span><span class="sy0">,</span>
  message <span class="sy0">:</span> <span class="st0">&quot;Hello from Sencha and AT&amp;amp;T&quot;</span><span class="sy0">,</span>
  success <span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>response<span class="br0">&#41;</span> <span class="br0">&#123;</span>…<span class="br0">&#125;</span>
  failure <span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>error<span class="br0">&#41;</span> <span class="br0">&#123;</span>…<span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></p>

<p>As you can see, although there is work to install and configure the server-side, once it&#8217;s ready, the client side code required is trivial.</p>

<h3>How to Get Started</h3>

<p>For all things AT&amp;T, developers can get started at the AT&amp;T developer program home page. Then head over to the Platform SDK home page, where there&#8217;s a very thorough guide for how to sign up for the developer program and get your merchant billing account. Finally once you&#8217;re ready, you can grab the AT&amp;T Platform SDK itself as well as its sample apps.</p>

<ul>
<li><a href="http://developer.att.com/developer/">AT&amp;T Developer program homepage</a></li>
<li><a href="http://developer.att.com/developer/tierNpage.jsp?passedItemId=9700232">AT&amp;T Platform SDK for HTML5 homepage</a></li>
<li><a href="http://developer.att.com/home/api/APISDKGetting_Started.pdf">Download Getting Started Guide (PDF)</a></li>
<li><a href="http://developer.att.com/home/api/sdk-2.0-r10b.zip">Download AT&amp;T Platform SDK for HTML5</a></li>
<li><a href="http://developer.att.com/home/api/samples-2.0-Drop10.zip">Download Sample Apps</a></li>
</ul>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Thu, 29 Mar 2012 15:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/the-att-api-platform-sdk-for-html5/#date:15:00</guid>
        </item>
        
        <item>
        <title>Sencha Animator 1.2 Now Available</title>
        <author>Luca Candela</author>
        <description>
            The second minor release update for Sencha Animator contains improvements to interactivity, export, speed and UX, plus a slew of bug fixes. Read on to see what&apos;s new.
        </description>
        <link>http://www.sencha.com/blog/sencha-animator-1-2-now-available/</link>
        <content:encoded>
            <![CDATA[
                <p>We’re excited to announce the general availability of <a href="http://www.sencha.com/products/animator/">Sencha Animator 1.2</a>! This new update brings improvements and tweaks across the board based in part on the valuable feedback from our user forums.</p>

<p><a class="button-link small inline arrow download" href="http://www.sencha.com/products/animator/download/"><span>Download Sencha Animator 1.2</span></a></p>

<p>Let&#8217;s take a look at what&#8217;s new in this latest release.</p>

<h3>New interactivity options</h3>

<p>To help you create an even richer experience for your end users, we enhanced the interactivity options in Animator by adding:</p>

<h4>Touch events</h4>

<p>Animator now provides touch events alongside the previously available mouse events, to unlock a wider set of interactions on mobile devices.</p>

<p><figure class="aligncenter">
    <img src="http://img1.sencha.com/files/misc/Interactivity_options.png" alt="New interactivity options" height="555" width="500">
    <figcaption>New interactivity options in Sencha Animator 1.2.</figcaption>
</figure></p>

<h4>Edit JavaScript in an external editor</h4>

<p>To make things easier for people that like to use their code editor of choice, it is now possible to launch an external application to edit JavaScript code directly from Animator.</p>

<h4>Improved export</h4>

<p>We keep discovering new and surprising ways in which our customers use Animator to create the most incredible things, from games to ads. It’s hard to predict exactly what you will be using our export for, so to make it even more flexible and useful, Animator 1.2 includes these new capabilities:</p>

<p>Animator now exports the new standards-track CSS3 gradient syntax (which fixes a Firefox bug), but the old syntax is still available for projects targeting webkit-based browsers.</p>

<p><figure class="aligncenter">
    <img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/Gradient_Editor.png" alt="New gradient editor" width="636">
    <figcaption>New gradient editor in Sencha Animator 1.2.</figcaption>
</figure></p>

<p>The export options have been refined: we have added the ability to prettify and minify the HTML export and to export individual scenes from a project that contains more than one.</p>

<p>In order to meet the needs of customers doing heavy post processing on generated code, scene duration is now an explicit value. A few other tweaks have been made in order to make the output more readable and predictable. Also, Scenes can now have a CSS ID assigned to them.</p>

<h4>UX Tweaks</h4>

<p>When it comes to user experience, the Tools team at Sencha is committed to creating the best possible experience, and that means constantly improving and refining the Animator UI. In this release we made a few changes to make your work inside Animator even more pleasant and productive.</p>

<p>We improved the way animation segments are handled in the timeline, so it&#8217;s no longer possible to drag and drop one cluster of keyframes inside another. This was leading to unpredictable results.</p>

<p>The stage area received a lot of attention: we now have pixel markers (every 50px when at 100% zoom) to make it easier to visually size and align objects. We also tweaked how guides are created, so you can now create a vertical and an horizontal guide at the same time by dragging from the rulers&#8217; intersection. Rotating a selected object is also much easier: there is a new rotation handle that removes the need to use the property panel.</p>

<p><figure class="aligncenter">
    <img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/Double_guides.png" alt="Creating two guides simultaneously" width="636">
    <figcaption>Creating two guides simultaneously in Sencha Animator 1.2.</figcaption>
</figure></p>

<p>The object tree now retains state when navigating between scenes, and a scene&#8217;s minimum length can now be set numerically in the property panel.</p>

<p>Imported images can be refreshed project-wide, so if you edit assets in an external application, it&#8217;s quicker to see the changes reflected in your project.</p>

<p>Performance and responsiveness are important to the user experience of any application: in this release Animator can export large projects more quickly. Various widgets and the property panels were tweaked to be more responsive to user&#8217;s input, and the new version of our runtime should produce a slight increase in performance across the board.</p>

<h3>What&#8217;s next</h3>

<p>We hope you&#8217;ll like the improvements we made to this latest release of Animator, and stay tuned for more improvements in the near future.</p>

<p>For now go ahead and update to the new version. Since this new version contains significant updates to our runtime, automatic updates will prompt you to download a new Animator installer. You can also <a href="http://www.sencha.com/products/animator/download">download the installer from our site</a> and simply replace the old version with the new one.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 13 Mar 2012 10:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/sencha-animator-1-2-now-available/#date:10:00</guid>
        </item>
        
        <item>
        <title>Sencha Touch 2.0&#8212;Built for Amazing Apps</title>
        <author>Jamie Avins</author>
        <description>
            Ever since we first unveiled the original Sencha Touch, we&apos;ve been raising expectations of what HTML5 apps can do. Almost two years ago, Sencha Touch pioneered a whole new way of creating mobile apps that run across multiple platforms with HTML5. Since then, HTML5 has become the most important advance in application development in the last decade. And today we&apos;re proud to announce the release of Sencha Touch 2.0.  We’re certain it will change the way you think about mobile apps.
        </description>
        <link>http://www.sencha.com/blog/announcing-sencha-touch-2/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright shadow rounded" src="http://cdn.sencha.io/img/touch2/20120306-touch2-thumb.png" alt="Sencha Touch 2.0.0 GA" height="90" width="120"> Ever since we first unveiled the original Sencha Touch, we&#8217;ve been raising expectations of what HTML5 apps can do. Almost two years ago, Sencha Touch pioneered a whole new way of creating mobile apps that run across multiple platforms with HTML5. Since then, HTML5 has become the most important advance in application development in the last decade. And today we&#8217;re proud to announce the release of <a href="http://www.sencha.com/products/touch/">Sencha Touch 2.0</a>.  We’re certain it will change the way you think about mobile apps.</p>

<p><a class="button-link small inline arrow download" href="http://www.sencha.com/products/touch/download/"><span>Download Sencha Touch 2</span></a>&nbsp;&nbsp;&nbsp;<a class="button-link small blue inline arrow download" href="http://www.sencha.com/products/sdk-tools"><span>Download SDK Tools beta</span></a>&nbsp;&nbsp;&nbsp;<a class="more-icon" href="http://dev.sencha.com/deploy/touch/release-notes.html">View Release Notes</a></p>

<p>Sencha Touch 2 delivers a major upgrade to the app experiences that you create, the efficiency of your work as a developer, and the ability of your apps to participate in the mobile ecosystem.</p>

<iframe src="http://player.vimeo.com/video/37993784" width="636" height="358" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

<h3>Built for Speed</h3>

<p>When we first thought about what to improve for Sencha Touch 2, one thing was at the top of our list: performance. Performance is a broad-ranging attribute, and one of extreme importance to application users. We’ve left no stone unturned in Sencha Touch 2, optimizing scrolling frame rates, layout speed, load time, and even how quickly a button responds to touch. <span class="meta">(You can <a href="http://www.sencha.com/blog/sencha-touch-2-developer-preview/">read more about our improvements in smoothness and responsiveness in our previous article.</a>)</span></p>

<p><figure class="aligncenter">
    <a href="http://www.sencha.com/apps/discover-music"><img class="rounded shadow" src="http://src.sencha.io/636/http://cdn.sencha.io/img/touch2/ST2-Discover-Music.jpg" alt="Discover Music" width="636"></a>
    <figcaption>Discover Music, built by Modus Create, uses the NPR Music API for an incredible browsing experience. <br><a class="more-icon" href="http://www.sencha.com/apps/discover-music">View on the App Gallery</a></figcaption>
</figure></p>

<p>In order to create great user experiences, we felt that mobile web apps had to get a lot faster. We&#8217;ve previously focused on <a href="http://www.sencha.com/blog/sencha-touch-2-developer-preview/"> making apps feel much faster</a> when they&#8217;re being used. Today we&#8217;re adding another leap forward in startup performance.</p>

<h4>Startup Speed</h4>

<p>Startup performance is critical for every app, but web apps have some special challenges. Traditionally, mobile web content has been fetched from remote web servers over high latency connections and inefficient redundant http connections. Mobile web caches have been known for their rudimentary capabilities. While data-driven Ajax UI&#8217;s have improved post-startup responsiveness, Ajax by itself, does little to improve initial application load.</p>

<p>The key to improving startup time is twofold &#8211; make fewer requests and transfer less data. Sencha Touch 2 does both. First, our new one-line build command automatically pares your app to the minimum possible number of files, which minimizes the number of http requests. Second, our groundbreaking new app loader caches your entire application within localStorage. This bypasses the need to download the app on a user’s second visit- in fact your app could load without making a single web request. This can yield a stunning improvement in the startup speed of your web app &#8211; in our example application below, the second visit time is 250% faster when using our loader.</p>

<p><figure class="aligncenter">
    <img src="http://cdn.sencha.io/img/touch2/20120305-ST2-performance-graph.png" alt="Performance comparison of Sencha Touch 1.1 versus Sencha Touch 2.0" height="280" width="636">
    <figcaption>Performance comparison of Sencha Touch 1.1 versus Sencha Touch 2.0 shows enormous improvement.</figcaption>
</figure></p>

<p>The loader automatically handles application changes. So whenever a user launches your app, the loader automatically checks for updates. If you&#8217;re running an older version of the app, it’ll create and download a delta update containing only the changes compared to the version on your device. Because most app updates are small relative to the full size of the app, delta updates mean that your app spends substantially less time on startup. We think the user experience will be radically better, making many connectivity and network latency issues a thing of the past.</p>

<p>We think this levels the playing field between native and web apps. To show how impactful it can be, we’ve equipped <a href="http://dev.sencha.com/deploy/touch/examples/" target="_blank">all our examples</a> with our new loader. We&#8217;ve also created a demonstration video that shows it in action. <a class="more-icon" href="https://vimeo.com/38010669">Watch a quick demo video on Vimeo</a></p>

<p>Our loader technology is baked into the <a href="http://www.sencha.com/products/sdk-tools/">Sencha SDK Tools</a>, which also sees a new release today. Our new release of the tools includes scaffolding, a simple but powerful capability that automates MVC class creation, deployment which makes it easy to build and deploy your apps, and packaging, to make wrapped apps for native app stores. Download Touch 2 with the new SDK Tools, then watch the new getting started video to see how easy it is to write Sencha Touch 2 apps.</p>

<p><figure class="aligncenter">
    <a href="http://www.sencha.com/apps/the-watch-list"><img class="rounded shadow" src="http://src.sencha.io/636/http://cdn.sencha.io/img/touch2/ST2-Watch-List.jpg" alt="The Watch List" width="636"></a>
    <figcaption>The Watch List, an official Touch 2 demo to show off Facebook integration. <br><a class="more-icon"  href="http://www.sencha.com/apps/the-watch-list">View on the App Gallery</a></figcaption>
</figure></p>

<h3>Built for Great Experiences</h3>

<p><img class="alignright" src="http://cdn.sencha.io/img/touch2/20120306-the-watch-list.jpg" alt="The Watch List" height="218" width="300"> We’re releasing a collection of <a href="http://www.sencha.com/products/touch/demos/">fantastic demo applications</a> with Sencha Touch 2 to show you the range of engaging user experiences you can build with it. First is <a href="http://www.sencha.com/apps/the-watch-list/">The Watch List</a> &#8211; an immersive social movie experiment built by the Touch team. Combining data from Facebook’s Open Graph, YouTube’s HTML5 video API and Flixster’s Movie API, we wanted to share how easy it is to build a world class app. The Watch List can be used to share the movies you’ve seen and want to see.  We hope that you enjoy using it as much as we enjoyed building it.</p>

<h3>Built for the Mobile Ecosystem</h3>

<p>We all love using web technology to build our apps, and in many cases deploying your app from a web server (and avoiding the hassles of app stores) will be the appropriate distribution choice.  To make it easier to monetize mobile web deployment, we’ve partnered with AT&amp;T to deliver their carrier-grade API’s for billing, location and more through Sencha Touch.  Read more about how you can equip your mobile web app with <a href="http://developerboards.att.lithium.com/t5/AT-T-Developer-Program-Blogs/Mobile-Web-Apps-through-HTML5-AT-amp-T-API-Platform-and-Sencha/ba-p/31392">carrier billing powered by AT&amp;T.</a></p>

<p>There are also times when your users or your customers want to install and update your app via a native app store. With Sencha Touch 2, that’s as simple as typing a single command. The Sencha SDK Tools now include native packaging, which lets you package and build your application as an Android .apk or an iOS .ipa. The best part? The SDK Tools work on both Mac and Windows, meaning PC developers can package iOS applications. It’s a major step forward for developers since your development platform no longer limits your choice of app stores. For enterprises standardized on Windows, you can use Sencha SDK Tools to package your iOS app as a part of your own internal build process.</p>

<p>In addition to the new packaging features, we’ve also enabled a set of native device APIs that work on both iOS and Android. These device APIs are Camera, Orientation, Network Connectivity, and native confirmation dialogs. The APIs are all accessible from JavaScript and provide identical semantics and signatures regardless of platform.</p>

<p><figure class="aligncenter">
    <a href="http://www.sencha.com/apps/sencha-radio"><img class="rounded shadow" src="http://src.sencha.io/636/http://cdn.sencha.io/img/touch2/ST2-Sencha-Radio.jpg" alt="Sencha Radio" width="636"></a>
    <figcaption>Sencha Radio, built with Sencha Touch 2 by our Professional Services Team. <br><a class="more-icon" href="http://www.sencha.com/apps/sencha-radio">View on the App Gallery</a></figcaption>
</figure></p>

<h3>Built for You!</h3>

<p>We’ve also been busy recording screencasts. We’ve done a huge amount of work making Sencha Touch 2 easier to learn and easier to build expertise in. We’ve updated the Sencha SDK Tools, so creating apps is easier than ever. While the SDK Tools are not required to build Sencha Touch 2 apps, they can make app development much easier (and faster). To show you just how easy it is to get started we&#8217;ve created a video that creates and deploys a simple app in thirty minutes. <a class="more-icon" href="https://vimeo.com/37974749">Watch the Getting Started video on Vimeo</a></p>

<p>The new live demonstration videos are part of the massive expansion in learning materials we&#8217;ve created for Sencha Touch 2. The new <a href="http://docs.sencha.com/touch/2-0/#">documentation center</a> features complete API documentation as well as over 35 in-depth guides on everything from getting started to native packaging.</p>

<p><figure class="aligncenter">
    <a href="http://www.sencha.com/apps/orea-hotels-magazine/"><img class="rounded shadow" src="http://src.sencha.io/636/http://cdn.sencha.io/img/touch2/ST2-Orea-Magazine.jpg" alt="Orea Magazine" width="636"></a>
    <figcaption>Orea Magazine is an outstanding example of what is possible with Sencha Touch. <br><a class="more-icon" href="http://www.sencha.com/apps/orea-hotels-magazine/">View on the App Gallery</a></figcaption>
</figure></p>

<h3>Built for Amazing Apps</h3>

<p>Sencha Touch 2 sets a new bar for mobile HTML5 applications. You’ll be excited to hear that <a href="http://www.sencha.com/blog/sencha-designer-2-beta-announcement/">Sencha Designer 2.0</a> works in harmony with all of the new deployment features and will support Sencha Touch 2.0 final in our next auto update. You can also look forward to Touch Charts updated to work with Sencha Touch 2. We are proud of this release, but we’re even prouder when we think of the amazing applications that you’ll build with it.</p>

<p>With over 15,000 forum posts in the <a href="http://www.sencha.com/forum/forumdisplay.php?89-Sencha-Touch-2.x-Forums">Sencha Touch 2 forums</a> to date, we are incredibly grateful for the input and energy of our engaged and knowledgeable community.  The community helps with everything from helping newcomers get familiar with the framework to advising on those final polishing touches.  Ultimately, the measure of our success is only the reflection of the amazing apps that we help you build!  We hope we’re equipping you to build extraordinary apps!</p>

<p><a class="button-link small inline arrow download" href="http://www.sencha.com/products/touch/download/"><span>Download Sencha Touch 2</span></a>&nbsp;&nbsp;&nbsp;<a class="button-link small blue inline arrow download" href="http://www.sencha.com/products/sdk-tools"><span>Download SDK Tools beta</span></a>&nbsp;&nbsp;&nbsp;<a class="more-icon" href="http://dev.sencha.com/deploy/touch/release-notes.html">View Release Notes</a></p>

<p>h4. Follow Sencha Touch 2 Development</p>

<p>If you missed all the great progress in our development of Sencha Touch 2, catch up with our release blog posts from the last three weeks:</p>

<ul>
<li><em>Feb 1</em>: &#8220;Sencha Touch 2 Beta&#8221;:http://www.sencha.com/blog/sencha-touch-2-raising-the-bar/</li>
<li><em>Feb 8</em>: &#8220;Sencha Touch 2 Beta 2&#8221;:http://www.sencha.com/blog/dive-into-dataview-with-sencha-touch-2-beta-2/ and a tutorial on DataView</li>
<li><em>Feb 14</em>: &#8220;Sencha Touch 2 Beta 2&#8221;:http://www.sencha.com/blog/sencha-touch-2-beta-3-kindle-fire-and-chrome-support/ added support for Kindle Fire, and Chrome for Android</li>
<li><em>Feb 22</em>: &#8220;Sencha Touch 2 Release Candidate&#8221;:http://www.sencha.com/blog/sencha-touch-2-rc-native-packaging/</li>
<li><em>Mar 6</em>: &#8220;Sencha Touch 2 GA&#8221;:http://www.sencha.com/blog/announcing-sencha-touch-2/</li>
</ul>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Tue, 06 Mar 2012 09:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/announcing-sencha-touch-2/#date:09:00</guid>
        </item>
        
        <item>
        <title>Flex to Sencha: Roadshow Update</title>
        <author>Ted Patrick</author>
        <description>
            Looking for the next step after Flex? Sencha has the desktop and mobile frameworks that give you a smooth migration to HTML5 application development. Ted Patrick is going on the road to show off Sencha&apos;s frameworks for building mobile and desktop applications using web standard HTML5, JavaScript, and CSS.
        </description>
        <link>http://www.sencha.com/blog/flex-to-sencha-roadshow-update/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright rounded shadow" src="http://img1.sencha.com/files/misc/sencha-on-the-road.jpg"> I wanted to share an update on the Flex to Sencha Roadshow. Thus far we have visited developers in Dallas, San Francisco, San Diego, Amsterdam (<span class="caps">FITC</span>), and most recently London. The roadshow has had a warm reception from Flex developers interested in Sencha as a platform. While the syntax of writing software with Sencha frameworks varies wildly from Flex, the core development paradigms are identical. With support for classes, component, and declarative UI; I know Flex developers will be very successful with Sencha as a platform.</p>

	<p><img src="http://pages.sencha.com/rs/sencha/images/flex-sencha-icons-380x77.png" title="Sencha Frameworks" alt="Sencha Frameworks" /></p>

	<p>In parallel to the roadshow, I have been visiting with many of the top Flex enterprise customers and many are well underway planning and building applications with Sencha. Additionally many of the leading Flex consulting firms and individual Flex consultants have attended Sencha training and are now beginning to build a new practice around application development on HTML5.</p>

	<p>I am especially excited to announce that Sencha will be sponsoring <a href="http://www.360flex.com/">360Flex in Denver on March 15-18</a>. I will be presenting a keynote at the end of the day on March 16 and we have a great party planned directly afterwards onsite.</p>

	<p>Here are more upcoming dates on the Flex to Sencha Roadshow:</p>

	<p>March 5 &#8211; <a href="http://www.meetup.com/how-to-javascript/events/44709602/">New York</a></p>

	<p>March 6 – <a href="http://hello-sencha-boston.eventbrite.com/">Boston</a></p>

	<p>March 8 – <a href="http://hellosenchacfug.eventbrite.com/">Chicago</a></p>

	<p>March 12 &#8211; <a href="http://www.pfpaug.org/core/pivot/entry.php?id=73">Philadelphia</a></p>

	<p>March 13 – <a href="http://www.meetup.com/atlflex/events/52162622/">Atlanta</a></p>

	<p>March 21 &#8211; <a href="http://www.meetup.com/Seattle-Web-App-Developers-Group/events/52464432/">Seattle</a></p>

	<p>March 22 – <a href="http://www.idofnashville.com/events/50938802/?eventId=50938802&amp;action=detail">Nashville</a></p>

	<p>March 24 – <a href="http://eventful.com/toronto/events/spotlight-javascript-/E0-001-044493394-9"><span class="caps">FITC</span> Spotlight JavaScript</a></p>

	<p>March 29 – <a href="http://www.meetup.com/Orange-County-ColdFusion-User-Group/events/53670722/">Los Angeles</a></p>

	<p>April 3 &#8211; <a href="http://www.eventbrite.com/event/2991382305">Washington DC</a></p>

	<p>April 5 &#8211; <a href="http://www.meetup.com/BayAreaMobile/events/53703502/">Bay Area Mobile</a></p>

	<p>April 15 &#8211; <a href="http://www.360flex.com/schedule/">360|Flex in Denver</a></p>

	<p>April 23 &#8211; <a href="http://www.fitc.ca/events/about/?event=124"><span class="caps">FITC</span> Toronto</a></p>

	<p>April 27 &#8211; <a href="http://events.actioncreations.com/adobecampbrasil2012/english/index.php">Adobe Camp Brazil</a></p>

	<p>May 1 &#8211; <a href="http://www.meetup.com/Wellington-Adobe-Web-Technology-Meetup/events/55020212/">Wellington, New Zealand</a></p>

	<p>May 3 &#8211; <a href="http://www.webdu.com.au/">WebDU &#8211; Sydney Australia</a></p>

	<p>I look forward to meeting you on the roadshow and highlighting why Sencha is the next platform for application developers.</p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Mon, 05 Mar 2012 12:26 GMT</pubDate>
        <guid>http://www.sencha.com/blog/flex-to-sencha-roadshow-update/#date:12:26</guid>
        </item>
        
        <item>
        <title>Optimizing Ext JS 4.1-based Applications</title>
        <author>Don Griffin</author>
        <description>
            Guidelines with tips and tricks on how to take advantage of Ext JS 4.1 performance enhancement in your applications
        </description>
        <link>http://www.sencha.com/blog/optimizing-ext-js-4-1-based-applications/</link>
        <content:encoded>
            <![CDATA[
                <p><img class="alignright rounded shadow" src="http://img1.sencha.com/files/misc/ext-js-4-1-performance-webinar.jpg" alt="Optimizing Ext JS 4.1-based Applications" height="180" width="240"> Sencha improved performance with Ext JS 4.1, but when it comes to optimal performance of Ext JS-based applications, that&#8217;s only part of the battle. The rest comes from optimizing applications for performance, which often includes making a few changes so your code can take advantage of Ext JS enhancements.</p>

	<p>We&#8217;ll tell you how to do that in this blog post. We&#8217;ll also introduce you to a new performance measurement tool releasing with Ext JS 4.1, Page Analyzer. Measurement is key when it comes to improving the performance of your applications. You need to figure out what to measure and how to measure it so you can identify bottlenecks in your code and take the right steps to eliminate them. Page Analyzer helps you do that. Finally, we discuss grid optimization and introduce you to another new Ext JS tool for evaluating grid performance, Infinite Grid Tuner. </p>

	<p>As we&#8217;ve worked with Ext JS developers, we&#8217;ve noticed a few common trends in the way applications are written that provide opportunities for performance tuning. We can&#8217;t enumerate every single coding technique that might bog down your application; however, we&#8217;ve seen that the way developers use the framework in the following areas can often stand in the way of a high performing application.</p>

	<h3>General optimization tips</h3>

	<p>Here are a few things you can do to avoid common areas that slow down Ext JS code.</p>

	<h4>Check your event listeners</h4>

	<p>The way your application uses event listeners is a key performance concern. For example, you might set a <code>load</code> event to fire the first time a store gets data. If you&#8217;re not careful, that same <code>load</code> event might fire every time the store gets new data. Turning that off, and having <code>load</code> fire only the first time the store retrieves data can make a substantial difference in the overall performance of your application. To do this, add <code>single:true</code> to your listener:</p>

<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript">listeners<span class="sy0">:</span> <span class="br0">&#123;</span>
    load<span class="sy0">:</span> onFirstLoadData<span class="sy0">,</span>
    single<span class="sy0">:</span> <span class="kw2">true</span>
<span class="br0">&#125;</span></pre>

	<p>Another event to be careful of is <code>afterrender</code>, which fires after all <span class="caps">DOM</span> elements already exist. Changing elements after rendering causes reflows, slowing your application. Instead, adjust classes and set styles before rendering takes place using <code>beforerender</code> so that the element renders with the correct classes and styles. Some code that must run after render may require the element size to have been acquired. Ext JS 4.1 provides a new event, <code>boxready</code>, which you should consider using if that is the case. It runs after the size of a component has been determined.</p>

	<h4>Remove <code>doLayout</code> and <code>doComponentLayout</code> calls</h4>

	<p>Simply put, remove these expensive calls whenever possible. In older versions of Ext JS (prior to 4.0), <code>doLayout</code> was how you told the framework you were done with a component or container and to go ahead and recalculate its layout. Even in Ext JS 4.0, these calls were sometimes needed after direct <span class="caps">DOM</span> updates or to work around certain bugs.</p>

	<p>With Ext JS 4.1, layouts are triggered differently, so your code should seldom need to call <code>doLayout</code> or <code>doComponentLayout</code>. If it turns out that these calls are still needed as bug workarounds in your application, please file a bug report so we can fix it.</p>

	<p>The only time <code>doLayout</code> or <code>doComponentLayout</code> should be needed for non-bug reasons is when the <span class="caps">DOM</span> is directly changed by application code. Since the framework is unaware of such changes, these calls are needed to update the affected layouts.</p>

	<h4>Reduce container nesting</h4>

	<p>We often see applications with excessive nesting of containers. For example, there might be a container that owns a single container which owns multiple components where all the work is taking place. You can often eliminate the outer container and accomplish the same thing with one container. It is important to remember that each container takes time to initialize, render, and layout, so the more you can get rid of unneeded nested containers like this, the faster your application will run. Look for code like the following (the “id” properties are seldom seen in practice but are added here to clarify that there are two containers):</p>

<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="br0">&#123;</span>
    id<span class="sy0">:</span> <span class="st0">'container1'</span><span class="sy0">,</span>
    items<span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#123;</span>
        id<span class="sy0">:</span> <span class="st0">'container2'</span><span class="sy0">,</span>
        items<span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#123;</span>
            id<span class="sy0">:</span> <span class="st0">'component3'</span>
        <span class="br0">&#125;</span><span class="br0">&#93;</span>
    <span class="br0">&#125;</span><span class="br0">&#93;</span>
<span class="br0">&#125;</span></pre>

	<p>If possible, the above should be reduced to a single container:</p>

<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="br0">&#123;</span>
    id<span class="sy0">:</span> <span class="st0">'container1'</span><span class="sy0">,</span>
    items<span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#123;</span>
        id<span class="sy0">:</span> <span class="st0">'component3'</span>
    <span class="br0">&#125;</span><span class="br0">&#93;</span>
<span class="br0">&#125;</span></pre>

	<h4>Replace Panels with Containers</h4>

	<p>Remember that Ext JS Panels are more powerful (and expensive!) than basic Containers. So specify <code>xtype: &#39;container&#39;</code> to avoid having your application use the default <code>&#39;panel&#39;</code>, as shown below.</p>

<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="br0">&#123;</span>
    xtype<span class="sy0">:</span> <span class="st0">'container'</span><span class="sy0">,</span> <span class="co1">// defaultType is 'panel'</span>
    items<span class="sy0">:</span> <span class="br0">&#91;</span> ... <span class="br0">&#93;</span>
<span class="br0">&#125;</span></pre>

	<h4>Reduce border layout nesting</h4>

	<p>With Ext JS 4.1, there are many cases where you no longer need to use nesting with the border layout. Removing this nesting will reduce the time to initialize, render, and layout your components. Previous versions of Ext JS required nesting when you needed, for example, to have two or more instances of the same region. You also had to nest border layouts if you needed two North regions above the center region. Now you can just have two North regions as part of the single border layout.</p>

	<p>With Ext JS 4.1, regions can be added dynamically when they are needed, instead of having to add all regions up-front and hide them when not in use. You can also use the <code>weight</code> property to give precedence to a region—for example, giving precedence to the West region over the North region. All these changes mean that you should not often need nesting with border layout, speeding up rendering of components that use that layout.	</p>

	<h4>Reduce <span class="caps">DOM</span> reads and writes</h4>

	<p>With Ext JS 4.1, we have tuned how layouts interacts with the <span class="caps">DOM</span> to reduce reads and writes wherever possible. You should do the same with your code. <span class="caps">DOM</span> reads by themselves can slow an application, but they have especially high-overhead when mixed with <span class="caps">DOM</span> writes, as this combination causes reflows. Try to manipulate styles and classes using <code>beforerender</code> so they are rendered with a component instead of changed after rendering. Avoid using <code>setStyle</code>, <code>addCls</code> and <code>removeCls</code>, and other direct <span class="caps">DOM</span> element modifications which cause writes. As a general rule, for better performance, try to manipulate the <span class="caps">DOM</span> in batches of reads and writes when writes are needed.</p>

	<h4>Eliminate extra layouts with <code>Ext.suspendLayouts</code> and <code>Ext.resumeLayouts</code></h4>

	<p>Ext JS 4.1 provides two new methods, <code>Ext.suspendLayouts</code> and <code>Ext.resumeLayouts</code>, to help you coordinate updates to multiple components and containers. Adding two items in rapid succession to two containers, for example, causes multiple layout and render operations to be performed. If you use <code>Ext.suspendLayouts</code> before you add these items the framework will no longer perform the layout for each individual item. Once you&#8217;re done making your additions, use <code>Ext.resumeLayouts</code> and the framework will perform a single render and layout operation.</p>

	<p>Keep in mind that it is not only adding items to containers that can trigger a layout. Other operations and changes to components and containers will also trigger layouts. It is important to analyze use cases in your application that have performance issues and make sure there are no extraneous layouts being performed.</p>

<style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="br0">&#123;</span>
    Ext.<span class="me1">suspendLayouts</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="co1">// batch of updates</span>
    Ext.<span class="me1">resumeLayouts</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre>

	<h3>Introducing the Ext JS Page Analyzer</h3>

	<p>Ext JS 4.1 includes a new tool to help you look at what&#8217;s going on under the covers of an application and measure its performance. You can also use it to quickly measure the performance impact of changes you make to code. Page Analyzer loads Ext JS 4.1 pages and instruments them with diagnostic hooks. The Page Analyzer contains many experimental features, but perhaps the most useful for optimizing application performance is the Layout tab, which we&#8217;ll take a look at in a moment.</p>

	<p>You can find the tool in the Ext JS 4.1 Examples folder, at the following location in the <span class="caps">SDK</span>:</p>

<style><!-- GeSHi could not find the language {LANGUAGE} (using path {PATH}) --></style><pre class="html">./examples/page-analyzer/page-analyzer.html</pre>

	<p>Copy the entire “page-analyzer” folder on the server that also hosts the application you want to analyze, since browser security only allows the kind of communication required by Page Analyzer between pages from the same server. Also, be sure the version of Page Analyzer you use matches the build number of Ext JS, since it won&#8217;t work if you&#8217;re using a different build.</p>

	<p>As you use it, remember that this is the first release of the tool and that it&#8217;s a work in progress. Please give us your feedback about the tool through the Ext JS forum.</p>

	<p>Here&#8217;s how to use page analyzer:</p>

	<ol>
		<li>Open a browser and enter the <span class="caps">URL</span> for Page Analyzer.</li>
		<li>When it opens, type in the address of page you want to test.</li>
		<li>The page then loads in an <code>iframe</code>, which is why the tool and the application have to be on the same server. Page Analyzer will look something like this when you open the page:</li>
	</ol>

    <figure class="aligncenter">
        <a class="lightbox" href="http://img1.sencha.com/files/misc/ext-js-4-1-perf-1.png"><img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/ext-js-4-1-perf-1.png" alt="Page Analyzer will look something like this when you open the page:"></a>
        <figcaption>Page Analyzer will look something like this when you open the page. Click image to view full-size.</figcaption>
    </figure>

	<p>4. Click the Layout tab. You will see a set of layout runs, like this:</p>

    <figure class="aligncenter">
        <a class="lightbox" href="http://img1.sencha.com/files/misc/ext-js-4-1-perf-2.png"><img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/ext-js-4-1-perf-2.png" alt="Click the Layout tab. You will see a set of layout runs, like this:"></a>
        <figcaption>Click the Layout  tab. You will see a set of layout runs, like this:</figcaption>
    </figure>

	<p>5. You&#8217;re looking for multiple layouts of the same components. When you find that, go back to your code and see if you can eliminate anything that reduces layouts of that component and improve performance.</p>

	<h3>Grid optimizations</h3>

	<p>Ext JS grids can pose a particular problem for web application performance, especially those that represent large data sets. When grids render small data sets, speed is not an issue. However grids with large data sets that call for so-called “infinite scrolling” can pose performance bottlenecks if they&#8217;re not created with some care. Infinite scrolling relies on a page cache where a paging scroller object stores pages of the dataset before the user scrolls to the part of the grid that needs to display it.</p>

	<p>As the user scrolls, the cached data becomes visible and then disappears off the top of the page and is typically no longer kept in the <span class="caps">DOM</span>. The main way to tune this is to keep the <span class="caps">DOM</span> size as small as possible, and cache data on the client side to minimize server round-trips.</p>

	<h4>Scrolling terminology</h4>

	<p>When a data store is configured with buffered: true, a <a href="http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.PagingScroller">PagingScroller</a> object is instantiated to monitor scrolling of the View (grids are specially configured data Views), and attempt to maintain a cache of pages ready to provide data immediately it becomes needed as the view traverses down the dataset.</p>

	<p>In the diagram below, the user has scrolled the view some way down the dataset. The PagingScroller maintains a leading buffer zone of records ready to render in the direction of travel, and a slightly smaller zone behind the direction of travel.</p>

    <figure class="aligncenter">
        <a class="lightbox" href="http://img1.sencha.com/files/misc/buffered_scrolling1.png"><img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/buffered_scrolling1.png" alt="Buffered scrolling diagram"></a>
        <figcaption>In the diagram above, the view has scrolled the buffered store.</figcaption>
    </figure>

	<p>The PagingScroller requests that the data store ensures that the <a href="http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.PagingScroller-cfg-trailingBufferZone">trailingBufferZone</a>, and the <a href="http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.PagingScroller-cfg-leadingBufferZone">leadingBufferZone</a> are in the cache. This causes the store to calculate which pages that requires, and ensure they are cached. The store only makes Ajax requests pages that are not already in the cache.</p>

	<p>As the view scrolls down, the edge of the rendered table almost comes into view. When it is <a href="http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.PagingScroller-cfg-numFromEdge">numFromEdge</a> rows from reaching the edge, the datastore is reloaded with data from further down the dataset, and the vertical position synchronized to keep the visible rows at the same position. When the required data is in the page cache, this operation is instantaneous and invisible. If the scroller is dragged down past the cached pages, an Ajax request will be made, and there will be a LoadMask displayed until the data arrives.</p>

	<p>If scrolling proceeds at a reasonable pace, and the leading edge of the “required zone” moves into a page which is not in the cache, an Ajax request is fired off for that page. In most cases, if the leading buffer zone is large enough, it will arrive in the cache before the rows are needed by the rendered table.</p>

	<p>By default the page cache only stores the most recently used 5 pages. This can be increased if the dataset will be “browsed”, so that a larger proportion of the dataset is cached in the client, and fewer Ajax requests are made. The store&#8217;s <a href="http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.Store-cfg-purgePageCount">purgePageCount</a> controls this behavior.</p>

	<p>If the dataset is not unreasonably large&#8212;up to maybe 50,000 rows, then it may be desirable to cache the entire dataset on the client. Configure the store with purgePageCount: 0 to never discard pages once they are cached.</p>

	<p>How you design this depends on how large the table is that&#8217;s being rendered and browser speed. The larger the table, the more it can scroll without having the edge come into view and without having to refresh the data from the prefetch buffer. However, the more data obtained from the prefetch buffer, the longer the delay in re-rendering. You need to maintain a balance between how much data is visible and how frequently re-rendering is required. If your application targets a fast browser, you can display a larger set of rows and data. For slower browsers, display a smaller table with fewer rows that reaches a visible edge more often and has to refresh more frequently</p>

	<p>To help you tune grids, Ext JS 4.1 includes an example called Infinite Grid Tuner, which you can find in the Examples directory. Infinite Grid Tuner includes a large data set&#8212;50K of records&#8212;and lets you set different ways to load the data into the store to prime the prefetch buffer. For example, you can simulate Ajax latency, change the number of rows that are prefetched, and tune the table size. You can experiment with the various parameters, shown on the left of the next image, to see what works best in the browser(s) your application targets. </p>

    <figure class="aligncenter">
        <a class="lightbox" href="http://img1.sencha.com/files/misc/ext-js-4-1-perf-4.png"><img src="http://src.sencha.io/636/http://img1.sencha.com/files/misc/ext-js-4-1-perf-4.png" alt="experiment with the various parameters"></a>
        <figcaption>You can experiment with the various parameters, shown on the left, to see what works best in the browser(s) your application targets.</figcaption>
    </figure>

	<p>Using the Infinite Grid Tuner, you can also adjust the purge page count setting of the store. This sets the amount of data that&#8217;s removed from the page cache after it&#8217;s been rendered. If you set this number to 0, it keeps all of the data in the buffer, which means that if the user scrolls back up the grid, the data is reloaded without having to refetch data from the server. </p>

	<p>Two other concepts to keep in mind as you experiment with the tuner: A grid&#8217;s visible data set can be thought of as a sliding window. Similarly, the page cache can also be thought of as a sliding window into all the data associated with the grid. You can change the size of both using the tuner. You can also set the rules for when each is replenished, determining at which point in user scrolling (the number of rows from the visible edge) to request more data for the visible part of the grid and the page cache.</p>

	<h3>Additional Resources</h3>

	<p>The following resources are also useful for application performance tuning:</p>

	<ul>
		<li>View a 50-minute <a href="https://vimeo.com/37636229">webinar video</a> version of this blog</li>
		<li>Suggestions from other Ext JS users in the Sencha Ext: Open Discussion forum <a href="http://www.sencha.com/forum/showthread.php?153565">Performance Best Practices thread</a></li>
		<li>Tips for optimizing <a href="http://msdn.microsoft.com/en-us/library/gg699341(v=vs.85).aspx">Internet Explorer 8 and higher</a></li>
		<li>Information about <a href="http://ajax.dynatrace.com/ajax/en/">dynaTrace</a> performance management technology for Internet Explorer and FireFox</li>
		<li>Chrome Speed Tracer <a href="http://code.google.com/webtoolkit/speedtracer/">website</a> and <a href="http://www.youtube.com/watch?v=Sn_3rJaexKc">tutorial</a></li>
		<li>Firebug profiler <a href="http://michaelsync.net/2007/09/10/firebugtutorial-logging-profiling-and-commandline-part-ii">tutorial</a></li>
	</ul>

    <iframe src="http://player.vimeo.com/video/37636229?byline=0" width="636" height="477" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

	<p><small class="meta">This article was written by Don Griffin and Nige White.</small></p>
                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Thu, 01 Mar 2012 10:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/optimizing-ext-js-4-1-based-applications/#date:10:00</guid>
        </item>
        
        <item>
        <title>Create a Small Interactive Application with Sencha Animator</title>
        <author>Arne Bech</author>
        <description>
            This tutorial shows you how to build a full&#45;screen interactive quiz for iPhone based on open web standards using Sencha Animator. In this tutorial we will cover how to use one of the advanced features of Sencha Animator, adding custom code to a project.
        </description>
        <link>http://www.sencha.com/blog/interactive-application-with-sencha-animator/</link>
        <content:encoded>
            <![CDATA[
                <p><figure class="aligncenter">
    <img src="http://img1.sencha.com/files/misc/20120227-animator-tutorial.jpg" alt="Create a Small Interactive Application with Sencha Animator" height="242" width="636">
    <figcaption>This tutorial will show you how to create a small, interactive app with Sencha Animator.</figcaption>
</figure></p>

<p>Sencha Animator is very flexible, and it can be used for a variety of purposes, from prototyping mobile applications to <a href="http://www.sencha.com/blog/how-to-embed-interactive-css3-animations-in-an-ibook/">creating interactive animated features for iBooks</a>. This tutorial shows how an animation can quickly be enhanced to an interactive mini-app by adding actions and custom code.</p>

<p><a class="button-link small inline arrow download" href="http://www.sencha.com/products/animator/download"><span>Download Sencha Animator</span></a>&nbsp;&nbsp;<a class="button-link small inline arrow download blue" href="https://github.com/arnebech/animator-quiz"><span>Download Project Files</span></a>&nbsp;&nbsp;&nbsp;<a class="more-icon" href="http://docs.sencha.com/animator/1-1/" target="_blank">View Animator Docs</a></p>

<h3>Before you get started</h3>

<p>To successfully complete this tutorial, you will need to be familiar with Animator. Before getting started, it&#8217;s a good idea to have absorbed the basics:</p>

<ul>
<li>Download and install the latest <a href="http://www.sencha.com/products/animator">Sencha Animator</a>.</li>
<li>Review <a href="http://docs.sencha.com/animator/1-1/#!/guide">Animator documentation</a> and follow the <a href="http://docs.sencha.com/animator/1-1/#!/guide/quickstart">Animator Quickstart tutorial</a>.</li>
<li>Download <a href="#">project files and resources</a>. They include a partially built “before” version, <code>startQuiz.animproj</code>, which you can open in Animator and use during the tutorial so we can focus on adding interactivity, logic, and JavaScript code. Also included is an “after” version, <code>finishedQuiz.animproj</code>, which shows the finished project after completing the steps described in this tutorial.</li>
<li>Have a WebKit browser like Google Chrome or Apple Safari to preview your Animator projects. (You can also use the iOS Simulator included with Xcode for Mac OS X.)</li>
</ul>

<h4>Open the project</h4>

<p>Open <code>startQuiz.animproj</code> in Sencha Animator. In the Scenes Panel, you should see five scenes, as follows:</p>

<ol>
<li>Intro</li>
<li>Questions</li>
<li>Incorrect</li>
<li>Correct</li>
<li>Score</li>
</ol>

<p>Select and run each scene to see what it does. You should also select the elements in each scene to familiarize yourself with them before we start adding interactivity. As you select elements, keep in mind that Animator lets you select an object on the Center Stage in two ways:</p>

<ul>
<li><strong>Base state mode.</strong> When you select an object that’s not on a keyframe, Animator displays it inside a purple box in the Center Stage. To view an object in this mode, click its name in the Object Tree or click the object in the timeline in between keyframes. Selecting an object in base state mode means you can edit its base properties, which persist with the object throughout the scene.</li>
<li><strong>Keyframe mode.</strong> When you select an object currently on a keyframe, Animator displays it inside a blue box in the Center Stage. To view an object in this mode, click on a keyframe in the Object Tree. Selecting an object in keyframe mode means you can edit its keyframe properties, which can change when the object reaches the next keyframe. </li>
</ul>

<p>In the File menu, select &#8220;Preview Project in Browser&#8221; to view the project in the browser. You’ll see the first scene, which doesn’t allow for any user interaction yet. We’ll take care of that in the tutorial by adding actions and a little JavaScript code to each scene. In the process, we’ll turn the project into a generic interactive quiz template.</p>

<p><figure class="alignright" style="width:300px;">
    <a class="lightbox" href="http://img1.sencha.com/files/misc/20120227-animator-tutorial-code.png"><img src="http://src.sencha.io/jpg75/300/http://img1.sencha.com/files/misc/20120227-animator-tutorial-code.png" alt="Code view in Sencha Animator"></a>
    <figcaption>Code view in Sencha Animator. (Click to view.)</figcaption>
</figure></p>

<h4>Scene 1: Intro</h4>

<p>Select Scene 1 in the Scenes Panel, and select the element called Button in the Object Tree. You can also select it in the Center Stage — it contains the text “Start”. In the Property Panel, in the Click action property under General, select &#8220;Go to next scene&#8221;. When the user clicks the button in the running animation, it will now advance to the next scene. Go ahead and try this by saving your project and selecting Preview Project in the File menu. (Be sure to save your project from time to time after this.)</p>

<p>Let’s also add some JavaScript to initialize a new set of quiz questions. Be sure the Intro scene is selected in the Scene panel, and in the Property Panel set the Start property under Actions to Custom JavaScript. Click Open editor and paste the following code into the Custom JS window:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Create a global object/namespace for the project to use.</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">typeof</span><span class="br0">&#40;</span>quizData<span class="br0">&#41;</span> <span class="sy0">===</span> <span class="st0">&quot;undefined&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    quizData <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// To help work with scenes, translate some</span>
<span class="co1">// scene ids into names. The scene id can be found</span>
<span class="co1">// by hovering the mouse over a scene in the Scene Panel. </span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>quizData.<span class="me1">sceneIDs</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    quizData.<span class="me1">sceneIDs</span> <span class="sy0">=</span> <span class="br0">&#123;</span>
        question<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span>
        wrong<span class="sy0">:</span> <span class="nu0">2</span><span class="sy0">,</span>
        correct<span class="sy0">:</span> <span class="nu0">3</span><span class="sy0">,</span>
        score<span class="sy0">:</span> <span class="nu0">4</span>
    <span class="br0">&#125;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Set up some questions.</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>quizData.<span class="me1">questions</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    <span class="co1">// Each question text entry consists of a question, 4 answers,</span>
    <span class="co1">// and the index of the correct answer.</span>
&nbsp;
    quizData.<span class="me1">questions</span> <span class="sy0">=</span> <span class="br0">&#91;</span>
        <span class="br0">&#123;</span>
            question<span class="sy0">:</span> <span class="st0">&quot;Which one of these is a CSS3 property?&quot;</span><span class="sy0">,</span>
            answers<span class="sy0">:</span> <span class="br0">&#91;</span>
                <span class="st0">'animation-degradation'</span><span class="sy0">,</span>
                <span class="st0">'animation-path'</span><span class="sy0">,</span>
                <span class="st0">'animation-fill-mode'</span><span class="sy0">,</span>
                <span class="st0">'animation-speed'</span>
            <span class="br0">&#93;</span><span class="sy0">,</span>
            correctAnswerIndex<span class="sy0">:</span> <span class="nu0">2</span>
        <span class="br0">&#125;</span><span class="sy0">,</span>
        <span class="br0">&#123;</span>
            question<span class="sy0">:</span> <span class="st0">&quot;What is the syntax to start a keyframe segment in CSS3?&quot;</span><span class="sy0">,</span>
            answers<span class="sy0">:</span> <span class="br0">&#91;</span>
                <span class="st0">&quot;@keyframes 'name'&quot;</span><span class="sy0">,</span>
                <span class="st0">&quot;@animation 'name'&quot;</span><span class="sy0">,</span>
                <span class="st0">&quot;.element:animation&quot;</span><span class="sy0">,</span>
                <span class="st0">&quot;.element:keyframes&quot;</span>
            <span class="br0">&#93;</span><span class="sy0">,</span>
            correctAnswerIndex<span class="sy0">:</span> <span class="nu0">0</span>
        <span class="br0">&#125;</span><span class="sy0">,</span>
        <span class="br0">&#123;</span>
            question<span class="sy0">:</span> <span class="st0">&quot;Which is a valid CSS3 animation-timing-function?&quot;</span><span class="sy0">,</span>
            answers<span class="sy0">:</span> <span class="br0">&#91;</span>
                <span class="st0">'slide-in'</span><span class="sy0">,</span>
                <span class="st0">'ease-out'</span><span class="sy0">,</span>
                <span class="st0">'jump-out'</span><span class="sy0">,</span>
                <span class="st0">'fast-in'</span>
            <span class="br0">&#93;</span><span class="sy0">,</span>
            correctAnswerIndex<span class="sy0">:</span> <span class="nu0">1</span>
        <span class="br0">&#125;</span>  
    <span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Set up or reset variable for the current question.</span>
quizData.<span class="me1">currentQuestionIndex</span> <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Set up or reset variables to keep track of score.</span>
quizData.<span class="me1">scoreRight</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
quizData.<span class="me1">scoreWrong</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></pre></div>

<p>Read through the code comments so you can see what each section does. Close the Custom JS window and save the project.</p>

<h4>Scene 2: Questions</h4>

<p>Select the Questions scene in the Scenes Panel, then select the Question text element in the Object Tree. In the Properties Panel set General->CSS ID to <code>question</code>. This will give the DOM element an ID of <code>question</code> in the exported code so it can easily be referred to from JavaScript code. Similarly, set the CSS IDs of the four buttons (from top to bottom in the Object Tree) to <code>button1</code> (top-most), <code>button2</code>, <code>button3</code>, and <code>button4</code>. Note that Animator will not let you assign the same CSS ID to two elements; Animator automatically changes any redundant name.</p>

<p>Be sure the scene is still selected in the Scenes Panel, and in the Properties Panel, under Actions, se the Start property to Custom Javascript and add the following code, again being sure to review the comments so you can see what each section does:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Increment the question index.</span>
<span class="kw2">var</span> index <span class="sy0">=</span> <span class="sy0">++</span>quizData.<span class="me1">currentQuestionIndex</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// If there are no more questions, go to the Score scene.</span>
<span class="kw1">if</span> <span class="br0">&#40;</span>index <span class="sy0">&gt;=</span> quizData.<span class="me1">questions</span>.<span class="me1">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    controller.<span class="me1">startSceneByID</span><span class="br0">&#40;</span>quizData.<span class="me1">sceneIDs</span>.<span class="me1">score</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">return</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Get the current question.</span>
<span class="kw2">var</span> currentQuestion <span class="sy0">=</span> quizData.<span class="me1">questions</span><span class="br0">&#91;</span>index<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Get references to the different elements on the stage;</span>
<span class="co1">// notice that the text we want to edit resides inside</span>
<span class="co1">// span elements.</span>
<span class="kw2">var</span> question <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#question span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> button1 <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#button1 span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> button2 <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#button2 span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> button3 <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#button3 span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> button4 <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#button4 span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Update the question text.</span>
question.<span class="me1">innerHTML</span> <span class="sy0">=</span> currentQuestion.<span class="me1">question</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Update buttons and answers.</span>
button1.<span class="me1">innerHTML</span> <span class="sy0">=</span> currentQuestion.<span class="me1">answers</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
button2.<span class="me1">innerHTML</span> <span class="sy0">=</span> currentQuestion.<span class="me1">answers</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
button3.<span class="me1">innerHTML</span> <span class="sy0">=</span> currentQuestion.<span class="me1">answers</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span>
button4.<span class="me1">innerHTML</span> <span class="sy0">=</span> currentQuestion.<span class="me1">answers</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Store the correct answer index.</span>
quizData.<span class="me1">correctAnswerIndex</span> <span class="sy0">=</span> currentQuestion.<span class="me1">correctAnswerIndex</span><span class="sy0">;</span></pre></div>

<p>Preview the project again, and you should see that the questions and answers have been updated.</p>

<p>Next, add logic to each of the objects labelled Button to detect if an answer is correct. One at a time for each button, in the Properties Panel select the Custom JavaScript in the Click action property under General, and the following JavaScript, setting buttonIndex in each Button (from top to bottom in the Object Tree) to <code>0</code>, <code>1</code>, <code>2</code>, and <code>3</code>:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Check if this is the button with the correct answer.</span>
<span class="kw2">var</span> buttonIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span>quizData.<span class="me1">correctAnswerIndex</span> <span class="sy0">===</span> buttonIndex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    controller.<span class="me1">startSceneByID</span><span class="br0">&#40;</span>quizData.<span class="me1">sceneIDs</span>.<span class="me1">correct</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
    controller.<span class="me1">startSceneByID</span><span class="br0">&#40;</span>quizData.<span class="me1">sceneIDs</span>.<span class="me1">wrong</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div>

<p><figure class="aligncenter">
    <img src="http://img1.sencha.com/files/misc/20120227-animator-tutorial-browser.jpg" alt="Preview your app in a WebKit browser" height="336" width="300">
    <figcaption>Preview your app in a WebKit browser.</figcaption>
</figure></p>

<h4>Scene 3: Incorrect</h4>

<p>Select the Incorrect scene in the Scenes Panel, then select the Answer text element (which contains the text “Texas” in the Content field under General in the Properties Panel) in the Object Tree. Set the CSS ID for the Answer  element  to <code>correct-answer</code>. Then set the start action of the scene to Custom JavaScript and insert the following code:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Get the current question.</span>
<span class="kw2">var</span> question <span class="sy0">=</span> quizData.<span class="me1">questions</span><span class="br0">&#91;</span>quizData.<span class="me1">currentQuestionIndex</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Get the element that displays the correct answer.</span>
<span class="kw2">var</span> correctElement <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#correct-answer span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Update the answer.</span>
correctElement.<span class="me1">innerHTML</span> <span class="sy0">=</span> question.<span class="me1">answers</span><span class="br0">&#91;</span>question.<span class="me1">correctAnswerIndex</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Increase the wrong answer score.</span>
quizData.<span class="me1">scoreWrong</span><span class="sy0">++;</span></pre></div>

<p>Set the click action for the object called Button (which displays the text “Continue”) to Go to Scene and select &#8220;2. Questions&#8221;.</p>

<h4>Scene 4: Correct</h4>

<p>Select the Correct scene in the Scenes Panel, set the start action of the scene to Custom JavaScript, and insert the following code in the Custom JS window:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Increment the correct score.</span>
quizData.<span class="me1">scoreRight</span><span class="sy0">++;</span></pre></div>

<p>Select the Button element in the Object Tree, set its Click action property to Go to scene, and select 2. Questions. You may have to open the disclosure triangle next to the Click action property to view the list of scenes.</p>

<h4>Scene 5: Score</h4>

<p>Select the Score scene in the Scenes Panel, then select the Score element in the Object Tree. Set its CSS ID to <code>final-score</code>. Then set the start action of the scene to Custom JavaScript and insert the following code to the Custom JS window:</p>

<div><style>/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .imp {font-weight: bold; color: red;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
</style><pre class="javascript"><span class="co1">// Get element for score.</span>
<span class="kw2">var</span> scoreElement <span class="sy0">=</span> document.<span class="me1">querySelector</span><span class="br0">&#40;</span><span class="st0">'#final-score span'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Get score and total possible points.</span>
<span class="kw2">var</span> right <span class="sy0">=</span> quizData.<span class="me1">scoreRight</span><span class="sy0">;</span>
<span class="kw2">var</span> total <span class="sy0">=</span> quizData.<span class="me1">scoreRight</span> <span class="sy0">+</span> quizData.<span class="me1">scoreWrong</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Create score text.</span>
<span class="kw2">var</span> text <span class="sy0">=</span> right <span class="sy0">+</span> <span class="st0">'/'</span> <span class="sy0">+</span> total <span class="sy0">+</span> <span class="st0">' points'</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Display score text.</span>
scoreElement.<span class="me1">innerHTML</span> <span class="sy0">=</span> text<span class="sy0">;</span></pre></div>

<p>Finally, set the Click action property for the scene’s Button element to Go to scene and select “1. Intro”.</p>

<h4>Finishing Touches</h4>

<p>To make this display well on an iPhone, we need to add meta tags to make the app occupy the full screen and so it can be easily saved as a web app on the Home screen. Note that the dimensions set for the app are optimized for full screen mode. We also add a couple of lines of JavaScript to hide the address bar when the page loads.</p>

<p>To do that, select the Project tab, click the Head HTML field under Export, and enter the following code:</p>

<div><style><!-- GeSHi could not find the language {LANGUAGE} (using path {PATH}) --></style><pre class="html">&lt;meta name=&quot;viewport&quot; content=&quot;user-scalable=no, width=device-width&quot;&gt;
&lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot;&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
// hide the address bar
window.addEventListener(&quot;load&quot;,function() {
    setTimeout(function(){
        window.scrollTo(0, 1);
    }, 0);
});
&lt;/script&gt;</pre></div>

<p><figure class="alignright" style="width:250px;">
    <img src="http://img1.sencha.com/files/misc/20120227-animator-tutorial-finished.jpg" alt="Load your Sencha Animator app in the iOS Simulator" height="470" width="250">
    <figcaption>Load your Sencha Animator app in the iOS Simulator.</figcaption>
</figure></p>

<h4>Deploy the App</h4>

<p>Now that the project is complete, select Export in the File menu to create a directory containing an HTML file for the project and its image assets. You can put this directory on your web server to host the quiz mini-app. Here is a link to a <a href="http://animator.sencha.com/samples/learn/quiz/">hosted version of the app</a>. If you have access to an iPhone or the iOS Simulator, save the app to your home screen and see how it works!</p>

<h3>Conclusion and Next Steps</h3>

<p>This guide has shown you how to add actions and custom code to create rich interactive animations that can be combined into a mini-app with little effort.</p>

<p>Since the mini-app is based on open standards it can easily be extended. It could be wrapped for native and submitted to the App Store. Instead of using hard-wired content, the app could get questions and answers through a JSON request. It could be integrated with <a href="http://www.sencha.com/products/io/">Sencha.io</a> to provide scoreboard functionality and much more.</p>

<p>If you expand this application, go ahead and show us your work by creating a new thread in the <a href="http://www.sencha.com/forum/forumdisplay.php?64-Sencha-Animator-Help-amp-Discussion">Sencha Animator forum</a>.</p>

                <style>
                    .right, .alignright { float: right; margin: 0 0 10px 10px; }
                    .left, .alignleft { float: left; margin: 0 10px 10px 0; }
                </style>
            ]]>
        </content:encoded>
        <pubDate>Wed, 29 Feb 2012 10:00 GMT</pubDate>
        <guid>http://www.sencha.com/blog/interactive-application-with-sencha-animator/#date:10:00</guid>
        </item>
        
    </channel>
</rss>
