/**
 * 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.
 */

/**
 * menuName : nom du menu
 * 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 += "&";
      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";
         }
      }
      frm.action = action;
      frm.target = menuTargetName;
      frm.submit();
   }
   else
   {
      alert("formulaire sysActionForm introuvable. Veuillez inclure dans la page le tag <action:init/>");
   }
}

/**
 * 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)
 */
function sysStoreFormValues(winName, frmName, frmIndex)
{
   // 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('Create sysFormFieldsValues');
      formParams = win.sysFormFieldsValues = new Array();
   }
   // Il faut mémoriser la position des élements et non leur nom car il peut
   // il avoir plusieurs éléments de même nom
   formParams[frmIndex] = new Array();
   for (var i=0;i<frm.elements.length;i++)
   {
      var elt = frm.elements[i];
      var elt_type = elt.type;
      if ( elt_type == 'text' ) // les hiddens ne sont pas modifiables
      {
         formParams[frmIndex][i] = elt.value;
      }
      else if ( elt_type == 'checkbox')
      {
         formParams[frmIndex][i] = elt.checked;
      }
      else if ( elt_type == 'radio')
      {
         formParams[frmIndex][i] = elt.checked;
      }
      else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
      {
         formParams[frmIndex][i] = new Array();
         for (var j=0; j< elt.options.length; j++)
         {
            formParams[frmIndex][i][j] = elt.options[j].selected;
         }
      }
   }
}
function sysRestoreFormValues(winName, frmName, frmIndex)
{
   // 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 ;
   }
   if ( formParams[frmIndex] == null ) { return ; }

   for (var i=0;i<frm.elements.length;i++)
   {
      var elt = frm.elements[i];
      var elt_type = elt.type;
      if ( elt_type == 'text' ) // les hiddens ne sont pas modifiables
      {
         elt.value = formParams[frmIndex][i];
      }
      else if ( elt_type == 'checkbox')
      {
         elt.checked = formParams[frmIndex][i];
      }
      else if ( elt_type == 'radio')
      {
         elt.checked = formParams[frmIndex][i];
      }
      else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
      {
         for (var j=0; j< elt.options.length; j++)
         {
            elt.options[j].selected = formParams[frmIndex][i][j];
         }
      }
   }
}
/**
 * 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 sysCaptureMousePosition()
{
   if (! document.all) document.captureEvents(Event.MOUSEMOVE);
   document.onmousemove = getMousePosition;
}   
function getMousePosition(e) 
{
   if ( !document.all ) 
   {
      _x = e.pageX;
      _y = e.pageY;
   }
   if ( document.all ) 
   {
      _x = event.clientX + document.body.scrollLeft;
      _y = event.clientY + document.body.scrollTop;
   }
   sysMouseX = _x;
   sysMouseY = _y;
   return true;
}


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 = "";
   for ( var p in obj )
   {
      msg += p + " = " + obj[p] + "\n";
   }
   alert(msg);
}
// 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 _sysHide(divName)
{
   var obj = sysFindObj(divName);
   if ( ! obj )
      return false;
   //sysDisplayAttributes(obj);
   if ( obj.style )
      obj.style.visibility = 'hidden';
   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 _sysShow(divName, posx, posy)
{
   var obj = sysFindObj(divName);
   if ( ! obj )
      return false;
   if ( obj.style )
      obj.style.visibility = 'visible';
   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 (RC8)";
// 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 son nom en se limitant à l'appli
function sysFindFrameWithinApp(frameName)
{
   return _findFrameWithinAppRecurse(frameName, getAppBaseUrl(), window, new Array());
}
