"import @un/fichier.js@";
/*==============================================================================
 * Ce fichier contient la definition du controlleur de page. Il initialise les controleur de formulaire et les eventuels controles qui n'appartiennent a aucun formulaire.
 globals doit contenir :
    isProd : true si le projet est en production et certain message de debuggage ne sont pas affiches.
    staticDivId : identifiant de la div qui doit servir a afficher le splash lorsde requetes AJAX
*/
var IAD_PageController = IAD_Class.create("IAD_PageController",
{
    initialize: function(globals)
    {
        window.onerror = function(msg, url, line)
        {
            msg = "ERROR: " + msg + "\n" + url + ":" + line;
            if(!globals.isProd){
                alert(msg);
            }else{
                //throw(msg);
            }
            return false;
        }

        /**
        * Retourne le parametre qui q servit a initialiser le controleur. Il peu contenir des variables globales dont d'autre elements ont besoin
        */
        var _globals = $H(globals);
        this.getGlobals = function (key)
        {
            return Object.isUndefined(key) ? globals : _globals.get(key);
        }
        /**
        * Retourne true si le projet est en production, false sinon.
        */
        this.isProd = function ()
        {
            return globals.isProd;
        }
        this.isDevl = function ()
        {
            return !globals.isProd;
        }

        /**
        * Pourra etre utilise dans une requete AJAX : avant de lancer le requete getThePc.getStaticSplash().show(), a la fin du callback : getThePc.getStaticSplash().hide().
        */
        var _staticSplash = new IAD_PageController.StaticSplashHandler(globals.staticDivId);
        /**
        *
        */
        this.getStaticSplash = function()
        {
            return _staticSplash;
        }
        /**
        * Pourra etre utilise dans une requete AJAX : avant de lancer le requete getThePc.getStaticSplash().show(), a la fin du callback : getThePc.getStaticSplash().hide().
        */
        var _helpView = new IAD_PageController.HelpViewHandler(globals.dynamicDivId);
        /**
        *
        */
        this.getHelpView = function()
        {
            return _helpView;
        }
        //alert("IAD_PageController.initialize : getStaticSplash = " + this.getStaticSplash());
        /**
        *
        */
        var _handlers = {};
        /**
        * Cette methode retourne le handler de l'evement eventtype associe au control d'identifiant id. Si eventtype vaut * le premier handler associe au control id est retourne (peu importe son type d'evenement associe). Si raiseExceptionFlag vaut true alors une execption est leves sinon on retourne null.
        */
        this.getElementHandler = function (id, eventtype, raiseExceptionFlag)
        {
            var ret ;
            //eventtype = Object.isUndefined(eventtype) ? "*" : eventtype;
            eventtype = eventtype || "*";
            raiseExceptionFlag = Object.isUndefined(raiseExceptionFlag) ? true : raiseExceptionFlag;
            if(_handlers[id])
            {
                if(_handlers[id][eventtype])
                {
                    //alert("IAD_PageController.getElementHandler() : found with eventtype handler=" + _handlers[id][eventtype]);
                    return _handlers[id][eventtype];
                }
                else if(eventtype=="*")
                {
                    //alert("IAD_PageController.getElementHandler() : looking for any");
                    //any handler, no matter what the enet type is
                    for(var e in _handlers[id])
                    {
                        //alert("IAD_PageController.getElementHandler() : handler for " + e);
                        return _handlers[id][e];
                    }
                }
            }
            //Not found
            if(raiseExceptionFlag)
            {
                this.reportError("IAD_PageController.getElementHandler : no handler for element " + id + " and event " + eventtype);
                return null;
                //throw("IAD_PageController.getElementHandler : no handler for element " + id + " and event " + eventtype);
            }
            return null;
        }
        /**
        * Cette methode ajoute le handler de l'evement eventtype associe au control d'identifiant id au tableau qui stocke les handler afin de pouvoir les recuperer par controle et type de'evenement. Un seul handler est enregistre par control et evenement, un duplicata ecrase le precedent.
        */
        this.addElementHandler = function (id, eventtype, handler)
        {
            if(!_handlers[id])
            {
                _handlers[id] = {};
            }
            _handlers[id][eventtype] = handler;
            if(id == _debugBar.id)
            {
                //alert("IAD_PageController.addElementHandler, id="+id+", eventtype="+eventtype);
            }
        }
        /**
        *
        */
        var _ajaxRequestHandler = new IAD_Ajax.RequestHandler(this);
        /**
        *
        */
        this.getAjaxRequesHandler = function ()
        {
            return _ajaxRequestHandler;
        }
        /**
        *
        */
        this.setAjaxRequestHandler = function (h)
        {
            _ajaxRequestHandler = h;
        }
        /**
        *
        */
        var _formHandlers = new Hash();
        /**
        *
        */
        this.getFormHandler = function (id)
        {
            return _formHandlers.get(id);
        }
        /**
        *
        */
        this.setFormHandler = function (id, c)
        {
            _formHandlers.set(id, c);
        }
        if(globals.isProd)
        {
            this.showDebug = function(){return this;};
            this.hideDebug = function(){return this;};
            this.debug = function(message, reverse){return this;};
            this.clearDebug = function(){return this;};
        }
        else
        {
            this.showDebug = function(){return showDebug();};
            this.hideDebug = function(){return hideDebug();};
            this.debug = function(message, reverse){showDebug(); return debug(message, reverse);};
            this.clearDebug = function(){return clearDebug();};
        }
        var _debugBar = getElt(globals.debugBar);
        var _debugBarHandler = null;
        if(_debugBar)
        {
            //_debugBarHandler = new IAD_PageController.AjaxDebugBarHandler(_debugBar, this);
            //this.addElementHandler(_debugBar.id, "**", _debugBarHandler);
        }
        /**
        * Affiche un message pour rendre compte d'une action (succes ou echec d'une suppression par exemple)
        */
        var _messages = "";
        this.reportMessage = function (msg)
        {
            var content = null;
            var wTitle = null;
            if(Object.isString(msg))
            {
                content = msg;
            }
            else
            {
                content = msg.content;
                wTitle = msg.title;
            }
            alert(content); return;

            content = _messages ? (_messages+"<br/>"+content) : content;
            var w = new Window({className: IAD_PageController.THEME, title:wTitle , width:400, height:50, destroyOnClose: true, recenterAuto:false});
            w.getContent().update(content);
            w.showCenter();
        }
        /**
        * Affiche un message pour rendre compte d'une erreur. Un traitement differencie sera sera fait entre prod et dev
        */
        this.reportError = function (msg)
        {
            var content = null;
            var wTitle = null;
            if(Object.isString(msg))
            {
                content = "Error " + msg;
            }
            else
            {
                content = msg.content;
                wTitle = msg.title;
            }
            alert(content);
            return;

            var w = new Window({className: IAD_PageController.THEME, title:wTitle , width:400, height:50, destroyOnClose: false, recenterAuto:false});
            w.getContent().update(content);
            w.showCenter();
            //alert("Error " + msg);
        }
        /**
        *
        */
        this.addActiveControls = function(activeControls, controller)
        {
            //Setting activeControls
            if(Object.isUndefined(controller)) controller = this;
            var that = this;
            $H(activeControls).each
            (
            function(pair)
            {
                var e;
                //return;
                e = getElt(pair.key, true);
                //on pose les attributs dans l'element
                $H(pair.value).each
                (
                function(p)
                {
                    e[p.key] = p.value;
                }
                );
                e.events = e.events ? e.events : ["*"];
                //Pour le moment on suppose qu'une seule classe gere ts les evenements.
                //TODO: faire en sorte qu'il soit possible de preciser la classe pour chaque
                //alert(e.handlerClass + ", id=" + e.id);
                h = eval("new IAD_PageController." + e.handlerClass + "Handler(e, that, controller)");
                //alert(e.handlerClass + ", id=" + h.getElement().id);
                e.events.each
                (
                function(t)
                {
                    //alert(e.handlerClass + ", id=" + h.getElement().id + ", handler for " + t);
                    IAD_Event.add(e, t, h);
                    controller.addElementHandler(pair.key, t, h);
                    //alert(e.handlerClass + ", handler = " + h.handleEvent);
                    //h.handleEvent({type:"click"});
                }
                );
            }
            );
        }
        /**
        * Elle initialise le controlleur d'un formulaire. Le parametre p doit contenir:
            formId : Identifiant du formulaire
            submittedBy : Ientifiant du controle qui contiendra le submitted by (en general le nom ou l'id du control qui
                provoque la soumission
            dataIdent (facultatif) : l'identifiant du controle cache qui contiendra l'identifiant de l'objet selectionne
                (un indicateur, une formule, une simulation, ...)
            dataControls : Identifiants des controles de donnees. Leurs valeurs seront mise en GET pour chaque requet AJAX.
            activeControls : Tous les controles actifs (y compris tous les dataControls) tels que bouton OK, info bulle ...
        */
        this.addFormHandler = function(p)
        {
            //alert("addFormHandler");
            var fc = new IAD_PageController.FormHandler(this, p);
            this.setFormHandler(fc.getId(), fc);
            var id;
            var e;
            var h;
            var className;

            //Setting dataControls
            p.dataControls.each
            (
            function(id)
            {
                //alert("addFormHandler : in loo");
                e = getElt(id, true);
                //e.defaultVal = p.dataControls[id];
                fc.addDataControl(id, e);
            }
            );
            this.addActiveControls(p.activeControls, fc);
            fc.load();
        }

        this.replaceBraces = function (t)
        {
            return t.replace(/__lbrace__/g, "{").replace(/__rbrace__/g, "}");
        }

        var _freezer = getElt(globals.bodyFreezer);
        this.freeze = function()
        {
            _freezer.appear({from: 0.0, to: 0.5, duration: 0.5});
            //_freezer.show();
            return this;
        }
        this.unFreeze = function()
        {
            _freezer.fade({from: 0.5, to: 0.0, duration: 0.5});
            //_freezer.hide();
            return this;
        }
        //Retourne l'objet contenant les parametres a utiliser pour lancer une requete ajax.
        this.getResquestEnv = function()
        {
            return globals.requestEnv;
        }

        //Retourne l'objet contenant les parametres a utiliser pour lancer une requete ajax sous forme de query str
        this.getResquestEnvQueryString = function()
        {
            return Object.toQueryString(globals.requestEnv);
        }

        if(globals.onMaintenance)
        {
            this.freeze();
        }
        //this.debug("Pour tester");
    }
}
);

IAD_PageController.THEME = "alphacube";


/**
* Objet global a utiliser par les initialisateur. Avant d'appeler IAD_PageController il faut avoir appele IAD_PageController.initPC(globals), sinon une execption sera levee.
*/
IAD_PageController.PC = null;
/**
* globals doit contenir :
*   isProd : true si le projet est en production et certain message de debuggage ne sont pas affiches.
 *  staticDivId : identifiant de la div qui doit servir a afficher le splash lorsde requetes AJAX
*/
IAD_PageController.initPC = function(globals)
{
    IAD_PageController.PC = new IAD_PageController(globals);
    return IAD_PageController.getPageController();
}

IAD_PageController.getPageController = function()
{
    if(IAD_PageController.PC)
    {
        return IAD_PageController.PC;
    }
    throw("IAD_PageController.PC not initialised");
}


