/**
 * server.js version 1.0.0
 *
 * Dï¿½finit un ensemble de traitements basï¿½s sur l'envoi de requï¿½tes XmlHttpRequest
 * au serveur et le traitement de la rï¿½ponse.
 * Gestion des requêtes Ajax WebOav.
 *
 */
 
function openProject(projectId)
{
    getOavRequest().sendFormRequest(null, null, {_action:'open',prj_oav_id:projectId});
}

/**
 * Objet chargï¿½ d'envoyer une requï¿½te au serveur.
 * Elle fait plusieurs choses :
 * <ul>
 * <li>Elle fournie deux mï¿½thodes pour l'envoie de requï¿½te post ou get au serveur.</li>
 * <li>Elle prend en charge les traitements standards en rï¿½ponse au serveur :</li>
 * 	<ul>
 * 		<li>Affichage des boites de dialogue systï¿½me.</li>
 * 		<li>Mise ï¿½ jour d'input hidden.</li>
 * 		<li>Mise ï¿½ jour d'ï¿½lement HTML de la page.</li>
 * 		<li>Instanciation et lancement de bloc javascripts.</li>
 * 		<li>...</li>
 *		</ul>
 * <li>Dans le cas d'une requï¿½te post elle traite le formulaire et envoi l'ensemble
 * 	de ses paramï¿½tres au serveur.</li>
 * <li>Pour les champs type checkbox, radio, si les valeurs ne sont cochï¿½es
 *   alors on force cette valeur (gï¿½nï¿½ralement false).<br />
 *   De cette faï¿½on, le binding cï¿½tï¿½ serveur est correctement effectuï¿½.<br />
 *   Cette opï¿½ration est rï¿½alisï¿½e dans une version modifiï¿½e de prototype (Form.serialize).</li>
 * @todo autoriser la sï¿½rialisation de plusieurs formulaire dans la page.
 */

/**
 * Cette fonction permet de serialiser les parametres d'un formulaire.
 * Utilise la methode std de prototype (Form.serialize).
 * Par contre, avec cette methode std, les champs radio et checkbox
 * non renseignes ne sont pas inscrit ds la chaine resultat.
 * cette methode ajoute donc les champs qui ne sont pas selected sous la forme :
 * champ= (chaine vide).
 * @return une chaine au format chp1=val1&ch2=val2....
 */
function serialize(form) {
    var outputString = Form.serialize($(form));
    var elements = Form.getElements($(form));
    var lstElts = $(form).getElementsByTagName('input');
    
    if (lstElts)
    {
        // traitement des radio
        var aR = $A(lstElts);
        var mapRadio ={};
        for (var i = 0;i < aR.length;i++)
        {
            var component = aR[i];

            if (component.type == 'radio')
            {
                var valueMap = mapRadio[component.name];
                if (valueMap == 'undefined')
                {
                    valueMap = false;
                }
                var isSelected = component.checked;
                valueMap = valueMap || isSelected ;
                mapRadio[component.name] = valueMap;
            }
        }
        var hshRadio = $H(mapRadio);
        var lst = hshRadio.findAll(function (item)
        {
            return item['value'] == false;
        }
    );
        var strRadio = '';
        lst.each (function (item){
            if (strRadio.length>0)
                strRadio+='&';
            strRadio += item['key'] + '=';
        }
    );

        // traitement des checkbox
        var queryComponents = new Array();
        aR.each(function (item)
        {
            var result = item.type == 'checkbox';

            if (result && !item.checked)
                queryComponents.push(item.name+"=");
        }
    );

        var strChk = queryComponents.join('&');

        // assemblage de l'ensemble
        if (strRadio.length>0)
            outputString += '&' +strRadio;
        if (strChk.length>0)
            outputString += '&' +strChk;
    }
    return outputString;
}

var internalOavRequest = null;
function getOavRequest()
{
    if (internalOavRequest==null)
    {
        internalOavRequest = new OavRequest();
    }
    return internalOavRequest;
}

var OavRequest = Class.create();

Object.extend(OavRequest.prototype, DHTMLMask.prototype);

Object.extend(OavRequest.prototype,
{
    /**
     * Constructeur
     */
    initialize: function()
    {
        this.ajaxRequest = null;
        this.localArrayToSubmit = null;
    },

    setBlocksToSubmit:function(blockArray)
    {
      this.localArrayToSubmit = blockArray;
    },

    cancelBlocksToSubmit:function()
    {
      this.localArrayToSubmit = null;
    },

    /**
     * Envoi une requete de formulaire au serveur
     * @param formAction : L'action du formulaire (optionnel, prend l'action courante du formulaire sinon)
     * @param formId : Le nom du formulaire (optionnel, par dï¿½faut le 1er formulaire de la page)
     * @param p_paramAdditionnels : Liste de paramï¿½tres ï¿½ ajouter dynamiquement
     */
    sendFormRequest:function(formAction, formId, p_paramAdditionnels, ignoreReturn)
    {
        debugForm = false;
	
        strFormId = null;
                
        if(formId && formId != "undefined")
        {
            strFormId = formId;
        }
                
        // Si le formulaire n'est pas paramï¿½trï¿½, prend le premier formulaire trouvï¿½
        // dans le document
        else
        {
            if(document.forms.length == 0)
            {
                alert("The document do not have any form ");
                return;
            }
            else
            {
                strFormId = document.forms[0];
                if(debugForm)
                {
                    alert("Default document form " + strFormId);
                }
            }
        }

        this.usedForm = $(strFormId)

        if(!this.usedForm || this.usedForm == "undefined")
        {
            alert("Form " + strFormId + " not found");
            return;
        }

        // Prend par dï¿½faut l'action du formulaire
        if(!formAction)
        {
            formAction = this.usedForm.action;
        }

        if(debugForm)
        {
            alert("Form action " + formAction);
        }

        formParams = '';

        parametersInitialized = false;
          
        // Ajoute les paramï¿½tres ï¿½ la requï¿½te
        if(p_paramAdditionnels)
        {
            this.addAdditionalParameters(this.usedForm, p_paramAdditionnels);
        }

        // Liste des blocks à soumettre (div, etc...)
        finalArrayToSubmit = null;

        if(this.localArrayToSubmit)
        {
            finalArrayToSubmit = this.localArrayToSubmit;
        }
        else
        {
            finalArrayToSubmit = globalArrayToSubmit;
        }

        this.existing = false;

		if(finalArrayToSubmit)
        {
            jSonAsStr = null;
            initialized = false;

            this.existing = true;

            radioValues = {};
			
			formElList = new FormUtils().getFormElements(finalArrayToSubmit);
			
			if(formElList)
			{
				for(i=0; i<formElList.length; i++)
				{
					formEl = formElList[i];

					elValue = formEl.value;

					if(formEl.type == "radio")
					{
						if(formEl.checked)
						{
							radioValues[formEl.name] = elValue;
						}
						else if(!radioValues[formEl.name])
						{
							radioValues[formEl.name] = '';
						}
					}
					else
					{
						this.appendToJSonStr(jSonAsStr, formEl.name, elValue, initialized);
						initialized = true;
					}
				}
			}
              
            if(radioValues)
            {
                for(radioName in radioValues)
                {
                    this.appendToJSonStr(jSonAsStr, radioName, radioValues[radioName], initialized);
                }
            }
            

            if(jSonAsStr)
            {
                jSonAsStr += "}";
                
                argumentsAsJSon = eval(jSonAsStr);
                this.addAdditionalParameters(this.usedForm, argumentsAsJSon);
            }
      }

        // Permet de poster des blocs en-dehors du formulaire courant.
 /*       if(finalArrayToSubmit)
        {
            jSonAsStr = null;
            initialized = false;

            this.existing = true;

            radioValues = {};

            for(i=0; i<finalArrayToSubmit.length; i++)
            {
                blockEl = $(finalArrayToSubmit[i]);

                if(blockEl == null)
                {
                    alert("Bloc " + finalArrayToSubmit[i] + " not found");
                    return;
                }

                childList = blockEl.childNodes;
 
                elStack = new Array();
 
                if(childList)
                {
                    elStack.push(blockEl);
                }
 
                while(elStack.length > 0)
                {
                    blockEl = elStack.pop();
                    
                    childList = blockEl.childNodes;
                    
                  for(j=0; j<childList.length; j++)
                  {
                      childEl = childList[j];
                      
                      // Pour les boutons radio, gère les valeurs manuellement
                      // si non sélectionné -> vide, sinon la valeur sélectionnée.
                      if(childEl.type != undefined &&
                          childEl.name && 
                          childEl.name.length > 0 &&
                          childEl.name != "")
                      {
                          elValue = childEl.value;
                          
                          if(childEl.type == "radio")
                          {
                              if(childEl.checked)
                              {
                                  radioValues[childEl.name] = elValue;
                              }
                              else if(!radioValues[childEl.name])
                              {
                                 radioValues[childEl.name] = '';
                              }
                          }
                          else
                          {
                             this.appendToJSonStr(jSonAsStr, childEl.name, elValue, initialized);
                            initialized = true;
                          }
                      }
                      
                      if(childEl.childNodes && childEl.childNodes.length > 0)
                      {
                          elStack.push(childEl);
                      }
                  }
                }
            }
            
            if(radioValues)
            {
                for(radioName in radioValues)
                {
                    this.appendToJSonStr(jSonAsStr, radioName, radioValues[radioName], initialized);
                }
            }
            

            if(jSonAsStr)
            {
                jSonAsStr += "}";
                
                argumentsAsJSon = eval(jSonAsStr);
                this.addAdditionalParameters(this.usedForm, argumentsAsJSon);
            }
        }
*/

        // Crï¿½ï¿½ la chaï¿½ne de paramï¿½tres finale ï¿½ passer ï¿½ Prototype.
        // C'est une chaine du type : param1=valeur1&param2=valeur2...
        formParams += serialize($(strFormId));//Form.serialize($(strFormId));
        if(formParams.length > 0)
        {
            parametersInitialized = true;
        }

        this.internalSendRequest(formAction, formParams, ignoreReturn);
    },

    appendToJSonStr:function(jSonStr, paramName, paramValue, initialized)
    {
       if(initialized == false)
      {
          jSonAsStr = "tempJSonArgVar = {";
      }
      else
      {
          jSonAsStr += ",";
      }

      jSonAsStr += "'" + paramName + "':'" + paramValue + "'";
    },

    addAdditionalParameters : function(usedForm, additionnalParameters)
    {
        // Converti le tableau de paramï¿½tres en une chaï¿½ne de paramï¿½tre de requete
        paramAdditionnels = $H(additionnalParameters).toQueryString();
        
        if(paramAdditionnels)
        {
            if(debugForm)
            {
                alert("Paramètres additionnels " + paramAdditionnels);
            }

            // Utilise la chaine de paramï¿½tres comme une map
            var paramsMap = paramAdditionnels.toQueryParams();
            for(var paramName in paramsMap)
            {
                // Ajoute ou initialise les paramï¿½tres additionnels au formulaire de la page
                setFormParameter(usedForm, paramName, "hidden", paramsMap[paramName]);
            }
        }
    },

    /**
     * Envoi une requete simple au serveur sur une url.
     */
    sendRequest:function(url, ignoreReturn)
    {
        this.internalSendRequest(url, null, ignoreReturn);
    },

    internalSendRequest:function(url, params, ignoreReturn)
    {
        this.sentUrl = url;

        // Les différentes méhodes en fonction du résultat de traitement
        // de la réponse.
        // Erreur réponse serveur : 500, 40X, ...
        onServerErrorFunction = createMethodReference(this, "onServerError");
        // Exception javascript lors du traitement de la réponse
        onResponseExceptionFunction = createMethodReference(this, "onResponseException");
        // Méthode chargée de parser/traiter la réponse du serveur
        responseHandler = createMethodReference(this, "handleServerResponse");

        // Affiche le masque empï¿½chant l'utilisateur d'intéragir avec l'interface
        // utilisateur en attendant le résultat de la requête.
        this.initMask("RequestMask");
        this.showMask();

		

        var options = null;
        if(!params || params == null)
        {
            params = "reqtype=xmlhttpreq";
            if(ignoreReturn)
            {
                options = {parameters:params,
                    asynchronous:false};
            }
            else
            {
                options = {
                    parameters:params,
                    asynchronous:false,
                    onComplete:responseHandler,
                    onFailure:onServerErrorFunction,
                    onException:onResponseExceptionFunction};
            }
        }
        else
        {
            params += "&reqtype=xmlhttpreq";
            if(ignoreReturn)
            {
                options = {
                    parameters:params,
                    asynchronous:false};
            }
            else
            {
                options = {
                    parameters:params,
                    asynchronous:false,
                    onComplete:responseHandler,
                    onFailure:onServerErrorFunction,
                    onException:onResponseExceptionFunction};
            }
        }
        document.body.style.cursor = 'wait';

        // Lance la requête serveur via prototype
        if (this.ajaxRequest==null)
        {
            this.ajaxRequest = new Ajax.Request(url, options);
        }
        else
        {
            this.ajaxRequest._complete=false;
            this.ajaxRequest.setOptions(options);
            this.ajaxRequest.request(url);
        }
    },

    /**
     * Cette méthode gère le flux de réponse (au format XML).
     * Cette fonction s'appuie sur xmldom.js pour le parcours du flux.
     * En fonction des balises rencontrées, l'application délègue le traitement à une méthode spécifique
     * Chaque balise est ensuite traitée dans des méthodes handleXXX spécifiques.<br />
     * Les bouts de code HTML doivent être encodés côté serveur en base64 (ils sont dï¿½codï¿½s cï¿½tï¿½ client).
     * @param request objet XmlHttpRequest contenant notamment la rï¿½ponse (request.responseText).
     */
    handleServerResponse:function(request)
    {

      if(this.existing)
      {
          formChilds = this.usedForm.childNodes;
            
          if(formChilds)
          {
              while(formChilds.length>0)
              {
                  this.usedForm.removeChild(formChilds[0]);
              }
          }
      }

        var content = request.responseText;

        // Enleve le masque bloquant l'interface utilisateur
        this.hideMask();

        var result = null;

        // Si le status de la reponse n'est pas le code HTTP OK : 200
        if(request.status != 200)
        {
            this.doServerError(request, "Invalid request status.");
            this.reponseHandlingEnd();
            return;
        }

        // Contenu de la reponse du serveur
        response = request.responseText;

        // La reponse du serveur est vide ce qui peut etre le cas quand
        // il n'a rien a dire.
        if(response.trim().length == 0)
        {
            this.reponseHandlingEnd();
            return;
        }

        // Controle que la reponse est bien une reponse ajax oav : elle doit
        // etre encadree par des balises ajax-response.
        if(!response.leftTrim().startsWith("<ajax-response>"))
        {
            this.reponseHandlingEnd();
            this.doServerError(request, "Invalid server response start");
            return;
        }
        else if(!response.rightTrim().endsWith("</ajax-response>"))
        {
            this.reponseHandlingEnd();
            this.doServerError(request, "Invalid server response end");
            return;
        }

        this.jsFctFirstList = new Array();

        this.handlingFctList = new Array();

        this.handlingFctNodeList = new Array();
                
        this.jsFctLoadList = new Array();

        // Une reponse serveur AJAX est un document XML.
        // Cree un nouveau parseur du document XML
        theDocument = new XMLDoc(response);

        rootNodeForDoc = theDocument.docNode;

        var rootNodeElements = rootNodeForDoc.getElements();

        // Tri les noeuds a la racine par ordre de traitement (attribut order).
        rootNodeElements = sortArray(rootNodeElements, nodeSortPredicate);

        // Evalue chaque element racine du resultats ajax
        for(var i=0; i<rootNodeElements.length; i++)
        {
            rootChild = rootNodeElements[i];

            // Determine la fonction chargee de traitee cette section du document
            var nodeFunctionName = rootChild.getAttribute("function");
            var functionCall = null;
            if(nodeFunctionName)
            {
                functionCall = nodeFunctionName;
            }
            else
            {
                // Si le nom de la fonction n'est pas donne, le construit automatiquement
                // a partir du nom du tag.
                functionCall = this.buildNodeFunctionName(rootChild.tagName);
            }


            var functionRef = null;
            // Recherche d'abord une fonction de la classe
            try
            {
                functionRef = eval("this."+functionCall);
                if(functionRef)
                {
                    functionRef = createMethodReference(this, functionCall);
                }
            }
            catch(e)
            {
            }

            // Sinon une fonction globale
            if(!functionRef)
            {
                try
                {
                    functionRef = eval(functionCall);
                }
                catch(e)	{}
            }

            /* if(functionCall == "handleJs" &&
                            rootChild.getAttribute("executeFirst") == "true")
                        {
                            this.jsFctFirstList.push(functionRef);
                        }
                        else
                        {*/
            if(functionCall == null || !functionRef)
            {
                alert("Function " + functionCall + " not found for tag " + rootChild.tagName);
            }
            else
            {
                /*var result = functionRef(rootChild);
                                  // Une fonction peut interompre le traitement ajax en retoutnant exit
                                  if("exit" == result)
                                  {
                                          this.reponseHandlingEnd();
                                          return;
                                  }*/
                if(functionCall == "handleJs")
                {
                    this.handleJs(rootChild);
                }
                else
                {
                    this.handlingFctList.push(functionRef);
                    this.handlingFctNodeList.push(rootChild);
                }
            }
            //}
        }

        // 
        for(var i=0; i<this.jsFctFirstList.length; i++)
        {
            eval(this.jsFctFirstList[i]+"()");
        }

        // 
        for(var i=0; i<this.handlingFctList.length; i++)
        {
            var result = this.handlingFctList[i](this.handlingFctNodeList[i]);
            // Une fonction peut interompre le traitement ajax en retoutnant exit
            if("exit" == result)
            {
                this.reponseHandlingEnd();
                return;
            }
        }

        // Execute toutes les fonctions onLoad des blocs javascripts
        for(var i=0; i<this.jsFctLoadList.length; i++)
        {
            eval(this.jsFctLoadList[i]+"()");
        }

        // Le layout peut ne pas etre defini
        try
        {
            layout.doLayout();
        }
        catch(e)
        {}
        this.reponseHandlingEnd();
    },

    reponseHandlingEnd:function()
    {
        document.body.style.cursor = 'default';
    },

    /**
     * Construit le nom de la fonction de traitement d'une section u document
     * XML ï¿½ partir du nom de son tag, ex : html-content devient handleHtmlContent
     */
    buildNodeFunctionName:function(nodName)
    {
        if(!nodName || nodName.length ==0)
        {
            return null;
        }
        var nodeChars = nodName.toArray();
        var functionName = "handle" + nodeChars[0].toUpperCase();
        for(var i=1; i<nodeChars.length; i++)
        {
            if(nodeChars[i] == '-')
            {
                if(i != nodeChars.length - 1)
                {
                    i++;
                    functionName += nodeChars[i].toUpperCase();
                }
            }
            else
            {
                functionName += nodeChars[i];
            }
        }

        return functionName;
    },

    /*
     * Mï¿½thode appelï¿½e lorsqu'une exception se produit dans le javascript de
     * traitement de la rï¿½ponse serveur.
     */
    onResponseException:function(request, exception)
    {
        this.hideMask();

        // Efface la valeur du token pour ne pas bloquer l'utilisateur
        cancelToken();

        errorText = '<table><tr>'
            + '<td align=\"left\" colspan=\"2\">Une exception est survenue lors du traitement de la réponse serveur.</td>'
            +'</tr><tr><td>&nbsp;&nbsp;</td><td align=\"left\">'
            +'<br>Exception message : '+exception.message
            +'<br>Request Url:'+this.sentUrl.substr(0, Math.min(80, this.sentUrl.length));
        if(request.transport)
        {
            /*	var readyState = null;
			try { readyState = request.transport.readyState; }	catch(e){}
			var status = null;
			try { status = request.transport.status; }	catch(e){}
			var statusText = null;
			try { statusText = request.transport.statusText; }	catch(e){}

			errorText+=
				((readyState)?'<br>-Ready state:'+readyState:'')
				+((status)?'<br>  -Status:'+status:'')
				+((statusText)?'-'+statusText:'');*/
        }
        errorText+='</td></tr></table>';

        this.displayOavRequestError(errorText);

        // Propage l'exception pour que l'avoir dans la console et empï¿½cher
        // le client d'aller plus loin
        throw exception;
    },

    /**
     * Mï¿½thode appelï¿½e lorsqu'une erreur est dï¿½tectï¿½e dans la rï¿½ponse du serveur.
     */
    onServerError:function(request)
    {
        this.hideMask();
        this.doServerError(request, 'Une erreur est survenue lors de l\'appel au serveur.');
    },

    /**
     * Mï¿½thode appelï¿½e lorsqu'une erreur est dï¿½tectï¿½e dans la rï¿½ponse du serveur.
     */
    doServerError:function(request, message)
    {
        // Efface la valeur du token pour ne pas bloquer l'utilisateur
        cancelToken();

        var description =
            '<br>' + message
            +'<br>Request Url:'+this.sentUrl.substr(0, Math.min(80, this.sentUrl.length))
            +'<br>Request status:'+request.status+'-'+request.statusText
            +'<br>Request readyState:'+request.readyState;

        this.displayOavRequestError(description, request.responseText);
    },



    /**
     * Affichage d'une erreur
     */
    displayOavRequestError :function (description, details)
    {
        if ($("erreur"))
            return;
        description = "<table width='95%' border='0'><tr><td align='left'>" + description + "</td></tr>";
        var height=150;
        if(details)
        {
            description += "<tr><td align='left'>Details :</td></tr>";
            description += '<tr><td valign="top" id="erriframediv" height="300px">';
            description += "</td></tr>";
            height = 430;
        }
        description += '</table>';
        Dialog.alert(description, {className: "harvest",  width:400, height:height, title:"Erreur", id: "erreur", okLabel:"OK"});
        // Ajoute une iframe au div erriframediv de la boite de dialogue.
        // On utilise une iframe car la rï¿½ponse du serveur est un contenu HTML
        // complet (html, head, body, etc...).
        // Si on ne rï¿½utilise pas l'iframe, elle n'est jamais supprimï¿½e du coup
        // quand on en recrï¿½ï¿½ une, c'est toujours la premiï¿½re crï¿½ï¿½e qui est rï¿½fï¿½rencï¿½e.
        if(details)
        {
            var iframe = document.getElementById('errorContent');
            if(!iframe)
            {
                iframe = document.createElement('iframe');
                iframe.id = "errorContent";
                iframe.frameborder = 0;
            }
            iframe.width = "100%";
            iframe.height = "250px";
            document.getElementById('erriframediv').appendChild(iframe);

            var frameDoc = null;
            if(iframe.contentDocument) { // For NS6
                frameDoc = iframe.contentDocument;
            } else if (iframe.contentWindow) { // For IE5.5 and IE6
                frameDoc = iframe.contentWindow.document;
            } else if (iframe.document) { // For IE5
                frameDoc = iframe.document;
            }
            frameDoc.write(details);
        }
    },

    closeWindowErreur:function(win)
    {
        //alert('fermeture');
        win.close();
    },



    /**
     * traite les balises "js" ds lesquelles sont situï¿½es les fragments <script>.
     * par dï¿½faut, une mï¿½thode pageLoad() est lancï¿½e.
     * @todo permettre de lancer une mï¿½thode ï¿½ l'initialisation (ou non).
     */
    handleJs:function(xmlNode)
    {
	if (xmlNode)
	{
            var scriptTxt = unescape(xmlNode.getText());
            scriptTxt.evalScripts();
	}

	var onLoadFunction = xmlNode.getAttribute("onLoad");

	if(onLoadFunction)
	{
            this.jsFctLoadList.push(onLoadFunction);
	}
        
        var executeFirstFunction = xmlNode.getAttribute("executeFirst");
        if(executeFirstFunction)
        {
            this.jsFctFirstList.push(executeFirstFunction);
        }        

        return
    },

    /*
     * Prise en charge de la mise ï¿½ jour d'inputs hidden depuis le serveur
     */
    handleHiddenParams:function(xmlNode)
    {
	// Traitement de l'ajout dynamique de paramï¿½tres hidden
        var hiddenParams = xmlNode.getElements("hiddenParam");
	if(hiddenParams)
	{
            var formId = document.forms[0];
            if(!formId)
            {
                alert("Form not found, can't append hidden parameters");
                return;
            }

            hiddenParams.each(
            function(item)
            {
                webOavParamName = item.getAttribute('name');
                webOavParamValue = item.getAttribute('value');
                setFormParameter(formId, webOavParamName, "hidden", webOavParamValue);
            });
	}
    },


    /**
     * Prise en charge d'une section message oav dans le document xml de la requï¿½te ajax
     */
    handleOavMessage:function(xmlNode)
    {
	var dialogId = xmlNode.getAttribute('id');
	// L'identifiant de message DIAG_CLOSEWINDOW_CLOSE est spï¿½cial, il indique
	// que le serveur veut fermer la fenï¿½tre (fonction quitter/fermer la fenï¿½tre
	// du framework).
	if(dialogId &&
            dialogId == 'weboav.diag_closewindow_close')
	{
            setTimeout("top.window.close()", 100);
            return "exit";
	}
	else
	{
            // Affiche la boite de dialogue ï¿½ l'utilisateur
            // Une boite de dialogue oav respecte les mï¿½me principes de configuration
            // qu'une boite de dialogue standard.
            handleDialog(xmlNode);
	}
    },


    /**
     * Met ï¿½ jour un zone avec du contenu html.
     * Le contenu est dï¿½codï¿½ en utilisant la mï¿½thode base64.
     * il faut donc que ce soit encodï¿½ en base64 cï¿½tï¿½ serveur.
     */
    handleHtmlContent:function(xmlNode)
    {
	var contentElement = xmlNode.getAttribute('element');

	if(!contentElement)
	{
            alert("Attribute element must be present to update its content");
	}
	else
	{
            var docElement = $(contentElement);
            if(!docElement)
            {
                alert("Div " + contentElement + " not found, can't update its content");
            }
            else
            {
                // mise ï¿½ jour du contenu HTML du bloc
                var xmlText = xmlNode.getText();
                if(xmlText &&
                    xmlText.length > 0)
                {
                    var strHtml = xmlText;
                    //				alert(strHtml);
                    docElement.innerHTML = strHtml;

                    // Branche le FormController sur le formulaire (controles de saisies, etc, ...)
                    var formElt = null;
                    var forms = docElement.getElementsByTagName('form');
                    if (forms!=null && forms.length>=1)
                    {
                        formElt = $A(forms)[0];
                        if(formCtrler)
                        {
                            if (formElt.id == null || formElt.id.length==0)
                            {
                                formElt.id =  formElt.name;
                            }
                            var strFormId = formElt.id;
                            if(!strFormId || strFormId == null)
                            {
                                alert("Form id must be defined");
                                return;
                            }
                            if (formCtrler.isFormId()==false || (strFormId != null && strFormId != formCtrler.getFormId()))
                            {
                                formCtrler.initialize(strFormId);
                            }
                            else
                            {
                                formCtrler.updateForm(strFormId, formElt);
                            }
                        }
                    }
                }

                // test portant sur la visibilitï¿½ ou non du bloc
                var isVisible = xmlNode.getAttribute('visible');
                if(isVisible == "true")
                {
                    Element.show(docElement);
                }
                else	if(isVisible == "false")
                {
                    Element.hide(docElement);
                }
            }
	}
    }
});

/**
 * Dï¿½sactive le token dans le formulaire courant.
 */
function cancelToken()
{
    var token = getFormElement(null, "tok");
    if(token)
    {
        token.value='';
    }
}

/*function debugFormParams(formToUse)
{
	var debugMess = "Action " + formToUse.action + "\n";
	var elements = Form.getElements(formToUse);
	for (var i = 0; i < elements.length; i++)
	{
		element = $(elements[i]);
		debugMess += "[" + element.name + ":" + element.value + "]\n";
	 }
	 return debugMess;
}
 */
/**
 * Mï¿½thode de traitement de la rï¿½ponse de l'utilisatauer ï¿½ une boite de dialogue
 * systï¿½me (lors du processus de sauvegarde, ...
 */
function handleOavDialogResponse(dialogId, userResponse)
{
    // si l'utilisateur ferme la fenï¿½tre sans rï¿½pondre ou sis il fait annuler
    // on revient ï¿½ la page dans l'ï¿½tat courant sans faire plus de traitements.
    if(userResponse != "cancel")
    {
        getOavRequest().sendFormRequest(null, document.forms[0], {_oavprompt:dialogId, _oavanswer:userResponse});
    }
}

/**
 * Prï¿½dicat de tri des noeuds des sections du document xml en rï¿½ponse ï¿½ une requï¿½te
 * ajax.
 */
function nodeSortPredicate(node1, node2)
{
    var node1Order = (node1.getAttribute("order"))?parseInt(node1.getAttribute("order"), 10):0;
    var node2Order = (node2.getAttribute("order"))?parseInt(node2.getAttribute("order"), 10):0;
    if(node1Order > node2Order) return 1;
    else	if(node1Order < node2Order) return -1;
    else	return 0;
}

function debugQueryString(queryString)
{
    var paramsMap = queryString.toQueryParams();
    var content = "";
    for(var paramName in paramsMap)
    {
        content += paramName + ":" + paramsMap[paramName] + "\n";
    }
    return content;
}

var globalArrayToSubmit = null;

function setBlocksToSubmit(blockArray)
{
    globalArrayToSubmit = blockArray;
}

function cancelBlocksToSubmit()
{
    globalArrayToSubmit = null;
}