/**
 * @author Ed Spencer
 *
 * LocalStorageProxyでは、{@link Ext.data.Model モデル}のデータをクライアントのブラウザ上のローカルに保存するために、HTML5のlocalStorage APIを使います。HTML5のlocalStorageはキーバリューストア(つまり、JSONのような複雑なオブジェクトは保存できない)なので、LocalStorageProxyは保存・取得の際に自動的にデータをシリアル化・逆シリアル化します。
 *
 * localStorageは、ユーザー固有の情報を保存するのに極めて便利であり、サポートにサーバーサイドのインフラストラクチャを必要としません。Twitter検索アプリケーションを書くときのことを考えてみましょう。ユーザーの検索をローカルに保存して、その検索を後で簡単に実行できるようにしたいとします。そのような場合、まず検索モデルを作成します。
 *
 *     Ext.define('Search', {
 *         fields: ['id', 'query'],
 *         extend: 'Ext.data.Model',
 *         proxy: {
 *             type: 'localstorage',
 *             id  : 'twitter-Searches'
 *         }
 *     });
 *
 * この検索モデルに含まれるのは、idとqueryの2つのフィールドと、プロキシ定義だけです。LocalStorageプロキシに渡す必要のある設定は、{@link #id}だけです。重要なのは、これによりプロキシ内のモデルデータが他と分離されることです。localStorage APIは、あらゆるデータを単一の共有名前空間に配置します。したがって、idを設定すれば、LocalStorageProxyは保存された検索データを管理することができます。
 *
 * データをlocalStorageに保存することは簡単で、通常は{@link Ext.data.Store ストア}によって行われます。
 *
 *     //our Store automatically picks up the LocalStorageProxy defined on the Search model
 *     var store = Ext.create('Ext.data.Store', {
 *         model: "Search"
 *     });
 *
 *     //loads any existing Search data from localStorage
 *     store.load();
 *
 *     //now add some Searches
 *     store.add({query: 'Sencha Touch'});
 *     store.add({query: 'Ext JS'});
 *
 *     //finally, save our Search data to localStorage
 *     store.sync();
 *
 * store.sync()を呼び出すと、LocalStorageProxyは、新しい検索に自動的にidを設定します。そして、モデルデータをエンコードし、localStorageに配置します。また、ストアを完全にバイパスして直接localStorageに保存することもできます。
 *
 *     var search = Ext.create('Search', {query: 'Sencha Animator'});
 *
 *     //uses the configured LocalStorageProxy to save the new Search to localStorage
 *     search.save();
 *
 * # 制限事項
 *
 * このプロキシを、ローカルストレージをサポートしていないブラウザで使うと、コンストラクタはエラーをスローします。ローカルストレージプロキシには一意のIDが必要です。このIDは、ローカルストレージオブジェクトに格納された全レコードデータのキーとして使われます。
 *
 * この一意のIDを提供しないと、信頼性のあるIDを求めることができません。したがって、IDの提供は重要です。このIDが提供されなかった場合、アタッチされたストアにストアIDがあれば、それがIDとして使われます。どちらの選択肢も与えられなかった場合には、プロキシはエラーをスローします。
 */
Ext.define('Ext.data.proxy.LocalStorage', {
    extend: 'Ext.data.proxy.WebStorage',
    alias: 'proxy.localstorage',
    alternateClassName: 'Ext.data.LocalStorageProxy',
    
    //inherit docs
    getStorageObject: function() {
        return window.localStorage;
    }
});