/* Script: ajaxv2.js Contains functions to manage ajax requests. License: 3i Consulting copyright 2008 Credits: Class: AJAXRequest, AJAXMain A collection of The AJAXRequest and AJAXMain Object prototype methods. */ /* Uncomment the lines above if using this file in standalone */ /* windows.ie = navigator.appName.indexOf("Microsoft") != -1; windows.ie7 = false; if (windows.ie) { var oExpr = new RegExp("MSIE ([0-9])+[\.0-9]*"); windows.ie7 = ((oExpr.exec(navigator.userAgent) != null) && (parseInt(oExpr.$1) >= 7)); } */ /* Classe representant une requete */ function AJAXRequest(nId, hRequest, bPost, bSync) { /* On initialise nos membres */ this.m_nId = nId; this.m_hRequest = hRequest; this.m_bPost = bPost; this.m_bSync = bSync; this.m_bValid = true; } var AJAXNull = ""; AJAXRequest.prototype = { m_sCallback: "", /* Pas de callback par defaut */ readyStateUninitialized:0, /* Les valeurs d'etat de requetes */ readyStateLoading: 1, readyStateLoaded: 2, readyStateInteractive: 3, readyStateComplete: 4, sHeaderError: "Error", /* Header d'erreur */ sHeaderRedirection: "GWSRedirect", /* Header de redirection */ sHeaderXML: "XMLDoc", m_sServerError: "", m_sRedirectionHttp: "", /* La callback en cas d'evenement asynchrone */ OnReadyState:function() { /* si c'est la notification de resultat pret */ if( this.m_hRequest.readyState == this.readyStateComplete ) { /* on valide le resultat */ if( this.IsValidResult() ) { /* si la requete n'a pas ete annulee* */ if (this.m_sCallback != "") { /* on valide le resultat de la requete */ this.m_bValid = true; /* on appelle la callback */ var sTmp = this.GetResult(); eval(this.m_sCallback + "(sTmp," + this.m_nId + ")"); } } /* on libere la requete */ this.Free(); } }, /* Regarde si il y a une redirection vers une page d'erreur en PHP */ IsHttpRedirection:function() { /* Blinde par une exception car certains navigateurs renvoient une exception si le header n'existe pas */ try { /* on recupere la partie erreur de la requete */ this.m_sRedirectionHttp = this.m_hRequest.getResponseHeader(this.sHeaderRedirection); /* Renvoie true si il y a eu une erreur qui declenche une redirection */ return (this.m_sRedirectionHttp && this.m_sRedirectionHttp.length>0 ); } catch(e) { /* Pas de header, pas d'erreur */ return false; } }, /* Regarde si il y a une erreur serveur */ IsServerError:function() { /* on blinde par une exception car certains navigateurs renvoient une exception si le header n'existe pas */ try { /* on recupere la partie erreur de la requete */ this.m_sServerError = this.m_hRequest.getResponseHeader(this.sHeaderError); /* on renvoie true si il y a eu une erreur */ return ( this.m_sServerError && this.m_sServerError.length>0 ); } catch(e) { /* pas de header, pas d'erreur */ return false; } }, /* La methode d'invocation : appel en interne */ Execute:function(sRequest,sURL) { /* Calcul de l'URL si on est en mode GET */ if (!this.m_bPost) { /* On ajoute un ? ou un & */ sURL = sURL + ((sURL.indexOf("?") == -1) ? "?" : "&") + sRequest; } /* On passe en mode invalide => Notre reponse n'a pas de sens */ this.m_bValid = false; /* On actualise le compteur de requete synchrone en cours si besoin */ if (this.m_bSync) { m_hAJAXMain.m_nRequestSync++; } /* Et on affiche le temoin d'activite AJAX (Dans tous les cas : synchrone et asynchrone) */ m_hAJAXMain.RefreshActivity(false); /* alert(sURL + '?' + sRequest); */ try { /* Ouverture de la requete */ this.m_hRequest.open(this.m_bPost ? "POST" : "GET", sURL, !(this.m_bSync)); } catch(e) { alert(e + "\n" + sURL); } /* Ajoute l'encodage du POST */ this.m_hRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); /* Puis envoie de la requete */ this.m_hRequest.send(this.m_bPost ? sRequest : ""); /* On actualise le compteur de requete synchrone en cours si besoin */ if (this.m_bSync) { m_hAJAXMain.m_nRequestSync--; /* Et on affiche le temoin d'activite AJAX (Uniquement dans le cas synchrone)*/ m_hAJAXMain.RefreshActivity(false); } }, /* Renvoi l'alphabet de la reponse si trouve */ /* Sinon renvoi l'alphabet du document */ /* Ne renvoie rien si le navigateur n'est pas IE */ GetDocRequestAlphabet:function () { /* Par defaut on prend la valeur stocke dans le document */ var sAlphabet = document.charset; /* Si pas IE => FIni */ if (!sAlphabet) { return undefined; } /* On regarde si on a un type mine dans la requete */ try { var sHeader = this.m_hRequest.getResponseHeader("Content-type"); /* Si on trouve la marque du charset : on renvoie la suite */ if (sHeader.indexOf("charset=") > 0) { return sHeader.substring(sHeader.indexOf("charset=") + "charset=".length); } // Sinon on renvoie la valeur par defaut } catch(e) { // Pas de header, charset du document } return sAlphabet; }, // verifie la validite du resultat d'une requete // affiche l'erreur dans le navigateur IsValidResult:function() { this.m_bValid = false; // le resultat n'est valide que si la requete a abouti if( this.m_hRequest.readyState == this.readyStateComplete ) { // si on a eu une erreur HTTP, inutile d'aller plus loin if( this.m_hRequest.status < 400 ) { // Si il y a une redirection (Affichage d'une erreur PHP) if (this.IsHttpRedirection()) { // Execute la redirection document.location.replace(unescape(this.m_sRedirectionHttp)); } else if(this.IsServerError()) { // Si il y a une erreur WL du serveur // Se libere soit meme AJAXNull = this.m_hRequest.responseText; // affichage du message d'erreur dans un element div predefini s'il exist var oErrDiv = _JGE('AJAX_ERROR', document); if(oErrDiv) { oErrDiv.innerHTML = this.m_sServerError; } else { alert(this.m_sServerError); } } else { // on valide le resultat this.m_bValid = true; return true; } } } // resultat non valide return false; }, // Recuperation du resultat en texte GetResult:function() { // Selon notre etat de validite if (this.m_bValid) { // On blinde par une exception car certains navigateurs renvoient une exception si le header n'existe pas try { // On recupere l'entete d'information sur le nom XML de la requete var sXML = this.m_hRequest.getResponseHeader(this.sHeaderXML); // Si on a un nom alors on declare le document XML et on renvoi son nom if (sXML && sXML.length > 0) { // Ici declaration du document XML // XMLAjoutDoc(sXML, this.m_hRequest.responseXML); // return sXML; return this.m_hRequest.responseXML; } } catch(e) { alert(e); // Pas de header, pas de reponse XML } // On renvoie la reponse bien encode pour le navigateur return m_hAJAXMain.m_bReencodeLatin1 ? m_hAJAXMain.ReencodeCP1252(this.m_hRequest.responseText, false) : this.m_hRequest.responseText; } else { return ""; } }, // La fonction d'initialisation : definie les callbacks Init:function() { // On definie la fonction de changement d'etat uniquement si on est en mode asynchrone if (!this.m_bSync) { // Une reference sur nous meme var clAJAXRequest = this; this.m_hRequest.onreadystatechange = function() { clAJAXRequest.OnReadyState.call(clAJAXRequest); }; } }, // Renvoie Vrai si la requete est en cours IsBusy:function() { // on renvoie true si une callback est active return (this.m_sCallback != ""); }, // Cancel une requete asynchrone Cancel:function() { // On annule la callback delete this.m_sCallback; // IE 6 : Bloque le onreadystatechange (delete ne suffit pas) + Un = null ne fonctionne pas donc on met une fonction vide this.m_hRequest.onreadystatechange = function () { }; // Et on se libere this.Free(); }, // Fermeture de la requete : se libere du tableau global des requetes Free:function() { var i; var nLimitI = m_hAJAXMain.m_lpConnection.length; for (i = 0; i < nLimitI; i++) { // Si c'est nous meme if (m_hAJAXMain.m_lpConnection[i].m_nId == this.m_nId) { // On se supprime du tableau m_hAJAXMain.m_lpConnection[i] = null; // Et on enleve l'element du tableau m_hAJAXMain.m_lpConnection.splice(i, 1); // Et on sort direct break; } } // On libere nos membres par securite if (this && this.m_hRequest) { delete this.m_hRequest.onreadystatechange; // Obligatoire ? delete this.m_hRequest; // Pas obligatoire } // Actualise le temoin d'activite AJAX m_hAJAXMain.RefreshActivity(false); } }; // Classe de creation des requetes function AJAXMain(bUTF8) { this.m_lpConnection = new Array(); // Tableau des connections this.m_nIdPos = 1; // Id de connection this.m_lpRequests = new Array(); // Tableau des evenements AJAX a traiter this.m_nRequestSync = 0; // On aura besoin de transforme les chaines recus pour gerer les caratere interdit en ISO-8859-1 si besoin // Pas besoin de le faire en UTF-8 car il on deja ete encode pour avoir au final la bonne valeur unicode if (bUTF8 === undefined) bUTF8 = ((document.charset ? document.charset : (document.characterSet ? document.characterSet : "iso-8859-1")).toLowerCase() != "iso-8859-1"); if (!bUTF8) { // On defini notre fonction d'encodage des parametres this.sEncode = function (sValue) { // QW42602 : Traite le caratere euro sValue = sValue.replace(/\u20AC/g, String.fromCharCode(0x80)); // Traite les carateres unicodes sValue = sValue.replace(/[\u0100-\uFFFF]/g, function(sCar) { var n = sCar.charCodeAt(0); var i; var nLimitI = m_hAJAXMain.sConvCP1252.length; for(i = 0; i < nLimitI; i++){ if(m_hAJAXMain.sConvCP1252[i]==n) return String.fromCharCode(i + 130);} return sCar; } ); // Escape le tout sValue = escape(sValue); // Et remplace le + car il represente l'encodage de l'espace return sValue.replace(/\+/g, "%2B"); }; } else { this.m_bReencodeLatin1 = false; // On defini notre fonction d'encodage des parametres this.sEncode = function (sValue) { return encodeURIComponent(sValue); }; } // Memorise si on est en mode AWP this.m_bPageAWP = document.location.pathname.substr(document.location.pathname.length - 4, 4).toUpperCase() == ".AWP"; }; AJAXMain.prototype = { m_bValid: true, // Drapeau qui indique si on peu encore utiliser les fonctions AJAX m_bTestEnabled: false, // Pas teste m_bEnabled: true, // Mais disponible par defaut m_bLocked: false, m_bReencodeLatin1: true, m_oActivityField: null, m_bActivityVisible: false, m_nActivityOption: 0, eActivity_Fixe: 0, eActivity_TopLeft: 1, eActivity_TopRight: 2, eActivity_BottomLeft: 3, eActivity_BottomRight: 4, eActivity_Center: 5, m_fWinOnScroll: null, m_fWinOnResize: null, eAsync: 1, eSync: 2, eEvent: 3, eCancel: 4, eBusy: 5, eEnabled: 6, sCommandAction: "_ACTION_", sCommandAjax_Context: "_CONTEXTE_", sCommandAjax_Execute: "EXECUTE", sCommandAjax_Field: "FIELD", sCommandAjax_Form: "FORM", sCommandAjax_Error: "ERROR", sCommandAjax_ExecuteProc: "EXECUTEPROC", sCommandAjax_Event: "EVENT", XML_ROOTRegExp: new RegExp(""), XML_ROOT: "DATA", XML_JS: "JS", XML_REDIR: "REDIR", XML_FIELD: "FIELD", XML_BLOCK: "BLOCK", XML_TRACE: "TRACE", XML_TRACE_ID: "AJAX_TRACE", XML_FIELD_ATT_NAME: "NAME", XML_FIELD_ATT_TYPE: "TYPE", XML_FIELD_TYPE_BODY: 1, XML_FIELD_TYPE_BLOCK: 2, XML_FIELD_TYPE_MAPAREA: 3, XML_FIELD_TYPE_IMAGE: 4, XML_FIELD_TYPE_LIST: 5, XML_FIELD_TYPE_SELECT: 6, XML_FIELD_TYPE_CHECKBOX: 7, XML_FIELD_TYPE_TEXT: 8, XML_FIELD_PROP: "PROP", XML_FIELD_PROP_TYPE: "TYPE", XML_FIELD_PROP_TYPE_VALUE: 1, // Chaine XML_FIELD_PROP_TYPE_LABEL: 3, // Chaine XML_FIELD_PROP_TYPE_HEIGHT: 5, // Entier XML_FIELD_PROP_TYPE_WIDTH: 6, // Entier XML_FIELD_PROP_TYPE_COLOR: 10, // Formate en chaine XML_FIELD_PROP_TYPE_BACKGROUND: 11, // Formate en chaine XML_FIELD_PROP_TYPE_STATE: 12, // Balise XML XML_FIELD_PROP_TYPE_VISIBLE: 18, // Value formate en chaine XML_FIELD_PROP_TYPE_CAPTION: 21, // Chaine XML_FIELD_PROP_TYPE_IMAGE: 34, // Chaine XML_FIELD_PROP_TYPE_URL: 38, // Chaine XML_FIELD_PROP_TYPE_BULLE: 39, // Chaine XML_FIELD_PROP_TYPE_X: 41, // Chaine XML_FIELD_PROP_TYPE_Y: 42, // Chaine XML_FIELD_PROP_TYPE_CURSOR: 43,// Chaine XML_FIELD_JS: "JS", XML_FIELD_STATE: "STATE", XML_FIELD_OPTIONS: "OPTIONS", XML_FIELD_OPTIONS_OPTION: "OPTION", XML_WBTRACE_ID: "WB_TRACE", // Le tableau pour la conversion depuis CP1252 // 130 131 132 133 134 135 136 137 138 139 140 141? 142 143? 144? 145 146 147 148 149 150 151 152 153 154 155 156 157? 158? 159 // 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B 0x9C 0x9D 0x9E 0x9F sConvCP1252:new Array( 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, 158, 376), // Indique si le mode AJAX est temporairement bloque IsAJAXMainValid:function() { // Bloque si le document n'est pas completement charge // Ca tombe bien on n'a le probleme que sous IE et document.readyState n'existe que sous IE if (document.readyState && (document.readyState != "interactive") && (document.readyState != "complete")) return false; // Renvoie la variable globale return this.m_bValid; }, // Bloque le mode AJAX : remplacement de la page courante LockAJAX:function() { // Met le flag a faux this.m_bValid = false; // Et supprime toutes les requetes asynchrones en cours while (this.m_lpConnection.length > 0) { this.m_lpConnection[0].Free(); } }, // Recupere un nouvel ID de requete GetNewId:function() { return this.m_nIdPos++; }, // CRee un objet XMLHttpRequest CreateXMLHttpRequest:function() { var hRequest = false; // On teste l'objet natif if(window.XMLHttpRequest) { try { hRequest = new XMLHttpRequest(); } catch(e) { hRequest = false; } } // On teste l'objet ActiveX pour IE/Windows if ((!hRequest) && (window.ActiveXObject)) { try { hRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { hRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { hRequest = false; } } } // On retourne notre objet return (hRequest === false) ? null : hRequest; }, // Creation d'un objet AJAXRequest // Mettre bSansInit pour faire une initialisation personnalise CreateAJAXRequest:function(bPost, bSync, bSansInit) { // Pseudo parametres par defaut if (bPost == null) bPost = true; if (bSync == null) bSync = false; // On commence par cree la requete var hRequest = this.CreateXMLHttpRequest(); // Si pas de requete (AJAX pas disponible => Fin) if (!hRequest) { return null; } // Puis on cree l'objet var nId = this.GetNewId(); // var nId = this.GetNewId.call(this); ?? var clAJAXRequest = new AJAXRequest(nId, hRequest, bPost, bSync); // Et on l'init if (!bSansInit) { clAJAXRequest.Init(); } // On l'enregistre dans le tableau des connections si c'est une connexion asynchrone if (!bSync) { this.m_lpConnection.push(clAJAXRequest); } // Puis on retourne l'objet return clAJAXRequest; }, // Recherche un objet AJAXRequest GetAJAXRequest:function(nId) { // On parcourt le tableau a la recherche de la requete var i; var nLimitI = this.m_lpConnection.length; for (i = 0; i < nLimitI; i++) { // si c'est la requete recherchee, on la renvoie if(this.m_lpConnection[i].m_nId==nId) return this.m_lpConnection[i]; } // si on arrive ici, on n'a pas trouve return null; }, // Traite un requete GetResponse:function (hRequest, oForm, oTable) { // Si le resulat est valide if(hRequest.IsValidResult()) { // Si on n'a pas en reponse XML a nous (Par exemple avec l'utilisation de PageAffiche) if ( (hRequest.m_hRequest.responseText.substring(0, " 0) { sOptions += "&"; } sOptions += this.sEncode(oField.name) + "=" + oField.options[i].value; } } return sOptions; // Autres champs mais moins frequents qui ne retournent rien case "file": case "reset": case "submit": return ""; default: // On encode si possible les caractere UNICODEs var sValue = oField.value; if (sValue === undefined) { return ""; } else { return this.sEncode(oField.name) + "=" + this.sEncode(sValue); } } return ""; }, // construit les valeurs de tous les champs de la page ConstructFormValue:function(oForm) { // on parcours les champs de la page pour construire la requete var tabResultat = new Array(oForm.elements.length); var i; var nLimitI = oForm.elements.length; for (i = 0; i < nLimitI; i++) { var oElem = oForm.elements[i]; // Toutes le requetes AJAX incluent WD_ACTION_ qui est deja specifie // On doit donc le filtrer, sinon cette valeur est deux fois dans la requete et le PHP renvoie uniquement la seconde valeur // On evite aussi les balises EMBED et autres qui n'ont pas de type et pas de valeur if ((this.sCommandAction == oElem.name) || (!oElem.type)) { tabResultat[i] = ""; } else { // On rajoute le separateur si le dernier caratere n'en est pas deja un & // Et on contruit la valeur du champ avec tabResultat[i] = (((i>0) && (tabResultat[i - 1].charAt(tabResultat[i - 1].length - 1) != "&")) ? "&" : "") + this.ConstructFieldValue2(oElem); // Vire les eventuelles paires vide if (tabResultat[i] == "&") tabResultat[i] = ""; } } return tabResultat.join(""); }, // construit l'URL pour appeler une procedure AJAX ConstructURL:function(sURL) { // on renvoie l'URL return sURL; }, // construit la requete pour appeler une procedure AJAX ConstructRequestProcedure:function(sProcedure,sContext, oForm) { // construction de la requete AJAX // - action AJAX (non specifique) var sRequest = this.sCommandAction + "=" + this.sCommandAjax_Execute; // - commande AJAX (non specifique) sRequest += "&" + this.sCommandAjax_ExecuteProc + "=" + escape(sProcedure); // - contexte d'execution (specifique) sRequest += "&" + this.sCommandAjax_Context + "=" + escape(sContext); if(oForm) sRequest += "&" + this.ConstructFormValue(oForm);; // on renvoie la requete creee return sRequest; }, // Defini le nom du champ du formulaire dont on doit transmettre la valeur en plus lors d'un envoi sans submit SetZRField:function (sZRField, sValue) { this.m_sZRField = sZRField; this.m_sZRFieldValue = sValue; }, // construit la requete pour appeler un evenement AJAX ConstructRequestEvent:function(oForm,sField,nEvent,nOption) { // construction de la requete AJAX selon les options var sRequest = ""; switch(nOption) { // on envoie la valeur du champ courant case 1 : // action AJAX sRequest += this.sCommandAction + "=" + this.sCommandAjax_Field; // evenement sRequest += "&" + this.sCommandAjax_Event + "=" + nEvent; // champ sRequest += "&" + this.sCommandAjax_Context + "=" + sField; // Value du champ var sValue = this.ConstructFieldValue(oForm,sField); if (sValue!="") sRequest += "&" + sValue; // Si on a indique (via _JAZR) de transmettre en plus l'occurrence courante de la ZR du champ : on la transmet if (this.m_sZRField) { sValue = this.sEncode(this.m_sZRField) + "=" + this.sEncode(this.m_sZRFieldValue); if (sValue != "") sRequest += "&" + sValue; } break; // on envoie la valeur de tous les champs de la page case 2 : // action AJAX sRequest += this.sCommandAction + "=" + this.sCommandAjax_Form; // evenement sRequest += "&" + this.sCommandAjax_Event + "=" + nEvent; // champ sRequest += "&" + this.sCommandAjax_Context + "=" + sField; // valeurs des champs de la page var sValue = this.ConstructFormValue(oForm); if(sValue!="") sRequest += "&" + sValue; break; // Clic sur une reglette mais sans submit case 3 : // Action AJAX sRequest += this.sCommandAction + "=" + this.sCommandAjax_Execute; // Event sRequest += "&" + this.sCommandAjax_Reglette + "=" + sField; // Field reglette sRequest += "&" + sField + "=" + nEvent; break; // Clic sur une reglette avec submit case 4 : // Action AJAX sRequest += this.sCommandAction + "=" + this.sCommandAjax_Form; // Event sRequest += "&" + this.sCommandAjax_Reglette + "=" + sField; // Field reglette. A priori cette valeur est en double car deja dans le submit de la page donc on ne la me pas var oFieldReglette = eval("oForm."+sField); if (oFieldReglette) oFieldReglette.value = nEvent; // valeurs des champs de la page var sValue = this.ConstructFormValue(oForm); if(sValue!="") sRequest += "&" + sValue; break; // Clic sur une reglette avec submit case 5 : // Action AJAX sRequest += this.sCommandAction + "=" + this.sCommandAjax_Execute; // evenement sRequest += "&" + this.sCommandAjax_Event + "=" + nEvent; // champ sRequest += "&" + this.sCommandAjax_Context + "=" + sField; // valeurs des champs de la page var sValue = this.ConstructFormValue(oForm); if(sValue!="") sRequest += "&" + sValue; break; // on ne renvoie aucune valeur default : { // Si on a indique (via _JAZR) de transmettre en plus l'occurrence courante de la ZR du champ : on la transmet var sValue = ""; if (this.m_sZRField) sValue = this.sEncode(this.m_sZRField) + "=" + this.sEncode(this.m_sZRFieldValue); // Action AJAX sRequest += this.sCommandAction + "="; sRequest += (sValue != "") ? this.sCommandAjax_Field : this.sCommandAjax_Execute; // evenement sRequest += "&" + this.sCommandAjax_Event + "=" + nEvent; // champ sRequest += "&" + this.sCommandAjax_Context + "=" + sField; // Value de la ZR if (sValue != "") sRequest += "&" + sValue; break; } } // Dans tous les cas (Que la valeur soit traite ou non) on supprime la reference a la ZR a transmettre en plus delete this.m_sZRField; delete this.m_sZRFieldValue; // on renvoie la requete return sRequest; }, // AJAXEnabled // renvoie TRUE si AJAX est disponible sur ce navigateur AJAXEnabled:function() { // Si deja teste if (this.m_bTestEnabled) return this.m_bEnabled; // Renvoie la disponibilite calcule // On essaie de creer une requete var hRequest = this.CreateXMLHttpRequest(); // AJAX est disponible si on a pu creer la requete this.m_bEnabled = (hRequest != null); hRequest = null; this.m_bTestEnabled = true; // On renvoie la valeur calcule return this.m_bEnabled; }, // renvoie la valeur d'un noeud XML XMLGetValue:function(XMLNode) { // Renvoie la valeur du noeud // Sauf que s'il y a trop de texte, FireFox (et IE ?) decoupent en plusieurs fils de type texte if (!XMLNode) return ""; // On recupere les nodes var tabNodes = XMLNode.childNodes; var nLimitI = tabNodes.length; if (nLimitI == 0) return ""; // Donc on concatene les fils via un tableau que l'on join var tabValue = new Array(nLimitI); // On parcours les fils var i; for (i = 0; i < nLimitI; i++) { //assert(tabNodes[i].nodeType == 3); // Met la valeur de la node dans le tableau tabValue[i] = tabNodes[i].nodeValue; } // Renvoie la valeur calcule return tabValue.join(""); }, // Indique si un attribut existe XMLAttributExists:function(XMLNode, sAttribut) { // Renvoie vrai si l'attribut existe return (XMLNode.attributes.getNamedItem(sAttribut) ? true : false); }, // renvoie la valeur d'un attribut de noeud XML XMLGetAttribut:function(XMLNode, sAttribut) { //assert(XMLAttributExists(XMLNode, sAttribut); // Renvoie la valeur du noeud return XMLNode.attributes.getNamedItem(sAttribut).nodeValue; }, // Renvoie la valeur d'un attribut de noeud XML ou "" si le neoud n'existe pas XMLGetAttributSafe:function(XMLNode, sAttribut) { var oAtt = XMLNode.attributes.getNamedItem(sAttribut); // Renvoie la valeur de l'attribut si possible return oAtt ? oAtt.nodeValue : ""; }, // Fonction de reencodage en HTML ReencodeInnerHTML:function(sValue, bReplaceBR, bEncodeTag) { // Remplace le minimum de caracteres if (bEncodeTag) { sValue = sValue.replace(/&/g, "&"); sValue = sValue.replace(//g, ">"); // sValue = sValue.replace(/\'/g, "'"); // sValue = sValue.replace(/\"/g, """); } // Si on est en encodage latin-1 (Donc pas en UTF-8) : On encode les caracteres > 127 // Pas besoin de le faire en UTF-8 car il on deja ete encode pour avoir au final la bonne valeur unicode if (this.m_bReencodeLatin1) { // Si le charset de la page est Latin1 // On transforme les caractere de CP1252 en leur equivalent unicode qui va fonctionner sValue = this.ReencodeCP1252(sValue, false); // Les caracteres restant (0xA0-0xFF) sont encode normalement en HTML sValue = sValue.replace(/[\xA0-\xFF]/g, function(sCar) { return "&#" + sCar.charCodeAt(0) + ";"; } ); } if (bReplaceBR) { // Met des balises BR pour les marques de lignes sValue = sValue.replace(/\r\n/g, "
"); sValue = sValue.replace(/\n/g, "
"); } // Renvoi de la valeur return sValue; }, // Enleve a la demande les espaces, RC, tabulations d'une chaine donne Trim:function (sValue, bSpaces, bTabulations, bRCs) { var szValue = new String(sValue); // Element du debut var nOffset = 0; while (nOffset < szValue.length) { var cChar = szValue.charAt(nOffset); // Un espace ? if (bSpaces && (cChar == " ")) { // Oui on le saute nOffset++; // Traite le caratere suivant continue; } // Une tabulation ? if (bTabulations && (cChar == "\b")) { // Oui on le saute nOffset++; // Traite le caratere suivant continue; } // Un rc? if (bSpaces && ((cChar == "\r") || (cChar == "\n"))) { // Oui on le saute nOffset++; // Traite le caratere suivant continue; } // Pas un caratere interdit : fin du parcours break; } // Element de la fin var nEnd = szValue.length; while (nEnd > nOffset) { var cChar = szValue.charAt(nEnd - 1); // Un espace ? if (bSpaces && (cChar == " ")) { // Oui on le saute nEnd--; // Traite le caratere suivant continue; } // Une tabulation ? if (bTabulations && (cChar == "\b")) { // Oui on le saute nEnd++; // Traite le caratere suivant continue; } // Un rc? if (bSpaces && ((cChar == "\r") || (cChar == "\n"))) { // Oui on le saute nEnd++; // Traite le caratere suivant continue; } // Pas un caratere interdit : fin du parcours break; } // on renvoie la chaine resultat return szValue.substring(nOffset, nEnd); }, // Enleve a la demande TOUS les RC, tabulations et doubles espaces d'une chaine donne RemoveSpaces:function (sValue, bSpaces, bTabulations, bRCs) { // Les RC et les tabulations if (bRCs && bTabulations) { sValue = sValue.replace(/[\r\n\b]/g, ""); } else if (bRCs) // Les RC seuls { sValue = sValue.replace(/[\r\n]/g, ""); } else if (bTabulations) // Les tabulations seules { sValue = sValue.replace(/\b/g, ""); } // Les espaces var nOldLength = 0; do { nOldLength = sValue.length; sValue = bSpaces ? sValue.replace(/ /g, " ") : sValue; } while(sValue.length < nOldLength); // Renvoie la chaine resultat return sValue; }, // Le jeu de caratere de windows est CP1252. Qui est un surensemble de ISO-8859-1 // Il faut convertir tous les carateres entre 0x82 et 0x9F en leur version unicode // On converti en plus le caractere euro // Quid du caratere 0x81 ???? ReencodeCP1252:function(sValue, bHTML) { // Traite le caratere euro sValue = sValue.replace(/\x80/g, "\u20AC"); // Puis les caractere de la plage // 130 = 0x82 if (bHTML) sValue = sValue.replace(/[\x82-\x9F]/g, function(sCar) { return "&#" + m_hAJAXMain.sConvCP1252[sCar.charCodeAt(0) - 130] + ";"; } ); else sValue = sValue.replace(/[\x82-\x9F]/g, function(sCar) { return String.fromCharCode(m_hAJAXMain.sConvCP1252[sCar.charCodeAt(0) - 130]); } ); // Renvoi de la valeur convertie return sValue; }, // Recherche un champ par son alias FindField:function(oForm, sFieldName, nFieldType, bExternal) { var oElement; // Recherche pour la visibilite oElement = _JGE(sFieldName, document); // Methodes commune en cas d'echec //if (!oElement) oElement = eval("oForm." + ); // Derniere chance pour les champ hors du formulaire if (!oElement) { oElement = document.getElementsByName(sFieldName); // Sauf pour les interrupteur : on prend le premier champ if (oElement) oElement = oElement[0]; } return oElement; }, // execute les actions pour une propriete ActionPropertyValue:function(oField, nFieldType, XMLAction, sFieldName) { var sValue = this.XMLGetValue(XMLAction); // Il n'y a pas encore eu de validation de l'existance de oField, donc on le fait ici si besoin // selon le type du champ switch(nFieldType) { // On traite le champ bouton specialement : Si c'est un champ image on fait comme les images case this.XML_FIELD_TYPE_BOUTON: // Si on a le champ c'est que c'est un champ de type input => bouton "normal" if (oField) { oField.value = sValue; break; } // Sinon c'est que l'on a un bouton image => On doit prendre l'image // Mais pas le droit de changer l'image d'un bouton image => donc ne fait rien break; // oField = _JGE("_" + sFieldName + "_IMG", document, false); // // Pas de break : on fait comme les images : on change le champ case this.XML_FIELD_TYPE_IMAGE: case this.XML_FIELD_TYPE_MAPAREA: if (oField) oField.src = sValue; break; case this.XML_FIELD_TYPE_LIST: if (oField) oField.selectedIndex = parseInt(sValue); break; case this.XML_FIELD_TYPE_SELECT: // Pour les selecteur : le code serveur a deja fait l'enventuelle transposition et le -1 requis var nOptionSel = parseInt(sValue); // Si on a une valeur negative => Ne selectionne rien if (nOptionSel < 0) { // Si on n'a plus d'une option if (oField && oField.length) { // Les deselectionnes toutes var i; var nLimitI = oField.length; for (i = 0; i < nLimitI; i++) { oField[i].checked = false; } } else if (oField) { // Une seule option //assert(nOptionSel==0); oField.checked = false; } } else { if (oField && oField.length) { // Si on n'a plus d'une option if (oField && (nOptionSel <= oField.length)) oField[nOptionSel].checked = true; } else if (oField) { // Une seule option //assert(nOptionSel==0); oField.checked = true; } } break; case this.XML_FIELD_TYPE_CHECKBOX: if (oField) oField.checked = parseInt(sValue); break; case this.XML_FIELD_TYPE_BLOCK: // Affectation de la valeur avec rajout des balises HTML if (oField) oField.innerHTML = this.ReencodeInnerHTML(sValue, true, true); break; case this.XML_FIELD_TYPE_TEXT: // Field de saisie if (oField) { // On transforme pour gerer les caratere interdit en ISO-8859-1 si besoin // Pas besoin de le faire en UTF-8 car il on deja ete encode pour avoir au final la bonne valeur unicode oField.value = this.m_bReencodeLatin1 ? this.ReencodeCP1252(sValue, false) : sValue; } break; default: // Autres cas if (oField) oField.value = sValue; break; } }, // Label ActionPropertyLabel:function(oField, nFieldType, XMLAction, sFieldName) { var sValue = this.XMLGetValue(XMLAction); // Selon le type du champ switch(nFieldType) { // On traite le champ bouton specialement : Si c'est un champ image on fait comme les images case this.XML_FIELD_TYPE_BOUTON: // Si on a le champ c'est que c'est un champ de type input => bouton "normal" if (oField) oField.value = sValue; break; case this.XML_FIELD_TYPE_BLOCK: // On ne cherche pas le champ lui meme mais le champ autour pour avoir la balise a oField = _JGE(sFieldName, document); if (oField) oField.innerHTML = this.ReencodeCP1252(sValue, true); break; default: // Autres cas // Ne fait rien break; } }, // Height ActionPropertyHeight:function(oField, nFieldType, XMLAction) { var nHeight = parseInt(this.XMLGetValue(XMLAction)); if (nHeight >= 0) { switch(nFieldType) { default: if (oField.height) oField.height = nHeight; break; } } }, // Largeur ActionPropertyWidth:function(oField, nFieldType, XMLAction) { var nWidth = parseInt(this.XMLGetValue(XMLAction)); if (nWidth >= 0) { switch(nFieldType) { default: if (oField.width) oField.width = nWidth; break; } } }, // X ActionPropertyX:function (oField, nFieldType, XMLAction) { //assert(oField.tagName == "DIV"); // On ne filtre pas les positions , les positions negatives sont valides switch(nFieldType) { default: // oField est normalement le conteneur externe du champ if (oField && oField.style) oField.style.left = this.XMLGetValue(XMLAction) + "px"; break; } }, // Y ActionPropertyY:function (oField, nFieldType, XMLAction) { //assert(oField.tagName == "DIV"); // On ne filtre pas les positions , les positions negatives sont valides switch(nFieldType) { default: // oField est normalement le conteneur externe du champ if (oField && oField.style) oField.style.top = this.XMLGetValue(XMLAction) + "px"; break; } }, // Color ActionPropertyColor:function(oField, nFieldType, XMLAction, sFieldName) { // On ne recupere la couleur qu'une fois var sColor = this.XMLGetValue(XMLAction); if (oField.style) oField.style.color = sColor; }, // Color de fond ActionPropertyBackground:function(oField, nFieldType, XMLAction, sFieldName) { // On ne recupere la couleur qu'une fois var sColor = this.XMLGetValue(XMLAction); if (oField && oField.style) oField.style.background = sColor; }, // Etat d'un champ ActionPropertyState:function (oField, nFieldType, XMLAction, sFieldName) { // Essai de trouver la collection des attributs de la balise A var oBaliseA = null; if (oField.tagName == "A") { oBaliseA = oField; } else if (oField.parentNode.tagName == "A") { oBaliseA = oField.parentNode; } else { return; } // Recupere l'etat final var nEtat = parseInt(this.XMLGetAttribut(XMLAction, this.XML_FIELD_STATE)); // Et la balise avec les attributs var oBalise = XMLAction.firstChild; // Selon le type de champ switch (nFieldType) { // Field qui genere des liens case this.XML_FIELD_TYPE_BOUTON: case this.XML_FIELD_TYPE_BLOCK: case this.XML_FIELD_TYPE_MAPAREA: // Parcours les attributs de oBalise pour les ajouter ou les supprimer du champ var tabAttributs = oBalise.attributes; var i; var nLimitI = tabAttributs.length; for (i = 0; i < nLimitI; i++) { var oAttribut = tabAttributs.item(i); if (nEtat != 0) { // Si on desactive => Supprime l'attribut oBaliseA.removeAttribute(oAttribut.nodeName, 0); } else { // Ajoute/modifie l'attribut oBaliseA.setAttribute(oAttribut.nodeName, oAttribut.nodeValue, 0); } } break; default: break; } }, // Color de fond ActionPropertyVisible:function(oField, nFieldType, XMLAction) { var sVisibility = ""; switch(this.XMLGetValue(XMLAction)) { case "0": sVisibility = "hidden"; // Cache break; case "1": default: sVisibility = "inherit"; break; } // oField est normalement le conteneur externe du champ if (oField && oField.style) oField.style.visibility = sVisibility; }, // Image ActionPropertyImage:function(oField, nFieldType, XMLAction) { // Selon le type du champ switch(nFieldType) { default: oField.src = this.XMLGetValue(XMLAction); break; } }, // URL ActionPropertyURL:function(oField, nFieldType, XMLAction, sFieldName) { // Selon le type du champ switch(nFieldType) { default: if (oField) oField.href = this.XMLGetValue(XMLAction); break; } }, // Bulle ActionPropertyBulle:function (oField, nFieldType, XMLAction, sFieldName) { var sValue = this.XMLGetValue(XMLAction); if (oField) oField.title = sValue; }, // CurseurSouris ActionPropertyCurseurSouris:function (oField, nFieldType, XMLAction) { // selon le type du champ switch(nFieldType) { default: if (oField && oField.style) oField.style.cursor = this.XMLGetValue(XMLAction); break; } }, // Execute un code JS sur l'objet ActionFieldJS:function (oField, sFieldName, XMLAction) { if (!oField) { // Essai avec un getElementById oField = _JGE(sFieldName, document); } if (oField) { eval("oField" + this.XMLGetValue(XMLAction)); } }, // Ajoute des options au champ ActionFieldOptions:function (oField, XMLAction) { // On parcourt les options du champ var XMLOption = XMLAction.firstChild; oField.options.length = 0; while(XMLOption) { // Selon l'option transmise switch (XMLOption.nodeName) { // Option simple default: case this.XML_FIELD_OPTIONS_OPTION: libelle = this.XMLGetValue(XMLOption); if(!XMLOption.attributes) break; valeur = this.XMLGetAttributSafe(XMLOption, "VALUE"); //if(valeur == '' && ) // break; // On ajoute l'option oField.options[oField.options.length] = new Option(libelle, valeur); // Il y a un problemes avec les carteres > 127 oField.options[oField.options.length-1].innerHTML = this.ReencodeInnerHTML(oField.options[oField.options.length-1].innerHTML, false, false); break; } // Option suivante XMLOption = XMLOption.nextSibling; } }, // Recoit un bout de CSS et l'ajoute dans la page // Pour optimiser les choses : si un style est vide on le degage ActionLigneStyle:function (sStyle) { // sTyle est un bout de CSS de la forme // #ID1, #ID2, ... { style1 } // #ID3, ... { style2 } // etc // Il peut y avoir des {} vide au milieu // Donc pour le parsing on decoupe d'abord selon les } var tabNouveauxStyles = sStyle.split("}"); // tabNouveauxStyles contient un tableau de lignes de la forme // #ID1, #ID2, ... { style1 <= split a fait partir le } final // On va maintenant traiter les lignes individuelles var i; var nLimitI = tabNouveauxStyles.length; for (i = 0; i < nLimitI; i++) { this._ActionLigneStyleLigne(tabNouveauxStyles[i]); } }, // Recoit une ligne de CSS et l'ajoute dans la page // Pour optimiser les choses : si un style est vide on le degage _ActionLigneStyleLigne:function (sLigneStyle) { var nDebutTexteStyle = sLigneStyle.indexOf("{"); //assert(nDebutTexteStyle <= 0); // Par securite si pas de style (-1) ou pas de nom de style (0) on boucle if (nDebutTexteStyle <= 0) return; // On decoupe le nom des styles et le contenu du style var sNomsStyle = sLigneStyle.substring(0, nDebutTexteStyle); var sTexteStyle = sLigneStyle.substring(nDebutTexteStyle + 1); // On vire les espaces/tabulations/RC du debut et de la fin du style comme ca si on decouvre que le style est vide on va // optimiser en n'en creant pas un autres sTexteStyle = this.Trim(sTexteStyle, true, true, true); // La feuille de style par defaut pour l'ajout var oStyle = document.getElementsByTagName("STYLE"); var oStyleSheetDefaut = oStyle[0].styleSheet ? oStyle[0].styleSheet : oStyle[0].sheet; // Puis on decoupe les noms de styles selon le separateur "," var tabNomsStyle = sNomsStyle.split(","); // Et on les traites var i; var nLimitI = tabNomsStyle.length; for (i = 0; i < nLimitI; i++) { var sNomStyle = this.Trim(tabNomsStyle[i]); // Si le nom du style est vide ou sans nom : on ignore ce nom de style if ((sNomStyle.legnth == 0) || (sNomStyle == "#")) { //assert(false); continue; } // Puis on modifie le style // Supprime l'ancien style var oStyleSheet = this._oActionSupprimeStyle(sNomStyle); // Et recree le nouveau si le texte du style est non vide if (sTexteStyle.length > 0) { // On recre si possible le style dans la feuille de style ou on l'a supprimer this._ActionCreerStyle(sNomStyle, sTexteStyle, oStyleSheet ? oStyleSheet : oStyleSheetDefaut); } } }, // Supprime l'ancien style portant le nom et le recree si besoin _oActionSupprimeStyle:function(sNomStyle) { // Recherche et supprime le style existant si besoin var tabStyles = document.getElementsByTagName("STYLE"); //assert(tabStyles.length==1); var i; var nLimitI = tabStyles.length; for (i = 0; i < nLimitI; i++) { // Pour internet explorer if (tabStyles[i].styleSheet) { var oFeuilleStyle = tabStyles[i].styleSheet; // On parcours les sous styles var j; var nLimitJ = oFeuilleStyle.rules.length; for (j = 0; j < nLimitJ; j++) { if (oFeuilleStyle.rules[j].selectorText == sNomStyle) { oFeuilleStyle.removeRule(j); // Comme on a supprimer une regle : on recule d'un cran sinon j+1 qui est devenu j n'est pas teste j--; nLimitJ--; } } } // Pour FireFox et autres else if (tabStyles[i].sheet) { var oFeuilleStyle = tabStyles[i].sheet; // On parcours les sous styles var j; var nLimitJ = oFeuilleStyle.cssRules.length; for (j = 0; j < nLimitJ; j++) { // On recupere la liste des styles pour voir si notre style y est // Comme les styles sont groupes par le moteur selon des styles qui doivent reste identique il sufit de trouver notre style une fois // Ici les styles sont groupe donc il faut faire un parsing var tabStylesNom = oFeuilleStyle.cssRules[j].selectorText.split(","); var k; var nLimitK = tabStylesNom.length; for (k = 0; k < nLimitK; k++) { // Enleve les espaces abusif tabStylesNom[k] = tabStylesNom[k].replace(/ /g, ""); if (tabStylesNom[k] == sNomStyle) { // Les regles ne sont pas factorisee par le moteur donc si on en supprime une on peu supprime aussi toutes ses // voisines oFeuilleStyle.deleteRule(j); // Comme on a supprimer une regle : on recule d'un cran sinon j+1 qui est devenu j n'est pas teste j--; nLimitJ--; break; } } } } } }, // Cree un style dans le feuille de style donnee _ActionCreerStyle:function(sNomStyle, sTexteStyle, oStyleSheet) { // Ajoute un style dans la feuille de style donnee if (oStyleSheet.addRule) { // Pour internet explorer oStyleSheet.addRule(sNomStyle, sTexteStyle); } else { //assert(oStyleSheet.insertRule) oStyleSheet.insertRule(sNomStyle + " {" + sTexteStyle + "}", oStyleSheet.length); } }, // execute les actions sur les champs ActionField:function(oForm,XMLField) { // on recupere l'alias du champ var sFieldName = this.XMLGetAttribut(XMLField,this.XML_FIELD_ATT_NAME); // on recupere le type du champ var nFieldType = parseInt(this.XMLGetAttribut(XMLField,this.XML_FIELD_ATT_TYPE)); // on cherche le champ var oField = this.FindField(oForm, sFieldName, nFieldType); var XMLAction = XMLField.firstChild; while(XMLAction!=null) { // selon le type d'action switch(XMLAction.nodeName) { // propriete case this.XML_FIELD_PROP : { // selon la propriete switch(parseInt(this.XMLGetAttribut(XMLAction,this.XML_FIELD_PROP_TYPE))) { // Value affiche => Value case this.XML_FIELD_PROP_TYPE_CAPTION: // Value case this.XML_FIELD_PROP_TYPE_VALUE: this.ActionPropertyValue(oField, nFieldType, XMLAction, sFieldName); break; // Label case this.XML_FIELD_PROP_TYPE_LABEL: this.ActionPropertyLabel(oField, nFieldType, XMLAction, sFieldName); break; // Height case this.XML_FIELD_PROP_TYPE_HEIGHT: if (oField)this.ActionPropertyHeight(oField, nFieldType, XMLAction); break; // Largeur case this.XML_FIELD_PROP_TYPE_WIDTH: if (oField)this.ActionPropertyWidth(oField, nFieldType, XMLAction); break; // Color case this.XML_FIELD_PROP_TYPE_COLOR: this.ActionPropertyColor(oField, nFieldType, XMLAction, sFieldName); break; // Color de fond. Comme on peu manipuler la couleur de fond de la page // le test d'existantce de oField est deporte dans ActionPropertyBackground case this.XML_FIELD_PROP_TYPE_BACKGROUND: this.ActionPropertyBackground(oField, nFieldType, XMLAction, sFieldName);break; // Etat d'un champ case this.XML_FIELD_PROP_TYPE_STATE: this.ActionPropertyState(oField, nFieldType, XMLAction, sFieldName); break; // Visibilite : manipule la partie externe du champ case this.XML_FIELD_PROP_TYPE_VISIBLE: this.ActionPropertyVisible(this.FindField(oForm, sFieldName, nFieldType, true), nFieldType, XMLAction); break; // Image case this.XML_FIELD_PROP_TYPE_IMAGE: if (oField)this.ActionPropertyImage(oField, nFieldType, XMLAction); break; // URL. pas de test de l'existence du champ car on va recherche la balise autour du champ case this.XML_FIELD_PROP_TYPE_URL: this.ActionPropertyURL(oField, nFieldType, XMLAction, sFieldName); break; // Bulle case this.XML_FIELD_PROP_TYPE_BULLE: this.ActionPropertyBulle(oField, nFieldType, XMLAction, sFieldName); break; // X case this.XML_FIELD_PROP_TYPE_X: this.ActionPropertyX(this.FindField(oForm, sFieldName, nFieldType, true), nFieldType, XMLAction); break; // Y case this.XML_FIELD_PROP_TYPE_Y: this.ActionPropertyY(this.FindField(oForm, sFieldName, nFieldType, true), nFieldType, XMLAction); break; // CurseurSouris case this.XML_FIELD_PROP_TYPE_CURSOR: this.ActionPropertyCurseurSouris(this.FindField(oForm, sFieldName, nFieldType, true), nFieldType, XMLAction); break; } break; } // Code JS a executer sur l'objet case this.XML_FIELD_JS: this.ActionFieldJS(oField, sFieldName, XMLAction); break; // Options a ajouter a l'objet case this.XML_FIELD_OPTIONS: if (oField)this.ActionFieldOptions(oField, XMLAction); break; } // on passe a l'action suivante XMLAction = XMLAction.nextSibling; } }, // execute les actions JS simple ActionJS:function(oForm,XMLAction) { // On recupere le code JS a executer var sCodeJS = unescape(this.XMLGetValue(XMLAction)); // Execute le code JS // Si on est en encodage latin-1 (Donc pas en UTF-8) : On encode les caracteres > 127 // Pas besoin de le faire en UTF-8 car il on deja ete encode pour avoir au final la bonne valeur unicode eval(this.m_bReencodeLatin1 ? this.ReencodeCP1252(sCodeJS, false) : sCodeJS); }, // Execute une redirection ActionRedirection:function(oForm,XMLAction) { // On recupere la redirection var sRedirection = this.XMLGetValue(XMLAction); // Execute la redirection document.location.replace(unescape(sRedirection)); }, // Affiche une trace ActionTrace:function (oForm, XMLAction) { // Recherche la zone de trace dans la page var oDivTrace = _JGE(this.XML_TRACE_ID, document); // Recupere la valeur de la trace var sTrace = this.XMLGetValue(XMLAction); // Supprime les traces du premier affichage var oOldTrace = _JGE(this.XML_WBTRACE_ID, document); while (oOldTrace) { oOldTrace.parentNode.removeChild(oOldTrace); oOldTrace = _JGE(this.XML_WBTRACE_ID, document) } // Si la trace est vide : on supprime la zone de trace si besoin if ((sTrace + "").length == 0) { // Si la zone existe if (oDivTrace) { // La supprime oDivTrace.parentNode.removeChild(oDivTrace); } // Fin du traitement return; } // Si la zone n'existe pas : la cree if (!oDivTrace) { // Cree dynamiquement un formulaire dans la cellule var oDivTrace = document.createElement("DIV"); oDivTrace.id = this.XML_TRACE_ID; oDivTrace.style.width = 1024; // oDivTrace.style.height = 20; oDivTrace.style.backgroundColor = "#FFFF00"; oDivTrace.style.fontFamily = "Courier New,Courier,mono"; oDivTrace.style.fontSize = "x-small"; // Ajoute la zone a la page var oPremier = document.body.firstChild; if (oPremier) { oDivTrace = document.body.insertBefore(oDivTrace, oPremier); } else { oDivTrace = document.body.insertBefore(oDivTrace); } } // Affecte le texte dans la zone en effectuant la conversion oDivTrace.innerHTML = this.ReencodeInnerHTML(sTrace, true, true); }, // execute les actions // oObjet : Selon la requete => objet formulaire, objet table (Ou objet cache de la table) ActionXML:function(oForm, oObjet, XML) { // on recupere la racine var XMLRoots = XML.getElementsByTagName(this.XML_ROOT); if (!XMLRoots) return false; var XMLRoot = XMLRoots ? XMLRoots[0] : null; if (!XMLRoot) return false; // on lance le parcours des actions a effectuer var XMLAction = XMLRoot.firstChild; while(XMLAction!=null) { // selon le type d'action switch(XMLAction.nodeName) { // champ case this.XML_FIELD: this.ActionField(oForm, XMLAction); break; // Code js pur case this.XML_JS: this.ActionJS(oForm, XMLAction); break; // Redirection case this.XML_REDIR: this.ActionRedirection(oForm, XMLAction); break; // Affichage de traces case this.XML_TRACE: this.ActionTrace(oForm, XMLAction); break; } // on passe au fils suivant XMLAction = XMLAction.nextSibling; } return true; }, GetFormAction:function(oForm, bParam) { // Trouve la page si besoin if (!oForm) oForm = document.MAINFORM; // Calcule l'URL var sAction = (oForm.action.length > 0) ? oForm.action : ""; if (sAction.length == 0) { // On prend l'URL si on n'a pas d'action sAction = location.href; // On vire l'ancre if (location.hash.length > 0) { sAction = sAction.subStr(0, sAction.indexOf(location.hash) - 1); } } // Vire les parametres if (bParam && (sAction.indexOf("?") != -1)) sAction = sAction.subStr(0, sAction.indexOf("?") - 1); // Renvoie la valeur return sAction; }, AJAXError:function() { // Ici requete au serveur qui indique que le navigateur ne supporte pas les appels AJAX // L'action sans les parametres var sAction = this.GetFormAction(null, true); // Ajout de la commande d'erreur sAction += "?" + this.sCommandAction + "=" + this.sCommandAjax_Error; // Et remplacement de la page courante document.location = sAction; }, // Execute le code serveur d'un champ AJAXExecuteEvent:function(oForm, sField, nEvent, nOption) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return; // Si l'AJAX n'est pas disponible if (!this.AJAXEnabled()) { // On utilise la methode normale this.NormalExecuteEvent(oForm, sField, nEvent, nOption); return; } // Empile la requete // Assert(this.m_lpRequests.length == 0); var stRequest = new Object(); stRequest.oForm = oForm; stRequest.sField = sField; stRequest.nEvent= nEvent; stRequest.nOption = nOption; this.m_lpRequests.push(stRequest); // Force le reaffichage de l'activite AJAX this.RefreshActivity(true); // Et demande le traitement de l'evenement // Permet de ne pas bloquer l'affichage (Fermeture des combos) setTimeout("m_hAJAXMain.AJAXExecuteEventProc();", 1); }, // Traite les evenements AJAX en attente AJAXExecuteEventProc:function() { // Supprime le reaffichage de l'activite AJAX this.RefreshActivity(false); // Assert(this.m_lpRequests.length == 1); // Tant que l'on a des requetes while(this.m_lpRequests.length > 0) { // Recupere la requete var stRequest = this.m_lpRequests[0]; // Vire la requete de la liste this.m_lpRequests.shift(); // Traite la requete var bRes = this.AJAXExecuteEventImpl(stRequest.oForm, stRequest.sField, stRequest.nEvent, stRequest.nOption); // Et sort direct si on est en erreur if (!bRes) this.m_lpRequests.length = 0; } }, // Execute le code serveur d'un champ. Version interne : celle appele via un timer AJAXExecuteEventImpl:function(oForm, sField, nEvent, nOption) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return; // on prepare la requete var sRequest = this.ConstructRequestEvent(oForm, sField, nEvent, nOption); // on prepare l'URL var sURL = this.ConstructURL(this.GetFormAction(oForm)); // on cree la requete var hRequest = this.CreateAJAXRequest(true,true); // Si la creation n'a pas echoue (AJAX possible) if (hRequest) { // On execute la requete hRequest.Execute(sRequest,sURL); // Si le resulat est valide on le renvoi return this.GetResponse(hRequest, oForm, null); } else { // Cas AJAX impossible this.AJAXError(); return false; } }, // Appel normal dans le cas ou AJAX n'est pas disponible NormalExecuteEvent:function(oForm, sField, nEvent, nOption) { switch(nOption) { // Envoie la valeur du champ courant. Renvoie la valeur de tous les champs car on ne sait pas faire moins case 1 : // Donc pas de break ici // Envoie la valeur de tous les champs de la page case 2 : // Construction d'un _JSL _JSL(oForm, sField, "_self", "", ""); break; case 3 : // Clic sur une reglette mais sans submit // Resultat de la forme "/WD110AWP/WD110AWP.EXE?WD_ACTION=SCROLLTABLE&TABLE1=4" // Construction d'un _JCL ? break; case 4 : // Clic sur une reglette avec submit // Appel de _RXXX eval("_R" + sField + "(" + nEvent + ")"); break; // Ne renvoie aucune valeur default : // Construction d'un _JCL _JCL(oForm.action + "?" + sField, "_self", "", ""); break; } }, // AJAXExecute // declenche l'execution synchrone d'une procedure AJAX sur le serveur // ATTENTION : le nombre de parametres est variable AJAXExecuteSync:function(sProcedure,sContext, oForm) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return ""; var bUrl = typeof(oForm) == 'string'; // on prepare la requete var sRequest = this.ConstructRequestProcedure(sProcedure,sContext, bUrl ? null : oForm); // on ajoute les parametres de la procedure var nNbParamIgnore = 2; var i; var nLimitI = arguments.length; for (i = nNbParamIgnore; i < nLimitI; i++ ) { // Si l'arguement est un booleen alors on envoi 0/1 pour faux/vrai // Car le cast en chaine du false/true du JS donne "false"/"true", ce que le serveur ne sait pas bien convertir en boolen sRequest += "&PA" + ( i - nNbParamIgnore + 1 ) + "=" + ((arguments[i] === true) ? "1" : ((arguments[i] === false) ? "0" : escape(arguments[i]))); } // on prepare l'URL var sURL = this.ConstructURL(bUrl ? oForm : this.GetFormAction(oForm)); // on cree la requete var hRequest = this.CreateAJAXRequest(true,true); // Si la creation n'a pas echoue (AJAX possible) if (hRequest) { // on execute la requete hRequest.Execute(sRequest,sURL); // On verifie la validite du resultat et on le renvoie si il est valide var sRes = hRequest.IsValidResult() ? hRequest.GetResult() : ""; // Free la requete hRequest.Free(); hRequest = null; // Renvoi le resultat return sRes; } else { // Cas AJAX impossible this.AJAXError(); return ""; } }, // AJAXExecuteAsync // declenche l'execution asynchrone d'une procedure AJAX sur le serveur // ATTENTION : Le nombres de parametres est variable AJAXExecuteAsync:function(sProcedure, sCallback, sContext, oForm) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return ""; var bUrl = typeof(oForm) == 'string'; // on prepare la requete var sRequest = this.ConstructRequestProcedure(sProcedure,sContext, bUrl ? null : oForm); // on ajoute les parametres de la procedure var nNbParamIgnore = 3; var i; var nLimitI = arguments.length; for (i = nNbParamIgnore; i < nLimitI; i++ ) { // Si l'arguement est un booleen alors on envoi 0/1 pour faux/vrai // Car le cast en chaine du false/true du JS donne "false"/"true", ce que le serveur ne sait pas bien convertir en boolen sRequest += "&PA" + ( i - nNbParamIgnore + 1 ) + "=" + ((arguments[i] === true) ? "1" : ((arguments[i] === false) ? "0" : escape(arguments[i]))); } // on prepare l'URL var sURL = this.ConstructURL(bUrl ? oForm : this.GetFormAction(oForm)); // on cree la requete var hRequest = this.CreateAJAXRequest(true, false); // Si la creation n'a pas echoue (AJAX possible) if (hRequest) { // on recupere son identifiant pour manipulations ulterieure (annulation, recuperation du resultat) var nIdRequest = hRequest.m_nId; // on renseigne la allback pour la validation du resultat hRequest.m_sCallback = sCallback; // on execute la requete hRequest.Execute(sRequest,sURL); // on renvoie l'identifiant de la requete return nIdRequest; } else { // Cas AJAX impossible this.AJAXError(); return ""; } }, // AJAXAsyncBusy // renvoie l'etat d'une requete asynchrone AJAXAsyncBusy:function(nId) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return false; // on commence par rechercher la requete var hRequest = this.GetAJAXRequest(nId); // si on trouve la requete, c'est qu'elle est en cours return( hRequest!=null&&hRequest.IsBusy() ); }, // AJAXCancelAsync // annule une requete asynchrone AJAXCancelAsync:function(nId) { // Si plus d'AJAX on sort if (!this.IsAJAXMainValid()) return false; // on commence par rechercher la requete var hRequest = this.GetAJAXRequest(nId); // si on trouve la requete, on l'annule if(hRequest!=null) hRequest.Cancel(); }, // Sauve le temoin d'activite AJAX InitActivity:function (sActivityField, nActivityOption) { // Recupere directement le champ this.m_oActivityField = _JGE(sActivityField, document, true); // Et sauve l'option this.m_nActivityOption = nActivityOption; // Initialise les callback de redimensionnement/defilement du navigateur this.m_fWinOnScroll = window.onscroll; this.m_fWinOnResize = window.onresize; var oTmp = this; if (window.ie) { window.onscroll = function () { if (oTmp.m_fWinOnScroll) { oTmp.m_fWinOnScroll(); } oTmp._RefreshActivity(oTmp.m_bActivity); }; window.onresize = function () { if (oTmp.m_fWinOnResize) { oTmp.m_fWinOnResize(); } oTmp._RefreshActivity(oTmp.m_bActivity); }; } else { window.onscroll = function (event) { if (oTmp.m_fWinOnScroll) { oTmp.m_fWinOnScroll(event); } oTmp._RefreshActivity(oTmp.m_bActivity); }; window.onresize = function (event) { if (oTmp.m_fWinOnResize) { oTmp.m_fWinOnResize(event); } oTmp._RefreshActivity(oTmp.m_bActivity); }; } // Et met a jour le temoin // S'il n'a pas encore ete defini le defini // S'il est deje defini : utilise sa valeur pour afficher le temoin this._RefreshActivity(this.m_bActivity ? this.m_bActivity : false); }, // Met a jour le temoin d'activite AJAX si besoin RefreshActivity:function (bForce) { // Calcule le nouvel etat var bActivity = (this.m_lpConnection.length > 0) || (this.m_nRequestSync > 0) || bForce; // Si l'etat change : effectue les modifications if (this.m_bActivity != bActivity) { this._RefreshActivity(bActivity); } }, // Met a jour le temoin d'activite AJAX _RefreshActivity:function (bVisible) { // Sauve le nouvel etat this.m_bActivity = bVisible; // Si pas de temoin => Fin if (!this.m_oActivityField) return; // Calcule le scrollLeft et scrollTop du navigateur selon le navigateur et le mode var oSource = window.ie ? (document.documentElement.clientWidth ? document.documentElement : document.body) : document.body; var nScrollLeft = window.ie ? oSource.scrollLeft : window.pageXOffset; var nScrollTop = window.ie ? oSource.scrollTop : window.pageYOffset; // Place le temoin d'activite switch (this.m_nActivityOption) { default: case this.eActivity_Fixe: // Rien break; case this.eActivity_TopLeft: this.m_oActivityField.style.left = _JCCP(nScrollLeft, this.m_oActivityField, true, false) + "px"; this.m_oActivityField.style.top = _JCCP(nScrollTop, this.m_oActivityField, false, false) + "px"; break; case this.eActivity_TopRight: this.m_oActivityField.style.left = (_JCCP(nScrollLeft, this.m_oActivityField, true, false) + oSource.clientWidth - this.m_oActivityField.clientWidth) + "px"; this.m_oActivityField.style.top = _JCCP(nScrollTop, this.m_oActivityField, false, false) + "px"; break; case this.eActivity_BottomLeft: this.m_oActivityField.style.left = _JCCP(nScrollLeft, this.m_oActivityField, true, false) + "px"; this.m_oActivityField.style.top = (_JCCP(nScrollTop, this.m_oActivityField, false, false) + oSource.clientHeight - this.m_oActivityField.clientHeight) + "px"; break; case this.eActivity_BottomRight: this.m_oActivityField.style.left = (_JCCP(nScrollLeft, this.m_oActivityField, true, false) + oSource.clientWidth - this.m_oActivityField.clientWidth) + "px"; this.m_oActivityField.style.top = (_JCCP(nScrollTop, this.m_oActivityField, false, false) + oSource.clientHeight - this.m_oActivityField.clientHeight) + "px"; break; case this.eActivity_Center: this.m_oActivityField.style.left = (_JCCP(nScrollLeft, this.m_oActivityField, true, false) + (oSource.clientWidth - this.m_oActivityField.clientWidth) / 2) + "px"; this.m_oActivityField.style.top = (_JCCP(nScrollTop, this.m_oActivityField, false, false) + (oSource.clientHeight - this.m_oActivityField.clientHeight) / 2) + "px"; break; } // Et l'affiche this.m_oActivityField.style.visibility = bVisible ? "inherit" : "hidden"; }, // fonction d'appel principale d'AJAXMain job:function (type, o){ if(o == null) return false; switch(type) { case this.eAsync: return this.AJAXExecuteAsync(o.procedure, o.callback, o.context, o.url ? o.url : o.form); break; case this.eSync: return this.AJAXExecuteSync(o.procedure, o.context, o.url ? o.url : o.form); case this.eEvent: if (!this.m_bLocked) this.AJAXExecuteEvent(o.form, o.field, o.event, o.option); else this.m_bLocked = false; break; case this.eCancel: return this.AJAXCancelAsync(o.id); } }, check:function (o, id){ if(o == null) return false; switch(o) { case this.eBusy: return this.AJAXAsyncBusy(id); case this.eEnabled: return this.AJAXEnabled(); } } }; // Fonction d'appel ajax function _JAES(sProcedure, sContext, oForm) { return m_hAJAXMain.AJAXExecuteSync(sProcedure, sContext, oForm); } function _JAEA(sProcedure, sCallback, sContext, oForm) { return m_hAJAXMain.AJAXExecuteAsync(sProcedure, sCallback, sContext, oForm); } function _JAEE(oForm, sField, nEvent, nOption){ // Si on a été bloqué par un l'appel de _JAZR qui précede immediatement if (!m_hAJAXMain.m_bLocked) m_hAJAXMain.AJAXExecuteEvent(oForm, sField, nEvent, nOption); else m_hAJAXMain.m_bLocked = false; } function _JAAB(nId) { return m_hAJAXMain.AJAXAsyncBusy(nId); } function _JACA(nId) { return m_hAJAXMain.AJAXCancelAsync(nId); } function _JAE() { return m_hAJAXMain.AJAXEnabled(); } function _JAZR(sZRField, sValue) { // Bloque l'appel de _JAEE qui suit immédiatement if (m_hAJAXMain.m_sZRField) m_hAJAXMain.SetZRField(sZRField, sValue); else m_hAJAXMain.m_bLocked = true; } /* Script: intl.js Contains functions to store multilanguage strings. License: 3i Consulting copyright 2008 Credits: Class: */ var m_hLang = new Array(); m_hLang['L_ERROR_LOGIN_EMPTY'] = "Login incorrecte"; m_hLang['L_ERROR_PWD_EMPTY'] = "Mot de passe incorrecte"; m_hLang['L_ERROR_001'] = "Delai de votre session est expiré"; m_hLang['L_ERROR_002'] = "Login ou Mot de passe incorrecte"; m_hLang['L_SEARCH_RESULT_LABEL'] = ""; m_hLang['L_SEARCH_NO_SELECTION'] = "Aucun document sélectionné"; m_hLang['L_SEARCH_NO_RESULT'] = "Aucun document trouvé"; function localizedString(s, d) { if(typeof(m_hLang[s]) != 'undefined') return m_hLang[s]; return typeof(d) == 'string' ? d : s; } /* Script: zfw.js Contains the main application framework. License: 3i Consulting copyright 2008 Credits: */ var m_hCalendar = null; var m_hAJAXMain = null; var markPopupTimeoutID = 0; window.onload = initMain; window.onunload = onUnload; function initMain() { initAJAX(); initList(); } function onUnload() { } function initAJAX() { m_hAJAXMain = new AJAXMain(); m_hAJAXMain.InitActivity('gws_ajax_activity', m_hAJAXMain.eActivity_Center); } function initList(page, target){ $$('img[rel$=docFlagPopup]').each(function(el){ el.removeEvents(); el.addEvent('click', function(event){ new Event(event).stop(); popupMarks(this); return false; }); }); $$('a[rel$=docMark]').each(function(el){ el.removeEvents(); el.addEvent('click', function(event){ new Event(event).stop(); markDoc(this); return false; }); }); $$('a[rel=folder]').each(function(el){ el.removeEvents(); var id = el.id; id = id.replace('tib_', 'ti_'); el.addEvent('click', function(event){ new Event(event).stop(); var o =$(id); if(o.hasClass('opened')) o.removeClass('opened'); else o.addClass('opened'); //toggleGroup(id); return false; }); }); $$('img[rel$=docPublish]').each(function(el){ el.removeEvents(); el.addEvent('click', function(event){ new Event(event).stop(); rowEvent(this, -1); return false; }); }); $$('img[rel$=docEdit]').each(function(el){ el.removeEvents(); el.addEvent('click', function(event){ new Event(event).stop(); editDoc(this); return false; }); }); $$('img[rel$=docDelete]').each(function(el){ el.removeEvents(); el.addEvent('click', function(event){ new Event(event).stop(); promptDeleteDoc(this, true); return false; }); }); SqueezeBox.initialize({}); $$('a[class*=modal]').each(function(el){ el.addEvent('click', function(event){ new Event(event).stop(); SqueezeBox.fromElement(el); }); }); new Tips($$('.tip'), { showDelay: 400, hideDelay: 400, fixed: true, offsets:{'x':60,'y':16} }); } function toggleGroup(id, imgid, resize) { var div = $(id); if(div) { var display = div.style.display == 'block' ? 'none' : 'block'; div.style.display = display; if(imgid && imgid != '') { var imgOpt = imgid.split(';'); if(imgOpt.length == 1) { eval('document.images.'+imgid+'.src=\"images/'+imgid + (display == 'block' ? '_co' : '_ex') + '.gif\"'); } else { if(display == 'block') eval('document.images.'+imgOpt[0]+'.src=\"images/'+imgOpt[1]+'\"'); else eval('document.images.'+imgOpt[0]+'.src=\"images/'+(imgOpt.length > 2 ? imgOpt[2] : imgOpt[0]+'_co.gif')+'\"'); } } /* if(resize) doResizeEvent(); */ } } function toggleGroupStyle(id, style, resize) { var obj = $(id); if(obj) { var display = obj.style.display == 'block' ? 'none' : 'block'; obj.style.display = display; if(style && style != '') { var styles = style.split(';'); if(styles.length == 1) { $(style).className = style+(display == 'block' ? '_off' : '_en'); } else { if(display == 'block') $(styles[0]).className = styles[1]; else $(styles[0]).className = (styles.length > 2 ? styles[2] : styles[0]+'_off'); } } /* if(resize) doResizeEvent(); */ } } function getScreenWidth(){ var _w; if(self.innerHeight){ _w=self.innerWidth; }else{ if(document.documentElement&&document.documentElement.clientHeight){ _w=document.documentElement.clientWidth; }else{ if(document.body){ _w=document.body.clientWidth; } } } return _w; } function getScreenHeight(){ var _h; if(self.innerHeight){ _h=self.innerHeight; }else{ if(document.documentElement&&document.documentElement.clientHeight){ _h=document.documentElement.clientHeight; }else{ if(document.body){ _h=document.body.clientHeight; } } } return _h; } function _JGE(i,d,s,p) { return $(i); } function loadScript(src, func) { var head= document.getElementsByTagName('head')[0]; var script= document.createElement('script'); script.type= 'text/javascript'; script.onreadystatechange= function () {}; script.onload= function () {func.call(func.arguments);}; script.src= src; head.appendChild(script); } function _JCCP(x,o,l,s){ var p=o.offsetParent; var t=0; while (p&&(p.tagName!='BODY')) { var v=l?p.offsetLeft:p.offsetTop; if(v!==undefined) t+=v; p=p.offsetParent; } return x+(s?t:-t) } function _JOF(w,n) { if(w.frames[n])return w.frames[n]; var i;for(i=0;i"; if (window.ie) { var d = f.document.open("text/html", "replace"); d.charset = "iso-8859-1"; d.write(wm); if (window.ie7) d.close(); } else { f.document.write(wm); f.document.charset = "iso-8859-1"; f.document.close(); } } else { f = $(frame); if(f) f.innerHTML = wm; } } function showCalendar(input) { if(!m_hCalendar) { loadScript('scripts/lib/cal.js', function(){ showCalendar(input); }); } else { m_hCalendar.select(input,input.name,'dd/MM/yyyy'); } return false; } function checkEmailEx(emailValue) { var str = emailValue /* email string */ var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(@\-)/; /* not valid */ var reg2 = /^[a-zA-Z0-9\-\._!#\$%&\*\+=\^\{\}~]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; if (!reg1.test(str) && reg2.test(str)) { /* if syntax is valid */ return true; } alert("Adresse email incorrecte. Exemple : prenom.nom@site.fr"); /* this is also optional */ return false; } function GetFormValues(input) { var values = ""; var AND = ""; var field; for(var i=0;i 6) c = 0; $(row).className = 'flag'+c; if(flagsLabel) $(row).title = flagsLabel[c] + ', cliquez pour changer'; updateDoc(id, c); } else if(r == 'FlagPopup'){ id = $(row).id.substr("docflag".length); c = check; if(c > 6) c = 0; //$(row).className = 'flag'+c; //if(flagsLabel) // $(row).title = flagsLabel[c] + ', cliquez pour changer'; updateDoc(id, c); } else if(r == 'Publish'){ id = $(row).id.substr("docPublish".length); if(check == -1) { c = $(row).className.substr("publish_".length); if(c != 'yes') { c = 'yes'; if(!promptPublish(true)) return; } else { c = 'no'; if(!promptPublish(false)) return; } } else { c = check == 1 ? 'yes' : 'no'; } // $(row).className = 'publish_'+c; updateDocPub(id, c); } } function updateDoc(id, c) { m_hAJAXMain.job(m_hAJAXMain.eAsync,{procedure:"updateDoc",callback:"updateDocCB",context:"flag",url:"?pid=6&Doc_id="+id+"&Doc_flag="+c}); } function updateDocCB(result, requestId) { if(result.substr(0, 3) == '+OK') { var res = Json.evaluate('{'+result.substr(4)+'}'); if(res) { var el = document.getElementById('docFlag'+res.id); el.className = 'flag'+res.flag; if(flagsLabel) el.title = flagsLabel[res.flag] + ', cliquez pour changer'; } }else if(result.substr(0, 4) == '-ERR') { var res = Json.evaluate('{'+result.substr(5)+'}'); if(res && res.message) { alert(res.message); } } } function updateDocPub(id, c) { m_hAJAXMain.job(m_hAJAXMain.eAsync,{procedure:"updateDoc",callback:"updateDocPubCB",context:"publish",url:"?pid=6&Doc_id="+id+"&Doc_Pub="+c}); } function updateDocPubCB(result, requestId) { if(result.substr(0, 3) == '+OK') { var res = Json.evaluate('{'+result.substr(4)+'}'); if(res) { var el = document.getElementById('docPublish'+res.id); el.className = 'publish_'+(res.status?'yes':'no'); } }else if(result.substr(0, 4) == '-ERR') { var res = Json.evaluate('{'+result.substr(5)+'}'); if(res && res.message) { alert(res.message); } } } function CompleteDate(fieldName, n) { var date = new Date(); var currobj = eval("document.recherche."+fieldName+n); for(var i=(n<4?1:4); i<=(n<4?3:6); i++) { if(i != n) { var obj = eval("document.recherche."+fieldName+i); if(obj.options[0].selected == true) { switch(obj.options.length) { case 32: obj.options[date.getDate()].selected = true; break; case 13: obj.options[date.getMonth()+1].selected = true; break; case 7: obj.options[4].selected = true; break; default: obj.options[0].selected = true; } } else if(currobj.options[0].selected == true) { obj.options[0].selected = true; } } } } function showCalendar(field) { if(!m_hCalendar) { loadScript('scripts/lib/cal.js', function(){ showCalendar(field); }); } else { m_hCalendar.select(field,field.name,'dd/MM/yyyy'); } return false; } function ShowHideItem(item, show) { o = document.getElementById(item); if(o) o.style.display = show?"block":"none"; } function ShowHideGroup(group, show) { switch(group) { case 0: ShowHideItem("criteres", show?1:0); ShowHideItem("plus", show?0:1); ShowHideItem("moins", show?1:0); break; case 1: ShowHideItem("date2", show?1:0); ShowHideItem("plus1", show?0:1); ShowHideItem("moins1", show?1:0); ShowHideItem("entrele", show?1:0); break; case 2: ShowHideItem("tip1", show==1); ShowHideItem("tip2", show==2); ShowHideItem("tip3", show==3); ShowHideItem("tip4", show==4); break; case 3: ShowHideItem("embleme", show?1:0); ShowHideItem("plus2", show?0:1); ShowHideItem("moins2", show?1:0); break; } } function DropList(btn) { if(!btn) return; var dlc = document.getElementById('dlc_' + btn.id.substring(4)); if(dlc) { var show = dlc.style.display != 'block'; dlc.style.display = (show ? 'block' : 'none'); var dlb = $('dlb_' + btn.id.substring(4)); if(show) dlb.addClass('dropped'); else dlb.removeClass('dropped'); } return false; } function DropListSelect(btn, val) { if(!btn) return; var name = btn.id.substring(4); name = name.substring(0, name.indexOf('_')); var dl = document.getElementById('dl_' + name); var dls = document.getElementById('dls_' + name); var dlc = document.getElementById('dlc_' + name); if(dl) { var input = document.getElementById(dl.getAttribute('rel')); if(input) input.value = val; } if(dls) dls.innerHTML = btn.innerHTML; DropList(dls); return false; } function doSearch(f) { //f.pid.value = '6'; //m_hAJAXMain.job(m_hAJAXMain.eAsync,{procedure:"doSearch",callback:"doSearchCB",context:"doSearch",form:f}); if(f && f.name == 'simpleSearchForm') { var kw = f.Keyword.value; kw.trim(); if(kw.length < 3){ alert("Vous devez saisir un mot clé ou un numéro de document valide!"); return false; } } f.submit(); return false; } function doSearchCB(sXML, RequestID){ $('leftPanel').innerHTML = sXML; } function applyFilter(fld, subitem, recent) { if(!subitem) subitem = ''; if(recent) location.href='?pid=1&docFilter=recent'; else location.href='?pid=1&Cli_num='+fld+'&Doc_nature='+subitem; return false; /* var f = $$('form[name=recherche]'); if(f.length == 0) f = $$('form[name=recherche2]'); if(f.length == 0) { location.href='?pid=1&Cli_num='+fld+'&Doc_nature='+subitem; return false; } f[0].reset(); f[0].Cli_num.value = fld; f[0].Doc_nature.value = subitem; f[0].submit(); return false; */ } function downloadDoc(docid) { var count = 0; doc = $$('input[name^=iddoc]'); doc.each(function(el){ if(el.checked) count ++; }); if(count > 0) { document.selectionform.action = 'download.php'; document.selectionform.submit(); } else { alert("Aucun document sélectioné"); } return false; } function publishDoc(pub) { var count = 0; var abort = 0; doc = $$('input[name^=iddoc]'); doc.each(function(el){ if(!abort && el.checked) { count ++; if(count==1 && !promptPublish(pub)) { abort = 1; return false; } rowEvent($('docPublish'+el.value), pub); } }); if(count == 0) { alert("Aucun document sélectioné"); } return false; } function promptPublish(pub) { var msg; if(pub) msg = "la publication du ou des documents sélectionnés les rend visible pour les autres utilisateurs, ils pourront ainsi les voir ainsi et les consulter"; else msg = "la depublication du ou des documents sélectionnés empeche les autres utilisateurs de les voir ainsi que de les consulter"; return confirm(msg+"\nVoulez vous continuer l'opération?"); } function addAlert(a) { var count = 0; doc = $$('input[name^=iddoc]'); doc.each(function(el){ if(el.checked) count ++; }); if(count > 0) { a.href = '?pid=6&EXECUTEPROC=alertMe&_CONTEXTE_=newAlert'; SqueezeBox.fromElement(a); } else { alert("Aucun document sélectioné"); } return false; } function saveAlert(f) { var aRecipient = document.alertSettings.alertTo.value; var aSubject = document.alertSettings.alertSubject.value; var aType = 1; var aTrigger = ''; for(var i = 0; i < document.alertSettings.alertType.length; i++) { if(document.alertSettings.alertType[i].checked) { aType = document.alertSettings.alertType[i].value; var at = eval('document.alertSettings.alertTrigger_'+aType); if(typeof(at) == 'object') { if(at.name) { /* TEXT or SELECT */ if(at.options) { for(i = 0; i < at.options.length; i++) { if(at.options[i].selected) { aTrigger = at.options[i].value; break; } } } else { aTrigger = at.value; } } else { /* radio */ for(i = 0; i < at.length; i++) { if(at[i].checked) { aTrigger = at[i].value; } } } } break; } } aRecipient = aRecipient.replace(' ', ''); if(aRecipient == '') { alert("l'adresse du destinataire n'est pas saisie!"); document.alertSettings.alertTo.focus(); return false; } $('dlgControls').style.display = 'none'; $('dlgActivityInd').style.display = 'block'; doc = window.parent.$$('input[name^=iddoc]'); doc.each(function(el){ if(el.checked) { m_hAJAXMain.job(m_hAJAXMain.eSync,{procedure:"alertMe",context:"addAlert",url:"?pid=6&Doc_id="+el.value+"&aType="+aType+"&aTrigger="+aTrigger+"&aRecipient="+aRecipient+"&aSubject="+aSubject}); } }); window.parent.document.getElementById('sbox-window').close(); } function removeAlerts() { var count = 0; var confirmation = -1; doc = $$('input[name^=idalert]'); doc.each(function(el){ if(el.checked) { if(confirmation == -1) { confirmation = confirm('Etes-vous sur de vouloir supprimer les alertes sélectionnées?'); if(confirmation) { $('dlgControls').style.display = 'none'; $('dlgActivityInd').style.display = 'block'; } } if(confirmation) m_hAJAXMain.job(m_hAJAXMain.eSync,{procedure:"alertMe",context:"removeAlerts",url:"?pid=6&alertId="+el.value}); count ++; } }); if(count > 0) { if(confirmation) window.location.reload(true); } else { alert("Aucun document sélectioné"); } return false; } function popupMarks(el) { var p = $('markPopup'); hideMarks(1); //var size = p.style.width; p.style.left = el.getLeft()-128; p.style.top = el.getTop(); p.setAttribute('rel', el.id); p.style.display = 'block'; selectMark(p, el); hideMarks(); // runs timer } function selectMark(p, el) { var m = parseInt(el.className.substr("flag".length)); if(m <0 && m > 6) return; for(var i = 0; i < 7; i++) { if(i == m) $('docFlag_'+i).addClass('selected'); else $('docFlag_'+i).removeClass('selected'); } } function hideMarks(el) { if(el && el == 1) { lockMarks(); $('markPopup').style.display = 'none'; } else { markPopupTimeoutID = setTimeout("hideMarks(1)", 1500); } } function lockMarks() { clearTimeout(markPopupTimeoutID); } function markDoc(el) { var p = el.getParent(); if(p) id = p.getProperty('rel'); if(id != '') { hideMarks(el); rowEvent($(id), el.id.substring(el.id.indexOf('_')+1)); } } function editDoc(src) { var id = $(src).id.substr("docEdit".length); var url = '?pid=6&EXECUTEPROC=updateDoc&_CONTEXTE_=view&Doc_id='+id; var options = {handler: 'iframe', size: {x: 400, y: 420}}; SqueezeBox.fromElement(url, options); } function editMyProfile(refresh) { var a = $('editMyProfile'); SqueezeBox.fromElement(a); } function promptDeleteDoc(a, single) { var count = 0; var options = {handler: 'iframe', size: {x: 400, y: 200}}; if(!single) { doc = $$('input[name^=iddoc]'); doc.each(function(el){ if(el.checked) count ++; }); if(count > 0) { a.href = '?pid=6&EXECUTEPROC=deleteDoc&_CONTEXTE_=prompt'; SqueezeBox.fromElement(a, options); } else { alert("Aucun document sélectioné"); } }else { var id = $(a).id.substr("docDelete".length); var url = '?pid=6&EXECUTEPROC=deleteDoc&_CONTEXTE_=prompt&Doc_id='+id; SqueezeBox.fromElement(url, options); } return false; } function deleteDoc(f, did) { $('deleteBtn').style.display = 'none'; $('dlgActivityInd').style.display = 'block'; window.parent.document.getElementById('sbox-btn-close').style.display = 'none'; m_bAbort = 0; var err = ''; var msg = ''; var result = ''; var docs = new Array(); if(did == '') { doc = window.parent.$$('input[name^=iddoc]'); doc.each(function(el){ if(m_bAbort == 0 && el.checked) { docs[docs.length] = el.value; } }); }else { docs[docs.length] = did; } for (var el = 0; el < docs.length; el++) { msg = m_hAJAXMain.job(m_hAJAXMain.eSync,{procedure:"deleteDoc",context:"delete",url:"?pid=6&Doc_id="+docs[el]}); err = msg.substr(0,3); if(err == '+OK') result += '
'+msg.substr(4)+'
'; else result += '
'+msg.substr(4)+'
'; if(m_bAbort == 1) { m_bAbort = -1; result += '
Opération annulée
'; break; } } $('dlgActivityInd').style.display = 'none'; $('cancelBtn').style.display = 'none'; $('closeBtn').style.display = 'inline'; $('messageCont').innerHTML = result; m_bAbort = -1; //window.parent.location.reload(true); }