﻿/*
* Module de definition du comportement des controles graphiques HTML
* (controle de saisie, gestion des popup, etc).
* Utilisé dans le runtime.
* Utilise les fichiers js :
* - AWSGlobals.js (en statique ou dynamique)
* ATTENTION : FICHIER A SAUVEGARDER TOUJOURS EN UTF-8
*/


/*
* Fonction permettant de recuperer le contenu d'un fichier js
* en AJAX.
* Attention : cette definition de fonction et le if qui suivent
* doivent rester en tete de ce fichier si on veut utiliser des
* var ou fcts dans AWSGlobals.js
*/
function getJSFile(fileName)
{
   var XhrObj = null;   
   
   if(typeof(XMLHttpRequest) != 'undefined')
   {
      // Mozilla 
   	XhrObj = new XMLHttpRequest();      
   }
   else
   {
      // Noms des activeX des differentes versions d'IE
   	var axO = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'], i;
   
   	for(i = 0; i < axO.length; i++)
      {
   		try
         {
   			XhrObj = new ActiveXObject(axO[i]);
            break;
   		}
         catch(e)
         {
         }
      }
   }   
   // Attention : requete en synchrone donc (pour Firefox) ne pas affecter
   // de callback (onreadystatechange)
   XhrObj.open("GET", fileName + "?AdeliaTS=" + new Date().getTime(), false);   
   XhrObj.send(null);
   if (XhrObj.readyState == 4 && XhrObj.status == 200)  
      // retourne le contenu texte de la requete (ok car fichier js) 
      return XhrObj.responseText;   
   else
      return '';
}

// Attention :
// Pour que l'execution d'un pgm AWS fonctionne sans re-generer le pgm jsp,
// il faut inclure dynamiquement le fichier AWSGlobals.js en tete car AWSControlScript.js
// utilise des fcts et var de AWSGlobals.js
// (Si on re-genere le jsp, on inclu dans le jsp AWSGlobals.js avant AWSControlScript.js)
if (typeof(AWSGLOBALS_JS_INCLUDED) == 'undefined')
{
   // AWSGLOBALS_JS_INCLUDED est definie dans AWSGlobals.js
   // Si on est dans ce if c'est que AWSGlobals.js n'a pas ete inclu
   // (cas d'une execution sans re-generation)
   var resTxt;
   // on recupere le path du fichier AWSControlScript.js pour
   // pouvoir inclure dynamiquement AWSGlobals.js    
   var tabScript = document.getElementsByTagName('script');
   var pathScript = tabScript[tabScript.length - 1].src;
   pathScript = pathScript.substring(0, pathScript.indexOf('AWSControlScript.js'));   
   resTxt = getJSFile(pathScript + 'AWSGlobals.js');
   // Attention : l'eval doit etre au niveau le plus haut du fichier js et pas
   // dans une fct car il est sensible au contexte
   eval(resTxt);
}
else
	// AWSGlobals.js est deja inclu : on cree le resourceBundle
	var AWSErrorMsgBundle = new ResourceBundleCreator('/AWSResources/AWSErrorMessage.properties');

/*
* Filtre la valeur des car saisis au clavier (dans un champ de saisie)
* en fonction du type adelia et du controle de saisie
* e : event pour etre compatible avec NS
* control : controle de saisie (int)
* type : type adelia (int)
* decimals : nb de dec du type (int)
* objet : ref javascript sur l'objet input
* objetName : nom du controle
* form : nom du formulaire
* DecimalSeparator : car separateur decimale (en fonction de la locale)
* GroupingSeparator : car sep des milliers (en fonction de la locale)
* DateSeparator : car sep de date (en fonction de la locale)
* TimeSeparator : car sep des heures (en fonction de la locale)
*/
function InputCtrlKeyPress(e, control, type, decimales, objet, objetName, form, DecimalSeparator, GroupingSeparator, DateSeparator, TimeSeparator)
{
   var res;

   // Initialisation des var globales dependantes de la locale (cf AWSGlobals.js)
   // L'init. est faite a la generation du jsp mais
   // on l'a fait aussi ici pour rester compatible avec l'existant (sans re-generation)
   //initDateTimeVars (DecimalSeparator, GroupingSeparator, DateSeparator, TimeSeparator, null);

   // si la lettre tapée est un caractère de contrôle (tab, entrée, ...) on s'arrête
   if (document.all)
   {
      if (window.event.keyCode <= 31)
         return true;
   }
   else
   {
      if (e.which <= 31)
         return true;
   }
   if (control == VGENJSP_TOUTMAJ)
   {
      // control = VGENJSP_TOUTMAJ, c'est un alpha en majuscules (lettres et car spéciaux autorisés)
      if (document.all)      
         window.event.keyCode = String.fromCharCode(window.event.keyCode).toUpperCase().charCodeAt(0);      
      else      
      {
         res = changeKey (objet, e, lettersToUpperCase);         
         return res;
      }
   }
   if (control == VGENJSP_TOUTMIN)
   {
      // control = VGENJSP_TOUTMIN, c'est un alpha en minuscules
      if (document.all)
         window.event.keyCode = String.fromCharCode(window.event.keyCode).toLowerCase().charCodeAt(0);      
      else      
      {
         res = changeKey (objet, e, lettersToLowerCase);         
         return res;
      }
   }
   if (control == VGENJSP_NUMER || type == VGENJSP_TNB2 || type == VGENJSP_TNB4 || (type == VGENJSP_TNUME && decimales == 0) || (type == VGENJSP_TNUMP && decimales == 0))
   {
      // control = VGENJSP_NUMER, c'est un numérique sans décimales
      if (document.all)
      {
         if (GroupingSeparator.charCodeAt() == 160 && window.event.keyCode == 32)
            window.event.keyCode = 160;
         if ((window.event.keyCode < 48 || window.event.keyCode > 57) && window.event.keyCode != 45 && window.event.keyCode != 43 
               && window.event.keyCode != GroupingSeparator.charCodeAt(0))
            return false;
      }
      else
      {
         if (GroupingSeparator.charCodeAt() == 160 && e.which == 32)
            changeKey (objet, e, letterCode32To160);
         if ((e.which < 48 || e.which > 57) && e.which != 43 && e.which != 45 
               && e.which != GroupingSeparator.charCodeAt(0))
            return false;
      }
   }
   if (control == VGENJSP_NUMEREXT || (type == VGENJSP_TNUME && decimales > 0) || (type == VGENJSP_TNUMP && decimales > 0))
   {
      // control = VGENJSP_NUMEREXT, c'est un numérique avec décimales
      if (document.all)
      {
         if (GroupingSeparator.charCodeAt() == 160 && window.event.keyCode == 32)
            window.event.keyCode = 160;

         if (padDecimalPointKeyPressed && window.event.keyCode != DecimalSeparator.charCodeAt(0) &&
               window.event.keyCode != GroupingSeparator.charCodeAt(0))
            window.event.keyCode = DecimalSeparator.charCodeAt(0);

         if ((window.event.keyCode < 48 || window.event.keyCode > 57) && window.event.keyCode != 45 
               && window.event.keyCode != 43 && window.event.keyCode != DecimalSeparator.charCodeAt(0) 
               && window.event.keyCode != GroupingSeparator.charCodeAt(0))
            return false;
      }
      else
      {
         if (GroupingSeparator.charCodeAt() == 160 && e.which == 32)
            changeKey (objet, e, letterCode32To160);

         if (padDecimalPointKeyPressed && e.which != DecimalSeparator.charCodeAt(0) &&
               e.which != GroupingSeparator.charCodeAt(0))            
            changeKey (objet, e, function() { return { replaceKey: true, newKeyCode: DecimalSeparator.charCodeAt(0)}; });
            

         if ((e.which < 48 || e.which > 57) && e.which != 43 && e.which != DecimalSeparator.charCodeAt(0) 
               && e.which != 45 && e.which != GroupingSeparator.charCodeAt(0))
            return false;
      }
   }
   if (control == VGENJSP_LETMAJ)
   {
      // control = VGENJSP_LETMAJ, c'est un alpha en majuscules (lettres et car spéciaux non autorisés)
      if (document.all)
      {
         if (window.event.keyCode < 65 || (window.event.keyCode > 90 && window.event.keyCode < 97)
               || window.event.keyCode > 122)
            return false;

         window.event.keyCode = String.fromCharCode(window.event.keyCode).toUpperCase().charCodeAt(0);
      }
      else
      {
         if (e.which < 65 || (e.which > 90 && e.which < 97) || e.which > 122)
            return false;

         res = changeKey (objet, e, lettersToUpperCase);         
         return res;
      }
   }
   if (control == VGENJSP_LETMAJCHIF)
   {
      // control = VGENJSP_LETMAJCHIF, c'est un alpha en majuscules (lettres autorisées et car spéciaux non autorisés)
      if (document.all)
      {
         if (window.event.keyCode < 48 || (window.event.keyCode > 57 && window.event.keyCode < 65) ||
               (window.event.keyCode > 90 && window.event.keyCode < 97) || window.event.keyCode > 122)
            return false;

         window.event.keyCode = String.fromCharCode(window.event.keyCode).toUpperCase().charCodeAt(0);
      }
      else
      {
         if (e.which < 48 || (e.which > 57 && e.which < 65) || (e.which > 90 && e.which < 97) || e.which > 122)
            return false;

         res = changeKey (objet, e, lettersToUpperCase);         
         return res;
      }
   }
   if (control == VGENJSP_ZONEIBM)
   {
      // control = VGENJSP_ZONEIBM, c'est une zone IBM (lettres majuscule, chiffres et '_' autorisés)
      if (document.all)
      {
         if ((window.event.keyCode < 48 || (window.event.keyCode > 57 && window.event.keyCode < 65) ||
               (window.event.keyCode > 90 && window.event.keyCode < 97) || window.event.keyCode > 122)
               && window.event.keyCode != 95)
            return false;

         window.event.keyCode = String.fromCharCode(window.event.keyCode).toUpperCase().charCodeAt(0);
      }
      else
      {
         if ((e.which < 48 || (e.which > 57 && e.which < 65) || (e.which > 90 && e.which < 97) || e.which > 122) 
               && e.which != 95)
            return false;

         res = changeKey (objet, e, lettersToUpperCase);         
         return res;
      }
   }   
   if (control == VGENJSP_DATE || control == VGENJSP_DATEXT || type == VGENJSP_TDATE)   
   {
      // control = VGENJSP_DATE, c'est une date (lettres et DateSeparator autorisés)
      if (document.all)
      {
      if ((window.event.keyCode < 48 || window.event.keyCode > 57) 
            && window.event.keyCode != DateSeparator.charCodeAt(0))
         return false;
      }
      else
      {
         if ((e.which < 48 || e.which > 57) && e.which != DateSeparator.charCodeAt(0))
            return false;
      }
   }
   if (type == VGENJSP_TTIME)
   {
      // type = VGENJSP_TTIME, c'est une heure (lettres et TimeSeparator autorisés)
      if (document.all)
      {
         if ((window.event.keyCode < 48 || window.event.keyCode > 57) && 
               window.event.keyCode != TimeSeparator.charCodeAt(0))
            return false;
      }
      else
      {
         if ((e.which < 48 || e.which > 57) && e.which != TimeSeparator.charCodeAt(0))
            return false;
      }
   }
   if (type == VGENJSP_TTMS)
   {
      // type = VGENJSP_TTMS, c'est un timestamp (lettres, TimeSeparator et DateSeparator autorisés)
      if (document.all)
      {
         if ((window.event.keyCode < 48 || window.event.keyCode > 57) 
               && window.event.keyCode != TimeSeparator.charCodeAt(0) 
               && window.event.keyCode != DateSeparator.charCodeAt(0))
            return false;
      }
      else
      {
         if ((e.which < 48 || e.which > 57) && e.which != TimeSeparator.charCodeAt(0) 
               && e.which != DateSeparator.charCodeAt(0))
            return false;
      }
   }
   return true;
}

/*
* Fonction de controle du nombre de caracteres saisis dans un champ de saisie Adelia
* de type multiligne (textarea)
* On utilise cette fonction car l'attribut maxlength n'est pas pris en compte en HTML pour un textarea
* Fonction appelee sur le onkeydown
*/
function InputCtrlCheckLength(e, obj)
{
	var evt, code;					
	
	if (ie)
	{
		evt = window.event;
		code = evt.keyCode;
	}
	else
	{
		evt = e;
		code = evt.which;
	}				
	if ((obj.value.length >= parseInt(obj.getAttribute('maxlength'))) && isEditableCar(evt))
	{
		if (ie)		
			evt.returnValue = false;						
		else 
			return false;		
	}
	return true;
}

/*
* Fonction de controle syntaxique d'une valeur saisie
* en fonction du type adelia et du controle de saisie
* e : event pour etre compatible avec NS
* control : controle de saisie (int)
* type : type adelia (int)
* length : lg du type (int)
* decimals : nb de dec du type (int)
* objet : ref javascript sur l'objet input
* objetName : nom du controle
* form : nom du formulaire
* DecimalSeparator : car separateur decimale (en fonction de la locale)
* GroupingSeparator : car sep des milliers (en fonction de la locale)
* DateSeparator : car sep de date (en fonction de la locale)
* TimeSeparator : car sep des heures (en fonction de la locale)
* DatePattern : format d'une date (en fonction de la locale)
* mandatory : defini si le champ a une saisie obligatoire
*/
// Identique a InputCtrlBlur
function checkAdeliaValueSyntax(control, type, length, decimales, objet, form, DecimalSeparator, GroupingSeparator, DateSeparator, TimeSeparator, DatePattern, mandatory)
{
   var valTxt = document.forms[form].elements[objet].value, iscRes;
   
   // Initialisation des var globales dependantes de la locale (cf AWSGlobals.js)
   // L'init. est faite a la generation du jsp mais
   // on la fait aussi ici pour rester compatible avec l'existant (sans re-generation)
   initDateTimeVars (DecimalSeparator, GroupingSeparator, DateSeparator, TimeSeparator, DatePattern);   
   switch (type)
   {
      case VGENJSP_TDATE :
      	// on fixe control a VGENJSP_DATE si on recoit 0 comme valeur
      	// possible si pgm genere en v9
         iscRes = SscVerifDate (valTxt, mandatory, control == VGENJSP_CAUCUN ? VGENJSP_DATE : control);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TTIME :
         // on fixe control a VGENJSP_TIME car on recoit 0 comme valeur
         iscRes = SscVerifTime (valTxt, mandatory, VGENJSP_TIME);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TTMS :
         iscRes = SscVerifTimeStamp (valTxt, mandatory);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TALPHA :
         iscRes = SscVerifChaine (valTxt, mandatory, control);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TNB2 :
         // la lg d'un bin_2 est de 5
         // on fixe control a VGENJSP_NUMER si on recoit 0 comme valeur
      	// possible si pgm genere en v9
         iscRes = SscVerifNumerique (valTxt, 5, 0, mandatory, control == VGENJSP_CAUCUN ? VGENJSP_NUMER : control);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TNB4 :
         // la lg d'un bin_4 est de 10
         // on fixe control a VGENJSP_NUMER si on recoit 0 comme valeur
      	// possible si pgm genere en v9
         iscRes = SscVerifNumerique (valTxt, 10, 0, mandatory, control == VGENJSP_CAUCUN ? VGENJSP_NUMER : control);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
         
      case VGENJSP_TNUMP :
      case VGENJSP_TNUME :
      	if (control == VGENJSP_CAUCUN)
      	{
      		// on fixe control a VGENJSP_NUMER ou VGENJSP_NUMEREXT si on recoit 0 comme valeur
      		// possible si pgm genere en v9
      		if (decimales == 0)
      			control = VGENJSP_NUMER;
      		else
      			control = VGENJSP_NUMEREXT;
      	}
         iscRes = SscVerifNumerique (valTxt, length, decimales, mandatory, control);
         if (iscRes != ISC_OK)
         {
            SscMessageErreur(iscRes, valTxt);
            return false;
         }
         break;
   }
   return true;
}

/*
* Fonction de formatage de la valeur d'un controle de type text en fonction 
* du type adelia, du code edition ou mot d'edition
* Fonction appelee sur le onchange d'un entryfield
*/
function formatAdeliaValueOnChange(Obj)
{
   var valTxt = Obj.value, val;
   var inputCtrl = Obj.getAttribute('inputctrl');
   var editCode = Obj.getAttribute('editcode');
   var editWord = Obj.getAttribute('editword');
   var adeliaType = parseInt(Obj.getAttribute('adeliatype'));
   var adeliaTypeLg = parseInt(Obj.getAttribute('adeliatypelg'));
   var adeliaTypeNbDec = parseInt(Obj.getAttribute('adeliatypenbdec'));
   var mandatory = Obj.getAttribute('mandatory') == 'true';      
   
   if (editCode == null)
      // l'attribut editcode peut ne pas etre present dans le tag
      // Dans ce cas il vaut aucun
      editCode = VGENJSP_EAUCUN;
   else
      editCode = parseInt(editCode);
      
   if (inputCtrl != null)
      inputCtrl = parseInt(inputCtrl);
   else
	{
		// l'attribut inputctrl peut ne pas etre present en v9
		// si on cree l'entryfield via la boite de placement de dreamweaver
		switch (adeliaType)
		{
			case VGENJSP_TDATE :
				inputCtrl = VGENJSP_DATE;
				Obj.setAttribute('inputctrl', inputCtrl);
				break;
				
			case VGENJSP_TNB2 :
			case VGENJSP_TNB4 :
				inputCtrl = VGENJSP_NUMER;
				Obj.setAttribute('inputctrl', inputCtrl);
				break;
				
			case VGENJSP_TNUMP :
			case VGENJSP_TNUME :
				if (adeliaTypeNbDec == 0)
					inputCtrl = VGENJSP_NUMER;
				else
					inputCtrl = VGENJSP_NUMEREXT;
					
				Obj.setAttribute('inputctrl', inputCtrl);
				break;
		}
	}

   switch (adeliaType)
   {
      case VGENJSP_TDATE :
         // si le champ est vide, alors ne rien faire
         if (valTxt == '')
            return;

         if (SscVerifDate (valTxt, mandatory, inputCtrl) == ISC_OK)
         {
            val = SscTexteVersDate(valTxt, inputCtrl);
            Obj.value = SscDateVersTexte2 (val, editCode);
         }         
         break;
         
      case VGENJSP_TTIME :
         if (SscVerifTime (valTxt, mandatory, VGENJSP_TIME) == ISC_OK)
         {
            val = SscTexteVersTime(valTxt, VGENJSP_TIME);
            Obj.value = SscTimeVersTexte2 (val, editCode);
         }         
         break;
         
      case VGENJSP_TTMS :
         if (SscVerifTimeStamp (valTxt, mandatory) == ISC_OK)
         {
            val = SscTexteVersTimeStamp(valTxt);
            Obj.value = SscTimeStampVersTexte2 (val, editCode);
         }  
         break;
         
      case VGENJSP_TNUMP :
      case VGENJSP_TNUME :         
         if (SscVerifNumerique (valTxt, adeliaTypeLg, adeliaTypeNbDec, mandatory, inputCtrl) == ISC_OK)
         {
            val = SscTexteVersLongDouble (valTxt);
            Obj.value = SscItoA2 (val, adeliaTypeLg, adeliaTypeNbDec, editWord, editCode);
         }
         break;
   }
}

function SscVerifChaine(valTxt, mandatory, inputCtrl)
{
   var res = ISC_OK;
   
   if (inputCtrl != VGENJSP_CAUCUN)
   {
      if ((res = VerifierType (inputCtrl, mandatory, valTxt)) != ISC_OK)
      {
         switch (res)
         {
         case ISC_ZONE_VIDE :
            return ISC_ALPHA_VIDE;
   
         case ISC_ZONE_INCORRECTE :
            return ISC_ALPHA_INCORRECTE;
         }  
      }   
   }
   else if ((valTxt == '') && mandatory)
   	return ISC_ALPHA_VIDE;
   	
   return res;
}

function SscVerifTimeStamp (valTxt, mandatory)
{
   var res;
      
   if ((res = VerifierType (VGENJSP_TIMESTAMP, mandatory, valTxt)) != ISC_OK)
   {
      switch (res)
      {
      case ISC_ZONE_VIDE :
         return ISC_TIMESTAMP_VIDE;

      case ISC_ZONE_INCORRECTE :
         return ISC_TIMESTAMP_INCORRECTE;
      }  
   }   
   // On teste la valeur semantique de la date
   return controlerTimeStamp(SscTexteVersTimeStamp(valTxt));
}

/*
* Fonction identique a SscVerifDate dans ssclasse.c
*/
function SscVerifDate (valTxt, mandatory, inputCtrl)
{
   var res;
      
   if ((res = VerifierType (inputCtrl, mandatory, valTxt)) != ISC_OK)
   {
      switch (res)
      {
      case ISC_ZONE_VIDE :
         return ISC_DATE_VIDE;

      case ISC_ZONE_INCORRECTE :         
         return ISC_DATE_INCORRECTE;
      }  
   }   
   // On teste la valeur semantique de la date
   return controlerDate(SscTexteVersDate(valTxt, inputCtrl));        
}

function SscVerifTime (valTxt, mandatory, inputCtrl)
{
   var res;
      
   if ((res = VerifierType (inputCtrl, mandatory, valTxt)) != ISC_OK)
   {
      switch (res)
      {
      case ISC_ZONE_VIDE :
         return ISC_TIME_VIDE;

      case ISC_ZONE_INCORRECTE :
         return ISC_TIME_INCORRECTE;
      }  
   }
   // On teste la valeur semantique de l'heure
   return controlerTime(SscTexteVersTime(valTxt, inputCtrl));          
}

/*
* Fonction identique a controlerDate dans ssclasse.c
*/
function controlerDate(adeliaDate)
{
   var year = getYearAdeliaDate (adeliaDate);
   var month = getMonthAdeliaDate (adeliaDate);
   var day = getDayAdeliaDate (adeliaDate);   
   var tempDate;
   // getFullYear pour une annee entre 0 et 99 rajoute 1900
   if (year <= 99)
      year += 1900;

   tempDate = new Date(year, month - 1, day);

   // On teste la valeur semantique de la date
   // si on a la date erronnee 29/02/2006 alors le new Date retourne 01/03/2006
   if ((day == tempDate.getDate()) && (month == tempDate.getMonth() + 1) && (year == tempDate.getFullYear()))
      return ISC_OK;
   else
      return ISC_DATE_VAL_INCORRECTE; 
}

/*
* Fonction identique a controlerTime dans ssclasse.c
*/
function controlerTime(adeliaTime)
{
   var hour = getHourAdeliaTime (adeliaTime);
   var minute = getMinuteAdeliaTime (adeliaTime);
   var second = getSecondAdeliaTime (adeliaTime);
   
   // On teste la valeur semantique de l'heure
   if (((hour > 23) || (minute > 59) || (second > 59)) && ((hour != 24) || (minute != 0) || (second != 0)))
      return (ISC_TIME_VAL_INCORRECTE);
   else
      return (ISC_OK);
}

/*
* Fonction identique a controlerDateStamp dans ssclasse.c
*/
function controlerTimeStamp(adeliaTimeStamp)
{
   var err;
   
   err = controlerDate (adeliaTimeStamp[0]);
   if (err != ISC_OK)
      return ISC_TIMESTAMP_VAL_INCORRECTE;
   err = controlerTime (adeliaTimeStamp[1]);
   if (err != ISC_OK)
      return ISC_TIMESTAMP_VAL_INCORRECTE;

   if (adeliaTimeStamp[1] == 240000 && adeliaTimeStamp[2] != 0)
      return ISC_TIMESTAMP_VAL_INCORRECTE;

   return ISC_OK;
}

function SscTexteVersTimeStamp(valTxt)
{
   var regExp, tmpTab, i, day, month, year, tabRes;

   if (valTxt == '')
      return [LOVAL_DATE, LOVAL_TIME, 0];

   regExp = new RegExp(REG_EXP_TIMESTAMP);
   tmpTab = regExp.exec(valTxt);  
   if (tmpTab == null)
      // Ne doit jamais arriver car on suppose que valTxt a une syntaxe valide
      return [LOVAL_DATE, LOVAL_TIME, 0];
      
   tabRes = [0,0,0];
   // tmpTab[1] contient le jour, tmpTab[2] contient le mois, etc.
   for (i = 0; i < DATE_PATTERN.length; i++)
   {
      switch (DATE_PATTERN.charAt(i))
      {
         case 'D' : 
            day = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'M' : 
            month = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'Y' : 
            year = parseInt(tmpTab[i + 1], 10);
            break;
      }
   }
   for (i = 0; i < TIME_PATTERN.length; i++)
   {
      switch (TIME_PATTERN.charAt(i))
      {
         case 'H' : 
            hour = parseInt(tmpTab[i + 4], 10);
            break;
            
         case 'M' : 
            minute = parseInt(tmpTab[i + 4], 10);
            break;
            
         case 'S' : 
            second = parseInt(tmpTab[i + 4], 10);
            break;
      }
   }   
   // on fixe la date
   tabRes[0] = year * 10000 + month * 100 + day;
   // on fixe l'heure
   tabRes[1] = hour * 10000 + minute * 100 + second;
   // on fixe les milli sec
   tabRes[2] = parseInt(tmpTab[7], 10);
   return tabRes;
}

function SscTexteVersTime(valTxt, inputCtrl)
{
   var regExp, tmpTab, hour, minute, second;

   if (valTxt == '')
      return LOVAL_TIME;

   // extraction du heure, minute, seconde
   switch (inputCtrl)
   {
      case VGENJSP_TIME :
         regExp = new RegExp(REG_EXP_TIME);
         break;
         
      case VGENJSP_TIMEXT :
         regExp = new RegExp(REG_EXP_TIMEXT);
         break;
   }
   tmpTab = regExp.exec(valTxt);  
   if (tmpTab == null)
      // Ne doit jamais arriver car on suppose que valTxt a une syntaxe valide
      return LOVAL_TIME; 

   // tmpTab[1] contient l'heure, tmpTab[2] contient les minutes, etc.
   for (var i = 0; i < TIME_PATTERN.length; i++)
   {
      switch (TIME_PATTERN.charAt(i))
      {
         case 'H' : 
            hour = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'M' : 
            minute = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'S' : 
            second = parseInt(tmpTab[i + 1], 10);
            break;
      }
   }
   return hour * 10000 + minute * 100 + second;
}

/*
* Fonction identique a SscTexteVersDate dans ssclasse.c
* 
*/
function SscTexteVersDate(valTxt, inputCtrl)
{
   var regExp, tmpTab, day, month, year;

   if (valTxt == '')
      return LOVAL_DATE;

   // extraction du jour, mois, annee
   switch (inputCtrl)
   {
      case VGENJSP_DATE :
         regExp = new RegExp(REG_EXP_DATE);
         break;
         
      case VGENJSP_DATEXT :
         regExp = new RegExp(REG_EXP_DATEXT);
         break;
   }
   tmpTab = regExp.exec(valTxt);  
   if (tmpTab == null)
      // Ne doit jamais arriver car on suppose que valTxt a une syntaxe valide
      return LOVAL_DATE; 

   // tmpTab[1] contient le jour, tmpTab[2] contient le mois, etc.
   for (var i = 0; i < DATE_PATTERN.length; i++)
   {
      switch (DATE_PATTERN.charAt(i))
      {
         case 'D' : 
            day = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'M' : 
            month = parseInt(tmpTab[i + 1], 10);
            break;
            
         case 'Y' : 
            year = parseInt(tmpTab[i + 1], 10);
            break;
      }
   }
   return year * 10000 + month * 100 + day;
}

function SscTexteVersLongDouble (valTxt)
{
   var resNum, tmpTxt;

   tempTxt = SupprimeEditWord(valTxt);
   resNum = SscAtoI(tempTxt);

   return resNum;
}

function SscAtoI(valTxt)
{
   var index = valTxt.indexOf(DECIMAL_SEPARATOR);
   
   if (valTxt == '')
      return 0;

   if (index != -1)
   {
      valTxt = setCharAt(valTxt, '.', index);
      return parseFloat(valTxt);
   }
   else
      return parseInt(valTxt, 10);    
   
}

/*
* Fonction identique a SscItoA2 dans ssclasse.c
* Pour l'instant, on ne prend en compte de les codes edition
* et pas les mots d'edition
*/
function SscItoA2 (valNum, lgAdeliaType, nbDecAdeliaType, editWord, editCode)
{
   var intPart, decPart, valTxt, tab, negVal = false, res;
   var MotEditionEspaceZero = false; // Flag si mot d'edition special (espace+zero en tete) identique a 0 en tete mais n'affichant rien quand valeur vaut 0
   var LgMax;
   var MotEditionUtiliser;

   if ((editWord != null) && (editWord != ''))
   {
      // Detection du cas ou le mot d'edition est special : commencant par ESPACE ZERO
      if (editWord.indexOf(' 0') == 0)
      {
         // Analyse du mot d'edition pour s'assurer que le mot d'edition
         // est bien un espace+zero+nb d'espace = longueur
         var nbCarEspace = 0;
         var antiSuppression = 0;
         var ZeroEnDebut = false;    // Indique la presence d'un 0 en debut
         var EspaceEnDebut = false;    // Indique la presence d'un espace en debut
         var EspaceZeroDebut = false;    // Indique la presence d'un espace puis zero en debut : nouveau mot d'edition
         var PositionCaractere = 0;        // Position du caractere lu dans le mot d'edition
         var pDebut = 0; 
     
         PositionCaractere = 1;  
         while (pDebut < editWord.length)
         {                     
            if (editWord.charAt(pDebut) == ' ')
            {
               // Caractere 'espace' --> mise a jour du nombre d'espaces rencontres
               nbCarEspace++;                  
               if (pDebut == 0)
                  // Caractere ' ' en debut
                  EspaceEnDebut = true;
            }            
            else if ((editWord.charAt(pDebut) == '*') && (antiSuppression == 0))
            {
               // Caractere 'asterisque' et pas d'antisuppression --> mise a jour du nombre d'antisuppression
               antiSuppression = 1;
            }            
            else if ((editWord.charAt(pDebut) == '0') && (antiSuppression == 0))
            {
               antiSuppression = 1;
            
               if (pDebut == 0)
                  // Caractere '0' en debut
                  ZeroEnDebut = true;
               else if (EspaceEnDebut && (PositionCaractere == 2))
                  // Caracteres ' 0' en tete : nouveau mot d'edition
                  EspaceZeroDebut = true;
            }   
            // Lecture du caractere suivant
            pDebut++;
            PositionCaractere++;
         }   
         if (EspaceZeroDebut && (lgAdeliaType == (nbCarEspace - 1)) )
            MotEditionEspaceZero = true;
      }      
      if (MotEditionEspaceZero)
      {
         // Mot d'edition en Espace+Zero+Fin : on fait comme si c'etait Zero+Fin       
         MotEditionUtiliser = editWord.substring(1);
      }
      else
      {         
         MotEditionUtiliser = editWord;
      }
      if (CarZeroEnDebutMotEdition (MotEditionUtiliser, lgAdeliaType))
         lgAdeliaType++;
         
      res = SscItoA(valNum, lgAdeliaType, nbDecAdeliaType, MotEditionUtiliser);
      res = DeleteBeginingBlanks(res);
      res = DeleteEndBlanks(res);
      
      // Cas special : MotEditionEspaceZero : la valeur vaut 0 ? on ne renvoie que la chaine vide..
      if (MotEditionEspaceZero && (valNum == 0))       
         res = '';
         
      return res;      
   }
   else
   {
      switch (editCode)
      {
         case VGENJSP_EAUCUN :
            if (valNum == 0)
               return padZeroLeft('', lgAdeliaType);
               
            if (valNum < 0)
               valNum = -valNum;
               
            if (nbDecAdeliaType == 0)         
               return padZeroLeft(valNum, lgAdeliaType);         
            else
            {
               valTxt = valNum.toString();
               tab = valTxt.split('.');
               intPart = padZeroLeft(tab[0], lgAdeliaType - nbDecAdeliaType);
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);            
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               return intPart + decPart;
            }
            break;
   
         case VGENJSP_CDE_A :
         case VGENJSP_CDE_B :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_A)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                   
               res = insertGroupingSep(valNum);
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');            
               intPart = insertGroupingSep(tab[0]);
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res += ISC_SIGNE_NEGATIF_2;
                         
            return res;         
   
         case VGENJSP_CDE_C :
         case VGENJSP_CDE_D :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_C)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                   
               res = valNum.toString();
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');                      
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res += ISC_SIGNE_NEGATIF_2;
                         
            return res;  
   
         case VGENJSP_CDE_J :
         case VGENJSP_CDE_K :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_J)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                     
               res = insertGroupingSep(valNum);
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');            
               intPart = insertGroupingSep(tab[0]);          
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res += ISC_CHAR_SIGNE_NEGATIF_1;
                         
            return res;  
   
         case VGENJSP_CDE_L :
         case VGENJSP_CDE_M :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_L)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                     
               res = valNum.toString();
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');                      
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res += ISC_CHAR_SIGNE_NEGATIF_1;
                         
            return res;  
   
         case VGENJSP_CDE_N :
         case VGENJSP_CDE_O :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_N)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                     
               res = insertGroupingSep(valNum);
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');            
               intPart = insertGroupingSep(tab[0]);          
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res = ISC_CHAR_SIGNE_NEGATIF_1 + res;
               
            return res;
            
         case VGENJSP_CDE_P :
         case VGENJSP_CDE_Q :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_P)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)
            {
               valNum = -valNum;
               negVal = true;
            }
            if (nbDecAdeliaType == 0)                     
               res = valNum.toString();
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');                      
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }
            if (negVal)
               res = ISC_CHAR_SIGNE_NEGATIF_1 + res;
               
            return res;
   
         case VGENJSP_CDE_1 :
         case VGENJSP_CDE_2 :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_1)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)         
               valNum = -valNum;
               
            if (nbDecAdeliaType == 0)                     
               res = insertGroupingSep(valNum);
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');            
               intPart = insertGroupingSep(tab[0]);          
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }         
            return res;
   
         case VGENJSP_CDE_3 :
         case VGENJSP_CDE_4 :
            if (valNum == 0)
            {
               if (editCode == VGENJSP_CDE_3)
               {
                  if (nbDecAdeliaType == 0)
                     return '0';
                  else
                     return '0' + DECIMAL_SEPARATOR + padZeroLeft('', nbDecAdeliaType);
               }
               else
                  return '';
            }
            if (valNum < 0)         
               valNum = -valNum;
               
            if (nbDecAdeliaType == 0)                     
               res = valNum.toString();
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');                      
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);                           
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               res = intPart + DECIMAL_SEPARATOR + decPart;
            }         
            return res;
   
         case VGENJSP_CDE_Z :
            if (valNum == 0)
               return '';
               
            if (valNum < 0)
               valNum = -valNum;
               
            if (nbDecAdeliaType == 0)         
               return valNum.toString();
            else
            {            
               valTxt = valNum.toString();
               tab = valTxt.split('.');          
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);            
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
                  
               return intPart + decPart;
            }
            break;
   
         case VGENJSP_CDE_Y :
            if (valNum == 0)
            {
               if (lgAdeliaType <= 2)
                  return '';
               if (lgAdeliaType == 3)
                  return '0/0';
               if (lgAdeliaType == 4)
                  return '0/00';
               if (lgAdeliaType == 5)
                  return '0/00/0';
               // lgAdeliaType >= 6
                  return '0/00/00';
            }
            if (valNum < 0)
               valNum = -valNum;
               
            if (nbDecAdeliaType == 0) 
            {        
               intPart = valNum.toString();
               decPart = '';
            }
            else
            {          
               valTxt = valNum.toString();
               tab = valTxt.split('.');          
               intPart = tab[0];
               if (tab.length > 1)            
                  decPart = padZeroRight(tab[1], nbDecAdeliaType);            
               else
                  decPart = padZeroLeft('', nbDecAdeliaType);
            }
            if (lgAdeliaType <= 2)
               return intPart + decPart;
            if (lgAdeliaType == 3)
            {
               res = intPart + decPart;
               res = padZeroLeft(res, 2);
               return res.substring(0, res.length - 1) + '/' + res.charAt(res.length - 1);            
            }
            if (lgAdeliaType == 4)
            {
               res = intPart + decPart;
               res = padZeroLeft(res, 3);
               return res.substring(0, res.length - 2) + '/' + res.substring(res.length - 2);
            }
            if (lgAdeliaType == 5)
            {
               res = intPart + decPart;
               res = padZeroLeft(res, 4);
               if (res.length == 4)
                  return res.substring(0, res.length - 2) + '/' + res.substring(res.length - 2);
               else
                  return res.substring(0, 2) + '/' + res.substring(2, 4) + '/' + res.charAt(4);
   
            }
            else
            {
               res = intPart + decPart;
               res = padZeroLeft(res, 5);
               return res.substring(0, res.length - 4) + '/' + res.substring(res.length - 4, res.length - 2) +
                  '/' + res.substring(res.length - 2);
            }
            break;
      }
   }
}

function DeleteBeginingBlanks (pNom)
{
   var index = 0;
   
   while (index < pNom.length && pNom.charAt(index) == ' ')
      index++;
      
   if (index == 0)
      return pNom;
   else if (index == pNom.length)
      return '';
   else
      return pNom.substring(index);   
}

function DeleteEndBlanks (pNom)
{
   var index = pNom.length - 1;
   
   while (index >= 0 && pNom.charAt(index) == ' ')
      index--;
      
   if (index < 0)
      return '';
   else if (index == pNom.length - 1)
      return pNom;
   else
      return pNom.substring(0, index + 1);   
}

function SscItoA(valNum, lgAdeliaType, nbDecAdeliaType, editWord)
{
   var NumeriqueNegatif = valNum < 0;
   var pBuffer;
   
   if (NumeriqueNegatif)
      valNum = -valNum;
      
   switch(TypeC(lgAdeliaType, nbDecAdeliaType))
   {
      case UTP_LONG :         
         pBuffer = stprintfLong (lgAdeliaType, valNum);
         break;
         
      case UTP_LONG_DOUBLE :         
         pBuffer = stprintfLongDouble (lgAdeliaType, nbDecAdeliaType, valNum);
         break;
   }
   /* SUPPRESSION DU POINT DANS pBuffer */   
   pBuffer = pBuffer.replace (/\./, '');
   return ConstEditWord (editWord, NumeriqueNegatif, pBuffer);
}

// Simule l'appel _stprintf (pBuffer, _T("%*ld"), Longueur, (long)Numerique)
function stprintfLong (Longueur, Numerique)
{   
   return padCarLeft(Numerique, ' ', Longueur);   
}
         
// Simule l'appel _stprintf (pBuffer, _T("%#*.*Lf"), Longueur, NbDecimale, Numerique)                        
function stprintfLongDouble (Longueur, NbDecimale, Numerique)
{
   var tab, decPart, intPart;
      
   tab = Numerique.toString().split('.');          
   intPart = padCarLeft(tab[0], ' ', Longueur - NbDecimale);
   if (tab.length > 1)            
      decPart = padZeroRight(tab[1], NbDecimale);            
   else
      decPart = padZeroLeft('', NbDecimale);

   return intPart + '.' + decPart;
}         

function ConstEditWord (editWord, NumeriqueNegatif, pNumerique)
{
   var NbDigit = pNumerique.length;
   var i, p, p1, pIndiceZero;      
   var CarRecherche = /\*|\x20|0/;
   var IndiceEtoile = -1;
   var IndiceZero	= Number.MAX_VALUE;
   var pBuffer = new String(editWord);
   var ExisteSgnDebut = false;
   
   if (parseFloat(pNumerique) == 0.0)
   {
      pNumerique = '';
      for (i = 1; i <= NbDigit; i++)
         pNumerique += ' ';
   }
   /* MISE EN PLACE DES DIGITS DANS LE MOT EDITION */
   i = 0;
   p = 0;
   pIndiceZero = pBuffer.length;   
   while ((i < NbDigit) && ((p1 = pBuffer.substring(p).search(CarRecherche)) != -1))   
   {
      p += p1;      
      if (pBuffer.charAt(p) == '*')
      {
	        IndiceEtoile  = p;	        
           CarRecherche = /\x20/;
      }      
      if (pBuffer.charAt(p) == '0')
      {
	        pIndiceZero = IndiceZero = p;	         	    
           CarRecherche = /\x20/;
      }      
      pBuffer = setCharAt (pBuffer, pNumerique.charAt(i), p);
      i++;      
      p++;
   }
   /* MISE EN PLACE DES CARACTERES '*'			*/
   /* CETTE MISE A JOUR SE PASSE EN 2 ETAPES		*/
   /*  - METTRE DES * A GAUCHE DE l'ETOILE APPARAISSANT */
   /*	 DANS LE MOT EDITION				*/
   /*  - METTRE DES 0 A DROITE DE l'ETOILE APPARAISSANT */
   /*	 DANS LE MOT D'EDITION                          */

   /* PREMIERE ETAPE */
   i = 0;   
   while ((i <= IndiceEtoile) && (! pBuffer.charAt(i).isDigits() || (pBuffer.charAt(i) == '0')))
   {
      if ((pBuffer.charAt(i) == '0') || (pBuffer.charAt(i) == ' '))	      
         pBuffer = setCharAt (pBuffer, '*', i);

      i++;
   }
   /* SECONDE ETAPE */
   if (IndiceEtoile >= 0)
   {
      i = IndiceEtoile;      
      while (i < pBuffer.length)
      {
         if (pBuffer.charAt(i) == ' ')	           
            pBuffer = setCharAt (pBuffer, '0', i);

         i++;
      }
   }
   /* MISE EN PLACE DU CARACTERE '0' */
   i = pBuffer.length - 1;
   while (i > IndiceZero)
   {
      if (pBuffer.charAt(i) == ' ')	        
         pBuffer = setCharAt (pBuffer, '0', i);

      i--;
   }
   /* Test l'existence d'un signe en debut de chaine */
   ExisteSgnDebut = WhereIsSigne(pBuffer) == FIRST;
   
   /* SUPPRESSION DES CARACTERES DU MOT D'EDITION SI LE NOMBRE */
   /* EST TROP PETIT  EX: Mot d'edition = '   .   ,  ' et 12,4 */
   /* DANS CE CAS LA IL FAUT SUPPRIMER LE POINT 	       */
   /* DANS LE CAS GENERAL IL FAUT SUPPRIMER TOUS LES CARACTERES*/
   /* A GAUCHE DU DIGIT LE PLUS A GAUCHE.		       */
   /* CAS PARTICULIER : 1. QUAND LE CARACTERE A GAUCHE DU DIGIT LE */
   /*			  PLUS A GAUCHE EST EGAL AU POINT DECIMAL */
   /*			  ON GARDE LE POINT DECIMAL		  */   
   if ((p = pBuffer.search(/\d|\*/)) != -1)
   {      
      if ((p != 0) && pBuffer.charAt(p).isDigits() && (pBuffer.substring(p - 1).indexOf(DECIMAL_SEPARATOR) == (p - 1)))
         p--;
      
      pBuffer = memset (pBuffer, ' ', Math.min (p, pIndiceZero + 1));
   }
   else      
      pBuffer = memset(pBuffer, ' ', pBuffer.length);
      
   /* MISE EN PLACE DU SIGNE */
   if (! NumeriqueNegatif) /* Numerique positif : suppression du signe */
   {
      pBuffer = SuppSigne (pBuffer);
   }
   else /* Negatif */
   {
      if (ExisteSgnDebut)
	        pBuffer = AjouteSigneDebut(pBuffer);
      else
	        pBuffer = ModifSigne(pBuffer);
   }   
   pBuffer = replaceCar (pBuffer, '&', ' ');   
   return pBuffer;
}

function ModifSigne (pBuff)
{
   switch (WhereIsSigne(pBuff))
   {
      case LAST :
      {
         switch (KindLastSigne(pBuff))
         {
           case SGN1 :	             
                pBuff = setCharAt(pBuff, ISC_CHAR_SIGNE_NEGATIF_1, pBuff.length - 1);
	             break;

           case SGN2 :	             
                pBuff = setCharAt(pBuff, ISC_CHAR_SIGNE_NEGATIF_21, pBuff.length - 2);	             
                pBuff = setCharAt(pBuff, ISC_CHAR_SIGNE_NEGATIF_22, pBuff.length - 1);
	             break;
         }
         if (ExistFirstSigne(pBuff))       
            pBuff = setCharAt(pBuff, ' ', 0);         
      }
      break;

      case FIRST :
      {         
         pBuff = SuppSigne(pBuff);
         pBuff = ShiftStringToLeft(pBuff);
         pBuff = ISC_SIGNE_NEGATIF_1 + pBuff;         
      }
      break;
   }
   return pBuff;
}

function ShiftStringToLeft (pNom)
{   
   var i = 0;

   while ((i < pNom.length) && pNom.charAt(i) == ' ')
      i++;
      
   if (i == 0)
      return pNom;
   else
      return pNom.substring(i, pNom.length);
}

function AjouteSigneDebut (pBuff)
{ 
    pBuff = ShiftStringToLeft(pBuff);
    return ISC_SIGNE_NEGATIF_1 + pBuff;  
}

function SuppSigne (pBuff)
{
   switch (WhereIsSigne(pBuff))
   {
      case LAST :      
         switch (KindLastSigne(pBuff))
         {
            case SGN1 :               
               pBuff = pBuff.substring(0, pBuff.length - 1);
               break;
         
            case SGN2 :            
               pBuff = pBuff.substring(0, pBuff.length - 2);
               break;
         }
         if (ExistFirstSigne(pBuff))         
            pBuff = setCharAt (pBuff, ' ', 0);               

         break;

      case FIRST :      
         pBuff = setCharAt (pBuff, ' ', 0);      
         break;
   }
   return pBuff;
}

function ExistFirstSigne (pBuff)
{   
   if ((pBuff.charAt(0) == ISC_CHAR_CODE_SIGNE_NEG_1) || (pBuff.charAt(0) == ISC_CHAR_SIGNE_NEGATIF_1))
      return true;

   return false;
}

function KindLastSigne (pBuff)
{
   var LgBuff = pBuff.length; 

   /* Signe '-' en derniere position */
   if ((pBuff.charAt(LgBuff - 1) == ISC_CHAR_CODE_SIGNE_NEG_1) || (pBuff.charAt(LgBuff - 1) == ISC_CHAR_SIGNE_NEGATIF_1))
      return SGN1;
   else
      return SGN2;
}

function memset (buf, car, nbCar)
{
   var tabCar = buf.split('');
   for (var i = 0; i < nbCar; i++)
   {
      tabCar[i] = car;
   }
   return tabCar.join('');
}

function WhereIsSigne (pBuff)
{
   var LgBuff = pBuff.length;   

   /* Signe '-' en derniere position */
   if ((LgBuff > 0) && ((pBuff.charAt(LgBuff - 1) == ISC_CHAR_CODE_SIGNE_NEG_1) || (pBuff.charAt(LgBuff - 1) == ISC_CHAR_SIGNE_NEGATIF_1)))
      return LAST;

   /* Signe 'CR' en derniere position */
   if ((LgBuff > 1) && (pBuff.charAt(LgBuff - 2) == ISC_CHAR_CODE_SIGNE_NEG_2) && (pBuff.charAt(LgBuff - 1) == ISC_CHAR_CODE_SIGNE_NEG_2))
      return LAST;

   /* Signe '-' en premiere position */
   if ((pBuff.charAt(0) == ISC_CHAR_CODE_SIGNE_NEG_1) || (pBuff.charAt(0) == ISC_CHAR_SIGNE_NEGATIF_1))
      return FIRST;

   return NONE;

}

function TypeC(lgAdeliaType, nbDecAdeliaType)
{
   return (donneTypeC(lgAdeliaType, nbDecAdeliaType));
}

function donneTypeC (lgAdeliaType, nbDecAdeliaType)
{
   // Si longueur ou nbre decimales en erreur
   if ((nbDecAdeliaType < 0) || (lgAdeliaType <= 0) || (lgAdeliaType > UTP_LONG_MAX_VAR_NUMERIQUE))
       return(UTP_ERROR);

   if ((lgAdeliaType >= 10) || (nbDecAdeliaType != 0))
      return(UTP_LONG_DOUBLE);
   else 
      return(UTP_LONG);
} 

function CarZeroEnDebutMotEdition (editWord, adeliaLong)
{
   var nbCarEspace;
   var AntiSuppression = true;
   var pDebut;

   if (editWord == null)
      return false;
 
   if ((editWord.charAt(0) != '0') && ((editWord.charAt(0) != ISC_CHAR_CODE_SIGNE_NEG_1)  || (editWord.charAt(1) != '0')))
      return false;

   nbCarEspace = 0;   
   pDebut = editWord.indexOf('0');
   if (pDebut == -1)
      return false;
      
   pDebut++;   
   while (pDebut < editWord.length)
   {         
      if (editWord.charAt(pDebut) == ' ')
         nbCarEspace++;
      else
      {   
         if ((editWord.charAt(pDebut) == '*') && AntiSuppression)
         {
            AntiSuppression = false;
            nbCarEspace++;
         }
      }
      pDebut++;
   }
   return (adeliaLong == nbCarEspace);
}

function insertGroupingSep(val)
{   
   var res = '', temp, index, mod3 = 3;
 
   // convertion de val en chaine au cas
   // ou c'est un int  
   temp = val.toString();   
   if (temp.length <= 3)
      return temp;
       
   index = temp.length - 1;
   while (index >= 0)
   {
      if (mod3 == 0)
      {
         res = GROUPING_SEPARATOR + res;
         mod3 = 3;
      }         
      res = temp.charAt(index) + res;
      index--;          
      mod3--;
   }
   return res;
}

function SscDateVersTexte2 (adeliaDate, editCode)
{
   if (editCode == VGENJSP_CDE_BLV && adeliaDate == LOVAL_DATE)
      return '';
   else
      return SscDateVersTexte (adeliaDate);
}

function SscTimeVersTexte2 (adeliaTime, editCode)
{
   if (editCode == VGENJSP_CDE_BLV && adeliaTime == LOVAL_TIME)
      return '';
   else
      return SscTimeVersTexte (adeliaTime);
}

function SscTimeStampVersTexte2 (adeliaTimeStamp, editCode)
{
   if (editCode == VGENJSP_CDE_BLV && adeliaTimeStamp[0] == LOVAL_DATE && adeliaTimeStamp[1] == LOVAL_TIME 
      && adeliaTimeStamp[2] == 0)
      return '';
   else
      return SscTimeStampVersTexte (adeliaTimeStamp);
}

function SscDateVersTexte (adeliaDate)
{   
   var year, month, day;
   var res = "";
	
	// extraction annee, mois, jour
   year = getYearAdeliaDate(adeliaDate);
   month = getMonthAdeliaDate(adeliaDate);
   day = getDayAdeliaDate(adeliaDate);
   
	for (var i = 0; i < DATE_PATTERN.length; i++)
   {      
      switch (DATE_PATTERN.charAt(i))
      {
         case 'D' :
            res = res + padZeroLeft(day, 2);
            break;

         case 'M' :
            res = res + padZeroLeft(month, 2);
            break;

         case 'Y' :
         	res = res + padZeroLeft(year, 4);
         	break;
      }
      if (i < 2)
      	res = res + DATE_SEPARATOR;
   }   
   return res;
}

function SscTimeVersTexte (adeliaTime)
{   
   var hour, minute, second;
   var res = "";
	
	// extraction heure, minute, seconde
   hour = getHourAdeliaTime (adeliaTime);
   minute = getMinuteAdeliaTime (adeliaTime);
   second = getSecondAdeliaTime (adeliaTime);
	for (var i = 0; i < TIME_PATTERN.length; i++)
   {      
      switch (TIME_PATTERN.charAt(i))
      {
         case 'H' :
            res = res + padZeroLeft(hour, 2);
            break;

         case 'M' :
            res = res + padZeroLeft(minute, 2);
            break;

         case 'S' :
         	res = res + padZeroLeft(second, 2);
         	break;
      }
      if (i < 2)
      	res = res + TIME_SEPARATOR;
   }   
   return res;
}

function SscTimeStampVersTexte (adeliaTimeStamp)
{
   var res = SscDateVersTexte(adeliaTimeStamp[0]);
   
   res = res + '-' + SscTimeVersTexte(adeliaTimeStamp[1]);
   res = res + TIME_SEPARATOR + padZeroRight(adeliaTimeStamp[2], 3);
   return res;
}

function SscVerifNumerique (valTxt, adeliaTypeLg, adeliaTypeNbDec, mandatory, inputCtrl)
{
   var res, tmpVal;
   
   tmpVal = SupprimeEditWord (valTxt);
   if ((res = VerifierType(inputCtrl, mandatory, tmpVal)) != ISC_OK)
   {
      switch (res)
      {
      case ISC_ZONE_VIDE :
         return ISC_NUM_VIDE;

      case ISC_ZONE_INCORRECTE :
         return ISC_NUM_INCORRECTE;
      }         
   }
   return VerifierLgNbDecimal (tmpVal, adeliaTypeLg, adeliaTypeNbDec);
}

function SupprimeEditWord (valTxt)
{
   var res = '', negSign;

   negSign = (valTxt.indexOf(ISC_CHAR_SIGNE_NEGATIF_1) == 0) || valTxt.endWith(ISC_CHAR_SIGNE_NEGATIF_1) || valTxt.endWith(ISC_SIGNE_NEGATIF_2);
      
   for (var i = 0; i < valTxt.length; i++)
   {
      if (valTxt.charAt(i).isDigits() || (valTxt.charAt(i) == DECIMAL_SEPARATOR))
         res += valTxt.charAt(i);
   }
   if (negSign)
      res = ISC_CHAR_SIGNE_NEGATIF_1 + res;
      
   return res;
}

/*
* Cette fonction est identique a VerifierLgNbDecimal dans ssclasse.c
* ValTxt est debarrasse est car d'un mot d'edition eventuel
* Attention : on suppose que si valTxt est negatif, le signe est
* son premier car (pas en fin, ni CR)
*/
function VerifierLgNbDecimal (valTxt, lgAdeliaType, nbDecAdeliaType)
{
   var parts = valTxt.split(DECIMAL_SEPARATOR), lg, nbDec;
   // Il faut recuperer le nb de chiffres de la partie entiere et
   // de la partie decimale si elle existe sans compter les car 0 superflux
   // ex: 012, 12,10, etc.
   if (parts[0].length == 0)
      lg = 1;
   else
      // pour supprimer les 0 de la partie entiere, on la parse en int
      // puis on la convertie en string
      lg = parseInt(parts[0], 10).toString().length;
      if (parts[0].charAt(0) == ISC_CHAR_SIGNE_NEGATIF_1)
         lg--;
      
   if (parts.length > 1)
   {
      // Idem pour la partie decimale
      if (parts[1].length == 0)
         nbDec = 0;
      else
      {
      	// Il faut compter les zero devant
      	//var nbZero = 0, i;
      	for (i = parts[1].length - 1; i >= 0; i--)
      	{
      		if (parts[1].charAt(i) != '0')      			
      			break;
      	}      	
         //nbDec = parseInt(parts[1], 10).toString().length;
         if (i < 0)
         	nbDec = 0;
         else
         	nbDec = i + 1;
      }
   }
   else
      nbDec = 0;

   if ((lg > (lgAdeliaType - nbDecAdeliaType)) || (nbDec > nbDecAdeliaType))
       return ISC_NUM_LG_NBDEC_INCORRECTE;
   else
      return ISC_OK;
}

/*
* Fonction identique a VerifierType dans ssclasse.c
*/ 
function VerifierType (inputCtrl, mandatory, valTxt)
{
   var res = ISC_OK;
   
   if (inputCtrl != VGENJSP_CAUCUN)
   {
      if (mandatory && valTxt == '')
         res = ISC_ZONE_VIDE;
      else
      {
         if (! analyseLexicale (valTxt, inputCtrl))
            res = ISC_ZONE_INCORRECTE;         	           
      }      
   }
   return res;
}

/*
* Fonction identique a AnalyseLexicale dans ssclasse.c
*/ 
function analyseLexicale (valTxt, inputCtrl)
{   
   var regExp;

   switch (inputCtrl)
   {
      case VGENJSP_DATE :
         regExp = new RegExp(REG_EXP_DATE);
         break;
         
      case VGENJSP_DATEXT :         
         regExp = new RegExp(REG_EXP_DATEXT);         
         break;

      case VGENJSP_TIME :
         regExp = new RegExp(REG_EXP_TIME);
         break;

      case VGENJSP_TIMEXT :
         regExp = new RegExp(REG_EXP_TIMEXT);        
         break;
         
      case VGENJSP_TIMESTAMP :
         regExp = new RegExp(REG_EXP_TIMESTAMP);        
         break;
         
      case VGENJSP_ZONEIBM :
         regExp = new RegExp(REG_EXP_ZONEIBM);        
         break;
         
      case VGENJSP_TOUTMIN :
         regExp = new RegExp(REG_EXP_TOUTMIN);
         break;
         
      case VGENJSP_TOUTMAJ :
         regExp = new RegExp(REG_EXP_TOUTMAJ);
         break;
         
      case VGENJSP_LETMAJ :
         regExp = new RegExp(REG_EXP_LETMAJ);
         break;
         
      case VGENJSP_LETMAJCHIF :
         regExp = new RegExp(REG_EXP_LETMAJCHIF);
         break;
         
      case VGENJSP_NUMER :
         regExp = new RegExp(REG_EXP_NUMER);
         break;
         
      case VGENJSP_NUMEREXT :
         regExp = new RegExp(REG_EXP_NUMEREXT);
         break;
   }
   return regExp.test(valTxt);      
}

/*
* Fonction identique a SscMessageErreur dans ssclasse.c
* Attention : nb de parametres variable. Il depend du message
* a afficher.
*/
function SscMessageErreur (iscCode)
{
   var msg;

   switch (iscCode)
   {
      case ISC_ZONE_VIDE :               
         // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)
         alert(typeof(AWS_ERROR_MSG_EMPTY_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_ZONE'));
         break;         

      case ISC_ZONE_INCORRECTE :         
         // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)
         alert(typeof(AWS_ERROR_MSG_WRONG_ZONE) != 'undefined' ? AWS_ERROR_MSG_WRONG_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_ZONE'));
         break;
   
      case ISC_NUM_LG_NBDEC_INCORRECTE :               
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)
			if (typeof(AWS_ERROR_MSG_WRONG_NUM_ZONE_LENGTH_OR_DEC_PART) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_NUM_ZONE_LENGTH_OR_DEC_PART;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_NUM_ZONE_LENGTH_OR_DEC_PART');
         	         
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_ALPHA_LG_INCORRECTE : 
         // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)              
         alert(typeof(AWS_ERROR_MSG_WRONG_ALPHA_ZONE_LENGTH) != 'undefined' ? AWS_ERROR_MSG_WRONG_ALPHA_ZONE_LENGTH : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_ALPHA_ZONE_LENGTH'));
         break;
         
      case ISC_COLLER_INCORRECT :               
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)
         alert(typeof(AWS_ERROR_MSG_WRONG_PASTE) != 'undefined' ? AWS_ERROR_MSG_WRONG_PASTE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_PASTE'));
         break;   
   
      case ISC_NUM_VIDE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)
         alert(typeof(AWS_ERROR_MSG_EMPTY_NUM_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_NUM_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_NUM_ZONE'));
         break;
   
      case ISC_NUM_INCORRECTE :  
         // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_NUM_ZONE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_NUM_ZONE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_NUM_ZONE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_ALPHA_VIDE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
         alert(typeof(AWS_ERROR_MSG_EMPTY_ALPHA_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_ALPHA_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_ALPHA_ZONE'));
         break;
   
      case ISC_ALPHA_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_ALPHA_ZONE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_ALPHA_ZONE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_ALPHA_ZONE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_DATE_VIDE :
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
         alert(typeof(AWS_ERROR_MSG_EMPTY_DATE_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_DATE_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_DATE_ZONE'));
         break;
   
      case ISC_DATE_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_DATE_ZONE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_DATE_ZONE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_DATE_ZONE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_DATE_VAL_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_DATE_ZONE_VALUE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_DATE_ZONE_VALUE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_DATE_ZONE_VALUE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_TIME_VIDE :     
         // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)           
         alert(typeof(AWS_ERROR_MSG_EMPTY_TIME_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_TIME_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_TIME_ZONE'));
         break;
   
      case ISC_TIME_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_TIME_ZONE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_TIME_ZONE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_TIME_ZONE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_TIME_VAL_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_TIME_ZONE_VALUE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_TIME_ZONE_VALUE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_TIME_ZONE_VALUE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
   
      case ISC_TIMESTAMP_VIDE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
         alert(typeof(AWS_ERROR_MSG_EMPTY_TIMESTAMP_ZONE) != 'undefined' ? AWS_ERROR_MSG_EMPTY_TIMESTAMP_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_EMPTY_TIMESTAMP_ZONE'));
         break;
   
      case ISC_TIMESTAMP_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
         alert(typeof(AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE) != 'undefined' ? AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE'));
         break;
   
      case ISC_TIMESTAMP_VAL_INCORRECTE :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
			if (typeof(AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE_VALUE) != 'undefined')
         	msg = AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE_VALUE;
         else
         	msg = AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_TIMESTAMP_ZONE_VALUE');
         	
         alert(msg.replace('{0}', arguments[1]));
         break;
         
		case ISC_WRONG_FILE_EXTENSION :         
		   // Pour rester compatible si on ne re-genere pas le jsp 
			// Avant : on inclut AWSErrorMessage_XX.js qui definit des var globales (ex: AWS_ERROR_MSG_WRONG_ZONE, etc.)
			// Apres (re-generation v10) : on utilise un resourceBundle (plus de var globales)       
         alert(typeof(AWS_ERROR_MSG_WRONG_FILE_EXTENSION) != 'undefined' ? AWS_ERROR_MSG_WRONG_FILE_EXTENSION : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_WRONG_FILE_EXTENSION'));
         break;
   
      default :
         break; 
   }
}

// Detecte si la touche entree est appuyee dans un objet champ de saisie
// Traite le cas d'un unique champ de saisie dans le formulaire
// Cette fonction est declenchee apres un eventuel traitant sur le onkeypress du champ de saisie
function detectEnterKeyPressed(e)
{
   var keyCode;
   var eventSrc;
   var tagObj;

   if (document.all)
   {
      keyCode = event.keyCode;
      eventSrc = event.srcElement;
   }
   else
   {
      keyCode = e.keyCode;      
      eventSrc = e.target;
   }	
   if (keyCode == 13)
	{
		// Attention : 
      // Cas 1 : un unique entryfield et un bouton defaut dans un formulaire
		// la touche entree soumet le formulaire (onsubmit) sans declencher un onclick
		// sur un eventuel bouton submit present dans le formulaire (seulement sur IE)
      // Cas 2 : plusieurs controles dont un bouton image et un bouton defaut
      // la touche entree declenche un onclick du bouton le premier (par ordre de creation)
      // present  dans le formulaire (donc soit le bouton image, soit le bouton submit)      
		if ((eventSrc.tagName.toLowerCase() == 'input' && eventSrc.type.toLowerCase() == 'text') ||
         (eventSrc.tagName.toLowerCase() == 'input' && eventSrc.type.toLowerCase() == 'checkbox') ||
         (eventSrc.tagName.toLowerCase() == 'input' && eventSrc.type.toLowerCase() == 'password') ||
         (eventSrc.tagName.toLowerCase() == 'input' && eventSrc.type.toLowerCase() == 'file') ||
         (eventSrc.tagName.toLowerCase() == 'input' && eventSrc.type.toLowerCase() == 'radio') ||
         eventSrc.tagName.toLowerCase() == 'select')
		{
         // recherche :
         // - d'un bouton submit ou
         // - d'un bouton image avec la prop bouton par defaut (genere comme attribut dans la balise img)
         // pour declencher un click         
         tabObj = document.getElementsByTagName('INPUT');
         for (index = 0; index < tabObj.length; index++)
         {
            if ((tabObj[index].form == eventSrc.form) &&
               ((tabObj[index].type.toLowerCase() == 'image' && tabObj[index].getAttribute('defaultButton') != null) ||
                (tabObj[index].type.toLowerCase() == 'submit')) &&
					(tabObj[index].disabled == false))
            {
					// on declenche le traitant onclick sur le bouton trouve               
					tabObj[index].click();
					// on intercepte l'evenement pour ne pas qu'il declenche le submit sur le formulaire
               if (document.all)
                  event.returnValue = false;
               else
               {
                  // annuler le comportement par defaut
                  e.preventDefault();
					   return false;
               }
				}
         }         
         // si on a pas trouve de bouton candidat
         //on annule l'effet (le submit) de la touche entree
         if (document.all)
            event.returnValue = false;
         else
         {
            // annuler le comportement par defaut
            e.preventDefault();
   			return false;
         }
		}
	}
}

/*
the third argument to changeKey should be a function
  function exampleKeyChecker (keyCode, key)
which returns an object 
  { cancelKey: boolean, replaceKey: boolean, newKeyCode: number, newKey:
string }
Not all properties need to be present, if cancelKey is set to true the
other properties are not needed.
If replaceKey is set to true then at least newKeyCode needs to be set.
*/
function changeKey (textControl, evt, keyChecker) 
{
   var keyCode = evt.keyCode ? evt.keyCode : evt.charCode ? evt.charCode : evt.which ? evt.which : void 0;
   var key;

   if (keyCode)    
      key = String.fromCharCode(keyCode);
   
   var keyCheck = keyChecker(keyCode, key);
   if (keyCode && window.event && !window.opera)
   {
      if (keyCheck.cancelKey)    
         return false;      
      else if (keyCheck.replaceKey) 
      {
         window.event.keyCode = keyCheck.newKeyCode;
         if (window.event.preventDefault)          
            window.event.preventDefault();
         
         return true;
      }
      else       
         return true;      
   }
   else if (typeof textControl.setSelectionRange != 'undefined') 
   {
      if (keyCheck.cancelKey) 
      {
         if (evt.preventDefault)          
            evt.preventDefault();
         
         return false;
      }
      else if (keyCheck.replaceKey) 
      {
         // cancel the key event and insert the newKey for the current selection
         if (evt.preventDefault)          
	         evt.preventDefault();
         
         var oldSelectionStart = textControl.selectionStart;
         var oldSelectionEnd = textControl.selectionEnd;
         var selectedText = textControl.value.substring(oldSelectionStart, oldSelectionEnd);
         var newText = typeof keyCheck.newKey != 'undefined' ? keyCheck.newKey : 
            String.fromCharCode(keyCheck.newKeyCode);

         textControl.value = textControl.value.substring(0, oldSelectionStart) + newText +
            textControl.value.substring(oldSelectionEnd);
         textControl.setSelectionRange(oldSelectionStart + newText.length, oldSelectionStart + newText.length);
         return false;
      }
      else       
         return true;      
   }
   else if (keyCheck.cancelKey) 
   {
      if (evt.preventDefault)       
         evt.preventDefault();
      
      return false;
   }
   else    
      return true;   
}


function letterCode32To160 (keyCode, key)
{   
   return { replaceKey: true, newKeyCode: 160};
}

function lettersToUpperCase (keyCode, key) 
{
   var newKey = key.toUpperCase();
   if (newKey != key)    
      return { replaceKey: true, newKeyCode: newKey.charCodeAt(), newKey: newKey };   
   else
      return { cancelKey: false };  
}

function lettersToLowerCase (keyCode, key) 
{
   var newKey = key.toLowerCase();
   if (newKey != key)    
      return { replaceKey: true, newKeyCode: newKey.charCodeAt(), newKey: newKey };   
   else
      return { cancelKey: false };  
}

// Ajout des traitants permettant de detecter l'appui sur la touche entree
// dans un controle de la page en cours (pour la gestion du bouton par defaut)
window.document.onkeypress = detectEnterKeyPressed;


/*
* Gestion des ordres TRAITER_PGM *POPUP
*/

/*
* Gere l'affichage d'une fenetre non modale
* Url : l'URL du pgm a afficher
* CmdLine : parametres de la fonction open
*/
function showModlessWindow (Url, CmdLine)
{   
   // ajout d'un parametre bidon timestamp pour
   // rendre unique l'url et empecher le cache par le navigateur
   if (Url.indexOf('?') == -1)
      Url += '?';
   else
      Url += '&';
   
   Url += 'AdeliaTS=' + new Date().getTime();
   
   try
   {
	   var newWin = window.open(Url,"", CmdLine);
   }
   catch (ex)
   {
      alert(typeof(AWS_ERROR_MSG_CREATE_POPUP) != 'undefined' ? AWS_ERROR_MSG_CREATE_POPUP : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_CREATE_POPUP'));
      return;
   }
   try
   {
      // parfois, Sous IE, cette instruction provoque une exception
	   newWin.document.close();
   }
   catch (ex)
   {
   }
}

// Timer utilise pour la gestion de la modalite
var TIMER_WIN_MODAL = 50;
/*
* Gere l'affichage d'une fenetre modale
* Url : l'URL du pgm a afficher
* CmdLine : parametres de la fonction open
*/
function showModalWindow (Url, CmdLine)
{
   var openPopupOk;
	var oldWindowOnFocus = window.onfocus;

	window.onfocus = setModalWindow;
   // ajout d'un parametre bidon timestamp pour
   // rendre unique l'url et empecher le cache par le navigateur
   if (Url.indexOf('?') == -1)
      Url += '?';
   else
      Url += '&';

   Url += 'AdeliaTS=' + new Date().getTime();
   
	openPopupOk = openModalWindow(Url, CmdLine, "", "");
   if (openPopupOk)
   {
	   // la fonction disableMouseEvents est declanchee apres la creation du body
	   // car elle l'utilise
	   dialogWin.idDisableMouseEvents = window.setInterval("disableMouseEvents()", TIMER_WIN_MODAL);
	   dialogWin.idCheckWindowClosed = window.setInterval("checkWindowClosed()", TIMER_WIN_MODAL);
	   dialogWin.oldWindowOnFocus = oldWindowOnFocus;
   }
   else
   {
      window.onfocus = oldWindowOnFocus;
   }
}

/*
* Fonction qui permet de fixer les valeurs des champs caches
* AdeliaKey<JspName>IsPopupCall et AdeliaKey<JspName>CalledFromPgmName
* lors de l'appel d'un programme en *POPUP
* Url : nom du fichier jsp du pgm a appele
* CalledFromPgmName : Nom du fichier jsp du pgm appelant
*/
function setIsPopupCall(Url, CalledFromPgmName)
{   
   var newUrl, temp;

   // Extraction du nom du jsp sans l'extension
   temp = Url.substring(0, Url.lastIndexOf('.jsp'));
   newUrl = new String (Url);
   if (newUrl.indexOf('?') == -1)
      newUrl += '?';
   else
      newUrl += '&';
 
   // Modification de l'url en ajoutant les parametres
   // AdeliaKey<JspName>IsPopupCall et AdeliaKey<JspName>CalledFromPgmName avec leur valeur
   newUrl += 'AdeliaKey' + temp + 'IsPopupCall=Y&AdeliaKey' + temp + 'CalledFromPgmName=' + CalledFromPgmName;
   return newUrl;
}

/*
* Debut Gestion de la modalite
* La fenetre appelante ne peut pas devenir active ni prendre le focus. De plus, les événements souris
* sont desactives
* La fenetre appelee reste en avant plan
*/

// One object tracks the current modal dialog opened from this window.
var dialogWin = new Object();
// Flag indiquant que le chargement du body par le browser est fait
var topBody = false;
/*
*
*/
function openModalWindow(Url, CmdLine, returnFunc, args)
{
   var res = true;
   var dlgClosed = false;
			
	try
	{
		// L'installation du Cumulative Security Update for Internet Explorer for Windows XP (KB918899) (IE 6)
		// fait en sorte que lorsqu'on ferme une window, pendant qq ms, l'acces a ces prop declenche une erreur permission denied
		// D'ou le try / catch
		if (dialogWin.win)
			dlgClosed = dialogWin.win.closed;
	}
	catch (e)
	{
		dlgClosed = false;
	}	
	if (!dialogWin.win || (dialogWin.win && dlgClosed))
	{
		// Initialize properties of the modal dialog object.
		dialogWin.returnFunc = returnFunc;
		dialogWin.returnedValue = "";
		dialogWin.args = args;
		// Keep name unique so Navigator doesn't overwrite an existing dialog.
		//dialogWin.name = (new Date()).getSeconds().toString()
      dialogWin.name = "";

		// Generate the dialog and make sure it has focus.
      try
      {
		   dialogWin.win = window.open(Url, dialogWin.name, CmdLine);
		   dialogWin.win.focus();
      }
      catch (ex)
      {
         alert(typeof(AWS_ERROR_MSG_CREATE_POPUP) != 'undefined' ? AWS_ERROR_MSG_CREATE_POPUP : AWSErrorMsgBundle.getString('AWS_ERROR_MSG_CREATE_POPUP'));
         res = false;
      }
	}
	else
		dialogWin.win.focus();

   return res;
}

/*
* Fonction qui simule la modalite d'une fenetre
* La fenetre parent (appelante) ne peut pas prendre le focus
* La fenetre modale reste en avant plan par rapport a la fenetre appelee
*/
function setModalWindow(event)
{
	setTimeout("keepFocusWindow()", TIMER_WIN_MODAL);
	return true;
}

/*
* Fixe le focus (activite et premier plan) d'une fenetre modale
*/
function keepFocusWindow()
{
	var dlgClosed = false;
			
	try
	{
		// L'installation du Cumulative Security Update for Internet Explorer for Windows XP (KB918899) (IE 6)
		// fait en sorte que lorsqu'on ferme une window, pendant qq ms, l'acces a ces prop declenche une erreur permission denied
		// D'ou le try / catch
		if (dialogWin.win)
			dlgClosed = dialogWin.win.closed;
	}
	catch (e)
	{
		dlgClosed = false;
	}	
	if (dialogWin.win && ! dlgClosed)
		dialogWin.win.focus();
}

/*
* Cree un div sur le fenetre modale pour desactiver les evenements souris
*/
function disableMouseEvents()
{
	if (topBody)
	{
      var divNode = document.getElementById('AdeliaDisableDiv');
		if (divNode == null)
		{
			// creation du div et positionnement
			divNode = document.createElement("div");
			divNode.id = 'AdeliaDisableDiv';
			// Mettre un tableau dans le div pour que les evt souris ne soient pas
			// passes aux controles sous le div
			divNode.innerHTML = '<table width="100%" height="100%" style="background-color:transparent"><tr><td>&nbsp;</td><td>&nbsp;</td></tr></table>'
			divNode.style.left = 0;
			divNode.style.top = 0;
			divNode.style.height = '100%';
			// la largeur du div est celle du body
			divNode.style.width = '100%';
			divNode.style.position = 'absolute';
			divNode.style.zindex = 99;
			divNode.style.visibility = "visible";
			divNode.style.backgroundColor = 'transparent';			
			// Ajout du div au body
			document.body.appendChild(divNode);
		}
      else
         divNode.style.visibility = "visible";

		// Modification du body pour que la hauteur du div soit celle du body
		dialogWin.oldBodyStyleHeight = document.body.style.height;
		document.body.style.height = '100%';
		// Rafraichissement du div pour que sa largeur soit prise en compte (bug IE ?)
		setTimeout('refeshAdeliaDisableDiv()', TIMER_WIN_MODAL);

		// Ajout de listeners permettant de cacher / rendre visible le div
		// des que le curseur est sur la fenetre appelante.
		// On cache le div si le curseur souris n'est pas dans la fenetre appelante
		// pour que lors d'un redimentionnement de la fenetre appelante le div ai
		// la bonne taille (seule solution trouvee pour eviter les problemes de
		// redimentionnement de la fenetre...)
		dialogWin.oldBodyOnMouseOver = document.body.onmouseover;
		document.body.onmouseover = setVisibleDiv;
		dialogWin.oldBodyOnMouseOut = document.body.onmouseout;
		document.body.onmouseout = hiddeDiv;
		divNode.onmouseout = hiddeDiv;

		window.clearInterval(dialogWin.idDisableMouseEvents);
	}
}

function refeshAdeliaDisableDiv()
{
	// Besoin de refresh pour maj de la width du div
	var divNode = document.getElementById('AdeliaDisableDiv');
	divNode.style.visibility = "hidden";
	divNode.style.visibility = "visible";
}

/*
* Rend visible le div AdeliaDisableDiv permettant d'intercepter
* les evt souris
*/
function setVisibleDiv(event)
{
	var dlgClosed = false;
			
	try
	{
		// L'installation du Cumulative Security Update for Internet Explorer for Windows XP (KB918899) (IE 6)
		// fait en sorte que lorsqu'on ferme une window, pendant qq ms, l'acces a ces prop declenche une erreur permission denied
		// D'ou le try / catch
		if (dialogWin.win)
			dlgClosed = dialogWin.win.closed;
	}
	catch (e)
	{
		dlgClosed = false;
	}	
	if (dialogWin.win && ! dlgClosed)
	{
		var divNode = document.getElementById('AdeliaDisableDiv');
		divNode.style.visibility = "visible";
	}
}

/*
* Rend invisible le div AdeliaDisableDiv
*/
function hiddeDiv(event)
{
	var dlgClosed = false;
			
	try
	{
		// L'installation du Cumulative Security Update for Internet Explorer for Windows XP (KB918899) (IE 6)
		// fait en sorte que lorsqu'on ferme une window, pendant qq ms, l'acces a ces prop declenche une erreur permission denied
		// D'ou le try / catch
		if (dialogWin.win)
			dlgClosed = dialogWin.win.closed;
	}
	catch (e)
	{
		dlgClosed = false;
	}	
	if (dialogWin.win && ! dlgClosed)
	{
		var divNode = document.getElementById('AdeliaDisableDiv');
		divNode.style.visibility = "hidden";
	}
}

function bodyLoaded()
{
	topBody = true;
}

BodyLoaded.addExec('bodyLoaded();');


/*
* Test si la fenetre modale est fermee par l'utilisateur.
* Si c'est le cas, on refixe les anciennes valeurs de traitants
* et on cache le div
*/
function checkWindowClosed ()
{
	var dlgClosed = false;
			
	try
	{
		// L'installation du Cumulative Security Update for Internet Explorer for Windows XP (KB918899) (IE 6)
		// fait en sorte que lorsqu'on ferme une window, pendant qq ms, l'acces a ces prop declenche une erreur permission denied
		// D'ou le try / catch
		if (dialogWin.win)
			dlgClosed = dialogWin.win.closed;
	}
	catch (e)
	{
		dlgClosed = false;
	}	
	if (dialogWin.win && dlgClosed)
	{  
		clearInterval(dialogWin.idCheckWindowClosed);
		dialogWin.win = null;
		if (typeof(dialogWin.oldWindowOnFocus) != 'undefined')
			window.onfocus = dialogWin.oldWindowOnFocus;
		if (typeof(dialogWin.oldBodyStyleHeight) != 'undefined')
			document.body.style.height = dialogWin.oldBodyStyleHeight;
		if (typeof(dialogWin.oldBodyOnMouseOver) != 'undefined')
			document.body.onmouseover = dialogWin.oldBodyOnMouseOver;
		if (typeof(dialogWin.oldBodyOnMouseOut) != 'undefined')
			document.body.onmouseout = dialogWin.oldBodyOnMouseOut;

      var divNode = document.getElementById('AdeliaDisableDiv');
		divNode.style.visibility = "hidden";
	}
}
/*
* Fin Gestion de la modalite
*/

/*
* Fixe le focus sur le controle de nom ObjectName dans le formulaire FormName
* Si ObjectName est present plusieurs fois dans FormName, alors on met le focus
* sur l'occurence numero FocusIndex
*/
function focusObject (FormName, ObjectName, FocusIndex)
{
	var formTmp, tabObj, objTmp = null, focusIndexFound = true;

	if (ObjectName == '')
		return;

   // si on indique pas de nom de formulaire alors on prend le premier
	if (FormName == '')
		formTmp = document.forms[0];
	else
		formTmp = document.forms[FormName];

   // si on indique pas de numero d'occurence du controle alors on prend le premier
	if (FocusIndex == '' || FocusIndex == 0)
   {
		FocusIndex = 1;
      focusIndexFound = false;
   }

   // on recupere tous les controles dans la page qui ont pour nom ObjectName
	tabObj = document.getElementsByName(ObjectName);

   // recherche du controle d'occurence FocusIndex qui appartient au formulaire formTmp
	for (var i = 0; i < tabObj.length; i++)
	{
      // la propriete form n'existe que pour les objets de type
      // HTMLInputElement (un objet <a> n'en est pas)
      if (typeof (tabObj[i].form) != 'undefined')
      {
		   if (tabObj[i].form == formTmp)      
		   {
			   if (FocusIndex == 1)
			   {
				   objTmp = tabObj[i];
				   break;
			   }
			   else
				   FocusIndex--;
		   }
      }
      else
      {
         // recherche si un parent de cet objet est le formulaire
         var parent = tabObj[i].parentNode;
         while (parent != null)
         {
            if (parent == formTmp)
               break;
            else
               parent = parent.parentNode;
         }
         if (parent != null)
         {
            if (FocusIndex == 1)
			   {
				   objTmp = tabObj[i];
				   break;
			   }
			   else
				   FocusIndex--;
         }
      }
	}
	if (objTmp != null)
		focusObjectInForm(objTmp, focusIndexFound);	
}

/*
* Fixe le focus sur un controle donne
* Si ce controle est un radio bouton, alors on fixe le focus
* sur le radio bouton selectionne dans son groupe si on n'a pas
* specifie d'index (focusIndexFound a faux) sinon on fixe le
* focus sur cet objet
*/
function focusObjectInForm(Obj, focusIndexFound)
{
	if (Obj.type == 'radio' && ! focusIndexFound)
	{		
      var radioTab;

      // Recuperation des radio boutons appartenant au meme groupe que Obj
      if (document.all)
         // en IE, NomForm[NomRB] donne un tableau des radio boutons du groupe
         // Attention, NomForm.NomRB donne une erreur dans le cas ou NomRB est
         // le nom d'un rb dans une liste (ex: :lst:ID_WPAGE1:TBL_1:RDO_2:1)         
         radioTab = eval('Obj.form["' + Obj.name + '"]');
      else
      {
         // pas en NS
         var tabTmp = document.getElementsByName(Obj.name);

         radioTab = new Array();
         for (i = 0; i < tabTmp.length; i++)
         {
            if ((tabTmp[i].type == Obj.type) && (tabTmp[i].form == Obj.form))
               radioTab.push(tabTmp[i]);
         }
      }
      // Mettre le focus sur l'objet radio selectionne
		for (i = 0; i < radioTab.length; i++)
		{
			if (radioTab[i].checked)
			{
				radioTab[i].focus();
				break;
			}
		}
	}
	else
		Obj.focus();
}

/**
* Disable multi submit on Adelia event
* For exemple, multi clic on Adelia button
*/
var adeliaSubmitPerformed = false;

/**
* Time out (in milliseconds) to re-enable
* submit after Adelia event
*/
var timeOutEnableAdeliaSubmit = 3000;


/**
* Gestion de la touche point decimal dans le pave numerique
* dans les champ de saisie : si le type adelia est numerique avec
* decimales, alors on transforme ce car en separateur decimal
* (cf InputCtrlKeyPress) 
*/
// Variable indiquant si la touche pressee est la touche '.' du pave numerique
var padDecimalPointKeyPressed = false;

/*
* Fonction qui controle si la touche pressee est la touche '.' du pave numerique
* Fonction declenchee sur le onkeydown des champs input adelia dont le type adelia 
* est numerique avec decimales.
* On associe ce traitant au onkeydown car c'est le seul endroit ou on a la bonne
* valeur pour le keyCode (sur le onkeypressed on ne peut pas faire la distinction
* entre point du pave num et l'autre point (keyCode 46 pour les deux cas).
*/
function checkKeyPressed (e)
{
   var charCode = (e.which) ? e.which : event.keyCode;

   if (charCode == 110)
   {
      // num pad decimal point
      padDecimalPointKeyPressed = true;         
   }
   else
      // Si la touche appuyee est Shift + point
      // ou capslock puis point alors on tombe ici      
      padDecimalPointKeyPressed = false;
}

/*
* Fonction qui permet d'associer a tous les champs input adelia
* de type numerique avec decimales un traitant sur le onkeydown
* pour detecter l'appui sur le point du pave num
*/
function registerInputType()
{      
   var adeliaType, adeliaTypeNbDec;
   var tab = document.getElementsByTagName('INPUT');
   
   for (var i = 0; i < tab.length; i++)
   {
      if (tab[i].type && tab[i].type.toLowerCase() == 'text')    
      {
         // test si le champ input est un champ adelia
         if (((adeliaType = tab[i].getAttribute('adeliatype')) == null) ||
               ((adeliaTypeNbDec = tab[i].getAttribute('adeliatypenbdec')) == null))
            continue;
                  
         switch (parseInt(adeliaType))
         {
            case VGENJSP_TNUMP :
            case VGENJSP_TNUME :
               if (adeliaTypeNbDec != '' && adeliaTypeNbDec != '0')
                  addEventHandler(tab[i], 'keydown', checkKeyPressed);      
               break;
         }                  
      }
   }
   
   // Identique mais pour les textarea
   tab = document.getElementsByTagName('TEXTAREA');
   
   for (var i = 0; i < tab.length; i++)
   {      
      // test si le champ textarea est un champ adelia
      if (((adeliaType = tab[i].getAttribute('adeliatype')) == null) ||
            ((adeliaTypeNbDec = tab[i].getAttribute('adeliatypenbdec')) == null))
         continue;
               
      switch (parseInt(adeliaType))
      {
         case VGENJSP_TNUMP :
         case VGENJSP_TNUME :
            if (adeliaTypeNbDec != '' && adeliaTypeNbDec != '0')
               addEventHandler(tab[i], 'keydown', checkKeyPressed);      
            break;
      }                      
   }
}   
   
/*
* L'enregistement des traitant sur le keydown des champ de saisie
* se fait sur le onload de la window (equivalent au onload du body
* ou a la fct bodyLoaded
* Ca evite de generer des onkeydown dans le jsp.
*/
addEventHandler(window, 'load', registerInputType);

/*
* Retourne vrai si le car tape au clavier est
* un car editable (lettre ou car speciaux)
* - evt : evenement declenche sur le onkeydown
*/
function isEditableCar(evt)
{
	var code;
			
	if (ie)	
		code = evt.keyCode;					
	else	
		code = evt.which;
		
	if (evt.shiftKey || evt.ctrlKey || evt.altKey || ((typeof evt.metaKey != 'undefined') && evt.metaKey))
			return false;
			
	if ((code <= 31) && (code != 13))
      return false;
      
   if ((code >= 33) && (code <= 40))
   	// Dans l'ordre :
   	// page up, page down, end, home, left arrow, up arrow, right arrow, down arrow
   	return false;
   	
   if ((code == 45) || (code == 46))
   	// Dans l'ordre :
   	// inser, suppr
   	return false;
   		
   if ((code >= 91) && (code <= 93))
   	// Dans l'ordre :
   	// left window key, right window key, menu window key
   	return false;
   	
   if ((code >= 112) && (code <= 123))
   	// F1 a F12      	
   	return false;
   	
   if ((code == 144) || (code == 145))
   	// Dans l'ordre :
   	// verr num, arret defil
   	return false;
   	
	return true;
}

/*
* Fonction de validation d'un formulaire avant sa soumission
* Appelee par validate<FORM_NAME> definie dans le jsp
* - formName : nom du formulaire
*/
function validateForm (formName)
{
	var form = document.forms[formName];
	var tabObj,	obj, attrAdeliaType, attrInputCtrl, attrMandatory, typeLC;
	
	// Validation des champs de saisie INPUT TEXT et champ d'upload INPUT FILE
	tabObj = form.getElementsByTagName('INPUT');
	for (var i = 0; i < tabObj.length; i++)
	{
		obj = tabObj[i];
		typeLC = obj.type.toLowerCase();
		if (typeLC == 'text')
		{
			attrAdeliaType = obj.getAttribute('adeliatype');
			if (attrAdeliaType == null)
				// champ input non adelia
				continue;
				
			attrAdeliaType = parseInt(attrAdeliaType);
			attrInputCtrl = obj.getAttribute('inputctrl');
			if (attrInputCtrl != null)
				attrInputCtrl = parseInt(attrInputCtrl);
						
			attrMandatory = obj.getAttribute('mandatory') == 'true';
			if (attrMandatory || (attrInputCtrl != VGENJSP_CAUCUN)
				|| (attrAdeliaType != VGENJSP_TALPHA && attrAdeliaType != VGENJSP_TLIST && attrAdeliaType != VGENJSP_TBLO))
			{		
				var adeliaTypeLg = parseInt(obj.getAttribute('adeliatypelg'));
   			var adeliaTypeNbDec = parseInt(obj.getAttribute('adeliatypenbdec'));
   
					   //checkAdeliaValueSyntax(control, type, length, decimales, objet, form, DecimalSeparator, GroupingSeparator, DateSeparator, TimeSeparator, DatePattern, mandatory)
				if (! checkAdeliaValueSyntax(attrInputCtrl != null ? attrInputCtrl : VGENJSP_CAUCUN, attrAdeliaType, adeliaTypeLg, adeliaTypeNbDec, obj.name, formName, DECIMAL_SEPARATOR, GROUPING_SEPARATOR, DATE_SEPARATOR, TIME_SEPARATOR, DATE_PATTERN, attrMandatory))
            {
               obj.focus();
               return false;
            }		
			}
		}
		else if ((typeLC == 'file') && (obj.getAttribute('adeliactrl') != null))
		{				
			if (! checkInputFile (obj.name, formName))               
         	return false;           			
		}		
	}	            
	
	// Validation des champs de saisie TEXTAREA
	tabObj = form.getElementsByTagName('TEXTAREA');
	for (var i = 0; i < tabObj.length; i++)
	{
		obj = tabObj[i];		
		attrAdeliaType = obj.getAttribute('adeliatype');
		if (attrAdeliaType == null)
			// champ input non adelia
			continue;
			
		attrAdeliaType = parseInt(attrAdeliaType);
		attrInputCtrl = obj.getAttribute('inputctrl');
		if (attrInputCtrl != null)
			attrInputCtrl = parseInt(attrInputCtrl);
					
		attrMandatory = obj.getAttribute('mandatory') == 'true';
		if (attrMandatory || (attrInputCtrl == VGENJSP_DATEXT) || (attrInputCtrl == VGENJSP_ZONEIBM)
			|| (attrAdeliaType != VGENJSP_TALPHA && attrAdeliaType != VGENJSP_TLIST && attrAdeliaType != VGENJSP_TBLO))
		{		
			var adeliaTypeLg = parseInt(obj.getAttribute('adeliatypelg'));
			var adeliaTypeNbDec = parseInt(obj.getAttribute('adeliatypenbdec'));
				   
			if (! checkAdeliaValueSyntax(attrInputCtrl != null ? attrInputCtrl : VGENJSP_CAUCUN, attrAdeliaType, adeliaTypeLg, adeliaTypeNbDec, obj.name, formName, DECIMAL_SEPARATOR, GROUPING_SEPARATOR, DATE_SEPARATOR, TIME_SEPARATOR, DATE_PATTERN, attrMandatory))
         {
            obj.focus();
            return false;
         }		
		}				
	}	 
	return true;
}


/*
* Retourne dans un tableau tous les controles d'un objet colonne d'un liste ou
* d'une table liste
* Retourne un tableau d'elements (ou un tableau vide)
* adeliaPageName : nom de la page Adelia
* adeliaListName : nom de la liste
* adeliaColumnName : nom de l'objet colonne
*/
function getCellsElementsFromAdeliaList (adeliaPageName, adeliaListName, adeliaColumnName)
{	
	var tabResult = new Array(), tmpTab, attrValue;	
	var ctrlId = ':lst:' + adeliaPageName + ':' + adeliaListName + ':' + adeliaColumnName + ':';
	
	if (ie)
		tmpTab = document.all;
	else
		tmpTab = document.getElementsByTagName('*');
		
	for (var i = 0; i < tmpTab.length; i++)
	{
		attrValue = tmpTab[i].getAttribute('id');
		// Test si l'element a un attribut id commencant par ctrlId
		if ((attrValue != null) && (attrValue.indexOf(ctrlId) == 0))		
			tabResult.push(tmpTab[i]);		
	}
	return tabResult;
}

var awsBackPage = true;
