﻿/**
 * frmCheckRequired(formulaire, field_name, no_msg, field_label)
 *
 * frmSelect(formName)
 * frmUnselect(formName)
 * frmSubmit(formName, altAction)
 * frmReset(formName)
 * frmCheckSelectionAndSubmit(formName, altAction)
 *
 * frmShowHelp(formName, action, p0, context, p1, subject)
 * frmShowIndexAssist(formName, action, table, index, crit, dest)
 * frmSetIndexTerm(formName, frameName, inputName, value, separator)
 * frmAddFieldValue(formName, frameName, inputName, value, separator )
 * frmSetFieldValue(formName, frameName, inputName, value )
 *
 * frmActionConfirm(formName, altAction, p0, actionName, pn, vn)
 * frmActionCancel(formName, altAction, p0, actionName)
 * frmActionExecute(formName, altAction, p0, actionName)
 * frmActionExecuteOnly(formName, altAction, p0, actionName, pn, vn)
 * frmActionReturn(formName, altAction, p0, actionName)
 * frmSelectMultipleIndexes(formName, hiddenList, objName)
 */

var MULTI_VALUE_SEP = "\037";
var isNetscape4x = ((navigator.appName=="Netscape")&&(parseFloat(navigator.appVersion)< 5.0));
var isMSIE = (navigator.appName == "Microsoft Internet Explorer");


/**
 * Vérifie qu'un champs est renseigné
 */
function frmCheckRequired(formulaire, field_name, no_msg, field_label)
{
   var fld_msg = field_name;
   if ( field_label != null )
   {
      fld_msg = field_label;
   }
   // On parcourt tous les champs et on teste tous les
   // champs portant le même nom
   for (var i=0;i<formulaire.elements.length;i++)
   {
      var elt = formulaire.elements[i];
      var elt_type = elt.type;
      if (elt.name == field_name)
      {
         if ( (elt_type == 'text') || (elt_type == 'hidden') || (elt_type == 'password')
              || (elt_type == "textarea") )
         {
            if ((elt.value == null) || (elt.value == ""))
            {
               if ( ! no_msg )
               {
                  alert(mess_oblig + " " + fld_msg);
                  // sinon message d'erreur
                  if ( elt_type != 'hidden' ) 
                  { 
                     // Sous IE, quand on utilise des onglets, exception si le champ est invisible
                     try
                     {
                        elt.focus(); 
                     }
                     catch (ex)
                     {
                     }
                  }
               }
               return false;
            }
         }
         else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
         {
            if ( ! elt.checked)
            {
               if ( ! no_msg)
               {
                  alert(mess_oblig + " " + fld_msg);
                  // Sous IE, quand on utilise des onglets, exception si le champ est invisible
                  try
                  {
                     elt.focus(); 
                  }
                  catch (ex)
                  {
                  } 
               }
               return false;
            }
         }
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            var has_one_selected = false;
            for (var j=0; (j< elt.options.length) && (!has_one_selected) ; j++)
            {
               has_one_selected = elt.options[j].selected;
            }
            if (! has_one_selected )
            {
               if ( ! no_msg)
               {
                  alert(mess_oblig + " " + fld_msg);
                  // Sous IE, quand on utilise des onglets, exception si le champ est invisible
                  try
                  {
                     elt.focus(); 
                  }
                  catch (ex)
                  {
                  }                  
               }
               return false;
            }
         }
      }
   }
   return true;
}
/**
 * Si tous les champs oblig sont OK, soumet le formulaire ou appelle une
 * - obligList = liste des champs à contrôler séparé par une virgule,
 *   un champ pouvant être de la forme a|b|c , qui signifie que un
 *   des champs cités doit être renseigné.
 * - labelList = libellés des champs séparés par une virgule.
 * - eval_call = éventuellement la fonction à appeler en cas de succès. Si non
 *   présent, on fait un submit du formulaire.
 */
function frmValidateForm(frm, obligList, labelList, eval_call)
{
   var flds = obligList.split(",");
   var labels = labelList.split(",");
   for (var i=0; i<flds.length; i++)
   {
      var or_fields = flds[i].split("|");
      if ( or_fields.length > 1 )
      {
         var one_is_ok = false;
         for (var j=0; ((j<or_fields.length) && ! one_is_ok); j++ )
         {
            if ( frmCheckRequired(frm, or_fields[j], 1 ) )
            {
               one_is_ok = true;
            }
         }
         if ( ! one_is_ok )
         {
            alert(mess_oblig + " " + labels[i]);
            frm.elements[or_fields[0]].focus();
            return false;
         }
      }
      else if ( ! frmCheckRequired(frm, flds[i], 0, labels[i] )  )
      {
            frm.elements[flds[i]].focus();
            return false;
      }
   }
   if ( eval_call )
      eval(eval_call);
   else
      mySubmit(frm);
}

/**
 * Fonctions de sélection des checkbox.
 * Par défaut, on recherche ceux qui se nomment "record".
 * Il est possible de spécifier un autre nom.
 * Si formName = '', on utilise altFormName
 */
function frmSelect(formName, unused, p0, checkName, element)
{
//ABE 30/03/06 ajout de la fonction unselect pour action avec un bouton radio
/*
*   si isChecked est indéfini -> c'est l'ancienne fonction qui est utilisé
*   si isChecked est à true > on coche toute les cases
*   si isChecked est à false > on décoche tout 
*/
   var checkAll=true;
   var isChecked=true;
   if(element.id=="checkAll") isChecked=element.checked;
   if(isChecked) checkAll=true;
   else if(isChecked==false) checkAll=false;
   
   var moreParams  = frmGetMoreParams(frmSelect.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   var frm = document.forms[formName];
   if ( ! checkName || (checkName == '' ))
      checkName = "record";
   if ( frm != null )
   {
      for (var i=0;i<frm.elements.length; i++)
      {
         var elem = frm.elements[i];
         if ( (elem.type=="checkbox") && ( elem.name==checkName))
         {
            elem.checked = checkAll;
         }
      }
   }
   else
      alert(mess_form_not_found + formName);
}

function frmUnselect(formName, unused, p0, checkName)
{
   var moreParams  = frmGetMoreParams(frmUnselect.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   var frm = document.forms[formName];
   if ( ! checkName || (checkName == '' ))
      checkName = "record";
   if ( frm != null )
   {
      for (var i=0;i<frm.elements.length; i++)
      {
         var elem = frm.elements[i];
         if ( (elem.type=="checkbox") && ( elem.name==checkName))
         {
            elem.checked = false;
         }
      }
   }
   else
      alert(mess_form_not_found + formName);
}

// tdn 15/01/2006
// Fonction appelée par l'attribut un scriptAction d'un bouton
// si step non spécifié, vaut -1
function frmBack(formName, step)
{
   if ( step == '' || step == 0)
      step = -1;
   history.go(step);
}

function frmSubmit(formName, action, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmSubmit.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   var frm = document.forms[formName];
   if ( frm != null )
   {
      // Complète les paramètres de l'action
      var moreParams = frmGetMoreParams(frmSubmit.arguments);
      action = frmCompleteAction(frm, action, moreParams);
      // Change la cible du formulaire si le paramètre 'target' existe
      var target = frmGetParam(moreParams, "target");

      mySubmit(frm, action, target);
   }
   else
      alert(mess_form_not_found + formName);
}

function frmReset(formName)
{
   var moreParams  = frmGetMoreParams(frmReset.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   var frm = document.forms[formName];
   if ( frm != null )
      frm.reset();
   else
      alert(mess_form_not_found + formName);
}

// Compte le nombre de checkbox cochés dans un formulaire
// - frm : le formulaire
// - checkName (optionnel) : nom des checkbox
function countSelection(frm, checkName)
{
   var count = 0;
   if ( frm != null )
   {
      if ( checkName == null )
      {
         for (var i=0;i<frm.elements.length; i++)
         {
            var elem = frm.elements[i];
            if ( elem.type=='checkbox')
            {
               if ( elem.checked )
                  count ++;
            }
         }
      }
      else
      {
         for (var i=0;i<frm.elements.length; i++)
         {
            var elem = frm.elements[i];
            if ( elem.type=='checkbox')
            {
               if ( elem.checked && (elem.name == checkName) )
                  count ++;
            }
         }
      }
   }
   return count;
}

// Fonction de contrôle, doit renvoyer true ou false
function frmCheckSelection(formName)
{
   var moreParams  = frmGetMoreParams(frmCheckSelection.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   var frm = document.forms[formName];
   if ( frm != null )
   {
      var count = countSelection(frm);
      if ( count < 1 )
         alert(mess_selection_empty);
      else
         return true;
   }
   else
      alert(mess_form_not_found + formName);
   return false;
}

// action : action alternative si spécifié
function frmCheckSelectionAndSubmit(formName, action, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmCheckSelectionAndSubmit.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   
   if ( formName == '' ) formName = altFormName;
   var frm = document.forms[formName];
   // tdn 27/06/2005 Si echec dans recherche dans les noms, recherche par id
   if ( ! frm )
      frm = document.getElementById(formName);
   
   if ( frm != null )
   {
      var checkName = frmGetParam(moreParams, "checkName");
      var count = countSelection(frm, checkName);
      if ( count < 1 )
         alert(mess_selection_empty);
      else
      {
         // Complète les paramètres de l'action
         action = frmCompleteAction(frm, action, moreParams);
         // Change la cible du formulaire si le paramètre 'target' existe
         var target = frmGetParam(moreParams, "target");
         mySubmit(frm, action, target);
      }
   }
   else
      alert(mess_form_not_found + formName);
}

// tdn 28/07/2005
function frmCheckSelectionAndSubmitExport(formName, action, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmCheckSelectionAndSubmitExport.arguments);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   
   if ( formName == '' ) formName = altFormName;
   var frm = document.forms[formName];
   // tdn 27/06/2005 Si echec dans recherche dans les noms, recherche par id
   if ( ! frm )
      frm = document.getElementById(formName);
   
   if ( frm != null )
   {
      var count = countSelection(frm);
      if ( count < 1 )
         alert(mess_selection_empty);
      else
      {
         // Complète les paramètres de l'action
         action = frmCompleteAction(frm, action, moreParams);
         // Ajout le paramètre exportTemplate
         action += "&exportTemplate=" + myEscape(document.getElementById("exportTemplate").value);
         // Change la cible du formulaire si le paramètre 'target' existe
         var target = frmGetParam(moreParams, "target");
         mySubmit(frm, action, target);
      }
   }
   else
      alert(mess_form_not_found + formName);
}

// Les fonctions de soumission qui modifient les attributs par défaut des
// formulaires doivent les remettre sinon s'il y a plusieurs boutons dans une
// même page, celui utilisant les attributs par défaut ne fonctionnera plus
// correctement une fois que le second utilisant les attributs alternatifs a
// été activé
function frmSaveAttributes(frm)
{
   var attr = new Array();
   attr[attr.length] = frm.target;
   attr[attr.length] = frm.action;
   return attr;
}
function frmRestoreAttributes(frm, attr)
{
   frm.target = attr[0];
   frm.action = attr[1];
}

// Privé
// Renvoie un tableau des paramètres (nom,valeur) si args en contient plus de
// 2 valeurs, sinon renvoie null
// - args : paramètres d'une fonction frm(formName, altAction)
// - startIndex : index dans le tableau du premier nom. Par défaut, 2
function frmGetMoreParams(args, startIndex)
{
   if ( ! args ) return null;
   var moreParams = new Array();
   if ( ! startIndex || (startIndex <= 0) )
      startIndex = 2;
   for (var i=startIndex; i<args.length; i+=2)
   {
      if ( args[i] && (args[i] != ""))
      {
         moreParams[moreParams.length] = args[i];
         moreParams[moreParams.length] = args[i+1];
      }
   }
   if ( moreParams.length == 0)
      moreParams = null;
   return moreParams;
}
// Ajoute des paramètres cgi à l'action
// Renvoie l'action telle quelle si moreParams est vide
function frmCompleteAction(frm, action, moreParams)
{
   if ( !action || (action == "") )
   {
      if ( frm ) action = frm.action;
   }
   if ( action && (action !="") )
   {
      if ( moreParams )
      {
         if ( action.indexOf("?") == -1 )
            action += "?";
         else
            action += "&";
         for (var i=0; i<moreParams.length; i+=2)
         {
            if ( i > 0 )
               action += "&";
            var paramName = moreParams[i];
            var paramValue = moreParams[i+1];
            if(paramName!=null && paramValue!=null)
            {
               if ( paramValue == "$referer" )
               {
                  paramValue = window.location.href;
               }
               action += paramName + "=" + myEscape(paramValue);
            }
         }
      }
   }
   return action;
}
// Renvoie la valeur du paramètre s'il existe dans le tableau, null sinon
function frmGetParam(moreParams, paramName)
{
   if ( ! moreParams ) return null;
   for (var i=0; i<moreParams.length; i+=2)
   {
      if (moreParams[i] == paramName )
      {
         return moreParams[i+1];
      }
   }
   return null;
}
/**
 * Appel de la fenêtre d'aide
 */
function frmShowHelp(formName, action, p0, context, p1, subject)
{
   // Paramètre la fenêtre
   // TODO : Lire dans la config taille et position
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   cgi += "context=" + myEscape(context)
       + "&subject=" + myEscape(subject);

   // Ouvre la fenêtre
   var winName = "win_help" + sysGetAppName();
   sysOpenWindow(winName, cgi, true /* affiche status cause IE */);
}

/**
 * Appel de l'assistant sur index
 * table : nom de la table ou nom du champ contenant la valeur. La valeur
  *        peut êtr source.nomTable ou nomTable seul
 * index : nom de l'index  ou nom du champ contenant la valeur
 * crit  : critère ou nom du champ contenant la valeur
 * dest  : nom du champ qui contient la valeur rapatriée (nb :la frame destination
 *    est la frame qui contient ce script).
 */
function frmShowIndexAssist(formName, action, p0, table, p1, index, p2, crit, p3, dest)
{
   var frame = this.name;

   var the_form = document.forms[formName];
   if ( the_form == null )
   {
      alert(mess_form_not_found + formName);
      return;
   }

   var tableName = getFieldValue(the_form, table, table);
   var indexName = getFieldValue(the_form, index, index);
   var critere   = getFieldValue(the_form, crit, '');

   // on teste que les paramètres sont correctement spécifiés
   /* tdn 21/07/2005 on remplace dans l'assistant par 'a'
   if (critere == '')
   {
      alert (mess_field_empty + crit);
      if ( the_form.elements[crit] != null )
      {
         the_form.elements[crit].focus();
      }
      return;
   }
   */
   if (tableName == ''){alert (mess_param_empty + table) ; return;}
   if (indexName == ''){alert (mess_param_empty + index) ; return;}
   var sourceName = null; 
   var parts = tableName.split(".");
   if ( parts.length == 2 )
   {
      sourceName = parts[0];
      tableName = parts[1];
   }
   _commonIndexAssistProcess(action, dest, sourceName, tableName, indexName, critere);
}

/**
 * Permet l'affichage des valeurs diponibles pour un index sur lien
 * le param table n'est utilisé que si index n'est pas un index sur lien.
 * Si index est un index sur lien il contient les info concernant la source et la table.
 */
function frmShowLinkIndexAssist(formName, action, p0, table, p1, index, p2, crit, p3, dest)
{
   var the_form = document.forms[formName];
   if ( the_form == null )
   {
      alert(mess_form_not_found + formName);
      return;
   }
   
   var sourceName = null;
   var indexName = getFieldValue(the_form, index, index);
   var parts = indexName.split(".");
   if(parts.length == 3)
   {
      sourceName=parts[0];
      tableName=parts[1];
      indexName=parts[2];
   }
   else if(parts.length == 2)
   {
      tableName=parts[0];
      indexName=parts[1];
   }
   else
   {
      //index standart
      tableName = getFieldValue(the_form, table, table);
      var parts = tableName.split(".");
      if ( parts.length == 2 )
      {
         sourceName = parts[0];
         tableName = parts[1];
      }
   }
   var critere   = getFieldValue(the_form, crit, '');
   if (tableName == ''){alert (mess_param_empty + table) ; return;}
   if (indexName == ''){alert (mess_param_empty + index) ; return;}
    

   _commonIndexAssistProcess(action, dest, sourceName, tableName, indexName, critere);
}

/**
 * interne
 * processus commun a frmShowLinkIndexAssist et frmShowIndexAssist
 */
function _commonIndexAssistProcess(action, dest, sourceName, tableName, indexName, critere)
{
   var frame = this.name;
   // Ajoute automatiquement le paramètre source si nécessaire


   // Paramètre la fenêtre
   // TODO : Lire de la config taille et position
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   if ( sourceName != null )
      cgi += "source=" + myEscape(sourceName) + "&";
   cgi += "tableName=" + myEscape(tableName)
       + "&indexName=" + myEscape(indexName)
       + "&criteria=" + myEscape(critere.getLastWordToken())
       + "&targetFrame=" + myEscape(frame)
       + "&targetInput=" + myEscape(dest)
       + "&firstLoad=true";
   // Ouvre la fenêtre avec un nom unique par application
   var winName = "win_index" + sysGetAppName();
   sysOpenWindow(winName, cgi, null, "100,100,500,550");
}

/**
 * Appel de l'assistant thesaurus
 * table = nom de la table source ou nom du champ contenant la valeur
 * thes  = nom de la table THESAURUS ou nom du champ contenant la valeur
 * crit = critère ou nom du champ contenant le critère
 * crit_dest = nom du champ où on rapatrie les termes (nb :la frame destination
 *    est la frame qui contient ce script).
 * index_dest = nom du champ où on rapatrie le nom de l'index thesaurus qui est
 * de la forme "table->thes"
 * critNotOblig = indique que le champ crit n'est pas obligatoirement renseigné.
 * Dans ce cas, crit contient directement le critère.
 * targetLang = Le nom de l'élément HTML dont la valeur indique la langue de recherche.
 * thesaurusIndex = Le nom de l'élément HTML dont la valeur indique le nom de l'index thesaurus complet.
 */
function frmShowThesaurusAssist(formName, action, p0, table, p1, thes, p2, crit, p3, crit_dest, p4, 
   index_dest, p5, critNotOblig, p6, conceptType, p7, targetLang, p8, thesaurusIndex, p9, is_editable)
{
   var frame = this.name;

   var the_form = document.forms[formName];
   if ( the_form == null )
   {
      alert(mess_form_not_found + formName);
      return;
   }

   var tableName = getFieldValue(the_form, table, table);
   var critere   = getFieldValue(the_form, crit, '');  
   var thesName  = getFieldValue(the_form, thes, thes);

   if (critNotOblig == '')
   {
      // on teste que les paramètres sont correctement spécifiés   
      /* tdn 21/07/2005 on remplace dans l'assistant par 'a'
      if (critere == '')
      {
         alert (mess_field_empty + crit);
         if ( the_form.elements[crit] != null )
         {
           the_form.elements[crit].focus();
         }
         return;
      }
      */
   }
   else
      critere = crit;

   if (tableName == ''){alert (mess_param_empty + table) ; return;}
   if (thesName == ''){alert (mess_param_empty + thes) ; return;}

   _frmShowThesaurusAssist(action, tableName, thesName, critere.getLastWordToken(), 
    targetLang, conceptType, crit_dest, index_dest, thesaurusIndex, is_editable)

}
/**
 * @param tableName : non utilisé pour thes. multilingue
 * @param targetIndex est utilisé pour passer le mode tu thes. multilingue
 */
function _frmShowThesaurusAssist(action, tableName, thesName, critere, targetLang,
   conceptType, targetInput, targetIndex, thesaurusIndex, is_editable)
{
            
   if ( ! conceptType ) conceptType = "";
   // Paramètre la fenêtre
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
      
   cgi += "tableName=" + myEscape(tableName)
       + "&thesaurusName=" + myEscape(thesName)
       + "&criteria=" + myEscape(critere.getLastWordToken())
       + "&targetFrame=" + myEscape(this.name)
       + "&targetInput=" + myEscape(targetInput)
       + "&targetIndex=" + myEscape(targetIndex)
       + "&conceptType=" + myEscape(conceptType);
   if( (targetLang) && (targetLang != '') )
   {
      cgi += "&targetLang=" + myEscape(targetLang);
   }
   if( (thesaurusIndex) && (thesaurusIndex != '') )
   {
      cgi += "&thesaurusIndex=" + myEscape(thesaurusIndex);
   }
   // Ouvre la fenêtre avec un nom unique par application
   var winName = "win_thesaurus" + sysGetAppName();
   if (!is_editable) 
   {
      sysOpenWindow(winName, cgi, null, "100,100,850,500");
   }
   else 
   {
      if(is_editable=="win_thesaurus_assist") 
      {
         winName=is_editable+ sysGetAppName();
         sysOpenWindow(winName, cgi, null, "100,100,850,500");
      }
      else 
      {
         sysOpenWindow(winName, cgi, null, "100,100,850,500");
      }
   }
}   

/**
 * Change le terme courant du thesaurus
 *
 * inputName : nom du champ contenant la clé du terme courant
 * termName : nom du champ recevant la clé du terme courant
 */
function frmThesaurusSetTerm(formName, action, p0, inputName, p1, termName)
{
   var the_form = document.forms[formName];
   var new_term = getFieldValue(the_form, inputName, '');
   var old_term = getFieldValue(the_form, termName, '');
   if ( (new_term != '') && ( new_term != old_term ))
   {
      setFieldValue(the_form, termName, new_term);
      //Pb avec Mozilla (a cause probablement de l'appel a "open")
      //mySubmit(the_form);
      the_form.submit( );
   }
   else if( new_term == '' )
   {
      alert( mess_field_empty + inputName );
      if( the_form.elements[ inputName ] != null )
      {
         the_form.elements[ inputName ].focus( );
      }
   }
}
/**
 * Recopie le terme courant de l'assistant dans le formulaire de recherche.
 *
 * termName : nom du champ contenant la valeur chaîne du terme
 * termValue : valeur du terme, si vide, on cherche dans termName
 * optionName : nom du champ contenant la valeur de l'option qui peut être vide
 * optionValue : valeur de l'option, si vide, on cherche dans optionName
 * indexName : nom du champ contenant la valeur de l'index
 * closeWindow : si non vide, on ferme la fenêtre après la recopie
 * vide, ">" ou "+>"
 */
function frmThesaurusRetrieveTerm(formName, action, termName, termValue, p1, frameName,
   p2, inputName, optionName, optionValue, p4, indexName, p5, indexValue,
   p6, closeWindow)
{
   // separator : séparateur à ajouter avant dans le champ destinataire
   var separator = " ";
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   if ( targetInput.type != "text" )
   {
      alert(mess_wrong_field_type + inputName);
      return;
   }
   // Cherche la valeur des champs
   var the_form = document.forms[formName];
   if ( (termValue == null) || (termValue == '') || (termValue == "empty"))
      termValue = getFieldValue(the_form, termName, '');

   /*
   tdn 30/07/2004 Inutile de faire ça car optionValue est bien positionné déjà
   if ( (optionValue == null) || (optionValue == '') || (optionValue == "empty"))
      optionValue = getFieldValue(the_form, optionName, '');
   */
   termValue += optionValue;

   // Ajoute le terme ou remplace le terme courant du critère
   targetInput.value = targetInput.value.setOrAddCriteria(termValue, ' ');

   // positionne l'index thesaurus
   if ( indexName != '' )
   {
      var indexInput = findField(frameName, indexName);
      if ( indexInput == null )
      {
         alert(mess_field_not_found + indexName);
         return;
      }
      setFieldValue(indexInput.form, indexName, indexValue);
   }

   if ( closeWindow != '')
      window.close();
}
/**
 * Complète le champ nommé avec la valeur précédée éventuellement du séparateur
 * Ne fonctionne que si inputName désigne un champ de type texte
 * Sert au rapatriement d'un terme d'index de l'assistant
 */
function frmSetIndexTerm(formName, altAction, p0, frameName, p1, inputName, p2, value, p3, separator, p4, visuId)
{
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   if ( targetInput.type != "text" )
   {
      alert(mess_wrong_field_type + inputName);
      return;
   }
   if(visuId !=null) 
   {
   document.getElementById(visuId).innerHTML+="\" "+value+"\" ";
   setVisuIndex(document.getElementById(visuId).innerHTML);
   }
   targetInput.value = targetInput.value.setOrAddCriteria(value, separator);
}

/*
* fonction pour le cache de l'ssistant sur index
* 
*/
var SYS_INDEX_LIST="SYS_INDEX_LIST";

function getVisuIndex()
{
var value=sysGetAttribute(SYS_INDEX_LIST);
return value;
}
function restoreVisuIndex(visuId,firstLoad)
{
if(visuId !=null) 
   {
   if(firstLoad=="true")
   {
   setVisuIndex("");
   }
   else
   {
   var value=getVisuIndex();
   if(value!=null) document.getElementById(visuId).innerHTML+=value;
   }
   }
}

function setVisuIndex(value)
{
sysSetAttribute(SYS_INDEX_LIST, value);
}
 

// Ajoute ou remplace un terme à la fin d'une chaîne de critère
// Renvoie la nouvelle valeur   
String.prototype.setOrAddCriteria = function(value, separator)
{   
   var endsWithSep = (this.charAt(this.length-1) == separator);
   // Masque les cotes internes
   value = value.mask('"');
   // Masque les * pour ne pas les remplacer par %
   value = value.mask('*');
   // Ajoute des cotes au début et à la fin
   value = value.quotes();
   // Remplace _quote_ par \"
   value = value.unmaskQuoteKeyWord();
   
   var newValue = value;
   // On remplace le dernier 'mot' de la chaîne par la valeur passée
   var tokens = this.getWordTokens(true /* ne pas ajouter le dernier " manquant */);
   if ( tokens != null )
   {
      newValue = "";
      for(var i=0; i<tokens.length-1; i++)
         newValue += tokens[i].quotes() + separator;
      var lastToken = tokens[tokens.length-1];
      // Test pour savoir si c'est un remplacement ou un ajout
      // abc_   : ajoute
      // "abc"_ : ajoute
      // "abc   : remplace
      // "abc"  : remplace
      // "abc_  : remplace
      // abc    : remplace
      var doReplace = true;
      if ( endsWithSep )
      {
         doReplace = ( (lastToken.charAt(0) == '"') &&  
              (lastToken.charAt(lastToken.length-1) != '"') );
      }
      // Ne pas remplacer la dernière ?
      if ( doReplace == false )
         newValue += lastToken.quotes() + separator;
      // Ajoute nouvelle valeur
      newValue += value + separator;
   }
   return newValue;
}

/**
 * Appel de l'assistant de saisie d'une date dans une DIV par un scriptAction
 * - action  : inusité, paramètre de scriptAction
 * - critId  : id du champ contenant la valeur actuelle, et où on rapatriera
 *             la nouvelle valeur
 * - listener : Objet implementant la méthode valueChanged(value). Cette
 *              méthode est appellée par le calendar lorsqu'une date est choisie
 */
function frmShowDateAssist(action, p0, critId,listener)
{
   var frame = this.name;

   // Vérifie le div
   var critElem =  critElem = document.getElementById(critId);
   if ( ! critElem)
   {
      alert("frmShowDateAssist : critId doit être l'id d'un élément valide");
      return;
   }
   var curVal = critElem.value;
   
   // Si div n'existe pas, le crée enfant de body
   var divCalId = "calendar-container";
   var divCal = document.getElementById(divCalId);
   if ( ! divCal )
   {
      divCal = document.createElement("div");
      divCal.setAttribute("id", divCalId);
      var bodyElems = document.getElementsByTagName("body");
      if ( ! bodyElems )
      {
         alert("frmShowDateAssist : aucun élément 'body' trouvé");
         return;
      }
      bodyElems[0].appendChild(divCal);
      HTMLUtil_setStyleClass(divCal, "calendarPopup");
   }
   var myCal = window.myCal = new CalendarWidget("myCal", divCal, critElem);
   if(listener != null)
      myCal.setListener(listener);
   if ( curVal ) myCal.setSelectedDate(curVal);
   myCal.show(null, 4);
}


/**
 * Ajoute une valeur à un champ. Si le champ était vide le séparateur ne
 * sert à rien. Sinon, si c'est un champ texte, ajoute le séparateur d'abord.
 * Dans le cas d'un champ non texte, le séparateur ne sert à rien.
 */
function frmAddFieldValue(formName, action, p0, frameName, p1, inputName, p2, value, p3, separator )
{
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   setOrAddFieldValue(targetInput.form, inputName, value, separator);

}
/**
 * Positionne la valeur d'un champ se trouvant dans une frame.
 * On parcourt tous les formulaires de la frame pour trouver le champ.
 */
function frmSetFieldValue(formName, action, p0, frameName, p1, inputName, p2, value )
{
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   setOrAddFieldValue(targetInput.form, inputName, value, "");
}

/**
 * Les fonction frmActionXXX gère l'enchaînement des actions nécessitant un 
 * message de confirmation, avec possibilité d'annulation ou non.
 * Si le nom du formulaire n'est pas spécifié, utilise le formulaire 
 * sysActionForm inclus automatiquement par tagext:init.
 */
function frmActionConfirm(formName, action, p0, actionName, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmActionConfirm.arguments, 4);
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   // appelle l'action manager lui passant la href de la fenêtre
   // servlet/ActionFlowManager?do=confirm&referer=...&
   //    action=hold_cancel&...
   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // Complète les paramètres de l'action
      action = frmCompleteAction(frm, action, moreParams);
      // Paramètre du manager
      var referer = window.location.href;
      action += "&do=confirm";
      action += "&referer=" + myEscape(referer);
      action += "&action=" + myEscape(actionName);

      // Appel de la fonction onSubmit s'il y en a une
      mySubmit(frm, action);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}
/**
 * Exécute l'action sans confirmation
 */
function frmActionExecuteOnly(formName, action, p0, actionName, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmActionExecuteOnly.arguments, 4);
   var altFormName = frmGetParam(moreParams, "formName");
   // Change la cible du formulaire si le paramètre 'target' existe
   var target = frmGetParam(moreParams, "target");
   
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;

   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // Complète les paramètres de l'action
      action = frmCompleteAction(frm, action, moreParams);
      // Paramètre du manager
      var referer = window.location.href;
      action += "&do=executeOnly";
      action += "&referer=" + myEscape(referer);
      action += "&action=" + myEscape(actionName);

      // Appel de la fonction onSubmit s'il y en a une
      mySubmit(frm, action, target);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}

/**
 * Réinitialise l'action en cours et revient au point initial
 */
function frmActionCancel(formName, altAction, p0, actionName)
{
   var moreParams  = frmGetMoreParams(frmActionCancel.arguments, 4);
   // Change la cible du formulaire si le paramètre 'target' existe
   var target = frmGetParam(moreParams, "target");
   
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // servlet/ActionFlowManager?do=cancel&action=hold_cancel
      var frmAction = ( altAction != "" ) ? altAction : frm.action;
      if ( frmAction.lastIndexOf("?") < 0)
         frmAction += "?";
      else
         frmAction += "&";
      frmAction += "do=cancel";
      frmAction += "&action=" + myEscape(actionName);
      mySubmit(frm, frmAction, target);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}
function frmActionExecute(formName, altAction, p0, actionName)
{
   var moreParams  = frmGetMoreParams(frmActionExecute.arguments, 4);
   // Change la cible du formulaire si le paramètre 'target' existe
   var target = frmGetParam(moreParams, "target");
   
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // servlet/ActionFlowManager?do=execute&action=hold_cancel
      var frmAction = ( altAction != "" ) ? altAction : frm.action;
      if ( frmAction.lastIndexOf("?") < 0)
         frmAction += "?";
      else
         frmAction += "&";
      frmAction += "do=execute";
      frmAction += "&action=" + myEscape(actionName);

      mySubmit(frm, frmAction, target);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}
/**
 * Revient au point initial
 */
function frmActionReturn(formName, altAction, p0, actionName)
{
   var moreParams  = frmGetMoreParams(frmActionReturn.arguments, 4);
   // Change la cible du formulaire si le paramètre 'target' existe
   var target = frmGetParam(moreParams, "target");
   
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // servlet/ActionFlowManager?do=return&action=hold_cancel
      var frmAction = ( altAction != "" ) ? altAction : frm.action;
      if ( frmAction.lastIndexOf("?") < 0)
         frmAction += "?";
      else
         frmAction += "&";
      frmAction += "do=return";
      frmAction += "&action=" + myEscape(actionName);

      mySubmit(frm, frmAction, target);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}
/**
 * Exécute l'action et revient au point initial. Permet d'exécuter une
 * action sans passer par un formulaire.
 * Cette fonction est conservée pour compatibilité avec les versions précédentes
 * Il vaut mieux la remplacer maintenant par frmActionExecuteOnly qui utilise
 * le formulaire système lorqu'aucun n'est spécifié.
 */
function frmActionDirectExecute(empty, action, p0, actionName, pn, vn)
{
   // Complète les paramètres de l'action
   var moreParams = frmGetMoreParams(frmActionDirectExecute.arguments, 4);
   action = frmCompleteAction(null, action, moreParams);
   // Paramètre du manager
   var referer = window.location.href;
   action += "&do=executeOnly";
   action += "&referer=" + myEscape(referer);
   action += "&action=" + myEscape(actionName);

   // La target est forcément la window courante
   // TODO : est-ce suffisant dans tous les cas ?
   window.location.href = action;
}
/**
 * Forward les paramètres déjà mémorisées pour une action à une autre action.
 */
function frmActionForward(formName, action, p0, actionName, p1, toAction, pn, vn)
{
   var moreParams  = frmGetMoreParams(frmActionForward.arguments, 6);
   // Change la cible du formulaire si le paramètre 'target' existe
   var target = frmGetParam(moreParams, "target");
   
   var altFormName = frmGetParam(moreParams, "formName");
   if ( (formName == '') && ( altFormName != null ) )
      formName = altFormName;
   if ( formName == "" )
      formName = "sysActionForm";
   var frm = document.forms[formName];
   if ( frm != null )
   {
      // Complète les paramètres de l'action
      action = frmCompleteAction(frm, action, moreParams);
      // Paramètre du manager
      var referer = window.location.href;
      action += "&do=forward";
      action += "&referer=" + myEscape(referer);
      action += "&action=" + myEscape(actionName);
      action += "&to=" + myEscape(toAction);

      // Appel de la fonction onSubmit s'il y en a une
      mySubmit(frm, action, target);
   }
   else
   {
      alert(mess_form_not_found + formName);
   }
}
/*
* Soumet un formulaire Z3950.
* S'il n'y a qu'une source, fait juste un submit
* S'il y a plusieurs sources sélectionnées, construit l'URL pour chaque
* source et redirige vers la page qui va créer les frames
*/
function frmSubmitZ3950(frm, sourceInputName, dispatchAction)
{
   var srce = getFieldValue(frm, sourceInputName, "");
   if ( srce == "" )
   {
      alert(mess_select_z_source);
      return false;
   }
   var sources = srce.split("\037");
   // Si une seule source, submit normal
   if ( sources.length == 1 ) return true;
   // Sinon sauve l'ancienne action et la passe dans un paramètre
   var oldAction = frm.action;
   if ( dispatchAction.indexOf("?") == -1 )
      dispatchAction += "?";
   else
      dispatchAction += "&";
   dispatchAction += "queryAction=" + myEscape(oldAction);
   dispatchAction += "&sourceInput=" + sourceInputName;
   //alert(dispatchAction);
   frm.action = dispatchAction;
    
   return true;
   
}

// Privé
// Teste si le formulaire a une fonction nommée frmName_onSubmit().
// Si oui, l'appelle d'abord, sinon appelle directemenr frm.submit().
function mySubmit(frm, action, target)
{
   var formName = frm.name;
   // sau 31.10.2007 : Sous mozilla, l’exécution de la méthode 
   // "open('','"+ window.name + "')." + formName + "_onSubmit"
   // engendre la perte du window.opener de la fenêtre courante.
   // ==> On ne passe plus par open, on teste la présence de la fonction 
   //     dans la fenêtre courante et on l'execute si elle est présente.
   var onSubmitFunc = "window." + formName + "_onSubmit";
   
   var onSubmitCall = onSubmitFunc + "(frm)";
   var doSubmit = true;
   if ( eval(onSubmitFunc + " != null") )
   {
      if ( ! eval(onSubmitCall) )
      {
         doSubmit = false;
      }
   }
   if ( doSubmit )
   {
      var attributes = frmSaveAttributes(frm);
      if ( action && (action != null) )
         frm.action = action;
      if ( target && (target != null) )
         frm.target = target;
      frm.submit();
      // Sous Netscape 4.x, la fonction frmRestoreAttributes est exécutée trop
      // tôt, avant le submit réel, ce qui fait que l'action du formulaire est
      // celui par défaut au lieu d'être celui spécifié par le paramètre action.
      // Solution : ne pas restaurer les attributs du formulaire pour Netscape 4.x
      if ( ! isNetscape4x ) 
         frmRestoreAttributes(frm, attributes);
   }

}

// Privé
// Retourne la valeur du champs de nom field_name du formulaire spécifié
// Retourne defValue si aucune valeur trouvée
// Si plusieurs valeurs correspondent, elles sont retournées sous la forme
// val1\037val2\037...
function getFieldValue(form, fieldName, defValue)
{
   var fieldValue = "";
   for (var i=0;i<form.elements.length;i++)
   {
      var elt = form.elements[i];
      var elt_type = elt.type;
      var newValue = "";
      if (elt.name == fieldName)
      {
         // pour les champs text ou hidden, on retourne la valeur
         if ( (elt_type == 'text') || (elt_type == 'hidden') || (elt_type == 'textarea'))
         {
            newValue = elt.value;
         }
         // pour les radioboutons ou les cases à cocher
         else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
         {
            if (elt.checked)
            {
               newValue = elt.value;
            }
         }
         // Pour les listes simple ou multiple
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            if ( elt.options != null ) if ( elt.options.length > 0 )
            {
               for (var j=0; j< elt.options.length; j++)
               {
                  if (elt.options[j].selected)
                  {
                     if ( newValue != "" )
                        newValue += MULTI_VALUE_SEP;
                     newValue += elt.options[j].value;
                  }
               }
            }
         }
         // Ajoute newValue
         if ( newValue != "" )
         {
            if (fieldValue != "") { fieldValue += MULTI_VALUE_SEP;}
            fieldValue += newValue;
         }
      }
   }
   return (fieldValue == "")? defValue : fieldValue;
}

// Retourne la valeur de l'élément spécifié. Pour les listes, donnent par défaut
// que les valeurs sélectionnées, sauf si allValues=true
// Si plusieurs valeurs correspondent, elles sont retournées sous la forme
// val1\037val2\037...
// @author tdn
// @since 26/03/2007
function getElementValue(elt, allValues)
{
   if ( !elt ) return "";
   var elt_type = elt.type;
   var newValue = "";
   // pour les champs text ou hidden, on retourne la valeur
   if ( (elt_type == 'text') || (elt_type == 'hidden') || (elt_type == 'textarea'))
   {
      newValue = elt.value;
   }
   // pour les radioboutons ou les cases à cocher
   else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
   {
      if (elt.checked)
      {
         newValue = elt.value;
      }
   }
   // Pour les listes simple ou multiple
   else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
   {
      if ( elt.options != null ) if ( elt.options.length > 0 )
      {
         for (var j=0; j< elt.options.length; j++)
         {
            if (allValues || elt.options[j].selected)
            {
               if ( newValue != "" )
                  newValue += MULTI_VALUE_SEP;
               newValue += elt.options[j].value;
            }
         }
      }
   }
   return newValue;
}


// Privé
// Recherche la frame de nom spécifié ET faisant partie de la même application
// On se base sur la racine de l'URL pour le décecter
// La recherche se fait en partant de la fenêtre courante : on remonte à opener 
// s'il y en a un, à parent sinon, et ainsi de suite de manière récursive
function findFrameWithinApp(frameName)
{
   return sysFindFrameWithinApp(frameName);
}

// Privé
// Teste si la frame possède au moins un formulaire contenant un champ du nom
// spécifié : si oui, le renvoie, sinon renvoie null.
function findField(frameName, inputName)
{
   // Rechercher le premier formulaire de frameName qui contient un
   // champ inputName
   // DEI 6064 : limite la recherche aux fenêtres issues de la même application
   // var targetFrame = open( "", frameName); 
   var targetFrame = findFrameWithinApp(frameName);
   if ( targetFrame == null )
   {
      alert(mess_frame_not_found + frameName);
      return;
   }
   else
   {
      //alert("frame trouvée : " + targetFrame.name + " " + targetFrame.location.href);
   }
   var targetForm = null;
   var targetInput = null;

   for (var i=0; (i<targetFrame.document.forms.length) && (targetInput==null); i++)
   {
      // Recherche le champ input_name dans frame_dest
      targetForm = targetFrame.document.forms[i];
      for(var j=0; j < targetForm.elements.length; j++)
      {
         if ( targetForm.elements[j].name == inputName )
         {
            targetInput = targetForm.elements[j];
            break;
         }
      }
   }
   return targetInput;
}

// Positionne la valeur d'un champ du formulaire
// - form      : formulaire
// - fieldName : nom du champ à positionner
// - value     : valeur simple ou séparé par \037 (MULTI_VALUE_SEP)
function setFieldValue(form, fieldName, value)
{
   return setOrAddFieldValue(form, fieldName, value, '');
}

// Renvoie le champ spécifié par le nom du formulaire et le nom du champ
function frmGetField(frmName, fieldName)
{
   var frm = document.forms[frmName];
   if ( frm )
   {
      var field = frm.elements[fieldName];
      if ( field )
         return field;
   }
   return null;
}

// Idem frmGetField en affichant un message détaillé
// si le champ n'est pas trouvé
// si fieldId spécifié, on veut juste le champ avec l'id
function frmCheckField(frmName, fieldName, fieldId)
{
   var field = null;
   if ( fieldId )
   {
      field = document.getElementById(fieldId);
   }
   else
   {
      var frm = document.forms[frmName];
      if ( ! frm )
      {
         alert(mess_form_not_found + frmName);   
         return;
      }
      field = frm.elements[fieldName];
   }

   if ( field )
      return field;
   else
      alert(mess_field_not_found + fieldName);   
}

// Privé
// Met à jour le champ de nom field_name du formulaire spécifié
// val est de la forme "val1 \037 val2 \037..."
// Si separator est non vide, alors il faut ajouter la nouvelle valeur à la
// valeur courante, sinon, c'est un remplacement.
// Renvoie true si un champ a été positionné, false sinon
function setOrAddFieldValue(form, fieldName, value, separator)
{
   var ret = false;
   for (var i=0;i<form.elements.length;i++)
   {
      var elt = form.elements[i];
      if (elt.name == fieldName)
      {
         try
         {
            if ( ! ret ) ret = HTMLUtil_setElementValue( elt, value, separator );
         }
         catch(e)
         {
           alert("### Error while setting field " + fieldName + "[" + value + "]");
         }
      }
   }
   return ret;
}
// Renvoie true si le champ a été positionné
function HTMLUtil_setElementValue(elt, value, separator)
{
   var elt_type = elt.type;
   
   value = value + ""; // tdn 01/09/2006 si value est un nombre, value.split n'existe pas
   if ( ! value ) value = "";
   var valueArray = value.split(MULTI_VALUE_SEP);
   var ret = false;
   // pour les champs text ou hidden, on met à jour la valeur
   if ( (elt_type == 'text') || (elt_type == 'hidden') || (elt_type == 'textarea')
        || (elt_type == 'password'))
   {
      var newValue = value;
      if( separator && separator != "" )
      {
         if (elt.value && elt.value != "")
            newValue = elt.value + separator;
         newValue += value;
      }
      elt.value = newValue;
      ret = true;
   }
   // pour les radioboutons et les cases à cocher, on coche la valeur
   else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
   {
      if ( contains(valueArray, elt.value) )
      {
         elt.checked = 1;
         ret = true;
      }
      else
      {
         // On ne remet à zéro que si c'est un remplacement
         if ( (separator == null) || (separator == "") )
            elt.checked = 0;
      }
   }
   else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
   {
      for (var j=0; j< elt.options.length; j++)
      {
         if ( contains(valueArray, elt.options[j].value) )
         {
            elt.options[j].selected = 1;
            ret = true;
         }
         else
         {
            // On ne remet à zéro que si c'est un remplacement
            if ( (separator == null) || (separator == "") )
               elt.options[j].selected = 0;
         }
      }
   }
   return ret;
}
// Privé. Teste qu'un tableau contient une valeur
function contains(array, val)
{
   for (var i=0; i< array.length; i++)
   {
      if ( array[i] == val ) { return true; }
   }
   return false;
}
// Renvoie la valeur de str : si débute ou finit par un ", l'enlève
String.prototype.getTokenValue = function()
{
   var str = this;
   if ( str == null ) return null;
   if (str.charAt(0) == '"' )
      str = str.substring(1);
   if (str.charAt(str.length-1) == '"' )
      str = str.substring(0, str.length-1);
   return str;
}

// Renvoie le dernier 'mot' détecté dans une chaîne, "" si aucun n'existe
String.prototype.getLastWordToken = function()
{
   var tokens = this.trim().getWordTokens();
   if ( (tokens != null) && (tokens != "") )
      return tokens[tokens.length-1].getTokenValue();
   return "";
}
// privé
// En unicode, la fonction escape() sous IE n'encode pas correctement les
// caractères car il le fait sous la forme %uXXXX, alors que le format attendu
// par le serveur HTTP est %XX%XX. A partir de IE 5.5, on peut utiliser à la
// place encodeURI qui le fait correctement
// tdn 22/03/2006 ajouté isUTF8 : si l'appli n'est pas UTF8 mais qu'on passe
// à XMLUtil_LoadXML une URL déjà encodée ISO, on passe la requête en UTF-8,
// ce qui fait que les accents sont dégradés.
function myEscape(s, isUTF8)
{
   if ( sysIsUTF8 || isUTF8)
   {
      if ( window.encodeURIComponent )
         return encodeURIComponent(s);
   }
   return escape(s);
}
function myUnescape(s, isUTF8)
{
   if ( sysIsUTF8 || isUTF8)
   {
      if ( window.decodeURIComponent )
         return decodeURIComponent(s);
   }
   return unescape(s);
}
/**
 * Découpe une chaîne en éléments. Un élément est un mot simple ne contenant
 * pas d'espace ni de point-virgule, ou un ensemble de mots entre double
 * quotes ("a b").
 * NB : les quotes sont renvoyées
 * doNotAddFinalQuote : si true, n'ajoute pas la quote finale si elle manque 
 */
String.prototype.getWordTokens = function (doNotAddFinalQuote)
{
   var s = this;
   if ( s == null )
      return null;

   var v = new Array();
   var cur = null;
   var curOpenQuotes = false;
   var cbefore = '';
   for (var i=0; i< s.length; i++)
   {
      var c = s.charAt(i);
      // Potentiellement une fin d'élément ou un espace à ignorer
      if ( (c==' ') || (c=='\t') || (c=='\n') || (c=='\r') || ( c == ';') )
      {
         if ( curOpenQuotes )
         {
            // Elément quoté en cours
            cur += c;
         }
         else if ( cur != null )
         {
            // Fin de l'élément simple courant
            v[v.length] = cur;
            cur = null;
         }
         else
         {
            // Espace à ignorer
         }
      }
      // Potentiellement début ou fin d'élément quoté
      else if ( (c == '"') && (cbefore != '\\') )
      {
         if ( curOpenQuotes )
         {
            // Fin
            cur += c;
            v[v.length] = cur;
            cur = null;
            curOpenQuotes = false;
         }
         else
         {
            // Début
            cur = c ;
            curOpenQuotes = true;
         }
      }
      // Potentiellement début élément, ou élément en cours
      else
      {
         if ( cur == null)
            cur = "";;
         cur += c;
      }
      cbefore = c;
   }
   // Il se peut qu'un élément quoté ou non ne soit pas fini
   if ( cur != null )
   {
      if ( curOpenQuotes )
      {
         // Ajoute la quote finale éventuellement
         if ( doNotAddFinalQuote == true )
            ;
         else
            cur += '"';
         v[v.length] = cur;
         cur = null;
      }
      else
      {
         v[v.length] = cur;
      }
   }
   return v;
}
/**
 * @return la chaîne avec les cotes initiale et finale si elle n'en a pas
 * déjà. Ajoute celle qui manque éventuellement.
 */
String.prototype.quotes = function ()
{
   var s = this;
   if (s == null ) return null;
   if ( s.charAt(0) !=  '"' )
      s = '"' + s;
   if ( s.length > 1 )
   {
      if ( s.charAt(s.length-1) != '"' )
         s += '"';
      else if (s.charAt(s.length-2) == '\\' )
         s += '"';
   }
   else
   {
      // chaine vide
      s += '"';
   }
   return s;
}
/*
Dans les appels à un javascript à partir du code HTML, la double-quote est encodé
par tagext:button en _quote_. unmaskQuoteKeyWord renvoie la chaîne où _quote_
est remplacé par \"
*/
String.prototype.unmaskQuoteKeyWord = function()
{
   return this.replace(/_quote_/g, "\\\"");
}
/*
Masque le caractère car par la chaîne by. Tous les caractères de la chaîne
sont masquées sauf ceux précédés par \. Renvoie la nouvelle chaîne.
Si by n'est pas spécifié, il vaut \car
*/
String.prototype.mask = function mask(car, by)
{
   var ret = "";
   var cbefore = "";
   var s = this;
   if ( by == null ) by = "\\" + car;
   for (var i=0; i<s.length; i++)
   {
      var c = s.charAt(i);
      if (  (c == car ) && ( cbefore != '\\' ) )
         ret += by;
      else
         ret += c;
      cbefore = c;
   }
   return ret;
}


/**
 * Renseigne des champs de type hidden pour affecter à un index 2 index de tables différentes 
 * hiddenList : liste de champs de type hidden séparée par des virgules.
 * objName : nom du champ pour lequel il faut récupèrer la valeur sélectionnée pour l'affecter
 *          à la liste des champs hidden. S'il y a plusieurs champs hidden, la valeur du champ 
 *          doit être séparée par des virgules.
 */
function frmSelectMultipleIndexes(frm, hiddenList, objName)
{
   var one_is_ok = false;
   
   if ( frm == null )
   {
      alert(mess_form_not_found + frm);
      return;
   }

   var flds = hiddenList.split(",");
   var tabvalues = getFieldValue(frm, objName, "");
   var values;
   
   if (tabvalues != null)
      if (tabvalues.length > 0)
         values = tabvalues.split(",");

   for (var i=0; i<flds.length ; i++)
   {
      if ((values == null) || (values[i]== null))
      {
         frm.elements[flds[i]].value="";
      }
      else
      {
         frm.elements[flds[i]].value=values[i];
      }
   }
   return true;
}
// 
function HTMLUtil_isElementEmpty(elt)
{
   var elt_type = elt.type;
   if ( (elt_type == 'text') || (elt_type == 'hidden') || (elt_type == 'textarea')
        || (elt_type == 'password'))
   {
      if ((elt.value == null) || (elt.value == ""))
         return true;
   }
   else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
   {
      if ( ! elt.checked)
         return true;
   }
   else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
   {
      var has_one_selected = false;
      for (var j=0; (j< elt.options.length) && (!has_one_selected) ; j++)
      {
         has_one_selected = elt.options[j].selected;
      }
      if (! has_one_selected )
         return true;
   }
   return false;
}

function HTMLUtil_encodeEntities(s)
{
   var ret = "";
   if ( s == null ) return ret;
   
   var i = 0;
   var len = s.length; 
   while ( i < len )
   {
      var c = s.charAt(i);
      switch (c)
      {
         case '&':
            ret += "&amp;";
            break;
         case '>':
            ret += "&gt;";
            break;
         case '<':
            ret += "&lt;";
            break;
         case '"':
            ret += "&quot;";
            break;
         case "'":
            ret+= "&#39;";
            break;
         default :
            ret += c;
            break;
      }
      i++;
   }
   return ret;
}
        
// Encode les entités et les retour chariot=<br />
function HTMLUtil_dataToVisible(s)
{
   if ( s == null ) return "";
   s = HTMLUtil_encodeEntities(s);
   s = s.replace("\n", "<br />");
   var len = s.length; 
   var ret = "";
   for (var i=0; i<len; i++ )
   {
      var c = s.charAt(i);
      if ( c == '\n' )
         ret += "<br />";
      else
         ret += c;
   }
   return ret;

}

// Enregistrement d'une requête générique
function frmSdiSaveRequest(formName, action, p0, forwardAction) 
{
   document.getElementById("sdiForward").setAttribute("value", forwardAction);
   document.getElementById("sdiContext").setAttribute("value", "save_new_query");
   var frm = document.forms[formName];   
   mySubmit(frm);
}

// fonction provisoire car frmValidateForm ne convient pas pour verifie que le nom est bien renseigné 
function frmValidateRequest(formName, action) 
{
   var frm = document.forms[formName]; 
   if (document.frmRequestAdd.NAME_RQ.value == '')
   {
      alert(mess_request_confirm);
      frm.NAME_RQ.focus();
   }
   else
   {
      mySubmit(frm);
   }
}


/**
 * Appel de l'assistant sur index pour les lecteurs
 * table : nom de la table ou nom du champ contenant la valeur. La valeur
  *        peut êtr source.nomTable ou nomTable seul
 * index : nom de l'index  ou nom du champ contenant la valeur
 * crit  : critère ou nom du champ contenant la valeur
 * dest  : nom du champ qui contient la valeur rapatriée (nb :la frame destination
 *    est la frame qui contient ce script).
 */
function frmShowBorrowerIndexAssist(formName, action, p0, table, p1, index, p2, crit, p3, dest)
{
   var frame = this.name;

   var the_form = document.forms[formName];
   if ( the_form == null )
   {
      alert(mess_form_not_found + formName);
      return;
   }

   var tableName = getFieldValue(the_form, table, table);
   var indexName = getFieldValue(the_form, index, index);
   var critere   = getFieldValue(the_form, crit, '');

   // on teste que les paramètres sont correctement spécifiés
   if (critere == '')
   {
      alert (mess_field_empty + crit);
      if ( the_form.elements[crit] != null )
      {
         the_form.elements[crit].focus();
      }
      return;
   }
   if (tableName == ''){alert (mess_param_empty + table) ; return;}
   if (indexName == ''){alert (mess_param_empty + index) ; return;}
   
   // Ajoute automatiquement le paramètre source si nécessaire
   var sourceName = null; 
   var parts = tableName.split(".");
   if ( parts.length == 2 )
   {
      sourceName = parts[0];
      tableName = parts[1];
   }

   // Paramètre la fenêtre
   // TODO : Lire de la config taille et position
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   if ( sourceName != null )
      cgi += "source=" + myEscape(sourceName) + "&";
   cgi += "tableName=" + myEscape(tableName)
       + "&indexName=" + myEscape(indexName)
       + "&criteria=" + myEscape(critere.getLastWordToken())
       + "&targetFrame=" + myEscape(frame)
       + "&targetInput=" + myEscape(dest);

   // Ouvre la fenêtre avec un nom unique par application
   var winName = "win_borrower_index" + sysGetAppName();
   sysOpenWindow(winName, cgi, false, "0,0,800,600");
}

/*
* Identique à frmSetIndexTerm avec en plus 
* positionnement du focus sur l'élément de type text et fermeture de la fenêtre
*/
function frmSetBorrowerIndexTerm(formName, altAction, p0, frameName, p1, inputName, p2, value, p3, separator)
{
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   if ( targetInput.type != "text" )
   {
      alert(mess_wrong_field_type + inputName);
      return;
   }
   targetInput.value = targetInput.value.setOrAddCriteria(value, separator);
   targetInput.focus();
   window.close();
}

// Fonction multi navigateur
function HTMLUtil_setStyleClass(elt, className)
{
   if ( isMSIE )
   {
      elt.setAttribute("className", className);
   }
   else
   {
      elt.className = className;
   }
   elt.setAttribute("sysClasName", className);// spec Flora
}
function HTMLUtil_getStyleClass(elt)
{
   return elt.getAttribute("sysClassName");// spec Flora
}


// Fonction utilisée dans la liste des résultats
// Positionne l'index dans la listbox de tri
// hasScore = "true" indique que la liste contient en position 1 le score 
// hasSource = "true" indique que la liste contient en position 1 ou 2 la source
// NB : hasScore et hasSource est exclusif pour le moment
function frmInitSortResult(way, index, hasScore, hasSource)
{
   if ( index == "" ) return;
   if ( way == "" ) way = "asc";
   if ( way != "asc" ) way = "desc";
   var listIndex = 0;
   if ( ! isANumber(index) )
   {
      // cas index = "score" ou index = "source"
      if ( (index == "score") || (index == "source") )
      {
         index = 0; // force à zéro
      }
      else
      {
         return;
      }
   }
   else
   {
      if ( hasScore == "true" || hasSource == "true")
         listIndex = 1; // saute score ou source
   }
   listIndex += parseInt(index)+1; // + 1 pour passer l'option vide;
   var select = document.getElementById("sort_" + way);
   if ( select && (listIndex >=0) )
   {
      //select.selectedIndex = listIndex;
      // Modifie le libellé
      var selectedText = select.options[listIndex].text;
      select.options[0].text += " " + selectedText;
   }
}
// Fonction utilisée dans la liste des résultats
// Execute le tri demandé
// way : asc ou desc
// params : au format : sourceName,queryName,columnIndex      
function frmSortResult(action, params)
{
   var parts = params.split(',');
   var source = parts[0];
   var query = parts[1];
   var sortCol = parts[2];
   action += "&source=" + myEscape(source) + "&query=" + myEscape(query) + "&sortCol=" + myEscape(sortCol);
   
   // Complète les paramètres de l'action
   var moreParams = frmGetMoreParams(frmSortResult.arguments);
   action = frmCompleteAction(null, action, moreParams);
   
   document.location.href = action;
}

// Met à jour le nombre de résultats total et par source
// si on est en recherche fédérée
// count : le nombre de résultats total rapatriés
// match : le nombre de résultats total trouvés >= count, ignoré si <= 0
// status : le statut global de la recherche "run" indiquant que la recherche est en cours
// statusDetail : détail pour chaque source (optionel)
var Async_IconStatus = new Array();
// tdn 01/07/2005 à cause bug ECIS, le statut run n'est jamais remonté, seulement end !
// je n'affiche donc pas pour l'instant le statut end
Async_IconStatus["run"] = "icons/css/default/status/running.gif";
//Async_IconStatus["end"] = "icons/css/default/status/valid.gif";
Async_IconStatus["err"] = "icons/css/default/status/error.gif";
Async_IconStatus["???"] = "icons/css/default/status/unknown.gif";
Async_IconStatus["toomany"] = "icons/css/default/status/toomanymatches.gif";
function Async_updateQueryCountIdents(count, match, overallstatus, statusDetail)
{
   var divCount = document.getElementById("queryCountIdents");
   if ( divCount )
   {
      divCount.innerHTML = count;
   }
   if ( match > 0 )
   {
      var divMatch = document.getElementById("queryCountMatches");
      if ( divMatch )
      {
         divMatch.innerHTML = match;
      }   
   }
   var divAnim = document.getElementById("searchAnim");
   if ( divAnim )
   {
      var display = (overallstatus == "run") ? "inline" : "none";
      divAnim.style.display = display;
   }
   
   if ( statusDetail && (statusDetail != "") )
   {
      var sourceResultsPane = document.getElementById("sourceResultsPane");   
      if ( ! sourceResultsPane ) return;
      var sources = statusDetail.split('|');
      for (var i=0; i<sources.length; i++)
      {
         var nv = sources[i].split('=');
         var sourceTableLabel = nv[0];
         var ns = nv[1].split(',');
         var count = ns[0];
         var status = ns[1]; // run, end, err, ???
         ns = sourceTableLabel.split('.');
         var sourceName = ns[0];
         var tableName = ns[1];
         var tableLabel = ns[2];
         var sourceTable = sourceName + "." + tableName
         // ignore la table virtuelle
         if ( tableName != "table_group" )
         {
            var divSource = document.getElementById(sourceTable);
            if ( ! divSource )
            {
               divSource = document.createElement("div");
               divSource.setAttribute("id", sourceTable);
               HTMLUtil_setStyleClass(divSource, "source-results-item");
               // Cherche à ajouter dans la cellule qui a le moins lignes
               var cellNum = 1;
               var cellDest;
               var minSource = 1000;
               while (true)
               {
                  var curCell = document.getElementById("sourceResultsCell." + cellNum);
                  if ( curCell )
                  {
                     var nbCurSource = curCell.getAttribute("sourceCount");
                     if ( nbCurSource == null ) nbCurSource = 0;
                     nbCurSource = parseInt(nbCurSource);
                     if ( nbCurSource < minSource )
                     {
                        cellDest = curCell;
                        minSource = nbCurSource;
                     }
                     cellNum++;
                     continue;
                  }
                  break;
               }
               if ( ! cellDest )
               {
                  alert("Cellule sourceResultsCell non trouvé !");
                  return;
               }
               cellDest.appendChild(divSource);
               cellDest.setAttribute("sourceCount", minSource+1);
            }
            // Mise en forme de la cellule : affiche icone suivant l'état de la recherche
            var icone = Async_IconStatus[status];
            if ( ! icone ) icone = "";
            else icone = "&nbsp;<img border='0' src=\"" + icone + "\" title='" + status + "'/>";
            divSource.innerHTML = tableLabel + " : <span class='source-results-count'>" 
               + count + icone + "</span>"; 
         }
      }
   }
}

// Refresh les boutons de navigation d'une liste de réponses
// Le premier appel avec resultCount<0 sert à mémoriser le rang max de la notice dans la page
// Le deuxième appel fait la véritable mise à jour
function frmUpdateNavigation(maxResultIndex, resultCount)
{
   resultCount = parseInt(resultCount);
   if ( isNaN(resultCount) ) resultCount = -1;
   if ( resultCount < 0 )
   {
      document.maxResultIndex = maxResultIndex;
      return;
   }
   maxResultIndex = parseInt(document.maxResultIndex);
   if ( isNaN(maxResultIndex) ) maxResultIndex = 0;
   var enabled = (resultCount > maxResultIndex) ? "inline" : "none";
   var disabled = (resultCount <= maxResultIndex) ? "inline" : "none";
   document.getElementById("page.next").style.display = enabled;
   document.getElementById("page.last").style.display = enabled;
   document.getElementById("page.next.disabled").style.display = disabled;
   document.getElementById("page.last.disabled").style.display = disabled;
}

function frmOpenLinkServiceWindow(formName, action, p0, recordId)
{
   // Parametre la fenetre
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
      
   cgi += "recordId=" + myEscape(recordId);
   
   // Ouvre la fenetre avec un nom unique par application
   var winName = "win_openlink" + sysGetAppName();
   sysOpenWindow(winName, cgi, false, "0,0,800,600");
}

function frmLockRecords(formName, action, p0, actionName, p1, recordId)
{
   var params = new Array();
   var isFree = Locks_LockRecords(recordId, params);
   if(isFree == false)
   {
      var msg = params["msg"];
      alert(msg);
   }
   return isFree;
}

function frmUnlockRecords(formName, action, p0, actionName, p1, recordId)
{
   Locks_UnlockRecords(recordId);
}

/**
 * Met à jour les champs générés par le tag assistedInput
 * fieldRef : nom du champ au format 'frame.form.field'
 * recordId : recordId
 * value_displayed : valeur affichée
 */
function setValueInField(fieldRef,recordId,value_displayed)
{
   var FieldParts = fieldRef.split(".");
   var frame = sysFindFrameWithinApp(FieldParts[0]);
   var input_id = frame.document.getElementsByName(FieldParts[2]);
   var input_displayed = frame.document.getElementsByName(FieldParts[2]+"_EVERDISP");
   
   var key=extractKeyFromRecordId(recordId);
   
   input_displayed[0].value=value_displayed;
   input_id[0].value=key;
	self.close()
}

/**
 * extract key from recordId source:table:key
 * recordId : String représentant un record id complet
 */
function extractKeyFromRecordId(recordId)
{
   var semicolonIndex = recordId.lastIndexOf(":");
   return recordId.substring(semicolonIndex+1);
}

/**
 * Method utilisé par l'inputGrid pour afficher un assistant de saisie
 * param formName: nom du formulaire contenant le champs (peut être null)
 * @param action: nom de l'action utilisé pour afficher l'assistant
 * @param p0,p1,p2,p3: nom des paramètres à passer à l'action
 * @param v0,v1,v2,v3: nom des valeurs correspondant aux paramètres
 **/
function frmDisplayAssist(formName, action, p0,v0, p1,v1,p2,v2,p3,v3,p4,v4,p5,v5)
{
   var params = new Array();
   params[0]=p0;
   params[1]=v0;
   params[2]=p1;
   params[3]=v1;
   params[4]=p2;
   params[5]=v2;
   params[6]=p3;
   params[7]=v3;
   params[8]=p4;
   params[9]=v4;
   params[10]=p5;
   params[11]=v5;
   var url = frmCompleteAction(null, action, params);
   sysOpenWindow("assistant", url);
}

/**
 * Methode utilisée par l'inputGrid pour afficher un assistant de saisie
 * dont les valeurs dépendent de deux autres champs
 * param formName: nom du formulaire contenant le champs (peut être null)
 * @param action: nom de l'action utilisé pour afficher l'assistant
 * @param p0,p1: nom des paramètres à passer à l'action
 * @param v0,v1: nom des valeurs correspondant aux paramètres
 * @param p2: nom du paramètre lié à la valeur dans le champ fieldName0  
 * @param fieldName0: nom du champs contenant la valeur du paramètre p2
 * @param p3: nom du paramètre lié à la valeur dans le champ fieldName1   
 * @param fieldName1: nom du champs contenant la valeur du paramètre p3
 **/
function frmDisplayAssistRelativeTo(formName, action, p0,v0, p1,v1,p2, fieldName, p3, fieldName1,p4, fieldName2, p5, fieldName3)
{
   var v2='';    
   var v3='';
   var v4='';    
   var v5='';
   if(fieldName!=null)
   {
       var field = document.getElementById(fieldName);
       if(field!=null)
       {
          v2=field.value;
       }
       else
       {
          p2=null;
          v2=null;
       }
   }
   if(fieldName1!=null)
   {
       var field1 = document.getElementById(fieldName1);
       if(field1!=null)
       {    
          v3=field1.value;
       }
       else
       {
          p3=null;
          v3=null;
       }
   }
   
   if(fieldName2!=null)
   {
       var field2 = document.getElementById(fieldName2);
       if(field2 != null)
       {      
          v4=field2.value;
       }
       else
       {
          p4=null;
          v4=null;
       }
   }
   
   if(fieldName3!=null)
   {
       var field3 = document.getElementById(fieldName3);
       if(field3!=null)    
          v5=field3.value;
       else
       {
          p5=null;
          v5=null;
       }
   }
   frmDisplayAssist(formName, action, p0,v0, p1,v1,p2,v2,p3,v3,p4,v4,p5,v5);
}

/**
 * Recherche les éléments ayant pour id (ElementId+rank) puis
 * retourne leur valeur
 * @param ElementId: identifiant d'un élément. Cette id n'est pas unique si
 * l'element ce répette
 * @param rank: rang de l'identifiant dans la notice
 * @param lookForDefault(true| false):si aucun élément identifier par ElementId+rank 
 *        existe on vérifie si un élément identifier par seulement ElementId existe.
 * @return le champ correspondant ou null s'il n'existe pas
 * 
 */
function getElementForId(ElementId,rank,lookForDefault)
{
   var field=null;
   if(rank!=null)
   {
      field = document.getElementById(ElementId+rank);

   }  
   if(field==null)
      field = document.getElementById(ElementId);
   
   if(field!=null)
      return field;
   return null;
}

/**
 * Permet sur l'événement onkeyup d'un input
 * la vérification des charactères saisies suivant
 * le pattern pattern.
 * Si complete vaut true alors les valeurs saisie
 * sont complétées.
 */
function frmParseTime(field,pattern,complete)
{
    var time = field.value;
    
    var datas = parseDate(time,pattern,complete);
    field.value= datas[TIME_FORMATED]
    return datas;
}

/**
 * Clef correspondant à la chaine formaté dans
 * le tableau de résultats.
 * @see parseDate(time,pattern,complete)
 */
var TIME_FORMATED= "string_date";
/**
 * Clef correspondant à l'heure dans
 * le tableau de résultats. 
 * @see parseDate(time,pattern,complete)
 */
var TIME_HOUR= "hour";
/**
 * Clef correspondant au nombre de minutes dans
 * le tableau de résultats.
 * @see parseDate(time,pattern,complete)
 */
var TIME_MINUTES= "minutes";
/**
 * Clef correspondant au nombre de secondes dans
 * le tableau de résultats.
 * @see parseDate(time,pattern,complete)
 */
var TIME_SECONDES= "secondes";

/**
 * Cette méthode permet de parser un chaine de charactères représentant
 * une heure suivant un format précisé par un pattern. Suivant la valeur
 * de l'option complete, la chaine de charactères est complétée ou non.
 * 
 * exemple soit la chaine time => 123456 et le patterne HH:mm:ss
 * alors le tableau resultat contient 12:34:56
 * hour = 12, minutes = 34 et secondes = 56
 * 
 * 
 * @param time: chaine de charactère a parser
 * @param pattern: format de la chaine time (ex: HH:mm:ss)
 * @param complete: si true la chaine time est complété pour correspondre
 * au pattern. Si ce champ et null, complete vaut false
 * @return un tableau contenant la chaine de charactère au format requis,
 * l'heure, les minutes et secondes contenu dans times. Les clefs du tableau
 * sont représentées par les constantes: TIME_FORMATED,TIME_HOUR, TIME_MINUTES
 * et TIME_SECONDES
 * 
 */
function parseDate(time,pattern,complete)
{
    var result = new Array();
    if(complete==null)
       complete=false;
    var currentValue="";
    var hour = "";
    var min = "";
    var sec = "";
    var timeIndex=0;

    var currentData="";
    var lastC=null;
    var completeMode=false;
    
           
    for(var index=0;index<pattern.length;index++)
    {
       //parse pattern  c
       var c = pattern.charAt(index);
       if(lastC==null)
          lastC=c;
       else if(lastC!=c)
       {
           currentValue+=currentData;
           currentData="";
       }
       
       //get data write
       var data = null;
       if(timeIndex<time.length)
       {
           data=time.charAt(timeIndex);
       }
       else if(complete)
       {
          //complete data write if requested
          data=0;
          completeMode=true;
       }
       
       //check data write validity
       if(data!=null && data != c && isNaN(data) )
       {
           timeIndex++;
           data=0;
       }
       
       //cas ou le charactère séparateur est contenue par le client
       if(data == c)
            timeIndex++;

       if(data!=null)
       {
           switch(c)
           {
               case 'H':
                   if(completeMode)
                      hour=data+hour;
                   else
                      hour+=data;
                   var hourInt = parseInt(hour);
                   if(hourInt>=0 && hourInt<24)
                   {
                       if(completeMode)
                       {
                           currentData=data+currentData;
                       }
                       else
                       {
                           currentData+=data;
                       }
                   }
                   else
                   {
                      hour="00";
                   }
                   timeIndex++;
               break;
               case 'h':
                   if(completeMode)
                      hour=data+hour;
                   else
                      hour+=data;
                   var hourInt = parseInt(hour);
                   if(hourInt>=0 && hourInt<13)
                   {
                       if(completeMode)
                       {
                           currentData=data+currentData;
                       }
                       else
                       {
                           currentData+=data;
                       }
                   }
                   else
                   {
                      hour="00";
                   }
                   timeIndex++;
               break;
               case 'm':
                   if(completeMode)
                      min=data+min;
                   else
                      min+=data;
                   var minInt = parseInt(min);
                   if(minInt>=0 && minInt<60)
                   {
                       if(completeMode)
                       {
                           currentData=data+currentData;
                       }
                       else
                       {
                           currentData+=data;
                       }
                   } 
                   else
                   {
                     min="00"; 
                   }
                   timeIndex++;
               break;
               case 's':
                   if(completeMode)
                      sec=data+sec;
                   else
                      sec+=data;
                   var secInt = parseInt(sec);
                   if(secInt>=0 && secInt<60)
                   {
                       if(completeMode)
                       {
                           currentData=data+currentData;
                       }
                       else
                       {
                           currentData+=data;
                       }
                   }
                   else
                   {
                      sec="00";
                   }
                   timeIndex++;
               break;
               default:
                   currentData+=c;
                   continue;
           }
        }
        lastC=c;
    }
    if(currentData!=null)
        currentValue+=currentData;
    result[TIME_FORMATED]=currentValue;
    result[TIME_HOUR]=hour;
    result[TIME_MINUTES]=min;
    result[TIME_SECONDES]=sec;
    return result;
}

function affectFinalDate(field,pattern,fieldResultId)
{
    var fieldResult = document.getElementById(fieldResultId)
    var datas = frmParseTime(field,pattern,true);
    var hour =datas[TIME_HOUR];
    var min =datas[TIME_MINUTES];
    var sec = datas[TIME_SECONDES];
    
    fieldResult.value = hour+min+sec;
}

function affectDateFormula(field,fieldResultId)
{
   if(field.value.indexOf('${') != 0)
   {
      alert("Une formule doit débuter par ${");
      return false;
   }
   var fieldResult = document.getElementById(fieldResultId);
   if(fieldResult!=null)
      fieldResult.value = field.value;   
   return true;
}

/**
 * ajout un handler pour l'événement onclick sur l'element. 
 */
function HTMLUtil_addOnClick(element,handle)
{
   if(typeof(element.addEventListener)!="undefined")
   {
      element.addEventListener('click',handle,false)
   } else
   {
      element.attachEvent('onclick',handle);
   }
}

/** ajout pour datatation ABE 02/11/06
*/

function datationRetrieveTerm(frameName, inputName,value )
{
   // separator : séparateur à ajouter avant dans le champ destinataire
   
   var targetInput = findField(frameName, inputName);
   if ( targetInput == null )
   {
      alert(mess_field_not_found + inputName);
      return;
   }
   if ( targetInput.type != "text" )
   {
      alert(mess_wrong_field_type + inputName);
      return;
   }
   // Cherche la valeur des champs
   
   

   // Ajoute le terme ou remplace le terme courant du critère
   targetInput.value = value;

      window.close();
}

function frmShowDatationAssist(formName, action, p0,inputName)
{
   // Paramètre la fenêtre
   
   var frame = this.name;
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   cgi += "targetFrame=" + myEscape(frame)
       + "&targetInput=" + myEscape(inputName);
   // Ouvre la fenêtre
   var winName = "win_datation" + sysGetAppName();
   sysOpenWindow(winName, cgi,true,"0,0,745,460");
   
}


/** fin ajout pour datatation ABE 02/11/06
*/


function actionToggle(element,elementOn,elementOff,isToggle)
{
 	var m_element=document.getElementById(element);
 	var m_element_on=document.getElementById(elementOn);
 	var m_element_off=document.getElementById(elementOff);
if (isToggle)
{
   m_element.style.display="inline";
   m_element_on.style.display="inline";
   m_element_off.style.display="none";
}
else {
   m_element.style.display="none";
   m_element_on.style.display="none";
   m_element_off.style.display="inline";
}
}

function frmActionToggleOn(formName,action, p0,v0, p1,v1,p2,v2,p3,v3)
{
actionToggle(v1,v2,v3,true);
}

function frmActionToggleOff(formName,action, p0,v0, p1,v1,p2,v2,p3,v3)
{
actionToggle(v1,v2,v3,false);
}


function frmOpenBasket(formName, action)
{
   var frame = this.name;
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   cgi += "targetFrame=" + myEscape(frame);
   // Ouvre la fenêtre
   var winName = "win_basket" + sysGetAppName();
   sysOpenWindow(winName, cgi,true,"0,0,745,460");
}

function frmActiveBasket(selectList)
{
var basketId=selectList.options[selectList.options.selectedIndex].value;
var basketLabel=selectList.options[selectList.options.selectedIndex].text;

var action = sysGetAppRoot()+"/jsp/tools/basket_active.jsp";      
      action += "?BASKET_ID="+basketId;
      action += "&BASKET_LABEL="+ basketLabel;
      docXML = XMLUtil_GetContent(action);  
 selectList.options[selectList.options.selectedIndex].setAttribute("selected","selected");    
}



function frmOpenRequests(formName, action)
{
   var frame = this.name;
   var cgi = action;
   if ( cgi.lastIndexOf("?") < 0)
      cgi += "?";
   else
      cgi += "&";
   cgi += "targetFrame=" + myEscape(frame);
   // Ouvre la fenêtre
   var winName = "win_datation" + sysGetAppName();
   sysOpenWindow(winName, cgi,true,"0,0,745,460");
}
   
//abe pour récupérer des informations XHTTP en html
function frmRetrieveHtmlData(formName,action, p0, actionName, pn, vn)
{
   // Paramètre la fenêtre
      var moreParams = frmGetMoreParams(frmRetrieveHtmlData.arguments, 4);
   action = frmCompleteAction(null, action, moreParams);
    docXML = XMLUtil_GetContent(action);  
    return docXML;
}


