// Fonctions de contrôle pour la saisie sur formulaire
// Nécessite form.js

var input_version = "1.2 (RC8)";

////////////////////////////////////////////////////////////////////////////////
// Objet date
function displayDate () 
{
  var year = this.dval.getYear();
  if ( year < 2000) 
     year = year + 1900;
  var day = this.dval.getDate();
  if ( day <10)
     day = "0"+day;
  var month = this.dval.getMonth()+1;
  if (month <10)
     month = "0"+month;
  this.ddisp.value=day + "/" + month + "/" + year; 
}
//
function getISODate () 
{
  var year = this.dval.getYear();
  if ( year < 2000)
     year = year + 1900;
  var day = this.dval.getDate();
  if ( day <10)
     day = "0"+day;
  var month = this.dval.getMonth()+1;
  if (month <10)
     month = "0"+month;
  return year + "" + month + "" + day;
}
//
function clearDate()
{ 
  this.ddisp.value = "";
}
//
function refreshDate (mess) 
{
   var val=0;
   var ok = 0;
   var flag = 0;

   if ( (this.ddisp.value == "") && (! this.required) )
      return true;
   var parts = this.ddisp.value.split("/");
   if (parts.length == 3)
   {
      val = parseInt(parts[0], 10); 
      if ( isANumber(parts[0]) && 0<val && val<32 )
      {
         this.dval.setDate(val);
         ok ++;
      }
      val = parseInt(parts[1],10);
      if ( isANumber(parts[1]) && 0<val && val<13 )
      {
         this.dval.setMonth(val-1);
         ok ++;
      }
      val = parseInt(parts[2],10);
      if ( isANumber(parts[2]) && 0<val  )
      {
         this.dval.setYear(val);
         ok ++;
      }
   }
   if ( ok != 3 ) 
   {
      if (mess) { alert (mess_control_date) }
      this.ddisp.focus(); 
      return false;
   }
   this.display(); 
return true; 
}
//
function copyDate(dateSrc) 
{
    this.dval.setTime(dateSrc.dval.getTime());
    this.display(); 
}

function getdiffDate(dateMax) 
{
    return (dateMax.dval.getTime()-this.dval.getTime())/86400000;
}

function addDaysDate(nbdays) 
{
  if (!this.refresh(true)) return;
  this.dval.setTime(this.dval.getTime()+nbdays*86400000);
  this.display();
}

function addYearsDate(nbdays) 
{
  if (!this.refresh(true)) return;
  this.dval.setTime(this.dval.getTime()+nbdays*86400000*(365.25));
  this.display();
}

function setTodayDate()
{
  this.dval = new Date();
  this.display();
}
function setTimeDate(time)
{
  this.dval.setTime(time); 
}

function getTimeDate()
{
  return this.dval.getTime(); 
}

function date (disp, required)
{
 this.dval=null;
 if (disp!=null) 
 {
    if (disp.value != "") {  this.dval=new Date(disp.value); }
 }
 if (this.dval==null)
   this.dval=new Date();
 this.ddisp=disp;
 this.required = (required == null) ? false : ((required==1)?true:false);
  //methods
 this.display=displayDate;
 this.addDays=addDaysDate;
 this.addYears=addYearsDate;
 this.refresh=refreshDate;
 this.copy=copyDate;
 this.getdiff=getdiffDate;
 this.clear=clearDate;
 this.setToday=setTodayDate;
 this.setTime=setTimeDate;
 this.getTime=getTimeDate;
 this.getISO = getISODate;
 return this;
}
////////////////////////////////////////////////////////////////////////////////
// Objet Field
// path est un chemin de type frameName.formName.fieldName
function Field(path)
{
   this.path = path;
   var parts = path.split(".");
   if ( parts.length != 3 )
   {
      alert("Mauvaise utilisation de l'objet Input : " + path);
      return null;
   }
   var frameName = parts[0];
   var formName  = parts[1];
   var elemName  = parts[2];
   
   var frame = findFrameWithinApp(frameName);
   if ( frame )
   {
      var form = frame.document.forms[formName];
      if ( form )
      {
         var elem = form.elements[elemName];
         if ( elem )
         { 
            this.frame = frame;
            this.form  = form;
            this.element = elem;
            return this;
         }
         else
             alert(mess_field_not_found + elemName);
      }
      else
          alert(mess_form_not_found + formName);
   }
   else
       alert(mess_frame_not_found + frameName);
   
   return null;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Selectionne toutes les valeurs sauf 0
function inputSelectAllOptions(formName, listeName)
{
   var liste = frmCheckField(formName, listeName);
   if ( liste && liste.options )
   {
      for (i=0; i<liste.options.length; i++)
      {
         if (liste.options[i].value != '0')
         {
            liste.options[i].selected = true;
         }
      }
   }
}

// Supprime un élément d'un tableau
function deleteElement(array, delindex)
{
   var size = array.length;
   var validNo = (delindex != "NaN");
   var inRange = ( (delindex >= 0) && (delindex < array.length) );

   if (validNo && inRange)
   {
      if(array.remove)
      {
         // méthode propre à IE
         array.remove(delindex);
      }
      else
      {
         // pour les autres navigateurs
         for(var j = delindex; j < size-1; j++)
         {      
            if (j != size) array[j] = array[j+1];
         }
         array.length = size-1;
      }
   }
}


// Permet de supprimer des éléments contenus dans une liste
function inputRemoveSelectedOptions(formName, fieldName)
{
   var elt = frmCheckField( formName, fieldName)
   if ( elt && elt.options )
   {
      listRemoveSelectedOptions(elt);
   }
}
function listRemoveSelectedOptions(elt)
{    
   var len    = elt.options.length;
   for (var i=len-1; i >= 0; i--)
   {
      if (elt.options[i].selected)
      {
         deleteElement(elt.options, i);
         len--;
      }
   }
}

// Vide un champ lié monovalué
function inputEmptyLinkField(formName, fieldName)
{
   var elt = frmCheckField( formName, fieldName)
   if ( elt )
      elt.value = "";
   elt = frmCheckField( formName, fieldName + "_EVERDISP")
   if ( elt )
      elt.value = "";
}

//
//
function isANumber (str)
{
   if (str.length == 0){ return true;}
   for (var i=0; i<str.length; i++){
       var n = parseInt(str.charAt(i));
       if (isNaN(n)) { return false; }
 }
return true;
}


// Contrôle le nombre de sélection max dans une liste
function inputControlListMultiple(frmName, field_name, no_msg, field_label, multi_maxi)
{
   var fld_msg = field_name;
   if ( field_label != '' )
   {
     fld_msg = field_label;
   }
   var elt = frmCheckField(frmName, field_name);
   if ( elt && elt.options )
   {
      var nb_selected = 0;
      for (var j=0; j< elt.options.length; j++)
      {
         if (elt.options[j].selected ) { nb_selected ++; }
      }
      if ( nb_selected > multi_maxi )
      {
         if ( ! no_msg) 
         { 
            alert(mess_control_liste_multi + " " + fld_msg + "\n" + mess_control_liste_multi2 + " " + multi_maxi);
            elt.focus();
         }
         return false;
      }
      return true;
   }
   return false;
}
//
function inputControlDecimal(formName, field_name, mess)
{
   //alert("inputControlDecimal n'est pas encore implémenté");
   return true;
}

function inputControlDateFormat15(formName, field_name, mess)
{
   var value = "";
   var field;
   var formulaire = document.forms[formName];

   if ( ! formulaire )
   {
      alert(mess_form_not_found + formName);
      return false;
   }
   
   for (var i=0;i<formulaire.elements.length;i++)
   {
      var elt = formulaire.elements[i];
      var elt_type = elt.type;
      if (elt.name == field_name)
      {
         field = elt;
         if ( (elt_type == 'text') || (elt_type == 'hidden') )
         {
            value = elt.value;
            break;
         }
         else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
         {
            value = elt.value;
         }
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            for (var j=0; j< elt.options.length; j++)
            {
               if (elt.options[j].selected)
               {
                  value = elt.options[j].value;
               }
            }
         }
      }
   }
   if ( ! isANumber(value) )
   {
      alert(mess_control_integer);
      field.focus();
      return false;
   }
   if (value.length != 4)
   {
      alert(mess_control_date_format_15);
      field.focus();
      return false;  
   }
   return true;
}



//
function inputControlInteger(formName, field_name, mess)
{
   var value = "";
   var field;
   var formulaire = document.forms[formName];

   if ( ! formulaire )
   {
      alert(mess_form_not_found + formName);
      return false;
   }
   
   for (var i=0;i<formulaire.elements.length;i++)
   {
      var elt = formulaire.elements[i];
      var elt_type = elt.type;
      if (elt.name == field_name)
      {
         field = elt;
         if ( (elt_type == 'text') || (elt_type == 'hidden') )
         {
            value = elt.value;
            break;
         }
         else if ( (elt_type == 'checkbox') || (elt_type == 'radio') )
         {
            value = elt.value;
         }
         else if ( (elt_type == 'select-one') || (elt_type == 'select-multiple') )
         {
            for (var j=0; j< elt.options.length; j++)
            {
               if (elt.options[j].selected)
               {
                  value = elt.options[j].value;
               }
            }
         }
      }
   }
   if ( ! isANumber(value) )
   {
      alert(mess_control_integer);
      field.focus();
      return false;
   }
   return true;
}

//
function inputControlLenMin(formName, fieldName, len)
{
   var elt = frmCheckField(formName, fieldName);
   if ( elt )
   {
      if ( elt.value == "") return true;
      if ( elt.value.length >= len ) return true;
      var f0 = mess_control_lenmin;
      alert(f0 + " [" + len + "]");
      elt.focus();
   }
   return false;
}

//
function inputControlValMax(formName, fieldName, val)
{
   var elt = frmCheckField(formName, fieldName);
   if ( elt )
   {
      if (elt.value <= val )
         return true;
      var f0 = mess_control_valmax;
      alert(f0 + " [" + val + "]");
      elt.focus();
   }
   return false;
}

//
function inputControlValMin(formName, fieldName, val)
{
   var elt = frmCheckField(formName, fieldName);
   if ( elt )
   {
      if (elt.value >= val )
         return true;
      var f0 = mess_control_valmin;
      alert(f0 + " [" + val + "]");
      elt.focus();
   }
   return false;
}

//
function inputControlMajus(formName, fieldName)
{
   var elt = frmCheckField(formName, fieldName);
   if ( elt )
   {
      elt.value = elt.value.toUpperCase();
   }
}

//
function inputControlMinus(formName, fieldName)
{
   var elt = frmCheckField(formName, fieldName);
   if ( elt )
   {
      elt.value = elt.value.toLowerCaserCase();
   }
}

//
function inputSetDateISO(frmName, dateObj, fieldName)
{
   var dateField = frmCheckField(frmName, fieldName);
   if ( dateField )
   {
      dateField.value = dateObj.getISO();
   }
}

// Ouvre la fenêtre assistant de saisie
function inputCallLinkAssist(formName, action, tableName, dest, multimax, filter)
{
  var frame = this.name;
  var cgi = action + "?";
  cgi += "tableName=" + myEscape(tableName)
       + "&targetInput=" + myEscape( frame + "." + formName + "." + dest)
       + "&filter=" + myEscape(filter)
       + "&criteria=" + myEscape("a");
  if ( multimax > 1 )
     cgi += "&multimax=" + myEscape(multimax);
   var h        = 450;
   var w        = 350;
   var top_pos  = 400;
   var left_pos = 400;

   // Ouvre la fenêtre
   var appName = getAppName();
   var win = window.open(cgi, "win_inputlink" + appName,
  "toolbar=0,location=0,directories=0,menuBar=0,scrollbars=yes,resizable=yes" +
  ",width=" + w + ",height=" + h +
  ",top=" + top_pos + ",left=" + left_pos);
   win.focus();
}

// formName : nom du formulaire d'origine
// field_name : nom de la liste du formulaire d'origine contenant les valeurs à
//              rapatrier
// destFieldPath : chemin nom du champ destination
function frmRetrieveLinks(formName, action, p0, fieldName, p1, destFieldPath,
   p2, multimax)
{
   var field = new Field(destFieldPath);

   // Normalise le nom de champ
   if ( fieldName.indexOf(".") == 0 )
      fieldName = fieldName.substring(1);
   
   if ( ! field )
      return;

   // Valeur sélectionnée dans la liste
   var list = frmCheckField(formName, fieldName);
   if ( ! ( list && list.options) )
   {
      alert(mess_wrong_field_type + " liste : " + formName + "." + fieldName);
      return;
   }
      
   var end_single_selection = false;
   var input_type = field.element.type;
   var hasSelections = false;
      
   // On ajoute toutes les valeurs sélectionnées dans la liste
   for (var j=0; (j< list.options.length) && (!end_single_selection); j++)
   {
      if (list.options[j].selected)
      {
         hasSelections = true;
         var realVal = list.options[j].value;
         var dispVal = list.options[j].text;
         
         // pour un champ simple
         if ( (input_type == 'hidden') || (input_type == 'text') )
         {
            field.element.value = realVal;
            var input_disp = field.element.name + "_EVERDISP";
            if ( field.form.elements[input_disp] )
               field.form.elements[input_disp].value = dispVal;
            end_single_selection = true;
         }
         // pour un champ multivalué
         else if ((input_type=='select-one') || (input_type=='select-multiple'))
         {
            // vérifie que la liste de destination ne contient pas déjà la valeur
            var already_exists = false;
            for( var k=0; (k<field.element.options.length) && (!already_exists) ; k++ )
            {
               already_exists = ( field.element.options[k].value == realVal );
            }
            if ( ! already_exists )
            {
               if ( field.element.options.length < multimax)
               {
                  field.frame.listAppendOption(field.element, realVal, dispVal);
               }
               else
               {
                  alert( mess_control_liste_multi2 + " " + multimax);
                  return;
               }
            }
         }
      }
   }
   if ( ! hasSelections )
   {
      alert(mess_select_first);
      return;
   }
   // Ferme automatiquement si sélection réussie pour champ lié simple
   if ( ! isANumber( multimax) ||  ( multimax <= 1 ) )
   {
      window.close();
   }
}
// Privé
// Teste l'existence d'une valeur dans une liste déroulante 
function listIsOptionDefined(list, value)
{
   for(var i=0 ; i < list.options.length ; i++)
   {
      if(list.options[i].value == value){return true;}
   }
   return false;
}

// Privé
// Ajout d'une OPTION dans un élément SELECT si cette valeur n'est pas déjà définie.
// Cette fonction doit être appelée dans la frame où se situe le SELECT
// (sinon problème dans IE)
function listAppendOption( list, val, disp)
{
   var len = list.options.length;

   if(! listIsOptionDefined(list, val))
   {
      // Ecrase l'option bidon si elle existe
      if( (len == 1) )
      {
         if ( list.options[0].value == '0')
         {
            list.options[0].value = val;
            list.options[0].text = disp;
            return true;
         }
      }
      // Nouvelle valeur
      var newOption = new Option(disp, val);
      list.options[len] = newOption;
      return true;
   }
   return false;
}



