/**
 * 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 )
   {
      // Modification YLE pour rennes2 : Il n'arrive pas à trouver la win_system
   	  var action = sysGetAppRoot()
   	  if(action != null)
   	  	action += "/servlet/MenuManager?";
   	  else
   	  	action = "servlet/MenuManager?";
   	  // Fin modif YLE pour rennes2
      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;i<elements.length;i++)
      {
         var elt = elements[i];
         var elt_type = elt.type;
         var elt_name = 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 && i<elements.length; i++)
      {
         var elt = elements[i];
         var elt_type = elt.type;
         var cacheVal = null;
         var cacheElem = entry.elements[i];
         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;
}


/**
 * This method look for a frame in the current window. If no frame is found whithin the current window,
 * this method seek the opener if not null. 
 * The method return the frame found or null
 * @param frameName, The name of the seeked frame or property
 * @param appBaseUrl, deprecated
 * @param frame, the current frame
 * @param testedArray, arrays containing the frame already tested
 * @param isProperty, true if frameName is a propertie not a frame name!
 * @return the seeked frame or property or null.
 */
function _findFrameWithinAppRecurse(frameName, appBaseUrl, frame, testedArray, isProperty)
{
   var ret =_findFrameWithinAppRecurseInWindow(frameName, appBaseUrl, frame, testedArray, isProperty);
   if(ret == null && frame.opener != null)
   {
      ret =_findFrameWithinAppRecurseInWindow(frameName, appBaseUrl, frame.opener, testedArray, isProperty);
   }
   return ret
}
   
/**
 * This method look for frame according the name or properties in argument. This method only seek current window
 * @param frameName, The name of the seeked frame or property
 * @param appBaseUrl deprecated, not used any more, catch security exception instead
 * @param frame the current frame
 * @param testedArray, arrays containing the frame already tested
 * @param isProperty, true if frameName is a propertie not a frame name!
 * @return the seeked frame or property or null.
 */
function _findFrameWithinAppRecurseInWindow(frameName, appBaseUrl, frame, testedArray, isProperty)
   {  
   //Test security write, it's not allowed to call this statment in a frame of another application
   try
   {
      frame.location.href;
   }
   catch (e)
      {
      //We are not any more in flora application.Flora is host in a frame of another application
      return null;
   }
   
   //Check if this frame was already tested
   if ( _isAlreadyTested(testedArray, frame.name) ) 
      return null;
   
   //Keep in mind that current frame is already tested
   testedArray.push(frame.name);
   
   var ret = null;
   var frameProperty = (isProperty ? frameName : null);

   if(!frameProperty)
         {
      //look for a frame
      //regarde si la frame courante est l'élément
      if(frame.name == frameName)
               return frame;
      
      //regarde si la frame courante contient l'élément
      ret = frame.frames[frameName];
         }
         else
         {
      //Look for a property
      
      if (eval("frame." + frameProperty + " == true") )
               return frame;
      
         }
   
   //regarde si une frame frère contient l'élément
   if(ret == null)
   {
      for (var i=0; i<frame.frames.length; i++)
      {
         ret = _findFrameWithinAppRecurse(frameName,appBaseUrl,frame.frames[i],testedArray, isProperty);
         if ( ret != null ) 
            return ret;
      }
   }
      
   //Remonte au parent pour rechercher depuis un cran plus bas
   if(ret == null && frame.parent!=null)
      return _findFrameWithinAppRecurse(frameName, appBaseUrl, frame.parent, 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 )
   {
   	  // YLE : modif Rennes2 : Le message d'erreur s'affiche sur le welcome.jsp (bloc contenu)
      //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();
}