//#16.0.1.0 WDUtil.js //VersionVI: 30F160057k // Le seul support technique disponible pour cette librairie est // accessible a travers le service "Assistance Directe". // Attention a ne pas mettre d'accent dans ce fichier COMMENTAIRES inclus // Detection du navigateur var bIE = navigator.appName.indexOf("Microsoft") != -1; var nIE = 0; var bIEQuirks = false; var bOpr = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); // On fait un cas particulier pour IE7 if (bIE) { // Cas particulier de Opera qui s'annonce par defaut comme IE if (!bOpr) { var oExpr = new RegExp("MSIE (\\d)+[\\.\\d]*"); var oRes = oExpr.exec(navigator.userAgent); if (oRes && oRes[1]) { nIE = parseInt(oRes[1], 10); } oRes = null; oExpr = null; // Detecte le "quirks mode" bIEQuirks = (document.compatMode == "BackCompat"); } else { bIE = false; } } // Detection de gecko pour avoir les autres browser ? var bFF = (navigator.userAgent.toLowerCase().indexOf("firefox/") != -1); if (bFF) { var oExpr = new RegExp("Fire[Ff]ox/\\s*(\\d+)\\.*(\\d+)"); var oRes = oExpr.exec(navigator.userAgent); var bFF35 = (oRes && oRes[1] && (((parseInt(oRes[1], 10) >= 3) && oRes[2] && (parseInt(oRes[2], 10) >= 5)) || (parseInt(oRes[1], 10) >= 4))); oRes = null; oExpr = null; } // Il faut chercher "chrome/" car sinon on trougve des faux positif (par exemple "chromeframe/") var bCrm = (navigator.userAgent.toLowerCase().indexOf("chrome/") != -1); var bSfr = (navigator.userAgent.toLowerCase().indexOf("safari") != -1) && (!bCrm); var bMac = (navigator.platform.indexOf("Mac") != -1); var bWK = bCrm || bSfr; // Manipulation des Cookies : utilisation d'un objet comme espace de nommage var clWDCookie = { ms_sSeparateurCookie: ";", ms_sSeparateurValeur: "=" }; // Recupere le cookie clWDCookie.GetCookie = function GetCookie(sNom) { var tabCookies = document.cookie.split(this.ms_sSeparateurCookie); var i = 0; var nLimiteI = tabCookies.length; for (i = 0; i < nLimiteI; i++) { var tabCookie = tabCookies[i].split(this.ms_sSeparateurValeur); if ((tabCookie[0] == sNom || tabCookie[0] == " " + sNom) && tabCookie[1]) { return unescape(tabCookie[1]); } } return ""; }; // Ecrit un cookie clWDCookie.SetCookie = function SetCookie(sNom, sValeur) { var sExp = "Mon, 31 Dec 2010 23:59:59 UTC"; // Si on est dans le futur (Apres 2009) : On met une autre date if (parseInt((new Date()).getFullYear(), 10) >= 2009) { sExp = new Date((new Date()).getTime() + 30 * 24 * 3600 * 1000).toGMTString(); } this._SetCookie(sNom, sValeur, sExp); }; // Supprime un cookie clWDCookie.ClearCookie = function ClearCookie(sNom) { this._SetCookie(sNom, "", "Fri, 02 Jan 1970 00:00:00 UTC"); }; // Ecrit un cookie, version interne clWDCookie._SetCookie = function _SetCookie(sNom, sValeur, sExp) { document.cookie = sNom + this.ms_sSeparateurValeur + escape(sValeur) + "; expires=" + sExp + "; path=/;"; }; // Utilisation d'un objet comme espace de nommage var clWDUtil = {}; // Manipule les tag en forme normalise (normalement inutile sur les navigateurs recents) clWDUtil.sGetTagName = function sGetTagName(oBalise) { return oBalise.tagName ? oBalise.tagName.toLowerCase() : ""; }; // Indique si la balise est du bon type clWDUtil.bBaliseEstTag = function bBaliseEstTag(oBalise, sTag) { return (this.sGetTagName(oBalise) == sTag); }; // Sens de lecture clWDUtil.bRTL = (bIE ? (document.dir == "rtl") : (document.documentElement.dir == "rtl")); clWDUtil.GetStyleLeft = function GetStyleLeft(oStyle) { return this.bRTL ? oStyle.right : oStyle.left; }; clWDUtil.SetStyleLeft = function SetStyleLeft(oStyle, nVal, nOffset) { if (this.bRTL) { oStyle.right = (nVal - nOffset) + "px"; } else { oStyle.left = (nVal + nOffset) + "px"; } }; // Fonction if (bIE) { clWDUtil.oGetOriginalTarget = function oGetOriginalTarget(oEvent) { return oEvent.srcElement; }; } else if (bFF && !bWK) { clWDUtil.oGetOriginalTarget = function oGetOriginalTarget(oEvent) { return oEvent.explicitOriginalTarget; }; } else { clWDUtil.oGetOriginalTarget = function oGetOriginalTarget(oEvent) { return oEvent.target; }; } // .style.display des TR/TD clWDUtil._sGetDisplayBlockIE = function _sGetDisplayBlockIE(oBalise) { return "block"; }; clWDUtil._sGetDisplayBlock = function sGetDisplayBlock(oBalise) { switch (this.sGetTagName(oBalise)) { case "table": return "table"; case "tr": return "table-row"; case "td": return "table-cell"; default: return "block"; } }; clWDUtil.sGetDisplayBlock = ((bIE && ((nIE < 8) || bIEQuirks)) ? clWDUtil._sGetDisplayBlockIE : clWDUtil._sGetDisplayBlock); clWDUtil.sGetDisplayPourAffiche = function sGetDisplayPourAffiche(oBalise, bAffiche) { return bAffiche ? this.sGetDisplayBlock(oBalise) : "none"; }; clWDUtil.SetDisplay = function SetDisplay(oBalise, bAffiche) { if (oBalise && oBalise.style) { oBalise.style.display = this.sGetDisplayPourAffiche(oBalise, bAffiche); } }; clWDUtil.bEstDisplay = function bEstDisplay(oElement, oDocument) { var oBody = oDocument.body; while (oElement && (oElement != oBody)) { if (_JGCS(oElement).display == "none") { return false; } oElement = oElement.parentNode; } return true; }; if (bOpr) { // Contournement pour createContextualFragment avec opera (perd les attributs de la racine dans certains cas) // Ne marche que s'il n'y a qu'un fils clWDUtil.oCreateContextualFragment = function oCreateContextualFragment(oRange, sFragment) { var oDiv = document.createElement('div'); oDiv.innerHTML = sFragment; var oFils = oDiv.firstChild; while (oFils && (oFils.nodeName == "#text")) { oFils = oFils.nextSibling; } return oFils; }; } else if (!bIE) { clWDUtil.oCreateContextualFragment = function oCreateContextualFragment(oRange, sFragment) { return oRange.createContextualFragment(sFragment); }; } // Emulation de getElementById (IE4 et IE pocket) var oGetId = null; if (document.getElementById) { oGetId = function(sNomChamp) { return document.getElementById(sNomChamp); }; } else if (document.all) { oGetId = function(sNomChamp) { return document.all(sNomChamp); }; } else { oGetId = function(sNomChamp) { return null; }; } // Stop la propagation des evenements var bStopPropagation = null; if (bIE) { bStopPropagation = function (oEvent) { oEvent.returnValue = false; return false; }; } else { bStopPropagation = function (oEvent) { if (oEvent.preventDefault) { oEvent.preventDefault(); } return false; }; } // Stoppe conditionnelement la propagation function bStopPropagationCond (oEvent, bStop) { if (bStop) { return bStopPropagation(oEvent); } else { return true; } } // Attache une fonction a un evenement function HookOnXXX (oCible, sEventIE, sEventFF, fFonction, bCapture) { if (oCible.addEventListener) { oCible.addEventListener(sEventFF, fFonction, bCapture ? true : false); } else if (oCible.attachEvent) { oCible.attachEvent(sEventIE, fFonction); } else { // Cas d'un objet sorti du DOM dans opera : ne fait rien } } // Detache une fonction d'un evenement function UnhookOnXXX(oCible, sEventIE, sEventFF, fFonction, bCapture) { if (oCible.removeEventListener) { oCible.removeEventListener(sEventFF, fFonction, bCapture ? true : false); } else if (oCible.detachEvent) { oCible.detachEvent(sEventIE, fFonction); } else { // Cas d'un objet sorti du DOM dans opera : ne fait rien } } // Indique si un element est fils d'un autre function bEstFils (oElement, oParent, oDocument) { var oBody = oDocument.body; while (oElement && (oElement != oBody)) { if (oElement == oParent) { return true; } oElement = oElement.parentNode; } return false; } // Supprime tous les fils d'un elements function SupprimeFils (oElement) { var tabChildNodes = oElement.childNodes; while (tabChildNodes.length > 0) { oElement.removeChild(tabChildNodes[0]); } } // Supprime une variable du HTML si elle existe // Retourne si la variable existait function bHTMLVideDepuisVariable(oObjet, sNomVariable) { if (oObjet[sNomVariable]) { // Si la variable existe, la supprime du HTML et de l'objet var oElement = oObjet[sNomVariable]; if (oElement.parentNode) { oElement.parentNode.removeChild(oElement); } oObjet[sNomVariable] = null; delete oObjet[sNomVariable]; return true; } else { // Supprime par securite (variable existante mais vide) delete oObjet[sNomVariable]; return false; } } // Construit les parametres d'une fonction serveur appelee // nNbParamIgnore contient le nombre de parametres a ignorer dans tabParamOriginaux function sConstuitProcedureParams (nNbParamIgnore, tabParamsOriginaux) { var i; var nLimiteI = tabParamsOriginaux.length; // + Car on laisse le premier indice vide donc comme ca on a automatiquement le "&" initial var tabParams = new Array(nLimiteI - nNbParamIgnore + 1); tabParams[0] = ""; for (i = nNbParamIgnore; i < nLimiteI; i++) { var nIndiceReel = i - nNbParamIgnore + 1; // 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 var oParam = tabParamsOriginaux[i]; tabParams[nIndiceReel] = "PA" + (i - nNbParamIgnore + 1) + "=" + ((oParam === true) ? "1" : ((oParam === false) ? "0" : clWDEncode.sEncodePOST(oParam + ""))); } return tabParams.join("&"); } // Recupere l'action depuis le location function _sGetPageActionDepuisLocation (sAction) { // On prend l'URL si on n'a pas d'action sAction = location.href + sAction; // On vire l'ancre var nAncreTaille = location.hash.length; if (nAncreTaille > 0) { var nAncrePos = sAction.indexOf(location.hash); sAction = sAction.substr(0, nAncrePos) + sAction.substr(nAncrePos + nAncreTaille); } return sAction; } // Recupere l'action d'une page // oPage : formulaire a utiliser (null possible) // bParamSuppr : indique s'il faut supprimer les parametres de l'URL // bIDSession : Indique s'il faut ajouter l'ID de session // bPourRepRes : Indique que la reference est avec le repertoire res et qu'il faut eviter les chemin relatifs function sGetPageAction (oPage, bParamSuppr, bIDSession, bPourRepRes) { // Trouve la page si besoin if (!oPage) { oPage = _PAGE_; } // Calcule l'URL var sAction = (oPage.action.length > 0) ? oPage.action : ""; if ((sAction.length == 0) || (sAction.charAt(0) == "?")) { // Si l'action se retourve deja dans l'URL de la page, on ne la double pas if (-1 != location.href.indexOf(sAction)) { sAction = _sGetPageActionDepuisLocation(""); } else { sAction = _sGetPageActionDepuisLocation(sAction); } } // Implicitement on a sAction > 0 (teste dans le premier if) else if ((nIE >= 8) && !bIEQuirks) { // En mode non quirks, IE retourne une addresse absolue pour FORM.action // Sauf que dans une page AWP l'action est vide. IE complete quand meme et retourne donc le chemin de la page // Evidement ce n'est pas une action valide au final var sActionAttribut = _PAGE_.getAttributeNode("action").value; if ((0 == sActionAttribut.length) || ("?" == sActionAttribut.charAt(0))) { sAction = _sGetPageActionDepuisLocation(sActionAttribut); } } if (bPourRepRes && (sAction.indexOf("/") == -1) && (sAction.length > 0)) { sAction = "../" + sAction; } // Vire les parametres if (bParamSuppr && (sAction.indexOf("?") != -1)) { sAction = sAction.substr(0, sAction.indexOf("?")); } // Ajoute l'ID de session si besoin if (bIDSession) { if ((sAction.indexOf("AWPID=") == -1) && (window["_AWPID_A_"] !== undefined)) { // Ajoute le separateur et la session var sID = (sAction.indexOf("?") != -1) ? _AWPID_A_ : _AWPID_P_; // Et s'il est vide prend le cookie de session s'il existe : // Firefox et chrome qui en donnent pas leurs cookies au plugins (= Flash) if ((bFF || bWK) && (sID.length == 0)) { sID = clWDCookie.GetCookie("AWP_CSESSION"); if (sID.length > 0) { sID = ((sAction.indexOf("?") != -1) ? "&" : "?") + "AWPID=" + sID; } } sAction += sID; } else if (window["_PHPID_"] !== undefined) { var sNomPHPID = _PHPID_.split("="); if ((sNomPHPID.length > 0) && (sAction.indexOf(sNomPHPID + "=") == -1)) { // Ajoute le separateur et la session sAction += ((sAction.indexOf("?") != -1) ? "&" : "?") + _PHPID_; } } } // Renvoie la valeur return sAction; } // Ajoute une regle CSS function CreeStyle(oFeuilleStyle, sNomStyle, sTexteStyle) { // Ne cree pas un style vide if (sTexteStyle.length) { // Ajoute un style dans la feuille de style donnee if (oFeuilleStyle.addRule) { oFeuilleStyle.addRule(sNomStyle, sTexteStyle); } else { oFeuilleStyle.insertRule(sNomStyle + " {" + sTexteStyle + "}", oFeuilleStyle.cssRules.length); } } } // Encodage des valeurs function WDEncode (bUTF8) { // 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.sEncodePOST = WDEncode.prototype.sEncodePOST_CP1252; // Et d'ecriture de valeur dans le HTML this.sEncodeCharset = WDEncode.prototype.sEncodeCharset_CP1252; } else { // Le fonctionnement par defaut des fonctions est OK } } // Fonctionnement par defaut des fonctions d'encodage : pour les pages UTF8 // Encodage pour l'ecriture dans le POST : simple echapement WDEncode.prototype.sEncodePOST = function sEncodePOST(sValeur) { return encodeURIComponent(sValeur); }; // Encodage pour l'ecriture dans la page : ne fait rien WDEncode.prototype.sEncodeCharset = function sEncodeCharset(sValeur) { return sValeur; }; // Version pour les pages non UTF8 (CP1252) des fonctions d'encodage // Encodage pour l'ecriture dans le POST : remplacement de tous les carateres unicodes par leur valeur CP1252 si possible WDEncode.prototype.sEncodePOST_CP1252 = function sEncodePOST_CP1252(sValeur) { // Traite les carateres unicodes sValeur = sValeur.replace(/[\u0100-\uFFFF]/g, function(sCar) { var n = sCar.charCodeAt(0); var i; var nLimiteI = WDEncode.prototype.tabConvCP1252.length; for(i = 0; i < nLimiteI; i++) { if(WDEncode.prototype.tabConvCP1252[i] == n) { return String.fromCharCode(i + 128); } } return sCar; } ); // Escape le tout sValeur = escape(sValeur); // Et remplace le + car il represente l'encodage de l'espace return sValeur.replace(/\+/g, "%2B"); }; // Encodage pour l'ecriture dans la page : remplace les carateres qui ne sont pas dans l'alphabet par leur valeur UNICODE WDEncode.prototype.sEncodeCharset_CP1252 = function sEncodeCharset_CP1252(sValeur, bHTML) { // Le jeu de caratere de windows est CP1252. Qui est un surensemble de ISO-8859-1 // Il faut convertir tous les carateres entre 0x80 et 0x9F en leur version unicode // Puis les caractere de la plage // 128 = 0x80 sValeur = sValeur.replace(/[\x80-\x9F]/g, function(sCar) { return String.fromCharCode(WDEncode.prototype.tabConvCP1252[sCar.charCodeAt(0) - 128]); } ); if (bHTML) { // Les caracteres restant (0xA0-0xFF) sont encode normalement en HTML sValeur = sValeur.replace(/[\xA0-\xFF]/g, function(sCar) { return "&#" + sCar.charCodeAt(0) + ";"; } ); } // Renvoi de la valeur convertie return sValeur; }; // Le tableau pour la conversion depuis CP1252 // 128 129? 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 // 0x80 0x81 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 WDEncode.prototype.tabConvCP1252 = [ 8364, 129, 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, 382, 376 ]; // Fonction de reencodage en HTML WDEncode.prototype.sEncodeInnerHTML = function sEncodeInnerHTML(sValeur, bRemplaceBR, bPasEncodeBalise, bSansHTMLDansEncodeCharset) { // Remplace le minimum de caracteres if (!bPasEncodeBalise) { sValeur = sValeur.replace(/&/g, "&"); sValeur = sValeur.replace(//g, ">"); // sValeur = sValeur.replace(/\'/g, "'"); // sValeur = sValeur.replace(/\"/g, """); } // Si le charset de la page est Latin1 (Donc pas en UTF-8) // => On transforme les caractere de CP1252 en leur equivalent unicode qui va fonctionner // => On encode les autres caracteres > 127 // Appele le pointeru qui pointe deja sur la bonne fonction sValeur = this.sEncodeCharset(sValeur, bSansHTMLDansEncodeCharset ? false : true); if (bRemplaceBR) { // Met des balises BR pour les marques de lignes sValeur = sValeur.replace(/\r\n/g, "
"); sValeur = sValeur.replace(/\n/g, "
"); } // Renvoi de la valeur return sValeur; }; // Instancie un objet principal var clWDEncode = new WDEncode(_bUTF8_); // Classe de base des types avances function WDTypeAvance(bConstructeur) { if (bConstructeur) { } } // Lire une propriete : a definir dans chaque type WDTypeAvance.prototype.GetProp = function GetProp(nPropriete) { return null; }; // Gestion des elements popup de la page function WDPopupAutomatique (oObjetParent) { // Memorise les parametres this.m_oObjetParent = oObjetParent; var oThis = this; // Cree la methode de hook dans la classe this.m_fOnFocus = function(oEvent) { return oThis.OnFocus(oEvent ? oEvent : event); }; this.m_fOnBlur = function(oEvent) { return oThis.OnBlur(oEvent ? oEvent : event); }; // Cree une fonction qui appele la fonction de masquage this.m_fTimeout = function(oEvent) { oThis.Masque(oEvent, true); }; } WDPopupAutomatique.prototype = { // m_oElement: null, // m_oObjetParent: null, // m_nTimeoutFocus: null, // Affiche le champ Affiche:function (oEvent, oElement, oParam) { // Si on a 'deja' un element, masque l'element precedent if (this.m_oElement) { this.Masque(oEvent, true); } // Memorise que l'on a un element this.m_oElement = oElement; // Efface le timeout existant si besoin this.__ClearTimeout(); // Hook les onfocus/onblur des elements this.__HookOnFocusBlurRecursif(oElement); // Appel le champ hote this.m_oObjetParent.AfficheInterne(oEvent, oElement, oParam); // Affiche l'element clWDUtil.SetDisplay(this.m_oElement, true); // Donne le focus au premier champ APRES l'affichage try { this.m_oElement.getElementsByTagName("a")[0].focus(); } catch (e) { } }, // Notification de que champ doit etre masquer Masque:function (oEvent, bLostFocus) { // Efface le timeout existant si besoin this.__ClearTimeout(); // Seulement si l'element existe (il peut ne pas existe si la popup n'a pas ete affichee if (this.m_oElement) { this.__UnhookOnFocusBlurRecursif(this.m_oElement); // Masque le champ clWDUtil.SetDisplay(this.m_oElement, false); } // Appel le champ hote this.m_oObjetParent.MasqueInterne(oEvent, bLostFocus); // Supprime l'element delete this.m_oElement; }, // Hook les onfocus/onblur des liens __HookOnFocusBlurRecursif:function (oElement) { // Hook l'element uniquement s'il peut recevoir le focus if (oElement.focus) { HookOnXXX(oElement, "onfocus", "focus", this.m_fOnFocus); HookOnXXX(oElement, "onblur", "blur", this.m_fOnBlur); } // Et ses fils qui ne sont pas du texte simple var oFils = oElement.firstChild; while (oFils) { if (oFils.nodeName != "#text") { this.__HookOnFocusBlurRecursif(oFils); } oFils = oFils.nextSibling; } }, // Supprime les hooks __UnhookOnFocusBlurRecursif:function (oElement) { // Unhook l'element uniquement s'il peut recevoir le focus if (oElement.focus) { UnhookOnXXX(oElement, "onfocus", "focus", this.m_fOnFocus); UnhookOnXXX(oElement, "onblur", "blur", this.m_fOnBlur); } // Et ses fils qui ne sont pas du texte simple var oFils = oElement.firstChild; while (oFils) { if (oFils.nodeName != "#text") { this.__UnhookOnFocusBlurRecursif(oFils); } oFils = oFils.nextSibling; } }, // Evenement avant l'affectation en AJAX du contenu du calendrier PreAffecteHTML:function (bDepuisAJAX) { // Si le champ est affiche : supprime les hooks if (this.m_oElement && (this.m_oElement.style.display == clWDUtil.sGetDisplayBlock(this.m_oElement))) { this.__UnhookOnFocusBlurRecursif(this.m_oElement); } }, // Evenement apres l'affectation en AJAX du contenu du calendrier PostAffecteHTML:function (bDepuisAJAX) { // Si le champ est affiche : restaure les hooks if (this.m_oElement && (this.m_oElement.style.display == clWDUtil.sGetDisplayBlock(this.m_oElement))) { this.__HookOnFocusBlurRecursif(this.m_oElement); } // Donne le focus au premier champ try { this.m_oElement.getElementsByTagName("a")[0].focus(); } catch (e) { } }, // Notification qu'un lien a pris le focus. OnFocus:function (oEvent) { // Efface le timeout existant si besoin this.__ClearTimeout(); }, // Notification que le champ a perdu le focus. // Il faut tester si le focus est parti dans un autre champ du calendrier ou a l'exterieur OnBlur:function (oEvent) { // On veut detecter les pertes de focus du calendrier // Sauf que la perte de focus d'un lien peut donner le focus a un autre lien du calendrier // => On fait un timeout de 1ms qui sera annule par le onfocus de l'autre lien si besoin if (!this.m_nTimeoutFocus) { // Un timeout de 1ms est trop faible pour Chrome // Il faut une valeur vraiment importante pour les versions recente de Chrome (il y a alors quand meme un leger lag visuel) et aussi pour safari var nDuree = (bWK) ? 200 : 1; this.m_nTimeoutFocus = setTimeout(this.m_fTimeout, nDuree); } }, // Efface le timeout existant si besoin __ClearTimeout:function () { // Supprime le timeout actif if (this.m_nTimeoutFocus) { // Invalide le timeout aupres du systeme clearTimeout(this.m_nTimeoutFocus); // Supprime le membre delete this.m_nTimeoutFocus; } } }; // Gestion d'un champ de saisie temporaire function WDPopupSaisie (oObjetParent, bValideSurBlur) { // Si on est pas dans l'init d'un protoype if (oObjetParent) { // Memorise les parametres this.m_oObjetParent = oObjetParent; this.m_bValideSurBlur = bValideSurBlur; } } // Initialisation WDPopupSaisie.prototype.Init = function Init() { // Fonction de validation (attention on suppose que l'on a un formulaire) var oThis = this; this.m_fValide = function(oEvent) { oEvent = oEvent ? oEvent : event; oThis.Valide(oEvent, oThis.m_oSaisie.value); return bStopPropagation(oEvent); }; this.m_fAnnule = function(oEvent) { oEvent = oEvent ? oEvent : event; oThis.Annule(); return bStopPropagation(oEvent); }; this.m_fAnnuleSiEsc = function(oEvent) { oEvent = oEvent ? oEvent : event; if (27 == oEvent.keyCode) { return oThis.m_fAnnule(); } }; }; // Debut de la saisie // nReductionLargeur : pour la saisie dans le champ table : on ne prend pas toute la largeur WDPopupSaisie.prototype.Debut = function Debut(oConteneurParent, nReductionLargeur) { // Annulle l'ancienne saisie si besoin (arrive dans des combinaisons d'evenements bizarres) this.Annule(); // Appel de la methode personnalisable this._vDebut.apply(this, arguments); // Et donne le focus au champ de saisie this.m_oSaisie.focus(); var oThis = this; setTimeout(function() { oThis.__DonneFocusSaisie(); }, 1); }; // Fixe le focus WDPopupSaisie.prototype.__DonneFocusSaisie = function __DonneFocusSaisie() { // Si le champ de saisie est directement supprime de la page, .focus ne fonctionne pas // Dans ce cas selon le navigateur, oSaisie.parentNode est null ou est le document, en tous cas ce n'est pas le formulaire if (this.m_oSaisie) { var oParent = this.m_oSaisie.parentNode; if (oParent && ("form" == clWDUtil.sGetTagName(oParent))) { this.m_oSaisie.focus(); } } }; // Debut de la saisie // nReductionLargeur : pour la saisie dans le champ table : on ne prend pas toute la largeur WDPopupSaisie.prototype._vDebut = function _vDebut(oConteneurParent, nReductionLargeur) { // Cree dynamiquement la zone de recherche var oFormulaire = document.createElement("form"); // Avec son action oFormulaire.method = "post"; oFormulaire.action = "javascript:return false;"; // Puis on place le formulaire au bon endroit oFormulaire.style.position = "absolute"; oFormulaire.style.top = "0px"; oFormulaire.style.left = "0px"; oFormulaire.style.width = (oConteneurParent.offsetWidth - nReductionLargeur - 1) + "px"; oFormulaire.style.height = "100%"; // Ensuite on fait le champs de saisie var oSaisie = document.createElement("input"); oSaisie.type = "text"; // On l'attache a son parent oSaisie = oFormulaire.appendChild(oSaisie); // Et lui defini son style oSaisie.style.position = "absolute"; oSaisie.style.top = "0px"; oSaisie.style.left = "0px"; oSaisie.style.width = "100%"; oSaisie.style.height = "100%"; oSaisie.style.borderWidth = "0"; oSaisie.style.borderStyle = "solid"; // Si la hauteur du parent est faible : reduit la taille de la police if ((oConteneurParent.offsetHeight <= 18) && (oConteneurParent.offsetHeight > 0)) { oSaisie.style.fontSize = Math.max(oConteneurParent.offsetHeight - 4, 6) + "px"; } // On met le tout dans la cellule de recherche this.m_oFormulaire = oConteneurParent.appendChild(oFormulaire); this.m_oSaisie = this.m_oFormulaire.elements[0]; // Et la methode de validation qui renvoie toujours faux pour ne pas valider le formulaire HookOnXXX(this.m_oFormulaire, "onsubmit", "submit", this.m_fValide); // Gere la perte du focus et l'annulation HookOnXXX(this.m_oSaisie, "onblur", "blur", this.m_bValideSurBlur ? this.m_fValide : this.m_fAnnule); HookOnXXX(this.m_oSaisie, "onkeydown", "keydown", this.m_fAnnuleSiEsc); }; // Valide la saisie WDPopupSaisie.prototype.Valide = function Valide(oEvent, sValeur) { // Seulement si on a une saisie if (this.m_oFormulaire) { // Appel de la methode personnalisable this._vValide.apply(this, arguments); } // Supprime le HTML de la saisie this.Annule(); }; // Valide la saisie WDPopupSaisie.prototype._vValide = function _vValide(oEvent, sValeur) { // Rien }; // Annule la saisie WDPopupSaisie.prototype.Annule = function Annule() { // Seulement si on a deja une saisie en cours if (this.m_oFormulaire) { // Appel de la methode personnalisable this._vAnnule.apply(this, arguments); // Supprime les evenements UnhookOnXXX(this.m_oSaisie, "onkeypress", "keypress", this.m_fAnnuleSiEsc); UnhookOnXXX(this.m_oSaisie, "onblur", "blur", this.m_fAnnule); UnhookOnXXX(this.m_oFormulaire, "onsubmit", "submit", this.m_fValide); } // Supprime le onblur de l'element de saisie pour eviter que le navigateur (IE) ne s'emelle les pinceau si on creer un nouvel objet) bHTMLVideDepuisVariable(this, "m_oSaisie"); bHTMLVideDepuisVariable(this, "m_oFormulaire"); }; // Annule la saisie WDPopupSaisie.prototype._vAnnule = function _vAnnule() { // Rien };