/**
 * 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鳥s 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
     */
     tabAdditionnalParameters:null,
    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)
        
        this.tabAdditionnalParameters = new Array();

        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 �oumettre (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;
                                        
                                        // Dois-je soumettre l'item ?'
                                        if(formEl.getAttribute("submittable") == null ||
                                           formEl.getAttribute("submittable") == "true")
                                        {                                        

                                          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);
            }
      }

        // 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糲es 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
                if(setFormParameter(usedForm, paramName, "hidden", paramsMap[paramName]))
                {
                	this.tabAdditionnalParameters.push(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豥ntes m觯des en fonction du r貵ltat de traitement
        // de la r误nse.
        // Erreur r误nse serveur : 500, 40X, ...
        onServerErrorFunction = createMethodReference(this, "onServerError");
        // Exception javascript lors du traitement de la r误nse
        onResponseExceptionFunction = createMethodReference(this, "onResponseException");
        // M賨ode charg裠de parser/traiter la r误nse du serveur
        responseHandler = createMethodReference(this, "handleServerResponse");

        // Affiche le masque emp�chant l'utilisateur d'int象gir avec l'interface
        // utilisateur en attendant le r貵ltat de la requ鳥.
        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鳥 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賨ode g籥 le flux de r误nse (au format XML).
     * Cette fonction s'appuie sur xmldom.js pour le parcours du flux.
     * En fonction des balises rencontr褳, l'application d譨gue le traitement �ne m賨ode sp袩fique
     * Chaque balise est ensuite trait裠dans des m賨odes handleXXX sp袩fiques.<br />
     * Les bouts de code HTML doivent 鳲e encod豠c󵧠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]);
//              }
						  if(this.tabAdditionnalParameters)
							{
			              for (var i=0; i<this.tabAdditionnalParameters.length; i++)
			              {
										  var formElement = getFormElement(this.usedForm, this.tabAdditionnalParameters[i]);
										  if(formElement!=null)
											{
												this.usedForm.removeChild(formElement);
											}
			             }
						 }
          }
      }

        var content = request.responseText;


        var result = null;

        // Si le status de la reponse n'est pas le code HTTP OK : 200
        if(request.status != 200)
        {
            this.reponseHandlingEnd();
            this.doServerError(request, "Invalid request status.");
            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)
            {
                setTimeout((function(){this.reponseHandlingEnd();}).bindAsEventListener(this),500);
                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)
        {}
        setTimeout((function(){this.reponseHandlingEnd();}).bindAsEventListener(this),500);
        
    },

    reponseHandlingEnd:function()
    {
        this.hideMask();
        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误nse 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;
}