/**
 * Ce fichier contient les fonctions non modifiables par l'administrateur du
 * site et réservées au système. Les appels à ces fonctions sont générés par
 * les extensions de balises.
 */

// tdn 29/07/2005 undefined n'est pas défini sur certains postes IE
// sûrement du à la version du moteur de script. J'essaye de contourner ici
// en déclarant un variable nommée ainsi
try
{
   var foo;
   if (foo == undefined)
      foo = true;
}
catch (e)
{
   window.undefined = null;
}

var sysMouseCaptureIsOn=false;

// tdn 29/06/2006 séparateur pour champ multivalué
var MULTIPLE_VALUE_SEP = "_RS_";

/**
 * menuName : nom du menu, si non spécifié, on l'ingore
 * menuAction : URL sans paramètre
 * menuActionParam : paramètre CGI complémentaire param=value&param=value
 */
function sysDoAction(menuName, menuAction, menuTargetName, menuActionParam)
{

   var frm = document.forms["sysActionForm"];
   if ( frm != null )
   {
	   if (frm.length > 1) {
	       // dch 27/11/2008
		   // cas ou le formulaire 'sysFormAction' est defini plusieurs fois dans la page
		   // on utilise le premier trouvé
		   frm = frm[0];
	   }
      var action = menuAction;
      // Il faut passer explicitement l'attribut menu sinon le referer
      // mémorisée dans ActionFlowManager n'est pas complet
      if ( action.lastIndexOf("?") < 0)
         action += "?";
      else
         action += "&";
      if ( menuName && (menuName != "") )
         action += "menu=" + menuName;

      if ( menuActionParam != "" )
      {
         action += "&" + menuActionParam;
      }
      // Bug netscape 7.0 : si le parent n'existe pas, _parent est considéré
      // comme une nouvelle fenêtre !
      if ( menuTargetName == "_parent" )
      {
         if (window.parent == null)
         {
            menuTargetName = "_self";
         }
      }
      if ( (menuTargetName == null) || (menuTargetName == "") )
      {
         menuTargetName = "_self";
      }
      frm.action = action;
      frm.target = menuTargetName;
      //alert("submiting to " + action);
      frm.submit();
   }
   else
   {
      alert("formulaire sysActionForm introuvable. Veuillez inclure dans la page le tag <action:init/>");
   }
}

/**
 * tdn 24/06/2005
 * Active une action en passant par MenuManager pour mémoriser le dernier.
 * Si l'action est vide, on ne fait rien
 * menu activé dans la session, accessible avec <action:info name="lastMenu" />
 * menuName : nom du menu, si non spécifié, on l'ingore
 * menuAction : URL avec ou sans paramètre, non utilisé pour l'instant
 * menuActionParam : paramètre CGI complémentaire param=value&param=value
 */
function sysDoMenu(menuName, menuAction, menuTargetName, menuActionParam)
{
   // tdn 29/06/2007 Si l'action est vide, ne fait rien pour ne pas provoquer
   // d'erreur HTTP 500
   if ( ! menuAction || menuAction=='' )
      return;
      
   var frm = document.forms["sysActionForm"];
   if ( frm != null )
   {
      var action = sysGetAppRoot() + "/servlet/MenuManager?"
      action += "menu=" + menuName;
      action += "&noParent=true";
      if ( menuActionParam != "" )
      {
         if ( menuAction.lastIndexOf("?") < 0)
            menuAction += "?";
         else
            menuAction += "&";
         menuAction += menuActionParam;
      }
      action += "&menuAction=" + myEscape(menuAction);

      // Bug netscape 7.0 : si le parent n'existe pas, _parent est considéré
      // comme une nouvelle fenêtre !
      if ( menuTargetName == "_parent" )
      {
         if (window.parent == null)
         {
            menuTargetName = "_self";
         }
      }
      if ( (menuTargetName == null) || (menuTargetName == "") )
      {
         menuTargetName = "_self";
      }
      frm.action = action;
      frm.target = menuTargetName;
      frm.submit();
   }
   else
   {
      alert("formulaire sysActionForm introuvable. Veuillez inclure dans la page le tag <action:init/>");
   }
}

// Un objet pour mémoriser le contenu d'un formulaire
function sysFormCache(id)
{
   this.entries = new Array(); // hash de clé = elemName, vlaue = sysFormCacheEntry
   this.id = id;
}
function sysFormCache_put(cache, idx, elemName, elemValue)
{
   var entry = cache.entries[elemName];
   if ( ! entry ) 
   {
      entry = new sysFormCacheEntry();
      cache.entries[elemName] = entry;
   }
   var cacheElem = new sysFormCacheElement(elemName, elemValue);
   entry.elements[idx] = cacheElem;
}
/* form objet crash sous IE à cause libération objet
sysFormCache.prototype.put = function(elemName, elemValue)
{
   var entry = this.entries[elemName];
   if ( ! entry ) 
   {
      entry = new sysFormCacheEntry();
      this.entries[elemName] = entry;
   }
   var cacheElem = new sysFormCacheElement(elemName, elemValue);
   entry.add(cacheElem);
}
*/
sysFormCache.prototype.dump = function()
{
   var msg = "";
   for (var elemName in this.entries)
   {
      var entry = this.entries[elemName];
      msg += elemName + " :\n";
      for (var j=0; j<entry.elements.length; j++)
      {
         var e = entry.elements[j];
         msg += "---" + j + " = " + e.value + "\n";
      }
   }
   alert(msg);
}
// Renvoie la valeur du sysFormCacheElement stocké ou vide
sysFormCache.prototype.get = function(elemName, rank)
{
   var entry = this.entries[elemName];
   if ( entry ) 
   {
      var elem = entry.get(rank);
      if (elem) return elem.value;
   }
   return "";
}
// Renvoie la valeur du sysFormCacheElement stocké ou vide
sysFormCache.prototype.get = function(elemName, rank)
{
   var entry = this.entries[elemName];
   if ( entry ) 
   {
      var elem = entry.get(rank);
      if (elem) return elem.value;
   }
   return null;
}

// Une entrée pour tous les éléments portant le même nom
function sysFormCacheEntry()
{
   this.elements = new Array();
}
sysFormCacheEntry.prototype.add = function(cacheElem)
{
   this.elements[this.elements.length] = cacheElem;
}
sysFormCacheEntry.prototype.get = function(rank)
{
   return this.elements[rank];
}
// Une entrée pour chaque élément : value peut être simple ou un tableau 
function sysFormCacheElement(name, value)
{
   if ( ! value ) value = "";
   this.name = name;
   this.value = value;
}

/**
 * Mémorise ou restaure les données du formulaire nommé 'frmName' du document
 * courant dans la variable sysFormFieldsValues de la window nommée 'winName' à
 * l'index 'frmIndex' (le nom du formulaire en général)
 * Si winName non spécifié, vaut "win_system"
 * Si frmIndex non spécifié, vaut frmName
 */
function sysStoreFormValues(winName, frmName, frmIndex)
{
   if ( ! winName ) winName = "win_system";
   if ( ! frmIndex ) frmIndex = frmName;
   
   // Cherche la fenêtre
   var win = findFrameWithinApp(winName);
   if ( win == null )
   {
      //alert(mess_frame_not_found + winName);
      return;
   }
   // Cherche le formulaire
   var frm = document.forms[frmName];
   if ( frm == null )
   {
      //alert(mess_form_not_found + frmName);
      return;
   }

   var formParams = win.sysFormFieldsValues;
   if ( ! formParams )
   {
      formParams = win.sysFormFieldsValues = new Array();
   }
   // On peut avoir plusieurs éléments avec le même nom
   // On réutilise le cache s'il est dispo
   var cache = formParams[frmIndex] ;
   if ( ! cache ) 
   {
      //alert("create cache");
      cache = formParams[frmIndex] = new sysFormCache(frmIndex); 
   }
   
   // Parcourt les éléments est les groupe par nom
   var elementsByName = new Array();
   for (var i=0;i<frm.elements.length;i++)
   {
      var elt = frm.elements[i];
      var elt_name = elt.name;
      var arr = elementsByName[elt_name];
      if ( ! arr )
         arr = elementsByName[elt_name] = new Array();
      arr[arr.length] = elt;
   }   
   
   for (var elemName in elementsByName) 
   {   
      var elements = elementsByName[elemName];
      for (var i=0;elements != null && i<elements.length;i++)
      {
         var elt = elements[i];
         var elt_type = (elt == null)? "" : elt.type;
         var elt_name = (elt == null)? "" : elt.name;
         if ( elt_type == 'text' || elt_type == 'textarea' || elt_type == 'hidden')
         {
            sysFormCache_put(cache, i, elt_name, elt.value);
         }
         else if ( elt_type == 'checkbox')
         {
            //alert("store " + elt_name + "=" + elt.checked);
            sysFormCache_put(cache, i, elt_name, elt.checked);
         }
         else if ( elt_type == 'radio')
         {
            sysFormCache_put(cache, i, elt_name, elt.checked);
         }
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            var values = new Array();
            for (var j=0; j< elt.options.length; j++)
            {
               values[j] = elt.options[j].selected;
            }
            //alert("store " + elt_name + " : " + values[0] + " " +  values[1]);
            sysFormCache_put(cache, i, elt_name, values);
         }
      }
   }
}
function sysRestoreFormValues(winName, frmName, frmIndex)
{
   if ( ! winName ) winName = "win_system";
   if ( ! frmIndex ) frmIndex = frmName;
   
   // Cherche la fenêtre
   var win = findFrameWithinApp(winName);
   if ( win == null )
   {
      //alert(mess_frame_not_found + winName);
      return;
   }
   // Cherche le formulaire
   var frm = document.forms[frmName];
   if ( frm == null )
   {
      //alert(mess_form_not_found + frmName);
      return;
   }
   var formParams = win.sysFormFieldsValues;

   if ( formParams == null )
   {
      //alert(" sysFormFieldsValues is null");
      return ;
   }
   var cache = formParams[frmIndex]; // objet sysFormCache
   if ( ! cache ) 
   { 
      //alert(" cache is null");
      return ; 
   }
   // Parcourt les éléments est les groupe par nom
   var elementsByName = new Array();
   for (var i=0;i<frm.elements.length;i++)
   {
      var elt = frm.elements[i];
      var elt_name = elt.name;
      var arr = elementsByName[elt_name];
      if ( ! arr )
         arr = elementsByName[elt_name] = new Array();
      arr[arr.length] = elt;
   }
   
   // Parcourt les éléments mémorisés é essaye de les affecter
   for (var elemName in cache.entries)
   {
      var entry = cache.entries[elemName];
      var elements = elementsByName[elemName];
      for (var i=0;elements != null && i<elements.length; i++)
      {
      	var elt = elements[i];
         var elt_type = (elt == null)? "" : elt.type;
         var cacheVal = null;
         var cacheElem = (entry.elements!=null) ? entry.elements[i] : null;
         if ( cacheElem )
            cacheVal = cacheElem.value;
         
         if ( elt_type == 'text' || elt_type == 'textarea' || elt_type == 'hidden')
         {
            elt.value = cacheVal;
         }
         else if ( elt_type == 'checkbox')
         {
            //alert("restore " + elemName + "=" + cacheVal);
            elt.checked = cacheVal;
         }
         else if ( elt_type == 'radio')
         {
            elt.checked = cacheVal;
         }
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            //alert("restore " + elemName + " : " + cacheVal[0] + " " +  cacheVal[1]);
            for (var j=0; cacheVal && j< elt.options.length; j++)
            {
               elt.options[j].selected = cacheVal[j];
            }
         }
      }
   }

   /*
   var elemRank = new Array();
   for (var i=0;i<frm.elements.length;i++)
   {
      var elt = frm.elements[i];
      var elt_type = elt.type;
      var elt_name = elt.name;
      
      if ( ! elemRank[elt_name] )
         elemRank[elt_name] = 0;
      var rank = elemRank[elt_name];
      var cacheVal = cache.get(elt_name, rank);
      
      if ( elt_type == 'text' || elt_type == 'textarea' || elt_type == 'hidden')
      {
         elt.value = cacheVal;
         elemRank[elt_name]++;
      }
      else if ( elt_type == 'checkbox')
      {
         elt.checked = cacheVal;
         elemRank[elt_name]++;
      }
      else if ( elt_type == 'radio')
      {
         elt.checked = cacheVal;
         elemRank[elt_name]++;
      }
      else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
      {
         for (var j=0; j< elt.options.length; j++)
         {
            rank = elemRank[elt_name];
            elt.options[j].selected = cache.get(elt_name, rank);
            elemRank[elt_name]++;
         }
      }
   }
   */
}
/**
 * Gestion de l'image 'changeante'. L'image doit avoir l'attribut 'name'
 * Par défaut, si imgOff et imgOn sont null, le nom de la source de l'image
 * doit être au format :
 * - nom_image.ext pour l'image active
 * - nom_image_off.ext pour l'image non active
 * Si imgOff et imgOn ne sont pas null, les utilise.
 */
function sysImageMouseOut(imgName, imgOff)
{
   // Change le nom de la source qui à priori ne se termine pas par
   // _off.
   var img = sysImageFindByName(imgName);
   if ( img )
   {
      if ( (imgOff == null) || (imgOff == "") )
      {
         var oldSrc = img.src;
         // recherche le point
         var pos = oldSrc.lastIndexOf('.');
         // extrait le début
         var newSrc = oldSrc.substring(0, pos);
         // ajoute _off
         newSrc += "_off";
         // ajoute l'extension originale
         newSrc += oldSrc.substring(pos);
         // change la source
         img.src = newSrc;
      }
      else
      {
         img.src = imgOff;
      }
   }
}
function sysImageMouseOver(imgName, imgOn)
{
   // Change le nom de la source qui à priori ne se termine par
   // _off.
   var img = sysImageFindByName(imgName);
   if ( img )
   {
      if ( (imgOn == null) || (imgOn == "") )
      {
         var oldSrc = img.src;
         // recherche la fin _off.
         var pos = oldSrc.lastIndexOf('_off.');
         // extrait le début
         var newSrc = oldSrc.substring(0, pos);
         // ajoute l'extension originale
         newSrc += oldSrc.substring(pos+4);
         // change la source
         img.src = newSrc;
      }
      else
      {
         img.src = imgOn;
      }
   }
}
// Renvoie l'objet image du document courant et de nom spécifié, null si
// n'existe pas
function sysImageFindByName(imgName)
{
   var i;
   if ( document.images != null )
   {
      for (i=0; i<document.images.length; i++)
      {
         var img = document.images[i];
         if ( img.name == imgName )
         {
            return img;
         }
      }
   }
   return null;
}

var sysMouseX;
var sysMouseY;

function getMousePosition(e) 
{
   if ( !document.all ) 
   {
      sysMouseX = e.pageX;
      sysMouseY = e.pageY;
   }
   if ( document.all ) 
   {
   // ABE : 26/04/05 // Sous IE, tiens compte du mode quirck DOCTYPE présent!
   if(document.documentElement.clientWidth>0) {
      sysMouseX = event.clientX + document.documentElement.scrollLeft;
      sysMouseY = event.clientY + document.documentElement.scrollTop;
    }
    else {
      sysMouseX = event.clientX + document.body.scrollLeft;
      sysMouseY = event.clientY + document.body.scrollTop;
   }
   }
   //window.status = "x=" + sysMouseX + " y=" + sysMouseY;
   return true;
}


function sysCaptureMousePosition()
{
   if (! document.all) document.captureEvents(Event.MOUSEMOVE);
   document.onmousemove = getMousePosition;
   sysMouseCaptureIsOn = true;
}   

// tdn 08/07/2005 Appelle tout de suite sysCaptureMousePosition pour éviter
// de la mettre dans chaque page, et car cela ne se déclenche pas tout
// de suite si on l'appelle depuis une autre  fonction.
sysCaptureMousePosition();

function sysFindObj(n, d)
{
   var p,i,x;
   if (!d)
      d = document;    if((p=n.indexOf("?"))>0 && parent.frames.length)
   {
     d = parent.frames[n.substring(p+1)].document;
     n = n.substring(0,p);
   }
   if ( !(x=d[n]) && d.all)
      x = d.all[n];
   for (i=0; !x && i<d.forms.length; i++)       x = d.forms[i][n];
   for(i=0; !x && d.layers && i<d.layers.length;i++)
       x = sysFindObj(n,d.layers[i].document);
   if( !x && document.getElementById)
   {
      x = document.getElementById(n);
   }

   return x;
}
function sysDisplayAttributes(obj)
{
   var msg = "";
   var i = 0;
   for ( var p in obj )
   {
      msg += p + " = " + obj[p] + "\n";
   }
   printDebug(msg);
}

// Renvoie true si l'objet d'id spécifié est visible
function sysIsVisible(elemId)
{
   var obj = sysFindObj(elemId);
   if ( ! obj ) return false;
   return (obj.style.visibility != 'hidden') && (obj.style.display != 'none');
}

// Masque ou affiche l'objet de nom spécifié. S'il est trouvé, cherche également
// l'objet avec le nom préfixé "div". Cela permet de ne faire qu'un appel
// valable pour des layers et des div. Un message d'erreur est affiché si aucun
// des deux objets n'existe
function sysHide(divName)
{
   var found = false;
   found |= _sysHide(divName)
   found |= _sysHide("div"+divName);
   if ( ! found )
      alert("objet " + divName + " ou div" + divName + " introuvable");
}   

function sysHideInFrame(frameName, divName)
{
	var frame = sysFindFrameWithinApp(frameName);
	frame.sysHide(divName);
}

function _sysHide(divName)
{
   var obj = sysFindObj(divName);
   if ( ! obj )
      return false;
   sysHideElement(obj);
   //sysDisplayAttributes(obj);
   return true;
}

function sysHideElement(obj, displayType)
{
   if ( obj.style )
   {
      obj.style.visibility = 'hidden';
      if ( ! displayType )
         displayType = 'none';
      obj.style.display = displayType;
   }
   else
   {
      obj.visibility = 'hide';
   }
}

function sysShow(divName, posx, posy)
{
   var found = false;
   found |= _sysShow(divName, posx, posy);
   found |= _sysShow("div"+divName, posx, posy);
   if ( ! found )
      alert("objet " + divName + " ou div" + divName + " introuvable");
}

function sysShowInFrame(frameName, divName)
{
	var frame = sysFindFrameWithinApp(frameName);
	frame.sysShow(divName);
}

function _sysShow(divName, posx, posy)
{
   var obj = sysFindObj(divName);
   if ( ! obj )
      return false;
   sysShowElement(obj);
   
   if ( posx != null )
   {
      if ( obj.style ) obj.style.left = posx;
      else if ( obj.x ) obj.x = posx;
   }
   if ( posy != null )
   {
      if ( obj.style ) obj.style.top = posy;
      else if ( obj.y ) obj.y = posy;
   }
   return true;
}
function sysShowElement(obj, displayType)
{
   if ( obj.style )
   {
      obj.style.visibility = 'visible';
      if ( ! displayType )
         displayType = '';
      obj.style.display = '';
   }
   else
      obj.visibility = 'show';
}


// Fonction appelé par <tagext:init >
// forwardHref : URL vers laquelle on est redirigé si la connexion n'est plus
// valide
function sysCheckCookie(cookieName, forwardHref)
{
   //alert(document.cookie);
   var cookie_str = document.cookie;
   var str_array = cookie_str.split("; ");
   var i;
   var found = false;
   var ok = false;
   for (i=0; (i< str_array.length) && ! found ; i++)
   {
      var part_array = str_array[i].split("=");
      if ( part_array.length == 2 )
      {
         if ( part_array[0] == cookieName)
         {
            found = true;
            ok = (part_array[1] == "1");
         }
      }
   }
   if ( ! ok )
   {
      top.location.href = forwardHref;
      return false;
   }
   return true;
}
var system_version = "1.2 (RC7)";
// Renvoie une chaîne identifiant la version des scripts
function sysVersion()
{
   if ( (form_version != system_version) ||
        (input_version != system_version) ||
        (input_version != form_version)
      )
   {
      return "Erreur : versions incompatibles ! form.js=[" +
         form_version + "] system.js=[" + system_version + 
         "] input.js=[" + input_version + "]";
   }
   return system_version;
}
// Affiche une fenêtre avec les infos sur la version
function sysShowVersion(moreInfo)
{
   var msg = "Version des composants :\n\n";
   var infos = moreInfo.split("|");
   for (var i=0; i<infos.length; i++)
   {
      msg += infos[i] + "\n"; 
   }
   //msg += "Scripts = [" + sysVersion() + "]\n";
   alert(msg);
}

// Recherche une frame par une propriété JavaScript en se limitant à l'appli
function sysFindFrameWithProperty(frameProperty)
{
   return _findFrameWithinAppRecurse(frameProperty, sysGetAppBaseUrl(), window, new Array(), 
      true);
}   


// Recherche une frame par son nom en se limitant à l'appli
function sysFindFrameWithinApp(frameName)
{
   return _findFrameWithinAppRecurse(frameName, sysGetAppBaseUrl(), window, new Array(),
      false);
}

function _isAlreadyTested(testedArray, obj)
{
   for (var i=0; i<testedArray.length; i++)
      if ( testedArray[i] == obj ) return true;
   return false;
}

// Si isProperty est spécifié, recherche la frame qui a
// la variable nommée à true, sinon recherche la frame avec le nom
function _findFrameWithinAppRecurse(frameName, appBaseUrl, frame, testedArray, isProperty)
{
   var ret = null;
   var frameProperty = (isProperty ? frameName : null);
   
   if ( _isAlreadyTested(testedArray, frame) ) return null;
   testedArray.push(frame);
   // Try/Catch nécessaire si on ouvre à partir l'appli à partir d'une autre
   // fenêtre, sinon message d'erreur "Accès refusé"
   try
   {
      // Même appli
      if ( sysGetAppBaseUrl(frame.location.href) == appBaseUrl )
      {
         // Cherche par propriété
         if ( frameProperty ) 
         {
            if (eval("frame." + frameProperty + " == true") )
               return frame;
         }
         else
         {
            // Cherche par nom
            if ( frame.name == frameName )
               return frame;
         }
      }
   }
   catch (e)
   {
      return null;
   }
   if ( frame.opener != null )
   {
      ret = _findFrameWithinAppRecurse(frameName, appBaseUrl, frame.opener, testedArray, isProperty);
      if ( ret == null )
         ret = _findFrameWithinAppRecurse(frameName, appBaseUrl, frame.opener.parent, testedArray, isProperty);
   }
   if ( ret != null ) return ret;
   if ( frame.parent != null )
       ret = _findFrameWithinAppRecurse(frameName, appBaseUrl, frame.parent, testedArray, isProperty);
   if ( ret != null ) return ret;
   var frames = frame.frames;
   if ( (frames != null) && (frames.length > 0) )
   {
      for (var i=0; (i<frames.length) && (ret==null); i++)
      {
         ret = _findFrameWithinAppRecurse(frameName, appBaseUrl, frames[i], testedArray, isProperty);
      }
   }
   return ret;
}

// Positionne/Renvoie l'URL absolu du contexte de l'application
// exe : http://nomserveur/flora
function sysGetAppRoot()
{
   var ret = sysGetAttribute("application-root");
   return ret;
}
function sysSetAppRoot(value)
{
   //alert("app root = " + value);
   sysSetAttribute("application-root", value);
}

// Positionne/Renvoie le nom du contexte sous une forme utilisable 
// dans un nom de fenêtre sinon erreur sous IE quand on ouvre 
// une fenêtre d'aide par exemple
function sysGetAppName()
{
   return sysGetAttribute("application-name");
}
function sysSetAppName(value)
{
   //alert("app name = " + value);
   sysSetAttribute("application-name", value);
}


/*
Prive
Renvoie l'URL de base de l'application en détectant 'jsp' ou 'servlet' dans
l'URL du document en cours.
Si l'URL est http://serveur:port/loris/jsp/view/view.jsp, renvoie
http://serveur:port/loris/.
Si jsp ou servlet non détecté, renvoie "/"
ref est optionnel (URL à tester) : dans ce cas, vaut alors l'URL du document
en cours.
*/
function sysGetAppBaseUrl(ref)
{
   if ( ref == null )
      ref = document.URL;
   // Cherche d'abord ? pou délimiter la rechercher car d'autres paramètres URL
   // peuvent contenir /jsp/ ou /servlet/ à la fin
   var i = ref.indexOf("?");
   if ( i > -1 )
   {
      ref = ref.substring(0, i); // il faut tronquer
   }
   i = ref.indexOf("/jsp/");
   if ( i < 0 )
   {
      i = ref.indexOf("/servlet/");
   }
   if ( i > - 1 )
   {
      return ref.substring(0, i+1);
   }
   return "/";
}

//
// Mémorise/restitue des attributs dans un hashing local
//
var sysFrame;

// Renvoie la frame système, null si non trouvée
function sysGetSystemFrame()
{
   var ret = sysFindFrameWithinApp("win_system");
   return ret;
}

function sysInitSysFrameData()
{
   if ( window.name == "win_system" )
      sysFrame = window;
      
   if ( sysFrame == null )
   {
      sysFrame = sysGetSystemFrame();
      // tdn 20/05/2008 : sous navigateur PULCRA, ouvre une nouvelle fenêtre  !!
      // open("", "win_system");
   }
   if ( sysFrame == null )
   {
      alert("La frame win_system est introuvable");
      return false;
   }
   if ( sysFrame.sysAttributes == null )
   {
      sysFrame.sysAttributes = new Array();
   }
   return sysFrame;
}

function sysSetAttribute(name, value)
{
   sysInitSysFrameData();
   if ( sysFrame != null  )
   {
      sysFrame.sysAttributes[name] = value;
      //alert("sysSetAttribute : " + name + "=" + value);
   }
}
function sysGetAttribute(name)
{
   sysInitSysFrameData();
   if ( sysFrame != null  )
      return sysFrame.sysAttributes[name];
   return null;
}

function sysRemoveAttribute(name)
{
   sysInitSysFrameData();
   if ( sysFrame != null  )
      delete sysFrame.sysAttributes[name];
}

function sysDebug()
{
   var msg = "";
   sysInitSysFrameData();
   for (var n in sysFrame.sysAttributes)
   {
      msg += n + "=" + sysFrame.sysAttributes[n] + "\n";
   }
   alert(msg);
}

// initData = x,y,w,h
function SizeAndPos(initData)
{
   if ( initData != null )
   {
      var parts = initData.split(',');
      this.x = parseInt(parts[0]);
      this.y = parseInt(parts[1]);
      this.w = parseInt(parts[2]);
      this.h = parseInt(parts[3]);
      if ( parts.length > 4 );
      {
         this.dx = parseInt(parts[4]);
         this.dy = parseInt(parts[5]);
         this.dw = parseInt(parts[6]);
         this.dh = parseInt(parts[7]);
      }
   }
   else
   {
      this.x = 0;
      this.y = 0;
      this.w = 400;
      this.h = 400;
      this.dx = 0;
      this.dy = 0;
      this.dw = 0;
      this.dh = 0;
   }
      
   return this;
}
// Ajuste la position pour que la fenêtre soit centrée
SizeAndPos.prototype.center = function()
{
   this.x = (screen.width - this.w) / 2;
   this.y = (screen.height - this.h) / 2;
   
}
// Renvoie un chaîne représentant l'objet
SizeAndPos.prototype.serialize = function()
{
   var spData = this.x + "," + this.y + "," +this.w + "," + this.h
      + "," + this.dx + "," + this.dy + "," +this.dw + "," + this.dh;
   return spData;
}



// Renvoie un objet SizeAndPos
function sysGetWindowSizeAndPos(windowObj)
{
   if ( windowObj == null )
      windowObj = window;
   var sp = new SizeAndPos();
   // On traite d'abord le cas de IE
   sp.x = windowObj.screenLeft;
   sp.y = windowObj.screenTop; 
   if ( ! sp.x ) // c'est Mozilla
   {
      sp.x = windowObj.screenX; 
      sp.y = windowObj.screenY;
      //pru: sous mozilla la taille de la popup diminue à chaque ouverture
      /**
      sp.w = windowObj.innerWidth;
      sp.h = windowObj.innerHeight;
      */
      sp.w = -1;
      sp.h = -1;
   }
   else
   {
      // Encore un souci sous IE : windowObj.document.body est null si la
      // fonction n'est pas appelée par la window courante !
      try
      {
         sp.w = windowObj.document.body.offsetWidth-2*windowObj.document.body.clientLeft;
         sp.h = windowObj.document.body.clientHeight;
      }
      catch (e)
      {
      }
   }
   return sp;
}

// Mémorise la position/taille d'une fenêtre
function sysStoreWindowContext(windowObj)
{
   if ( windowObj == null )
      windowObj = window;
   var sp = sysGetWindowSizeAndPos(windowObj);

   // Sous IE, stocker directement l'objet SizeAndPOse provoque une erreur quand
   // on essaye de le récupérer après (visiblement, l'objet a été libéré à la 
   // fermeture de la fenêtre). Pas de souci avec Mozilla.
   // C'est pourquoi on sérialise avant pour stocker une String
   //alert("sysStoreWindowContext x=" + sp.x + " y=" + sp.y + " w=" + sp.w + " h=" + sp.h);
   sysSetAttribute("WindowContext." + windowObj.name, sp.serialize());
}

/**
 * @deprecated La fenêtre est directement ouverte avec la bonne taille
 **/
function sysRestoreWindowContext(windowObj)
{
}

// Renvoie le contexte s'il existe, null sinon
function sysGetWindowContext(windowName)
{
   var spData = sysGetAttribute("WindowContext." + windowName);
   if ( spData != null )
      return new SizeAndPos(spData);
   return null;
}



// Affiche le statut d'attente dans la barre de statut du navigateur
function sysWait()
{
   document.status = mess_sys_wait;
}

// Affiche le message prêt dans la barre de statut du navigateur
function sysEndWait()
{
   document.status = mess_sys_ready;
}

// Ouvre une fenêtre nommée à la même position et avec la même taille
// si elle a déjà été ouverte et fermée avec sysCloseWindow().
// - showStatus : si true, on a joute ",status=yes" aux options
// - sizeAndPos : "x,y,w,h" position et taille à la première ouverture
//                par défaut, la fenêtre est centrée, avec taille de 450
// - options : si non spécifié, on utilise par défaut 
//       "toolbar=0,location=0,directories=0,menuBar=0,scrollbars=yes,resizable=yes"
// renvoie l'objet window
function sysOpenWindow(win_name, url, showStatus, sizeAndPos, options)
{
   var sp = sysGetWindowContext(win_name);
   if ( sp == null )
   {
      if ( ! sizeAndPos || sizeAndPos == '')
         sizeAndPos = "0,0,450,450";
      sp = new SizeAndPos(sizeAndPos);
      sp.center();
   }
   else
   {
      var tmpSp = new SizeAndPos(sizeAndPos);
      tmpSp.x=sp.x;
      tmpSp.y=sp.y;
      if(sp.w!=-1)
         tmpSp.w=sp.w;
      if(sp.h!=-1)
         tmpSp.h=sp.h;
      sp=tmpSp;
   }
   //alert("x=" + sp.x + " y=" + sp.y + " w=" + sp.w + " h=" + sp.h);
   if ( ! options || options == '')
      options = "toolbar=0,location=0,directories=0,menuBar=0,scrollbars=yes,resizable=yes"
   if ( showStatus == true )
      options += ",status=yes";
   else
      options += ",status=no";
   var win = window.open(url, win_name, options +
      ",width=" + sp.w + ",height=" + sp.h +
      ",top=" + sp.y + ",left=" + sp.x);  
   win.focus();

   return win;
}
function sysWaitIEWindow(win_name)
{
   var win = open("", win_name);
   if ( win == null )
   {
      setTimeout("sysWaitIEWindow('" + win_name + "')", 50);
   }
   else
   {
      if ( win.sysRestoreWindowContext == null )
      {
         setTimeout("sysWaitIEWindow('" + win_name + "')", 50);
      }
      sysRestoreWindowContext(win);
   }
}



// Mémorise position et taille de la fenêtre avant de la fermer
function sysCloseWindow(win)
{
   if ( win == null ) win = window;
   sysStoreWindowContext(win);
   win.close();

}

// Redirige une l'action du formulaire nommé vers la fenêtre principale
// et ferme la fenêtre encours si elle n'est pas la fenêtre principale
// Si la fenêtre principale n'est pas troué, fait seulement un submit du formulaire
function sysGotoIndexPage(formName)
{
   var frm = document.forms[formName];
   if ( (frm == null) || ((frm != null)&&(frm.action == "")) )
   {
      alert("Veuillez inclure dans la page le formulaire nommé " + formName + " en spécifiant son action");
      return false;
   }
   frm.target = "_top"; // par défaut
   var targetWindow = sysFindFrameWithProperty("FLORA_MAIN_WINDOW");
   if ( targetWindow )
   {
      targetWindow.location.href = frm.action;
      if ( window != targetWindow )
         window.close();
   }
   else
   {
      frm.submit();
   }
   
   return false;
}

// Remplace les traductions directes par une recherche dans un hashing
// Pour garder compatibilité, on recherche également dans le variables
// Renvoie key si non trouvé, "" si key est null
function sysGetMessage(key)
{
   var ret = null;
   if ( key == null ) return "";
   // Le hashing est à déclarer dans messages_xx.js
   if ( window.sysMessages )
   {
      ret = window.sysMessages[key];
   }
   if ( ! ret )
   {
      // suppose que key référence une variable mess_xxx
      try { ret = eval(key); }
      catch(e){}
   }
   if ( ! ret ) 
   {
      // tdn 16/06/2005 message non traduit entre crochets
      ret = "[" + key + "] "; 
   }
   return ret;
}

// Renvoie true si object est une instance de constructorFunction
function sysInstanceOf(object, constructorFunction) 
{
   while (object != null) 
   {
      if (object == constructorFunction.prototype)
         return true
      object = object.__proto__;
   }
   return false;
}

// Gestion des cookies en js
function sysGetCookieVal(offset) 
{
   var endstr=document.cookie.indexOf (";", offset);
   if (endstr==-1)
      endstr=document.cookie.length;
   return unescape(document.cookie.substring(offset, endstr));
}

function sysGetCookie (name) 
{
   var arg=name+"=";
   var alen=arg.length;
   var clen=document.cookie.length;
   var i=0;
   while (i<clen) 
   {
      var j=i+alen;
      if (document.cookie.substring(i, j)==arg)
         return sysGetCookieVal (j);
      i=document.cookie.indexOf(" ",i)+1;
      if (i==0) 
         break;
   }
   return null;
}

function sysSetCookie (name, value) 
{
   var argv=sysSetCookie.arguments;
   var argc=sysSetCookie.arguments.length;
   var expires=(argc > 2) ? argv[2] : null;
   var path=(argc > 3) ? argv[3] : null;
   var domain=(argc > 4) ? argv[4] : null;
   var secure=(argc > 5) ? argv[5] : false;
   document.cookie=name+"="+myEscape(value)+
		((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
		((path==null) ? "" : ("; path="+path))+
		((domain==null) ? "" : ("; domain="+domain))+
		((secure==true) ? "; secure" : "");
}

// Ecriture d'un contenu html (divStr) dans une div identifiée par son nom divName
function sysPrintDiv(divName, divStr)
{
   var vMsgDiv = document.getElementById(divName);
   if (vMsgDiv)
   {
      vMsgDiv.innerHTML = '';
      vMsgDiv.style.display = 'none';               
      vMsgDiv.innerHTML = divStr;
      vMsgDiv.style.display = 'block';
   }
   else
      alert("La div " + divName + " est introuvable.");
} 

/*
* fonction de retaillage d'un bloc dont l'id elemId est passé en paramètre en overflow en fonction de la taille de la fenêtre
* cette fonction est appellée par l'événement onresize du body
* cette fonction execute un resize vertical
*/

function sysResize(elemId, maxHeight)
{
   //modif ABE 14/04/06 maxhight force la taille maxiamle dans le cas d'un multiframe
   if (!maxHeight) maxHeight=0;
   var heightIE = 225;
   var heightNotIE =230;
   if ( document.getElementById(elemId) )  
   {
      var height = 0;
      if( typeof( window.innerWidth ) == 'number' )
      {
         //Non-IE
         height = window.innerHeight;
         height = height - heightNotIE;
      } 
      else if(   document.documentElement 
             && ( document.documentElement.clientWidth 
             ||   document.documentElement.clientHeight ) ) 
      {
         //IE 6+ in 'standards compliant mode'
         height = document.documentElement.clientHeight;
         height = height - heightIE;
      }
      else if(    document.body 
              && ( document.body.clientWidth 
              ||   document.body.clientHeight ) ) 
      {
         //IE 4 compatible
         height = document.body.clientHeight;
         height = height - heightIE;
      }
      if (height < 0 )
        height = 20;
        
      document.getElementById(elemId).style.height = height+maxHeight;
   }   
}

/**
 * @return the user css or null if not setted.
 */
function getUserCss()
{
   return sysGetAttribute("CssPathName");
}   

// tdn 12/07/2007 Fonction appelé par le tag html:button
function sysButtonOnClick(elem)
{
   if ( elem.getAttribute("sysEnabled") == "true" 
     && elem.getAttribute("sysEventPending")!="true")
   {
      elem.setAttribute("sysEventPending", "true");
      //try
      {
         var action = elem.getAttribute("sysAction");
         if ( action )
         {
            sysDoAction(null, action);
         }
         else
         {
            var formAction = elem.getAttribute("sysFormAction");
            if ( formAction )
            {
               eval(formAction);
            }
         }
      }
      //catch(e)
      {
      }
      elem.setAttribute("sysEventPending", "false");
   }
}
// Désactive un bouton 2states
function sysButtonDisabled(elem)
{
   elem.setAttribute("sysEnabled", "false");
   HTMLUtil_setStyleClass(elem, "buttonDisabled");
}
// Active un bouton 2states
function sysButtonEnabled(elem)
{
   elem.setAttribute("sysEnabled", "true");
   HTMLUtil_setStyleClass(elem, "buttonEnabled");
}

// GESTION D'UNE LISTE D'ITEMS par un tableau HTML
// cf. jsp/admin/database/list/db_list_edit.jsp pour un exemple
// Le passage par les styles est beaucoup plus long avec IE (clignotement)
// C'est pourquoi on gère une couleur de fond directement, avec des constantes
// ici
var listItemMouseOverBg = "#ccccff";
var listItemSelectedBg  = "#ccccff";

function sysListItemMouseOver(elem, bgColor)
{
   if ( ! bgColor )
      bgColor = listItemMouseOverBg;
   elem.style.backgroundColor = bgColor;
   
}
function sysListItemMouseOut(elem)
{
   var isSelected = (elem.getAttribute("sysSelected")=='true');
   if ( isSelected )
   {
      // Laisse le style sélectionné
      elem.style.backgroundColor = listItemSelectedBg;
   }
   else
   {
      elem.style.backgroundColor = '';// Remet la couleur originale
   }
}
// Refresh lorsqu'un item est sélectionné
// L'élément contenant les infos a l'id "item."+itemRank
// - listName  : nom servant de clé pour mémoriser le dernier item sélectionné
// - itemRank  : rang 1-N de l'item
// Retour true si l'item existe
function sysOnItemSelected(listName, itemRank)
{
   var elemId = "item." + itemRank;
   var elem = document.getElementById(elemId);
   if ( ! elem ) return false;
   var previousItemIdKey = listName + ".selected.item.id";
   var prevId = sysGetAttribute(previousItemIdKey);
   if ( prevId )
   {
      var prevElem = document.getElementById(prevId);
      if ( prevElem )
      {
         prevElem.setAttribute("sysSelected", "false");
         prevElem.style.backgroundColor = '';
         var prevSelectMark = document.getElementById(prevId+".select.mark");
         if ( prevSelectMark )
            sysHideElement(prevSelectMark, "block");
         
      }
   }
   var selectMark = document.getElementById(elemId+".select.mark");
   if ( selectMark )
      sysShowElement(selectMark, "block");
   elem.setAttribute("sysSelected", "true");
   elem.style.backgroundColor = listItemSelectedBg;
   sysSetAttribute(previousItemIdKey, elemId);
   return true;
}

// Force la sélection d'un item
// - listName      : nom servant de clé pour mémoriser le dernier item sélectionné
// - itemRank      : rang 1-N de l'item
function sysListItemSelect(listName, itemRank)
{
   return sysOnItemSelected(listName, itemRank);
}

// Renvoie l'id de l'item sélectionné pour la liste, null si aucun
function sysListGetSelectedItemId(listName)
{
   var selectedItemIdKey = listName + ".selected.item.id";
   return sysGetAttribute(selectedItemIdKey);
}
// Mémorise l'id de l'item sélectionné
function sysListSetSelectedItemId(listName, itemId)
{
   var selectedItemIdKey = listName + ".selected.item.id";
   sysSetAttribute(selectedItemIdKey, itemId);
}
// Renvoie le rang de l'item sélectionné, 0 si aucun
function sysListGetSelectedItemRank(listName)
{
   var selectedItemId = sysListGetSelectedItemId(listName);
   if ( selectedItemId != null )
   {
      var item = document.getElementById(selectedItemId);
      if ( item )
      {
         var itemRank = selectedItemId.substring(selectedItemId.lastIndexOf('.')+1);
         return parseInt(itemRank);
      }
   }
   return 0;
}

function sysSetCssName(cssName)
{
   sysSetAttribute("CssPathName", cssName);
}
// Positionné dans win_system.jsp
function sysGetCssName()
{
   return sysGetAttribute("CssPathName");
}

// Alias HTTP
var sysAliasPrefix = "_SYS_ALIAS_.";
function sysSetAlias(aliasName, aliasValue)
{
   sysSetAttribute(sysAliasPrefix+aliasName, aliasValue);
}
// Renvoyé avec "/" final
function sysGetAlias(aliasName)
{
   var ret = sysGetAttribute(sysAliasPrefix+aliasName);
   if ( ! ret )
      ret = aliasName;
   if ( ret.charAt(ret.length-1) != '/' )
      ret += "/";
   return ret;
}
// Renvoyé avec "/" final
function sysGetIconsAlias()
{
   return sysGetAlias("icons");
}
// Renvoyé avec "/" final
function sysGetCssAlias()
{
   return sysGetAlias("css");
}
// Renvoyé avec "/" final
function sysGetScriptAlias()
{
   return sysGetAlias("script");
}
// Renvoyé avec "/" final
function sysGetHelpAlias()
{
   return sysGetAlias("help");
}
// Renvoie le début du chemin résolu avec l'alias de icons et le nom de la 
// feuille de style pour atteindre une image
// Renvoyé avec "/" final, sauf si path est spécifié alors on l'accole
function sysGetImagePath(path)
{
   var ret = sysGetIconsAlias()+"css/"+sysGetCssName()+"/";
   if ( path && path != "" )
      ret += path;
   return ret;
}

//GESTION DU PROFILE

/**
 * permet l'envoie d'une requêtre au servlet gérant les modifs globales
 * @param action: Chaine de charactère représentant l'action à réaliser
 * @param values:Tableau de string représentant les valeur pour key
 * @return un document dom.
 **/
function _profileRequest(action,key,values)
{
    var dataActionUrl = sysGetAppRoot() + "/servlet/UserManagement";
    var url = dataActionUrl+"?action="+action;
    url+="&key="+myEscape(key,true);
    if(values != null)
    {
       for(var index in values)
       {
          var value = values[index]
          url+="&value="+myEscape(value,true);
       }
    }
    try
    {
        var responce= XMLUtil_LoadXML(url);
        var error = XMLUtil_IsError(responce);
        if(error!=null)
        {
           alert(error);
        }
        return responce;
    } catch(Exception)
    {
        return XmlDocument.create();
    }
}

/**
 * @param document dom correspondant à une réponce du serveur
 * @return un tableau contenant toute les valeurs contenue dans le document
 */
function extractValues(xmlDoc)
{
   if(xmlDoc==null)
      return;
   var result = new Array();
   var items = xmlDoc.getElementsByTagName("value");
   if ( (items != null) && (items.length > 0) )
   {
      for (var i=0; i< items.length; i++)
      {
         var item = items[i];
         var value = item.getAttribute("data");
         result[i]=value;
      }
   }
   return result;
}

/**
 * ATTENTION il s'agit de requête xmlhttp, optimisé les utilisations
 * Lie value à key
 * @param key: chaine correspondant à une clef
 * @param value: Chaine correspondant à une seul valeur
 */
function profilePutValue(key,value)
{
   var values = new Array();
   values[0]=value;
   profilePutCollection(key,values);
}

/**
 * ATTENTION il s'agit de requête xmlhttp, optimisé les utilisations
 * Lie toutes les valeurs contenues dans values à key
 * @param key: chaine correspondant à une clef
 * @param value: Tableau de chaine représentant les valeurs à lié à key
 */
function profilePutCollection(key,values)
{
   _profileRequest("addProfileValue",key,values);
}


/**
 * ATTENTION il s'agit de requête xmlhttp, optimisé les utilisations
 * Supprime les valeurs liés à key
 * @param key: chaine correspondant à une clef
 */
function profileRemoveValue(key)
{
   _profileRequest("removeProfileValue",key);
}

/**
 * ATTENTION il s'agit de requête xmlhttp, optimisé les utilisations
 * retourne les valeurs liés à key
 * @param key: chaine correspondant à une clef
 * @return une chaines représentant les anciennes valeurs liés à key.
 *          retourne null s'il n'y en avait pas 
 */
function profileGetValue(key)
{
   var xmlDoc = _profileRequest("getProfileValue",key);
   var datas = extractValues(xmlDoc);
   if(datas.length>0)
      return datas[0];
   return null;
}

/**
 * ATTENTION il s'agit de requête xmlhttp, optimisé les utilisations
 * retourne les valeurs liés à key
 * @param key: chaine correspondant à une clef
 * @return un tableau cotenant des chaines représentant les anciennes valeurs liés à key.
 *          retourne null s'il n'y en avait pas 
 */
function profileGetCollection(key)
{
   var xmlDoc = _profileRequest("getAllProfileValue",key);
   return extractValues(xmlDoc);
}

// Génération d'une alerte sonore
function sysBeep() 
{
   // Renvoie la frame système "win_system", 
   // null si non trouvée
   var sysFrame = sysGetSystemFrame();
   if ( sysFrame != null ) 
   {
      if ( sysFrame.document.beepApplet )
      {
         sysFrame.document.beepApplet.beep();
      }
   }   
}

// Gestion de n'inactivation de l'écran en attente d'un retour du serveur
// Cas 594 : les masques sont créés en dynamique car un frameset ne supporte pas
// d'avoir des DIV
var sysNbWaitState = 0;
var sysCancelWaitState = false; // indiqu'on est passé par sysClearWaitState
var _sysWaitMask;
var _sysDisableMask;
function _sysGetWaitMask()
{
	if ( _sysWaitMask ) return _sysWaitMask;
	_sysWaitMask = document.getElementById("sysWaitMask");
	if ( ! _sysWaitMask )
	{
	   var elem = document.createElement("div");
	   elem.setAttribute("id", "sysWaitMask");
      elem.setAttribute("class", "sysWaitMask");
      elem.setAttribute("className", "sysWaitMask");
	   elem.style.visibility = "hidden";
	   var tags = document.getElementsByTagName("body");
	   if ( tags && tags.length > 0 )
	   {
	      elem.innerHTML = mess_sys_wait;
	      tags[0].appendChild(elem);
	      _sysWaitMask = elem;
	   }
	}
	return _sysWaitMask;
}
function _sysGetDisableMask()
{
   if ( _sysDisableMask ) return _sysDisableMask;
   _sysDisableMask = document.getElementById("sysDisableMask");
   if ( ! _sysDisableMask )
   {
      var elem = document.createElement("div");
      elem.setAttribute("id", "sysDisableMask");
      elem.setAttribute("class", "sysDisableMask");
      elem.setAttribute("className", "sysDisableMask");
      //elem.style.visibility = "hidden";
      var tags = document.getElementsByTagName("body");
      if ( tags && tags.length > 0 )
      {
         tags[0].appendChild(elem);
         _sysDisableMask = elem
      }
   }
   return _sysDisableMask;
}

function sysSetWaitState(msg, noTimeout)
{
   sysCancelWaitState = false;
   if ( msg && msg.length>0)
      msg = XMLUtil_replaceEntities(msg);
   else
      msg = "";
   if ( noTimeout == true )
      sysSetWaitStateTimeout(msg);
   else
      setTimeout("sysSetWaitStateTimeout(\"" + msg + "\")", 50);
}

function sysSetWaitStateNoTimeout(msg)
{
   sysSetWaitState(msg, true);
}

// Le message est optionel
function sysSetWaitStateTimeout(msg)
{
   if ( sysCancelWaitState == false )
   {
      sysDisableBackground();
      sysShowWaitMessage(msg);
      sysNbWaitState++;
   }
}

// Masque la div d'attente système
function sysClearWaitState(force)
{
   var doHide = false;
   sysCancelWaitState = true;
   if ( sysNbWaitState > 0 )
      sysNbWaitState--;
   if ( sysNbWaitState <= 0 ) doHide = true;
   if ( force ) doHide = true;
   // tester une variable locale et non sysNbWaitState qui peut être modifiée entre temps
   if ( doHide )
   {
      sysHideWaitMessage();
      sysEnableBackground();
   }
}

// Désactive le fond sans message seul
function sysDisableBackground()
{
   var disableMask = _sysGetDisableMask();
   if ( disableMask )
      sysShowElement(disableMask);
}
// Rend active le fond seul
function sysEnableBackground()
{
   var disableMask = _sysGetDisableMask();
   if ( disableMask )
      sysHideElement(disableMask);
}
// Affiche le message d'attente seul
function sysShowWaitMessage(msg)
{
   var waitMask = _sysGetWaitMask();
   if ( waitMask )
      sysShowElement(waitMask);
   if ( waitMask && msg && msg.length>0  )
      waitMask.innerHTML = msg;
}
//Masque le message d'attente seul
function sysHideWaitMessage()
{
   var waitMask = _sysGetWaitMask();
   if ( waitMask )
   {
      sysHideElement(waitMask);
      waitMask.innerHTML = "";
   }
}


/**
 * Plie ou deplie un bloc de champ dans la vue generique
 */
function sysViewToogleField(eleId) 
{
   var vElt = document.getElementById(eleId);
   if ( vElt == null ) return;
   var itemType = vElt.getAttribute("ezItemType");
   var itemDcm = vElt.getAttribute("ezItemDcm");   
   
   if ( itemType == "dir" )
   {
      var vSib = vElt.nextSibling; // recherche le DIV suivant
      var imgname = eval("document.images.chip_" + eleId);
      //if the vSib is a text then go to the next element 
      if ( (vSib != null) && (vSib.nodeType == 3) ) vSib = vSib.nextSibling; 
       
      if ( (vSib != null) && (vSib.getAttribute("ezItemType") == "dirContent")) 
      {
         if (vSib.style.display == 'none') {
            vSib.style.display = 'block';
	         var imgPath = imgname.getAttribute('ezIconfold');
	         if(imgPath != null)
	             imgname.setAttribute("src", imgPath);
         }
         else 
         {
            vSib.style.display = 'none';
	        var imgPath = imgname.getAttribute('ezIconUnFold');
	        if(imgPath != null) 
	                imgname.setAttribute("src", imgPath);
         }
      }
   } 
}

// Affiche la div system modal
function sysShowModal(title, action)
{
   sysSetWaitState();
   var modalPopup = document.getElementById("sysModalPopup");
   var url = sysGetAppRoot() + 
   "/jsp/tools/popup/modal_popup.jsp?content=" + myEscape(action)
    + "&title=" + myEscape(title);
   var html = XMLUtil_GetContent(url);
   modalPopup.innerHTML = html;
   sysHideWaitMessage();
   sysShowElement(modalPopup);
}
// Masque la div system modal
function sysHideModal()
{
   var modalPopup = document.getElementById("sysModalPopup");
   sysHideElement(modalPopup);
   sysClearWaitState();
}
