var ch = ch || {};
ch.exm = ch.exm || {};
;(function(){
    var wgtNum = 0,
        storedWidgets = [],
        transport = null,
        readyWgt = 0,
        currentTab = 0,
        _wcount = 0
    ;
    ch.exm.Loader = {
        _loadNext: function(){
            var p = this.parameters,
                wgtsToLoad = p["widgets"],
                w = wgtsToLoad[_wcount]
            ;
            if(!w){ return; }
            document.write("<script "   +
                   "type='text/javascript' " +
                   "src='"                   +
                   p["wgtBaseUrl"]           +
                   "/"                       +
                   w["name"]                 +
                   w["version"]              +
                   ".js"                     +
                   "'></script>"
            );
            _wcount++;
        },
	    hideAll: function(){
			for(var i = 0, l = storedWidgets.length; i < l; i++){
				storedWidgets[i].hide();
			}
	    },
        _loadDeps: function(){
            var p = this.parameters,
                d = p.dependencies
            ;
            for(var i = 0, l = d.length; i < l; i++){
                document.write("<scr" + "ipt "   +
                       "type='text/javascript' " +
                       "src='"                   +
                       p["wgtBaseUrl"]           +
                       "/"                       +
                       d[i]["name"]                 +
                       ".js"                     +
                       "'><\/script>"
                );
            }
            document.write("<scr" + "ipt "   +
                   "type='text/javascript' " +
                   ">ch.exm.Loader.startup()<\/scr" + "ipt>"
            );
        },
        _init: function(){
            this.getParameters();
            this._loadDeps();
        },
        startup: function(){
            this._loadNext();
            wgtNum = this.parameters["widgets"].length;
            // widget construction: script tags
        },
        getWgtById: function(/** String */ wId){
            var wgt = null;
            for(var i = 0, l = storedWidgets.length; i < l; i++){
                (storedWidgets[i].wgtId === wId) && (wgt = storedWidgets[i]);
            }
            return wgt;
        },
        register: function(/** Widget */ wgt){
            var wpos = storedWidgets.push(wgt) - 1;
            wgt.parameters = this.parameters["widgets"][wpos]["params"];
            wgt.wgtId = this.parameters["widgets"][wpos]["id"];
            wgt.startup.call(wgt);
            this._loadNext();
            return wpos;
        },
        cback: function(/** Object */ args){
            var id = args.id,
                method  = args.method,
                data = args.data
            ;
            // aggiungere un livello di complessità nella servlet, l'envelop
            this.getWgtById(id)[method](args);
        },
        _setupTabs: function(){
            var p = this.parameters,
                tabs = p.tabs
	        ;
            if(!tabs){ return }
            var tl = tabs.length,
                self = this,
                m = self.fnMap,
                t,
                ct,
                tx,
                clickHandler = function(x){
                    return function(){
                        for(var j = 0; j < tl; j++){
                            ct = document.getElementById(tabs[j]["id"]);
                            ct.className = ct.className.replace(/selected/g, "");
                        }
                        tx = document.getElementById(tabs[x]["id"]);
                        tx.className = tx.className + " selected";
                        if(currentTab != x){
                            currentTab = x;
                            var wgt = self.getWgtById(tabs[x].wgt);
                            wgt.execute(tabs[x].action, wgt);
                        }
                    };
                };
            ;
            this._defaultTab = p["defaultTab"] || 0;
            for(var i = 0; i < tl; i++){
                t = document.getElementById(tabs[i]["id"]);
                t.onclick = clickHandler(i);
            }
	        this.hideAll();
	        storedWidgets[this._defaultTab].show();
            tabs.length && clickHandler(this._defaultTab)();
        },
        notify: function(/** Object */ args){
            var status = args.status;
            switch(status){
                case "ready":
                    readyWgt++;
                break;
                default:
                break;
            }

            (readyWgt === wgtNum) && this._onLoad();
        },
        _onLoad: function(){
            // sistemare i tab
            this._setupTabs();
            this.onLoad();
        },
        onLoad: function(){
            // hook method
	        var ol = this.parameters.onLoad;
	        ol && ol();
        },
        getData: function(/** Object */ args){
            var id = args.id,
                cback = args.cback,
                url = args.url,
                envelop = args.envelop,
                t = args.ownTransport ? null : transport
            ;
            var paramString = "";
            for(var i in envelop){
                paramString += i + ":\"" + envelop[i] + "\"" + ",";
            }
            if(paramString.length){
                paramString = paramString.substring(0, paramString.length - 1) + ",";
            }

            t && t.parentNode.removeChild(t);
            t = document.createElement("script");
            t.type = "text/javascript";
            t.src = url + "&jsonp=ch.exm.Loader.cback({id:'" + id + "',method:'" + cback + "'," + paramString + "data:\"";
            document.getElementsByTagName("head")[0].appendChild(t);

        },
        getParameters: function(){
            var scripts = document.getElementsByTagName("script"),
                cs = null,
                src = "",
                pattern = "/suggester/loader/loader.js",
                p = ""
            ;
            for(var i = 0, l = scripts.length; i < l; i++){
                cs = scripts[i];
                src = cs.src;
                if(src.lastIndexOf(pattern) == (src.length - pattern.length)){
                    p = cs.getAttribute("params");
                    this.parameters = p ? eval("(" + p + ")") : {};
                }
            }
        }
    };
    ch.exm.Loader._init();
})();
    