/**
 * @class Ext.data.StoreManager
 * @extends Ext.util.MixedCollection
 * <p>Contains a collection of all stores that are created that have an identifier.
 * An identifier can be assigned by setting the {@link Ext.data.AbstractStore#storeId storeId}
 * property. When a store is in the StoreManager, it can be referred to via it's identifier:
 * <pre><code>
Ext.create('Ext.data.Store', {
    model: 'SomeModel',
    storeId: 'myStore'
});

var store = Ext.data.StoreManager.lookup('myStore');
 * </code></pre>
 * Also note that the {@link #lookup} method is aliased to {@link Ext#getStore} for convenience.</p>
 * <p>
 * If a store is registered with the StoreManager, you can also refer to the store by it's identifier when
 * registering it with any Component that consumes data from a store:
 * <pre><code>
Ext.create('Ext.data.Store', {
    model: 'SomeModel',
    storeId: 'myStore'
});

Ext.create('Ext.view.View', {
    store: 'myStore',
    // other configuration here
});
 * </code></pre>
 * </p>
 * @singleton
 * @docauthor Evan Trimboli <evan@sencha.com>
 * TODO: Make this an AbstractMgr
 */

Ext.define('Ext.data.StoreManager', {
    extend
: 'Ext.util.MixedCollection',
    alternateClassName
: ['Ext.StoreMgr', 'Ext.data.StoreMgr', 'Ext.StoreManager'],
    singleton
: true,
    uses
: ['Ext.data.ArrayStore'],
   
    /**
     * @cfg {Object} listeners @hide
     */


    /**
     * Registers one or more Stores with the StoreManager. You do not normally need to register stores
     * manually.  Any store initialized with a {@link Ext.data.Store#storeId} will be auto-registered.
     * @param {Ext.data.Store} store1 A Store instance
     * @param {Ext.data.Store} store2 (optional)
     * @param {Ext.data.Store} etc... (optional)
     */

   
register : function() {
       
for (var i = 0, s; (s = arguments[i]); i++) {
           
this.add(s);
       
}
   
},

    /**
     * Unregisters one or more Stores with the StoreManager
     * @param {String/Object} id1 The id of the Store, or a Store instance
     * @param {String/Object} id2 (optional)
     * @param {String/Object} etc... (optional)
     */

    unregister
: function() {
       
for (var i = 0, s; (s = arguments[i]); i++) {
           
this.remove(this.lookup(s));
       
}
   
},

    /**
     * Gets a registered Store by id
     * @param {String/Object} id The id of the Store, or a Store instance, or a store configuration
     * @return {Ext.data.Store}
     */

    lookup
: function(store) {
       
// handle the case when we are given an array or an array of arrays.
       
if (Ext.isArray(store)) {
           
var fields = ['field1'],
                expand
= !Ext.isArray(store[0]),
                data
= store,
                i
,
                len
;
               
           
if(expand){
                data
= [];
               
for (i = 0, len = store.length; i < len; ++i) {
                    data
.push([store[i]]);
               
}
           
} else {
               
for(i = 2, len = store[0].length; i <= len; ++i){
                    fields
.push('field' + i);
               
}
           
}
           
return Ext.create('Ext.data.ArrayStore', {
                data  
: data,
                fields
: fields,
                autoDestroy
: true,
                autoCreated
: true,
                expanded
: expand
           
});
       
}
       
       
if (Ext.isString(store)) {
           
// store id
           
return this.get(store);
       
} else {
           
// store instance or store config
           
return Ext.data.AbstractStore.create(store);
       
}
   
},

   
// getKey implementation for MixedCollection
    getKey
: function(o) {
         
return o.storeId;
   
}
}, function() {    
    /**
     * <p>Creates a new store for the given id and config, then registers it with the {@link Ext.data.StoreManager Store Mananger}.
     * Sample usage:</p>
    <pre><code>
    Ext.regStore('AllUsers', {
        model: 'User'
    });

    //the store can now easily be used throughout the application
    new Ext.List({
        store: 'AllUsers',
        ... other config
    });
    </code></pre>
     * @param {String} id The id to set on the new store
     * @param {Object} config The store config
     * @param {Constructor} cls The new Component class.
     * @member Ext
     * @method regStore
     */

   
Ext.regStore = function(name, config) {
       
var store;

       
if (Ext.isObject(name)) {
            config
= name;
       
} else {
            config
.storeId = name;
       
}

       
if (config instanceof Ext.data.Store) {
            store
= config;
       
} else {
            store
= Ext.create('Ext.data.Store', config);
       
}

       
return Ext.data.StoreManager.register(store);
   
};

    /**
     * Gets a registered Store by id (shortcut to {@link #lookup})
     * @param {String/Object} id The id of the Store, or a Store instance
     * @return {Ext.data.Store}
     * @member Ext
     * @method getStore
     */

   
Ext.getStore = function(name) {
       
return Ext.data.StoreManager.lookup(name);
   
};
});