/**
 * 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 )
   {
      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
 * 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)
{
   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;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] + " *** ";
      i++;
      if  ( i>4 )
      {
         msg += "\n";
         i = 0;
      }
   }
   alert(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;
   //sysDisplayAttributes(obj);
   if ( obj.style )
   {
      obj.style.visibility = 'hidden';
      obj.style.display = 'none';
   }
   else
   {
      obj.visibility = 'hide';
   }
   return true;
}

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;
   if ( obj.style )
   {
      obj.style.visibility = 'visible';
      obj.style.display = '';
   }
   else
      obj.visibility = 'show';
      
   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;
}

// 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 = 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 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;
      sp.w = windowObj.innerWidth;
      sp.h = windowObj.innerHeight;
   }
   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();
   }
   //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");
}   