/** 
 * @author Dmitry Monin <d.monin@netzbewegung.com>
 * @created 11.02.2010 
 */

Nb.Wr.Controller = function() {
    var Y = Nb.Lib;
    var components = {};
    var domReady = false;
    var timer = null;
    
    var anim = null;
    
    return {
        _initPageComponents : function() {
            var cmpConfigs = Nb.Wr.PageConfig.components || [];
        
            var errors = [];
            
            for (var i = 0; i < cmpConfigs.length; i++) 
            {
                var cmpType = cmpConfigs[i].type;
                var cmpName = cmpConfigs[i].name;
                var cmpCfg = cmpConfigs[i].config;
                
                try 
                {
                    var type = Nb.Core.Util.getType(cmpType);
                    components[cmpName] = new type(cmpCfg);
                    components[cmpName].on('load', this._onComponentLoad, this);
                } 
                catch (e) 
                {
                    errors.push(e);
                }
            }
            
            this.fire('componentsReady');
            
            
            if (errors.length > 0) 
            {
                throw errors[0];
            }

        },
        _onComponentLoad : function() {
            if(timer)
            {
                timer.cancel();
            }
            
            timer = Y.later(1500, this, this.hideLoader);
        },
        _onDomReady : function() {
            domReady = true;
            this.hideLoader();
        },
        _onHideComplete : function() {
            var pageCusNode = Y.get('#page-customization')
            pageCusNode.setStyles({
                opacity : 0,
                display: 'block'
            });
            
            // Hiding loader
            var anim = new Y.Anim({
                node: pageCusNode,
                to: {
                    opacity: 1
                }
            });
            
            anim.run();              
        },
        addComponent : function(name, component) {
            components[name] = component;
        },
        getComponentByName : function(name) {
            return components.hasOwnProperty(name) ? components[name] : null;
        },
        hideLoader : function() {
            if (!domReady)
            {
                return;
            }

            for (var name in components)
            {
                if (!components[name].get("loaded"))
                {
                    return;
                }
            }
            if (!document.getElementById('page-loader'))
            {
                return;
            }

            // Hiding loader
            this.anim = new Y.Anim({
                node: "#page-loader",
                to: {
                    opacity: 0
                }
            });
            this.anim.on('end', this._onHideComplete, this);
            this.anim.run();

            this.fire('componentsComplete');
        },
        init : function() {
            this._initPageComponents();
            Y.on("domready", this._onDomReady, this);

            try
            {
                Y.History.initialize('#gs-history-field', '#gs-history-iframe');
            } catch(e) {}


        },
        removeComponent : function(name) {
            components[name].destroy();
            delete components[name];                     
        },
        showLoader : function() {
            var pageCusNode = Y.get('#page-customization')
            
            if (pageCusNode.one('ul').one('li').getStyle('display') == 'block')
            {
                // Hide customization
                this.anim = new Y.Anim({
                    node: pageCusNode,
                    to: {
                        opacity: 0
                    }
                });
                this.anim.on('end', this._onHideCustomizationComplete, this);
                this.anim.run();     
            }
            else
            {
                this._onHideCustomizationComplete();
            }
        },
        _onHideCustomizationComplete : function() {
            // Show loader
            this.anim = new Y.Anim({
                node: "#page-loader",
                to: {
                    opacity: 1
                }
            });
            this.anim.run();
        }
    };
}();

Nb.Lib.augment(Nb.Wr.Controller, Nb.Lib.EventTarget);

Nb.Wr.Controller.init();
