/**
 * A Provider implementation which saves and retrieves state via the HTML5 localStorage API
 * or IE `userData` storage. For details see `Ext.util.LocalStorage`.
 * 
 * If the browser does not support local storage, there will be no attempt to read the state.
 * Before creating this class, check {@link Ext.util.LocalStorage#supported}.
 */
Ext.define('Ext.state.LocalStorageProvider', {
    extend: 'Ext.state.Provider',
    requires: [
        'Ext.util.LocalStorage'
    ],
    
    alias: 'state.localstorage',
   
    constructor: function() {
        var me = this;
 
        me.callParent(arguments);
 
        me.store = me.getStorageObject();
 
        if (me.store) {
            me.state = me.readLocalStorage();
        }
        else {
            me.state = {};
        }
    },
    
    readLocalStorage: function() {
        var store = this.store,
            data = {},
            keys = store.getKeys(),
            i = keys.length,
            key;
            
        while (i--) {
            key = keys[i];
            data[key] = this.decodeValue(store.getItem(key));
        }
 
        return data;
    },
    
    set: function(name, value) {
        var me = this;
        
        me.clear(name);
 
        if (value != null) { // !== undefined && !== null
            me.store.setItem(name, me.encodeValue(value));
            me.callParent(arguments);
        }
    },
 
    /**
     * @private
     */
    clear: function(name) {
        this.store.removeItem(name);
        this.callParent(arguments);
    },
    
    getStorageObject: function() {
        var prefix = this.prefix,
            id = prefix,
            n = id.length - 1;
 
        if (id.charAt(n) === '-') {
            id = id.substring(0, n);
        }
 
        return new Ext.util.LocalStorage({
            id: id,
            prefix: prefix
        });
    }
});