/* Définition
   Constantes              */

/* Variables globales */
verbose_      = 0;
modInteractif = false;
var tmp_      = null;
var errMsg    = null;
var paramsG   = null;

/* CONSTANTES */

Kpar      = "par";
Kerr      = "err";

KlstSep   = ","; // séparateur des listes
KclSep    = "_"; // séparateur dans classes
KfldSep   = "_"; // séparateur dans champs
KparSep   = ":"; // séparateur des parametres (si texte)

KclTyp    = "typ"; // séparateur dans classes

/* parametres possibles */

KparMin   = "min";  // valeur minimale
KparMax   = "max";  // valeur maximale
KparLst   = "lst";  // liste de valeurs acceptées
KparTyp   = "typ";  // type de valeurs (int, dat, str...)
KparMod   = "mod";  // mode de validation
KparLock  = "lock"; // force le focus champ si incorrect (true,false)
KparPop   = "pop";  // mode popup pour ce champ (true,false)

/* types de variables */

KparInt   = "int";   // entier
KparStr   = "str";   // chaine de caractere
KparFloat = "float"; // flottante
KparDate  = "date";  // date
KparTime  = "time";  // heure
KparName  = "name";  // nom propre
KparStd   = "std";   // standard-defaut
KparMaj   = "maj";   // majuscule
KparMin   = "min";   // minuscule

/* RECHERCHE RAPIDE DES TYPES */

KparTyps  =   KparStd + '@' + KparInt + '@' + KparStr + '@' + KparFloat + '@'
            + KparDate + '@' + KparTime + '@' + KparName + '@' + KparStd;

/* Extension de la classe Object */

Object.prototype.fwClass = null; // memorisation du nom complet de la classe originale
Object.prototype.fwTyp   = null; // type de champ
Object.prototype.fwFmt   = null; // format (a implementer)
Object.prototype.fwPop   = null; // popup en cas d'erreur si true
Object.prototype.fwMod   = null; // mode (obligatoire,etc...)
Object.prototype.fwLock  = null; // blocage dans le champ si true (force le focus)
Object.prototype.fwErr   = null; // champ en erreur
Object.prototype.fwMin   = null; // valeur minimale si non null
Object.prototype.fwMax   = null; // valeur maximale si non null
Object.prototype.fwSep   = null; // separateur liste par defaut KlstSep
Object.prototype.fwLst   = null; // liste de valeurs valide si non null
Object.prototype.fwMsg   = null; // message utilisateur
Object.prototype.fwOk    = null; // Ok déja sette

/* -- Syntaxes fct(id) ou fct('id') -- */

function trapBack(evt)
{
 // if (evt.keyCode==8) alert("Back non autorise");
}

function getRef(field) {
  if  ( typeof field  == "string"  ) {
    if (field=="this") {
      alert("Erreur de programmation, 'this' ne doit pas être entre 'quotes'");
      return null;
    }
    field=document.getElementById(field);
  }
  return field;
}

/* objet visible ? */

function getVisible(field, status) {
  field=getRef(field);
    return field.style.visibility == "" || field.style.visibility ==  "visible";
}

/* magicien !! */

function setVisible(field, bool) {
  field=getRef(field);
  if (bool == false)   field.style.visibility = "hidden";
 else  field.style.visibility = "visible";
}

/* NOR (Visible) */

function toggleVisible(field) {
  field=getRef(field);
  if  (getVisible(field) == true)  setVisible(field, false);
  else setVisible(field);
}

/* présentation des propriétés de l'objet */

function showProps(field) {
   field=getRef(field);
   if (verbose_>=1) alert(" Object: [" +field.name +";"+field.id
          + "]\n Objet[" + field.name + "/" + field.id
          + "]\n Class:[" + field.fwClass
        + "]\n fwMod:[" + field.fwMod
        + "]\n fwLock:[" + field.fwLock
        + "]\n fwErr:[" + field.fwErr
        + "]\n fwMin:[" + field.fwMin
        + "]\n fwTyp:[" + field.fwTyp
        + "]\n fwMax:[" + field.fwMax
        + "]\n fwLst:[" + field.fwLst + "]" );
}

/* positionner la classe d'un objet */

function setClassName(field, className) {
   if (verbose_>=2) alert("setClassName "+field.id+" "+ className);
   getRef(field).className = className;
}

/* recherche de la classe d'un objet */

function getClassName(field) {
   return getRef(field).className;
}

/* positionner la classe d'un objet en erreur */

function setClassErr(field, bool) {
  if (verbose_>=2) alert("setClassErr "+field.id+" "+ bool);
  if (field.fwClass == null) field.fwClass=field.className;
  if (bool==false)
    setClassName(field,field.fwClass);
  else
    setClassName(field,field.fwClass+KclSep+Kerr);
  field.fwErr = bool;
}

/* Majuscule en ruptures */

function nomPropre(str) {
  str = upper(str.substring(0,1)) + str.substring(1,str.length);
  return str;
}

function validObligatoire(field) {
   if (field.fwMode == 1) {
      if ((!field.value) || (field.value!="")) return false;
   }
   return true;
}

function validMin(field) {
  var ok_, v1_, v2_;
  if (verbose_>=2) alert("validMin "+field.id);
  if (field.fwMin==null) {
    ok_=true;
  }
  else {
    switch (field.fwTyp) {
      case KparStr   : ok_= (field.value>=field.fwMin) ? true : false; break;
      case KparInt   : v1_=parseInt(field.value); v2_=parseInt(field.fwMin);ok_=v1_>=v2_ ? true : false; break;
      case KparFloat : v1_=parseFloat(field.value); v2_=parseFloat(field.fwMin);ok_=v1_>=v2_ ? true : false; break;
      default        : ok_=false;
    }
  }
  if (verbose_>=2) alert("validMin "+field +":"+ok_);
  return ok_;
}

function validMax(field) {
  var ok_,v1_,v2_;
  if (verbose_>=2) alert("validMax "+field);
  if (field.fwMax==null) {
     ok_=true;
  }
  else {
   switch (field.fwTyp) {
     case KparStr   : ok_ = field.value<=field.fwMax; break;
     case KparInt   : v1_=parseInt(field.value); v2_=parseInt(field.fwMax);ok_=v1_<=v2_;break;
     case KparFloat : v1_=parseFloat(field.value); v2_=parseFloat(field.fwMax);ok_=v1_<=v2_;break;
     default        : ok_=false;break;
   }
  }
  if (verbose_>=2) alert("validMax "+field +":"+ok_);
  return ok_;
}

function validList(field) {
  var ok_, j, v1_,v2_;
  if (verbose_>=2) alert("validList "+field);
  if (field.fwLst==null) {
    ok_=true;
  }
  else {
     for (j=0;j<field.fwLst.length;j++){
    switch (field.fwTyp) {
        case KparStr   : ok_ = field.value==field.fwLst[j];break;
        case KparInt   : v1_=parseInt(field.value); v2_=parseInt(field.fwLst[j]);ok_=v1_==v2_;break;
       case KparFloat : v1_=parseFloat(field.value); v2_=parseFloat(field.fwLst[j]);ok_=v1_==v2_;break;
      default        : ok_=false;break;
      }
     if (ok_==true) break;
   }
  }
  if (verbose_>=2) alert("validList "+field +":"+ok_);
  return ok_;
}

/* -------------------------------------------------------------- */

/* fonction qui parse les arguments de l'appel,
   attention pour raison d'appel depuis une autre fonction,
   obligé de passer par une variable globale... */

function parseParams() {
  var args=paramsG;
  var cnt_;
  var field=getRef(args[0]);
  if (verbose_>=2) alert("parseParams:"+field.id);
  for (cnt_=1; cnt_<args.length; cnt_=cnt_+2) {
    var param = args[cnt_];
    var value = args[cnt_+1];
    if (verbose_>=2) alert("parseParams:"+field.id+";"+param+";"+value);
    switch (param) {
      case KparTyp  : if (KparTyps.indexOf(value) != -1) field.fwTyp = value; break;
      case KparPop  : field.fwPop  = value; break;
      case KparLock : field.fwLock = value; break;
      case KparMin  : field.fwMin  = value; break;
      case KparMax  : field.fwMax  = value; break;
      case KparLst  : field.fwLst  = value.split(KlstSep); break;
      default       :;
    } // switch
  } // for
  return field;
}

function validateAll()
{
   for (var j = 0; j < document.elements.length; j++) {
      if ((document.elements[j].mode) &&  (document.elements[j].mode==1))
      if (!validate(document.elements[j],event)) return false;
   }
   return true;
}

function ctiDate(date)
{
   if (verbose_>=2) alert(date);
   var arDate=date.split(".");
   if (verbose_>=2) alert(arDate[2]+arDate[1]+arDate[0]);
   return arDate[2]+arDate[1]+arDate[0];
}

function validateDate()
{
   var args=validateDate.arguments;
   var field=getRef(args[0]);
   var evt;
   var dateField;

   if (args.length>=2)
   {
   evt=args[1];
   }
   if (args.length>=3)
   {
   dateField = args[2];
   }
   if (!validDate(field,evt)) {
    setClassErr(field,true);
    if (modInteractif || field.fwPop  ) alert("Date non valide");
    if (field.fwLock) {
      field.focus();
      field.select();
    }
   } // if !ok2_
   var valueDate = ctiDate(field.value);
   setFieldValue(dateField, valueDate);
}

function validate() {
  var args=validate.arguments;
  var ok1_, ok2_;
  var field=getRef(args[0]);
  var evt;
  var dateField;

  if (args.length>=2)
  {
    evt=args[1];
  }
  if (args.length>=3)
  {
      dateField = args[2];
  }

  /* parametres de validation */

  ok2_=true;ok1_=true;
  errMsg="Validation du Champ ["+field.name+"] erronée:"

  if (field.fwOk==null) {
      if (field.fwSep==null)   field.fwSep   = KlstSep; // toujours placé avant fwLst
      if (field.fwLst!=null)   field.fwLst   = field.fwLst.split(field.fwSep);
      if (field.fwClass==null) field.fwClass = field.className;
      if (field.fwLock==null)  field.fwLock  = false;
      if (field.fwPop==null)   field.fwPop   = false;
     field.fwOk=true;
  }

  if (verbose_>=2) alert(field.name);
  if (verbose_>=1) showProps(field);

  /* attributs en parametre...*/
/*
  if (args.length>2) {
   paramsG=args;
   parseParams(args);
  }
*/
/*  switch (field.fwTyp) {
    case KparInt   : break;
    case KparStr   : break;
    case KparFloat : break;
    case KparDate  : return validDate(field, evt); break;
    case KparTime  : break;
    case KparName  : break;
    case KparStd   : break;
  }
*/
  /* valeur obligatoire */

  ok1_ = validObligatoire(field);
  if (!ok1_) errMsg=errMsg + "\n  Valeur obligatoire";
  ok2_=ok2_&&ok1_;

  /* valeur minimale */

  ok1_ = validMin(field);
  if (!ok1_) errMsg=errMsg + "\n  Valeur minimale:"+field.fwMin;
  ok2_=ok2_&&ok1_;

  /* valeur maximale */

  ok1_ = validMax(field);
  if (!ok1_) errMsg=errMsg + "\n  Valeur maximale:"+field.fwMax;
  ok2_=ok2_&&ok1_;

  /* valeur liste */

  ok1_ = validList(field);
  if (!ok1_) errMsg=errMsg + "\n  Valeur hors cotes: ["+field.fwLst+"]";
  ok2_=ok2_&&ok1_;
  errMsg=errMsg+" !";

  /* valeur date */
/*
  if (field.fwTyp == KparDate) {
    alert('date');
    ok1_ = validDate(field);
    alert(ok_1);
    if (!ok1_) errMsg=errMsg + "\n  Date fausse: ["+field.fwDate+"]";
    ok2_=ok2_&&ok1_;
  }
  errMsg=errMsg+" !";
*/
  /* traitement en cas d'erreurs */

  showMsg(field);

  if (!ok2_) {
    setClassErr(field,true);
    if (modInteractif || field.fwPop  ) alert(errMsg);
    if (field.fwLock) {
      field.focus();
      field.select();
    }
  } // if !ok2_
  else
    setClassErr(field,false);
}

/* ==================================================================================================== */

/* mettre en majuscule */

function keyToUpperCase(field, evt) {
  if (document.all) {
    var c=field.value.charAt(field.value.length-1);
    var cu = c.toUpperCase();
    if (field.value.length==1) field.value=cu;
    else field.value=field.value.substring(0,field.value.length-1)+cu;
    return true;
  }
  else
    return true;
}

/* mettre en minuscule */

function keyToLowerCase(field, evt) {
  if (document.all) {
    var c=field.value.charAt(field.value.length-1);
    var cl = c.toLowerCase();
    if (field.value.length==1) field.value=cl;
    else field.value=field.value.substring(0,field.value.length-1)+cl;
    return true;
  }
  else
    return true;
}

/* champ de type nom propre, séparateurs (' ' . - _) */

function keyName(field, evt) {
  var sep=" .-_'";
  if (document.all) {
    if (field.value.length==1)
      field.value=field.value.charAt(0).toUpperCase();
   else {
          var c1=field.value.charAt(field.value.length-2);
          var c2=field.value.charAt(field.value.length-1);
     if (sep.indexOf(c1) != -1) field.value=field.value.substring(0,field.value.length-1)+c2.toUpperCase();
    }
  }
  return true;
}

/* champ de type Entier */

function keyInteger(field, evt) {
  var str="1234567890";
  if (document.all) {
    var c = field.value.charAt(field.value.length-1); //String.fromCharCode(evt.keyCode);
    if (str.indexOf(c) != -1) return true;
    else {field.value=field.value.substring(0,field.value.length-1);return false; }
  }
  else
    return true;
}

/* champ de type Numeric */

function keyNumeric(field, evt) {
  var str="-.,1234567890";
  if (document.all) {
    var c = field.value.charAt(field.value.length-1); // String.fromCharCode(evt.keyCode);
    if (str.indexOf(c) != -1) {return true;}
    else if (field.value.indexOf("-") != 0) {field.value.substring(0,field.value.length-1);return false;}
    else {field.value=field.value.substring(0,field.value.length-1);return false;}
  }
  else
    return true;
}

function validDate(field,evt) {
  return DateFormat(field,field.value,evt,true,'3');
}


function keyDate(field, evt) {
alert('ll');
  return DateFormat(field, field.value, evt, false, '3');
}

function keyVerify() {
  var args=keyVerify.arguments;
  var field=getRef(args[0]);
  var evt=getRef(args[1]);
  var ok_=true;

  /* traitement général.. */

  switch (field.fwTyp) {
    case KparStr   : ok_=true;  break;
    case KparInt   : ok_=keyInteger(field,evt); break;
    case KparFloat : ok_=keyNumeric(field,evt); break;
    case KparDate  : ok_=keyDate(field,evt); break;
    case KparMaj   : ok_=keyToUpperCase(field,evt); break;
    case KparMin   : ok_=keyToLowerCase(field,evt); break;
    case KparTime  : ok_=true;break;
    case KparName  : ok_=keyName(field,evt); break;
    case KparStd   : ok_=true;break;
    default        : ok_=true;break;
  }
  return ok_;
}

function showMsg(field) {
  if(field != null && field.fwMsg!=null)  window.defaultStatus=field.fwMsg;
  else window.defaultStatus="";
}
/* date du jour jj/mm/aaaa */

function toDay() {
  var date=new Date();
  var j = date.getDate();    j = j < 10 ? "0" + j : j + "";
  var m = date.getMonth()+1; m = m < 10 ? "0" + m : m + "";
  var a = date.getFullYear() + "";
  return (j + "." + m + "." + a);
}

// ---------------------------------------------------------------------------------
var closing = true;

/**
 * Toutes les actions de l'utilisateur devraient passer par cette méthode
 * @return
 */

function setEncType(pEnc)
{
   mainForm().encoding = pEnc;
}


function setTarget(pTarget)
{
   mainForm().target = pTarget;
}

function continueCloseModal(pCloseModal)
{
  if (pCloseModal) {
     closeWindow();
//     enableForms();
     unblockEvents();
     opener.focus();
     window.close();
  }
}

function go(pAction, pCloseModal){
  closing = false;
  mainForm().action=pAction;
  if (pCloseModal)
     mainForm().target = opener.name;
  else
     mainForm().target = "_self";
  mainForm().submit();
  setTimeout(continueCloseModal(pCloseModal),1000);
}
function go2(pAction, pCloseModal){
  closing = false;
  mainForm().action=pAction;
  if (pCloseModal)
     mainForm().target = opener.name;
  else
     mainForm().target = "_self";
  showWaitMessage();
  mainForm().submit();
//  setTimeout(continueCloseModal(pCloseModal),1000);
  if (pCloseModal) {
     closeWindow();
//     enableForms();
     unblockEvents();
     opener.focus();
     window.close();
  }
}

function closeWindow()
{
   dialogWin.win=null;
}

function mainForm(){
  return document.forms[0];
}

function getField()
{
}

function modalBeforeUnload(){
  if (closing){
    /*go ("/proto/annuler.do", true);*/
    opener.focus();
    opener.mainForm().target = "_self";
  }
}

/**
 * Fixe la valeur d'un champ du formulaire.
 * Utilisé typiquement pour modifier la valeur d'un champ hidden
 */
function setFieldValue(pFieldName, pValue){
  mainForm().elements[pFieldName].value=pValue;
}

/**
 * Fixe l'action et soumet le formulaire principal
 */

function continueOpenModal(pAction, pTarget)
{
  mainForm().target = pTarget;
  mainForm().action = pAction;
  mainForm().submit();
  disableForms();
  blockEvents();
}

function openModal(pAction){

  closing = false;
  var formTarget = openDialog("about:blank", 750, 450);
// var formTarget = new_window("http://www.yahoo.com", 750, 450);
     //  setTimeout(continueOpenModal(pAction, formTarget),1000);
  mainForm().target = formTarget;
  mainForm().action = pAction;
  mainForm().submit();
  disableForms();
  blockEvents();
}

function selectionneOnglet(action)
{
  mainForm().action = action;
  mainForm().submit();
  //  window.event.cancelBubble=true;
}

function selectionneMenu(action)
{
  mainForm().action = action;
  mainForm().submit();
}

function contextMenu(evt)
{
   evt.returnValue=false;
}
/**********************************************************************
  BEGIN MODAL DIALOG CODE (can also be loaded as external .js file)
***********************************************************************/
// Global for brower version branching.
var Nav4 = ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4))

// One object tracks the current modal dialog opened from this window.
var dialogWin = new Object()

// Generate a modal dialog.
// Parameters:
//    url -- URL of the page/frameset to be loaded into dialog
//    width -- pixel width of the dialog window
//    height -- pixel height of the dialog window
function openDialog(url, width, height) {
   if (!dialogWin.win || (dialogWin.win && dialogWin.win.closed)) {
      // Initialize properties of the modal dialog object.
      dialogWin.url = url;
      dialogWin.width = width;
      dialogWin.height = height;
      // Keep name unique so Navigator doesn't overwrite an existing dialog.
      dialogWin.name = (new Date()).getSeconds().toString();
      // Assemble window attributes and try to center the dialog.
      if (Nav4) {
         // Center on the main window.
         dialogWin.left = window.screenX +
            ((window.outerWidth - dialogWin.width) / 2);
         dialogWin.top = window.screenY +
            ((window.outerHeight - dialogWin.height) / 2);
         var attr = "screenX=" + dialogWin.left +
            ",screenY=" + dialogWin.top + ",resizable=yes,scrollbars=yes,width=" +
            dialogWin.width + ",height=" + dialogWin.height+",menubar=yes";
      } else {
         // The best we can do is center in screen.
         dialogWin.left = (screen.width - dialogWin.width) / 2;
         dialogWin.top = (screen.height - dialogWin.height) / 2;
         var attr = "left=" + dialogWin.left + ",top=" +
            dialogWin.top + ",resizable=yes,scrollbars=yes,width=" + dialogWin.width +
            ",height=" + dialogWin.height+",menubar=yes";
      }

      // Generate the dialog and make sure it has focus.
      dialogWin.win=window.open(dialogWin.url, dialogWin.name, attr);
      dialogWin.win.focus();
                if (!dialogWin.win.opener)
                  dialogWin.win.opener = self;
   } else {
      dialogWin.win.focus();
   }
        return dialogWin.name;
}

// Event handler to inhibit Navigator form element
// and IE link activity when dialog window is active.
function deadend() {
   if (dialogWin.win && !dialogWin.win.closed) {
      dialogWin.win.focus()
      return false
   }
}

// Since links in IE4 cannot be disabled, preserve
// IE link onclick event handlers while they're "disabled."
// Restore when re-enabling the main window.
var IELinkClicks

// Disable form elements and links in all frames for IE.
function disableForms() {
   IELinkClicks = new Array()
   for (var h = 0; h < frames.length; h++) {
      for (var i = 0; i < frames[h].document.forms.length; i++) {
         for (var j = 0; j < frames[h].document.forms[i].elements.length; j++) {
            frames[h].document.forms[i].elements[j].disabled = true
         }
      }
      IELinkClicks[h] = new Array()
      for (i = 0; i < frames[h].document.links.length; i++) {
         IELinkClicks[h][i] = frames[h].document.links[i].onclick
         frames[h].document.links[i].onclick = deadend
      }
   }
}

// Restore IE form elements and links to normal behavior.
function enableForms() {
   for (var h = 0; h < frames.length; h++) {
      for (var i = 0; i < frames[h].document.forms.length; i++) {
         for (var j = 0; j < frames[h].document.forms[i].elements.length; j++) {
            frames[h].document.forms[i].elements[j].disabled = false
         }
      }
      for (i = 0; i < frames[h].document.links.length; i++) {
         frames[h].document.links[i].onclick = IELinkClicks[h][i]
      }
   }
}

// Grab all Navigator events that might get through to form
// elements while dialog is open. For IE, disable form elements.
function blockEvents() {
   if (Nav4) {
      window.captureEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS)
      window.onclick = deadend
   } else {
      disableForms()
   }
   window.onfocus = checkModal
}
// As dialog closes, restore the main window's original
// event mechanisms.
function unblockEvents() {
   if (Nav4) {
      window.releaseEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS)
      window.onclick = null
      window.onfocus = null
   } else {
      enableForms()
   }
}

// Invoked by onFocus event handler of EVERY frame,
// return focus to dialog window if it's open.
function checkModal() {
   if (dialogWin.win && !dialogWin.win.closed) {
      dialogWin.win.focus()
   }
}

function setName()
{
   this.window.name = (new Date()).getSeconds().toString();
}

function closingModal()
{
   var iX = window.document.body.offsetWidth - window.event.clientX ;
   var iY = window.event.clientY ;

   if (iX <=30 && iY < 0 )
   {
      mainForm().target = opener.name;
      closeWindow();
      enableForms();
      unblockEvents();
      opener.focus();
   }
}

/**************************
  END MODAL DIALOG CODE
**************************/