﻿/*
* Module de boite a outils et de definition des var globales
* Utilisé dans le runtime et dans le plugin dreamweaver.
* Utilise les fichiers js :
* - 
* ATTENTION : FICHIER A SAUVEGARDER TOUJOURS EN UTF-8
*/

// Flag indiquant si le fichier AWSGlobals.js est deja inclu
var AWSGLOBALS_JS_INCLUDED = true;

// Chemin du repertoire AWSResources dans la web app
var AWSRESOURCES_DIR_PATH;
// Langue geree par la session
var AWSRESOURCES_LANG;
// Chemin racine de la web app
var AWSCONTEXT_PATH;
// Langue par defaut geree par la jvm
var AWSRESOURCES_DEFAULT_LANG;

// Definition des valeurs de types Adelia (chaine)
var TA_DATE = 'DATE';
var TA_TIME = 'TIME';
var TA_CHAINE = 'ALPHA';
var TA_NUM_P = 'NUMP';
var TA_NUM_E = 'NUME';
var TA_BINAIRE_2 = 'NB2';
var TA_BINAIRE_4 = 'BIN4';
var TA_BOOL = 'BOOL';
var TA_TIME_STAMP = 'TMS';

// Definition des valeurs de types Adelia (int)
var VGENJSP_TDATE = 0;
var VGENJSP_TTIME = 1;
var VGENJSP_TALPHA = 2;
var VGENJSP_TNUMP = 3;
var VGENJSP_TNUME = 4;
var VGENJSP_TNB2 = 5;
var VGENJSP_TNB4 = 6;
var VGENJSP_TBOOL = 7;
var VGENJSP_TTMS = 8;
var VGENJSP_TLIST = 9;
var VGENJSP_TBLO = 10;

// Controles de saisie
var VGENJSP_CAUCUN = 0;
var VGENJSP_TOUTMAJ = 1;
var VGENJSP_TOUTMIN = 2;
var VGENJSP_NUMER = 3;
var VGENJSP_NUMEREXT = 4;
var VGENJSP_LETMAJ = 5;
var VGENJSP_LETMAJCHIF = 6;
var VGENJSP_ZONEIBM = 7;
var VGENJSP_DATE = 8;
var VGENJSP_DATEXT = 9;
var VGENJSP_TIME = 10;
var VGENJSP_TIMEXT = 11;
var VGENJSP_TIMESTAMP = 12;

// Codes edition
var VGENJSP_EAUCUN = 0;
var VGENJSP_CDE_A = 1;
var VGENJSP_CDE_B = 2;
var VGENJSP_CDE_C = 3;
var VGENJSP_CDE_D = 4;
var VGENJSP_CDE_J = 5;
var VGENJSP_CDE_K = 6;
var VGENJSP_CDE_L = 7;
var VGENJSP_CDE_M = 8;
var VGENJSP_CDE_N = 9;
var VGENJSP_CDE_O = 10;
var VGENJSP_CDE_P = 11;
var VGENJSP_CDE_Q = 12;
var VGENJSP_CDE_Y = 13;
var VGENJSP_CDE_Z = 14;
var VGENJSP_CDE_1 = 15;
var VGENJSP_CDE_2 = 16;
var VGENJSP_CDE_3 = 17;
var VGENJSP_CDE_4 = 18;
var VGENJSP_CDE_BLV = 19;

var ISC_OK = 0;
var ISC_ZONE_VIDE = 1;
var ISC_ZONE_INCORRECTE = 2;
var ISC_NUM_LG_NBDEC_INCORRECTE = 3;
var ISC_ALPHA_LG_INCORRECTE = 4;
var ISC_COLLER_INCORRECT = 5;
var ISC_NUM_VIDE = 6;
var ISC_NUM_INCORRECTE = 7;
var ISC_ALPHA_VIDE = 8;
var ISC_ALPHA_INCORRECTE = 9;
var ISC_DATE_VIDE = 10;
var ISC_DATE_INCORRECTE = 11;
var ISC_DATE_VAL_INCORRECTE = 12;
var ISC_TIME_VIDE = 13;
var ISC_TIME_INCORRECTE = 14;
var ISC_TIME_VAL_INCORRECTE = 15;
var ISC_TIMESTAMP_VIDE = 16;
var ISC_TIMESTAMP_INCORRECTE = 17;
var ISC_TIMESTAMP_VAL_INCORRECTE = 18;
var ISC_WRONG_FILE_EXTENSION = 19;

var ISC_CHAR_SIGNE_NEGATIF_1 = '-';
var ISC_SIGNE_NEGATIF_2 = 'CR';

// Signe negatif 1 = '-'
var ISC_CHAR_CODE_SIGNE_NEG_1	= '\x05';
// Signe negatif 2 = 'CR'
var ISC_CHAR_CODE_SIGNE_NEG_2 = '\x06';
var ISC_CHAR_SIGNE_NEGATIF_21 = 'C';
var ISC_CHAR_SIGNE_NEGATIF_22 = 'R';

var LOVAL_DATE = 10101;
var LOVAL_TIME = 0;

var UTP_LONG_MAX_VAR_NUMERIQUE = 15;

// Enumeration UTP_ERROR
var UTP_ERROR = 0;
var UTP_STRING = 1;
var UTP_LONG_DOUBLE = 2;
var UTP_DOUBLE = 3;
var UTP_FLOAT = 4;
var UTP_LONG = 5;

// Enumeration WHERESIGNE
var FIRST = 0;
var LAST = 1;
var NONE = 2;

// Enumeration KINDSIGNE
var SGN1 = 0;
var SGN2 = 1;


// Variables dependantes de la locale
// Ces var sont initialisees soit a la generation du jsp
// soit dans les fonctions InputCtrlKeyPress ou checkAdeliaValueSyntax
// pour rester compatible avec l'existant sans re-generer
var DECIMAL_SEPARATOR;
var GROUPING_SEPARATOR;
var DATE_SEPARATOR;
var TIME_SEPARATOR;
var DATE_PATTERN;
var TIME_PATTERN;
// On fixe des valeurs par defaut.
// Il faudra les initialiser dans initAWSGlobalsVars
var EBCDIC5B = '\x24';
var EBCDIC7B = '\xFA';
var EBCDIC7C = '\xD3';

// Expressions regulieres definissants les controles de saisie
var REG_EXP_DATE;
var REG_EXP_DATEXT;
var REG_EXP_TIME;
var REG_EXP_TIMEXT;
var REG_EXP_TIMESTAMP;
var REG_EXP_ZONEIBM;
var REG_EXP_TOUTMIN;
var REG_EXP_TOUTMAJ;
var REG_EXP_LETMAJ;
var REG_EXP_LETMAJCHIF;
var REG_EXP_NUMER;
var REG_EXP_NUMEREXT;

var ie = document.all; // Browser type IE
var ns4 = document.layers; // Browser Netscape 4


// On enrichi String
/*
* Test si une chaine est a la fin d'une autre
*/
String.prototype.endWith = function(endString)
{
	var index = this.lastIndexOf(endString);

	if (index == -1)
		return false;
   else
	   return this.length == index + endString.length;
}

/*
* Test si une chaine est constituee que de chiffres
*/
String.prototype.isDigits = function ()
{   
   var code;

   for (var i = 0; i < this.length; i++)
   {   
      code = this.charCodeAt(i);
      if ((code < 48) || (code > 57))
         return false;
   }
   return true;
}

/*
* Fonction trim java
* Supprime les espaces de debut et de fin de chaine
*/
String.prototype.adel_Trim = function ()
{   
   var start, end;
   var lg = this.length;

   for (start = 0; start < lg; start++)
   {   
   	if (this.charAt(start) != ' ')
      	break;      
   }
   if (start == lg)
   	return '';
	
   for (end = lg - 1; end >= 0; end--)
   {
      if (this.charAt(end) != ' ')
      	break;      
   }
   if ((start == 0) && (end == lg - 1))
   	return this;

   return this.substring(start, end + 1);
}

// On enrichi Function
/*
* Retourne le nom de la fonction
* Attention : pour les fonctions anonymes,
* cela retourne 'anonymous'
*/
Function.prototype.getName = function ()
{
   if (ie)
   {
      var sFct = this.toString();
      var endName = sFct.indexOf('(');
      
      if (sFct.charAt(endName - 1) == ' ')
         endName--;

      return sFct.substring('function '.length, endName);
   }
   else
      return this.name;   
}

Array.prototype.adel_InsertAt = function (index, obj)
{
	if ((index < 0) || (index > this.length))
		return false;
			
	this.length++;
	for (var i = this.length - 1; i > index; i--)
		this[i] = this[i - 1];
		
	this[index] = obj;
	return true;
}

/*
* Remplace dans une chaine text toutes les occurences de oldCar par newCar
* Retourne la nouvelle chaine resultat s'il y a eu remplacement, l'ancienne sinon
*/
function replaceCar (text, oldCar, newCar)
{   
   var tab = text.split('');
   var replaced = false;

   for (var i = 0; i < tab.length; i++)
   {         
      if (tab[i] == oldCar)
      {
         tab[i] = newCar;
         replaced = true;
      }
   }
   return (replaced ? tab.join('') : text);
}

function setCharAt (val, car, pos)
{
   var tab;
   
   if (pos < 0 || pos >= val.length)
      return;

   tab = val.split('');
   tab[pos] = car;
   return tab.join('');
}

/*
* Formate un entier (ou une chaine representant un entier)
* sur digits chiffres
* Retourne une chaine qui contient X zeros a gauche du chiffre
* Ex: 
* padZeroLeft(3, 2) = '03'
* padZeroLeft('3', 2) = '03'
* padZeroLeft(10, 2) = '10'
* padZeroLeft(100, 2) = '100'
*/
function padZeroLeft(num, digits)
{
   var res;

   res = num.toString();   
   while (res.length < digits)
      res = '0' + res;
      
   return res;   
}

/*
* Formate un entier (ou une chaine representant un entier)
* sur digits chiffres
* Retourne une chaine qui contient X zeros a droite du chiffre
* Ex: 
* padZeroRigth(3, 2) = '30'
* padZeroRigth('3', 2) = '30'
* padZeroRigth('03', 3) = '030'
* padZeroRigth(10, 2) = '10'
* padZeroRigth(100, 2) = '100'
*/
function padZeroRight(num, digits)
{
   var res;

   res = num.toString();   
   while (res.length < digits)
      res = res + '0';
      
   return res;   
}

/*
* Formate un entier (ou une chaine representant un entier)
* sur digits chiffres
* Retourne une chaine qui contient X car car a gauche du chiffre
* Ex: 
* padZeroLeft(3, ' ', 2) = ' 3'
* padZeroLeft('3', 'a', 2) = 'a3'
* padZeroLeft(10, ' ', 2) = '10'
* padZeroLeft(100, ' ', 2) = '100'
*/
function padCarLeft(num, car, digits)
{
   var res;

   res = num.toString();   
   while (res.length < digits)
      res = car + res;
      
   return res;   
}

/*
* Ajoute un couple nom valeur a une URL
*/
function setURLParameter(URL, paramLib, paramVal)
{
   var sep = URL.indexOf('?');

   if (sep == -1)
   	URL += '?';
	else
   	URL += '&';

   URL += paramLib + '=' + escape(paramVal);
   return URL;
}

/*
* Retourne la valeur chaine d'un parametre passe dans une URL
*/
function getURLParameterString(URL, param)
{
   var indexDeb = URL.indexOf(param + '='), indexFin;

   if (indexDeb == -1)
   	return '';

   indexFin = URL.indexOf('&', indexDeb + param.length + 1);
   if (indexFin == -1)
   	return unescape(URL.substring(indexDeb + param.length + 1));
   else
   	return unescape(URL.substring(indexDeb + param.length + 1, indexFin));
}

/*
* Retourne la valeur entiere d'un parametre passe dans une URL
*/
function getURLParameterInt(URL, param)
{
   var val = getURLParameterString(URL, param);
   var res;

   try
   {
      res = parseInt(val);
   }
   catch (e)
   {
      res = 0;
   }
   return res;
}

/*
* Retourne la valeur booleene d'un parametre passe dans une URL
*/
function getURLParameterBoolean(URL, param)
{
   var val = getURLParameterString(URL, param);

   return (val == "true");
}

/*
* Retourne la valeur de l'attribut attrName defini dans la 
* classe CSS className
*/
function getCSSClassAttribute(className, attrName)
{
	var ssl = window.document.styleSheets; // StyleSheetList
	var ss; // StyleSheet
	var rl; // CSSRuleList
	var r; // CSSRule

	try
	{
		for (i = 0; i < ssl.length; i++)
		{
			ss = ssl.item(i);
			if (ie)
				rl = ss.rules;
			else
				rl = ss.cssRules;

			for (j = 0; j < rl.length; j++)
			{
				r = rl.item(j);

				// on suppose que r (CSSRule) est du type CSSStyleRule pour
				// avoir acces a l'attribut selectorText
				if (! ie)
				{
					if (r.type != r.STYLE_RULE)
						continue;
				}
				if (r.selectorText.endWith(className))
				{                            
					if (ie)
						return r.style.getAttribute(attrName);
					else
						return r.style.getPropertyValue(attrName);
				}
			}
		}
	}
	catch (e)
	{
		return '';
	}
}

/*
* Retourne l'objet CSSRule correspondant a la 
* classe CSS className
*/
function getCSSRuleClass(className)
{
	var ssl = window.document.styleSheets; // StyleSheetList
	var ss; // StyleSheet
	var rl; // CSSRuleList
	var r; // CSSRule

	try
	{
		for (i = 0; i < ssl.length; i++)
		{
			ss = ssl.item(i);
			if (ie)
				rl = ss.rules;
			else
				rl = ss.cssRules;

			for (j = 0; j < rl.length; j++)
			{
				r = rl.item(j);

				// on suppose que r (CSSRule) est du type CSSStyleRule pour
				// avoir acces a l'attribut selectorText
				if (! ie)
				{
					if (r.type != r.STYLE_RULE)
						continue;
				}
				if (r.selectorText.endWith(className))				
               return r;				
			}
		}
	}
	catch (e)
	{
		return null;
	}
}

/*
* Fonction d'initialisation de var globales
* Sont initialisees ici les var dependants de scriptlets jsp
* ou d'autres vars
* Fonction appelee juste apres insertion des fichiers js dans le jsp genere
*/
function initAWSGlobalsVars (decimalSeparator, groupingSeparator, dateSeparator, timeSeparator, datePattern, contextPath, AWSResourcesPath, AWSLangue, AWSDefaultLangue)
{               
   initDateTimeVars (decimalSeparator, groupingSeparator, dateSeparator, timeSeparator, datePattern);   
   AWSCONTEXT_PATH = contextPath; // chemin sans '/' a la fin   
   AWSRESOURCES_DIR_PATH = AWSResourcesPath;
   AWSRESOURCES_LANG = AWSLangue;   
	AWSRESOURCES_DEFAULT_LANG = AWSDefaultLangue;   
}

/*
* Fonction d'initialisation des var dependantes de la locale
* Ces var sont initialisees soit a la generation du jsp (cf initGlobalVars)
* soit dans la fonction checkAdeliaValueSyntax
* pour rester compatible avec l'existant sans re-generer
*/
function initDateTimeVars (decimalSeparator, groupingSeparator, dateSeparator, timeSeparator, datePattern)
{  
   var tmpConv, i;

   if (typeof(DECIMAL_SEPARATOR) != 'undefined')
      // c'est juste un moyen de n'excecuter cette fct qu'une seule fois
      return;
      
   DECIMAL_SEPARATOR = decimalSeparator;
   GROUPING_SEPARATOR = groupingSeparator;
   DATE_SEPARATOR = dateSeparator;
   TIME_SEPARATOR = timeSeparator;
   DATE_PATTERN = datePattern;
   // le format d'heure n'est pas pris en compte pour l'instant
   // on le fixe par defaut
   TIME_PATTERN = 'HMS';
      
   // Initialisation des expressions regulieres pour les controles de saisie
   REG_EXP_DATE = '^$|^';   
   for (i = 0; i < DATE_PATTERN.length; i++)
   {      
      switch (DATE_PATTERN.charAt(i))
      {         
         case 'D' :            
            REG_EXP_DATE += '(\\d{2})';
            break;
            
         case 'M' :
            REG_EXP_DATE += '(\\d{2})';
            break;
            
         case 'Y' :
            REG_EXP_DATE += '(\\d{4})';
            break;
      }
      if (i < DATE_PATTERN.length - 1)                     
         REG_EXP_DATE += convertStringWithRegExpSpecialCar(DATE_SEPARATOR);      
   }    
   REG_EXP_DATE += '$';

   REG_EXP_DATEXT = '^$|^';
   for (i = 0; i < DATE_PATTERN.length; i++)
   {
      switch (DATE_PATTERN.charAt(i))
      {
         case 'D' :
            REG_EXP_DATEXT += '(\\d{2})';
            break;
            
         case 'M' :
            REG_EXP_DATEXT += '(\\d{2})';
            break;
            
         case 'Y' :
            REG_EXP_DATEXT += '(\\d{4})';
            break;
      }
      if (i < DATE_PATTERN.length - 1)                     
         REG_EXP_DATEXT += '[' + convertStringWithRegExpSpecialCar(DATE_SEPARATOR) + ']?';               
   }    
   REG_EXP_DATEXT += '$';
   
   REG_EXP_TIME = '^$|^';
   for (i = 0; i < TIME_PATTERN.length; i++)
   {
      REG_EXP_TIME += '(\\d{2})';            
      if (i < TIME_PATTERN.length - 1)
         REG_EXP_TIME += convertStringWithRegExpSpecialCar(TIME_SEPARATOR);
   } 
   REG_EXP_TIME += '$';

   REG_EXP_TIMEXT = '^$|^';
   for (i = 0; i < TIME_PATTERN.length; i++)
   {
      REG_EXP_TIMEXT += '(\\d{2})';            
      if (i < TIME_PATTERN.length - 1)                     
         REG_EXP_TIMEXT += '[' + convertStringWithRegExpSpecialCar(TIME_SEPARATOR) + ']?';               
   } 
   REG_EXP_TIMEXT += '$';
   
   REG_EXP_TIMESTAMP = '^$|^';
   for (i = 0; i < DATE_PATTERN.length; i++)
   {
      switch (DATE_PATTERN.charAt(i))
      {
         case 'D' :
            REG_EXP_TIMESTAMP += '(\\d{2})';
            break;
            
         case 'M' :
            REG_EXP_TIMESTAMP += '(\\d{2})';
            break;
            
         case 'Y' :
            REG_EXP_TIMESTAMP += '(\\d{4})';
            break;
      }
      if (i < DATE_PATTERN.length - 1)               
         REG_EXP_TIMESTAMP += convertStringWithRegExpSpecialCar(DATE_SEPARATOR);            
   } 
   REG_EXP_TIMESTAMP += '-';  
   for (i = 0; i < TIME_PATTERN.length; i++)
   {
      REG_EXP_TIMESTAMP += '(\\d{2})';                        
      REG_EXP_TIMESTAMP += convertStringWithRegExpSpecialCar(TIME_SEPARATOR);            
   }       
   // milli sec
   REG_EXP_TIMESTAMP += '(\\d{1,3})$';
   
   tmpConv = convertStringWithRegExpSpecialCar(EBCDIC5B) + convertStringWithRegExpSpecialCar(EBCDIC7B)
      + convertStringWithRegExpSpecialCar(EBCDIC7C);
   REG_EXP_ZONEIBM = '^$|^[A-Z' + tmpConv + '][A-Z0-9_' + tmpConv + ']*$'; 
   
   tmpConv = convertStringWithRegExpSpecialCar('\x09\x0a\x0d\x14\x15 !\x22#$%&\'()*+,-./0-9:;<=>?@[\x5c]^_`a-z{|}~' +
      '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f' +
      '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f' +
      '\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf' +
      '\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf' +
      '\xd0\xd7\xde\xdf' +
      '\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef' +
      '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u20AC');
   REG_EXP_TOUTMIN = '^[' + tmpConv + ']*$';  
   
   tmpConv = convertStringWithRegExpSpecialCar('\x09\x0a\x0d\x14\x15 !\x22#$%&\'()*+,-./0-9:;<=>?@A-Z[\x5c]^_`{|}~' +
      '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f' +
      '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f' +
      '\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf' +
      '\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf' +
      '\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf' +
      '\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf' +
      '\xf7\xfe\u20AC');
   REG_EXP_TOUTMAJ = '^[' + tmpConv + ']*$';   
   REG_EXP_LETMAJ = '^[A-Z]*$';
   REG_EXP_LETMAJCHIF = '^[A-Z0-9]*$';
   REG_EXP_NUMER = '^$|^[+-][0-9]*|[0-9]+[+-]?$';   
   
   tmpConv = convertStringWithRegExpSpecialCar(DECIMAL_SEPARATOR);
   REG_EXP_NUMEREXT = '^$|^((([+-]' + tmpConv + '\\d+[+-]?)|([+-]\\d+(' + tmpConv + '\\d*)?[+-]?))|(' + tmpConv + '\\d+[+-]?)|(\\d+([+-]?|' + tmpConv + '\\d*[+-]?)))$';
}

/*
* Fonction de convertion d'un entier en hexa
* Formate le nombre hexa en fonction du nb de digits
* digits : nombre de chiffres hexa du resultat. Si -1
* alors on prend tous les chiffres de la convertion
* Ex : 
* 65535 avec digits a -1 => FFFF
* 65535 avec digits a 2 => FF
* 65535 avec digits a 5 => 0FFFF
*/
function decimalToHexa(intVal, digits) 
{
   var _HEXA = '0123456789ABCDEF', res = '';

   if (isNaN(intVal)) 
      return null;
  
   while (intVal) 
   {
      res = _HEXA.charAt(intVal & 15) + res;
      intVal >>=  4;
   }
   if (digits == -1)
      return res;
   else if (res.length >= digits)
      return res.substring(res.length - digits);
   else
   {      
      while (res.length < digits)      
         res = '0' + res;
         
      return res;      
   }
}

/*
* Convertie une chaine en car compatible avec la syntaxe
* des expressions reg.
* Certains car sont speciaux et doivent etre precedes d'un '\'
*/
function convertStringWithRegExpSpecialCar(text)
{
   var res = "", i, j, tmpCar, found;
   var tabSpecialCar = ['^', '$', '.', '*', '+', '?', '=', '!', ':', '|', '\\', '/', '(', ')', '[', ']', '{', '}'];

   for (i = 0; i < text.length; i++)
   {
      tmpCar = text.charAt(i);
      found = false;
      for (j = 0; j < tabSpecialCar.length; j++)
      {
         if (tmpCar == tabSpecialCar[j])
         {
            res += '\\' + tmpCar;
            found = true;
            break;
         }
      }
      if (! found)
         res += tmpCar;      
   }
   return res;
}

function getYearISODate (valDate)
{
   return parseInt(valDate.substr(0, 4));
}

function getMonthISODate (valDate)
{
   return parseInt(valDate.substr(5, 2));
}

function getDayISODate (valDate)
{
   return parseInt(valDate.substr(8, 2));
}

function getYearAdeliaDate (valDate)
{
   return Math.floor(valDate / 10000);
}

function getMonthAdeliaDate (valDate)
{
	return Math.floor(((valDate % 10000) / 100));
}

function getDayAdeliaDate (valDate)
{
   return valDate % 100;
}

function getHourAdeliaTime (valTime)
{
   return Math.floor(valTime / 10000);
}

function getMinuteAdeliaTime (valTime)
{
	return Math.floor(((valTime % 10000) / 100));
}

function getSecondAdeliaTime (valTime)
{
   return valTime % 100;
}

/*
* Fonction d'ajout d'un traitant d'evenement sur un controle
* Cette fonction est portable (IE, Gecko, etc)
* Attention : l'ordre de declenchement des traitants n'est pas garantie
* Avec IE : S'il y a un traitant sur un onXXX affecte via HTML 
* (onXXX="fct();") ou via js (obj.onXXX = fct;), le onXXX est prioritaire, puis viennent 
* les addEventHandler dans l'ordre inverse de leur appel.
* Avec Gecko : Les traitants sont declenches dans l'ordre de leur appel.
*/
if (document.attachEvent) 
   var addEventHandler = function (oTarget, sEventType, fnHandler) { oTarget.attachEvent('on' + sEventType, fnHandler); };
else if (document.addEventListener)      
   var addEventHandler = function (oTarget, sEventType, fnHandler) { oTarget.addEventListener(sEventType, fnHandler, false); };   
else         
   var addEventHandler = function (oTarget, sEventType, fnHandler) { oTarget['on' + sEventType] = fnHandler; };
   
/*
* Fonction de suppression d'un traitant d'evenement sur un controle
* Cette fonction est portable (IE, Gecko, etc)
*/
if (document.detachEvent) 
   var removeEventHandler = function (oTarget, sEventType, fnHandler) { oTarget.detachEvent('on' + sEventType, fnHandler); };
else if (document.removeEventListener)      
   var removeEventHandler = function (oTarget, sEventType, fnHandler) { oTarget.removeEventListener(sEventType, fnHandler, false); };   
else         
   var removeEventHandler = function (oTarget, sEventType, fnHandler) { oTarget['on' + sEventType] = null; };
   
/*
* Classe de stockage et d'execution d'instructions js
* Les instructions sont executees a la fin du tag body.
* Appelee dans le jsp genere
*/
// Singleton pattern (le constructeur est anonyme)
var BodyLoaded = new function ()
{
	// var privee
	var tabExec = [];
   
   this.addExec = function (instr)
   {
      tabExec[tabExec.length] = instr;
   }
   
   this.startExec = function ()
   {
		var i;

      for (i = 0; i < tabExec.length; i++)
		{
		   try
			{
            eval(tabExec[i]);      
			}
			catch (e)
			{
				throw new Error('[BodyLoaded-startExec]' + e.message);
			}
		}
   }
	
	this.removeAllExec = function()
	{
		tabExec.length = 0;
	}
	
	this.removeExec = function (instr)
	{
		var i = 0;
		
		while (i < tabExec.length)
		{
			if (tabExec[i] == instr)
			{
				tabExec.splice(i, 1);
				continue;
			}
			i++;
		}
	}
}


/*
* Classe permettant de declencher des validateurs au moment
* de la soumission d'un formulaire.
* Il est indique d'enregistrer un validateur par controle graphique.
* Appelee dans la fonction validateXXX du jsp genere
*/
// Singleton pattern (le constructeur est anonyme)
var FormValidator = new function ()
{
	// var privee
   var tabValidator = new Array();
   
	/*
   * Methode addLastValidator : ajout en fin de liste d'un validateur a declencher
	* formName : nom du formulaire sujet a soumission
	* validatorFct : objet fonction contenant le traitement de la validation.
	* Cette fonction doit retourner true si validation ok, false sinon.
	* Attention : validatorFct doit etre definie comme top level function
	* tabParam : tableau de parametres a passer a validatorFct au moment de l'appel
	* continueValid : booleen indiquant si on doit traiter les validateurs suivant
	* lorsque validatorFct retourne false.	
	*/
   this.addLastValidator = function (formName, validatorFct, tabParam, continueValid)
   {
      tabValidator[tabValidator.length] = [formName, validatorFct, tabParam, continueValid];
   }
   
   /*
   * Methode addFirstValidator : ajout en tete de liste d'un validateur a declencher
	* formName : nom du formulaire sujet a soumission
	* validatorFct : objet fonction contenant le traitement de la validation.
	* Cette fonction doit retourner true si validation ok, false sinon.
	* Attention : validatorFct doit etre definie comme top level function
	* tabParam : tableau de parametres a passer a validatorFct au moment de l'appel
	* continueValid : booleen indiquant si on doit traiter les validateurs suivant
	* lorsque validatorFct retourne false.	
	*/
   this.addFirstValidator = function (formName, validatorFct, tabParam, continueValid)
   {      
      tabValidator.adel_InsertAt (0, [formName, validatorFct, tabParam, continueValid]);
   }
   
   /*
   * Methode addBeforeValidator : ajout d'un validateur a declencher avant un autre validateur
	* formName : nom du formulaire sujet a soumission
	* validatorFct : objet fonction contenant le traitement de la validation.
	* Cette fonction doit retourner true si validation ok, false sinon.
	* Attention : validatorFct doit etre definie comme top level function
	* tabParam : tableau de parametres a passer a validatorFct au moment de l'appel
	* continueValid : booleen indiquant si on doit traiter les validateurs suivant
	* lorsque validatorFct retourne false.	
	* validatorFctInsertBefore : objet fonction servant de position a l'insertion de validatorFct
	* Retourne vrai si l'insertion est ok, faux sinon.
	*/
   this.addBeforeValidator = function (formName, validatorFct, tabParam, continueValid, validatorFctInsertBefore)
   {      
   	var index = 0;
   	
   	for (index = 0; index < tabValidator.length; index++)
   	{
   		if (tabValidator[index][1] == validatorFctInsertBefore)
   			break;
   	}
   	if (index == tabValidator.length)
   		// validatorFctInsertBefore non trouve
   		return false;
   	else if (index == 0)
   		this.addFirstValidator (formName, validatorFct, tabParam, continueValid);
   	else
      	tabValidator.adel_InsertAt (index, [formName, validatorFct, tabParam, continueValid]);
      	
      return true;
   }
   
	/*
   * Methode validate : Declenche le traitement des validateurs enregistres pour un formulaire donne
	* formName : nom du formulaire (attribut name) soumis
	* Retourne faux si au moins un validateur a retourne false, true sison
	* Appelee dans la fonction validateXXX du jsp genere	
	*/
   this.validate = function (formName)
   {
      var res = true;
		var lg = tabValidator.length;

      for (var i = 0; i < lg; i++)
      {
			// Test si le validateur est pour ce formulaire
         if (tabValidator[i][0] == formName)
         {
				try
				{
   				// Declenche le traitement du validateur : validatorFct(tabParam)
               if (! tabValidator[i][1].apply(window, tabValidator[i][2]))
               {
                  res = false;
   					// Si la validateur a retoune false, on teste la valeur de continueValid
   					// pour savoir si on doit continuer le traitement des validateurs suivants.
                  if (! tabValidator[i][3])
                  	break;
               }
				} 
            catch (e)
				{
					// le apply peut declencher une erreur
					throw new Error('[FormValidator-validate]' + e.message);
				}
         }                  
      }
      return res;
   }
	
	/*
   * Methode RemoveAllValidator : Supprime tout les validateurs enregistres
	*/
	this.removeAllValidator = function()
	{
		tabValidator.length = 0;
	}
	
	/*
   * Methode removeValidator : supprime un validateur pour un formulaire donne
	* formName : nom du formulaire auquel se raporte le validateur
	* validatorFct : objet fonction contenant le traitement de la validation.
	* Ce parametre est optionnel. S'il n'est pas present, on supprime tous les
	* validateurs lie a formName
	*/
	this.removeValidator = function (formName, validatorFct)
	{
		var fct = null, i = 0;
		
		if (typeof(validatorFct) != 'undefined')
		   fct = validatorFct;
      
		while (i < tabValidator.length)
		{
         if (tabValidator[i][0] == formName)
			{
				if ((fct == null) || (tabValidator[i][1] == fct))
				{
               tabValidator.splice(i, 1);
					continue;
				}				
			}
			i++;
		}
	}
}


/*
* Fixe a un controle de type <img> une image donnee par une classe CSS.
* La classe CSS doir avoir un attribut background-image (ex : background-image:URL("../images/img.gif") )
* Cette classe est definie soit par .MA_CLASSE, soit par #idObj
* idObj : id du tag <img>
* Fonction appelee dans AWSCalendar.js et dans le jsp genere si bouton de guide
* pour fixer les images definies dans AWSGUIControls.jsp
*/
function setBackgroundImageClass(idObj)
{	   
	var tempObj = document.getElementById(idObj);
	var indexStart, indexEnd;
	var val;
 
   if (tempObj == null)
      return;
 
 	// recuperation de la valeur de l'attribut background-image applique a l'objet idObj
	if (ie)
	{
		val = tempObj.currentStyle['backgroundImage'];	
	}
   else
	{	   
		val = document.defaultView.getComputedStyle(tempObj, null).getPropertyValue('background-image');	
	}   
	if (val == null || val == '')	
		return;
		
	// La syntaque est URL(IMAGE_URL) : on extrait IMAGE_URL
	if (val.indexOf('url(') != -1)
	{
		if (val.charAt('url('.length) == '"')
		{
			// cas IE			
			indexStart = 'url('.length + 1;
			indexEnd = val.length - 2;
		}
		else
		{
			indexStart = 'url('.length;
			indexEnd = val.length - 1;
		}		     
		val = val.substring(indexStart, indexEnd);
		// On affecte l'image a l'objet idObj
		tempObj.src = val;
	}
   else
	{
		// probleme dans l'url
	}	
}

// Il faudra remplacer cette fonction par un objet XHR avec methodes
function getAjaxFile(fileName)
{
   var XhrObj = null;   
   
   if(typeof(XMLHttpRequest) != 'undefined')
   {
      // Mozilla ou IE7
   	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", AWSCONTEXT_PATH + fileName + "?AdeliaTS=" + new Date().getTime(), false);   
   XhrObj.open("GET", AWSCONTEXT_PATH + fileName, 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 null;
}

/*
* locale : chaine definissant la locale (ISO 639).
* Peut contenir une sous-locale (ex: de_CH)
*/
function ResourceBundleCreator(fileName, locale)
{	
	// var me permet d'acceder a l'objet cree dans une inner fonction 
	// (car bug ECMA si on utilise this dans l'inner fonction)
   var me = this;

	this.hashTable = {};
	this.defaultLocale = '';


	function pv_createSearchBundlesName(tabLocExp)
	{
		var tmp, tabRech = [];
		
		// Sous FF, on peut avoir undefined comme valeur
		if (typeof tabLocExp[1] == 'undefined')
			tabLocExp[1] = '';
		if (typeof tabLocExp[2] == 'undefined')
			tabLocExp[2] = '';
		if (typeof tabLocExp[3] == 'undefined')
			tabLocExp[3] = '';
			
		tmp = '_' + tabLocExp[1];		
		
   	if (tabLocExp[1] != '')
   		tabRech[tabRech.length] = tmp;
   		
   	if ((tabLocExp[2] != '') || (tabLocExp[3] != ''))
   	{
      	tmp += '_' + tabLocExp[2];
      	if (tabLocExp[2] != '')
      		tabRech[tabRech.length] = tmp;
      		
      	tmp += '_' + tabLocExp[3];
      	if (tabLocExp[3] != '')
      		tabRech[tabRech.length] = tmp;
   	}
      // mettre la construction de tabRech dans une fonction	
      return tabRech.reverse();
	}
	
   function pv_init()   
   {      	
	   var fileNameWithoutExtension;
   	var extension, tmpIndex, fileValue;   	

      // On fixe la locale
	   if (typeof(locale) == 'undefined')
		   // locale par defaut de la page jsp
   	   me.defaultLocale = AWSRESOURCES_LANG;
      else
   	   me.defaultLocale = locale;
      
      if (fileName.charAt(0) != '/')
   		fileName = '/' + fileName;
   		
   	// Extraction du nom de fichier sans extension et extension
      tmpIndex = fileName.lastIndexOf('.');
   	if (tmpIndex == -1)
   	{
         fileNameWithoutExtension = fileName;
   		extension = '';
   	}
   	else
   	{
   		fileNameWithoutExtension = fileName.substr(0, tmpIndex);
   		extension = fileName.substr(tmpIndex + 1);
   	}   	
				
		// Strategie de recherche d'un properties en fonction de la locale : cf source classe java ResourceBundle
		// If the specified locale's language, country, and variant are all empty
		// strings, then the base name is the only candidate bundle name.
		// Otherwise, the following sequence is generated from the attribute
		// values of the specified locale (language1, country1, and variant1)
		// and of the default locale (language2, country2, and variant2):		
		// baseName + "_" + language1 + "_" + country1 + "_" + variant1
		// baseName + "_" + language1 + "_" + country1
		// baseName + "_" + language1
		// baseName + "_" + language2 + "_" + country2 + "_" + variant2
		// baseName + "_" + language2 + "_" + country2
		// baseName + "_" + language2
		// baseName		
		if (me.defaultLocale == '')
		{
			// locale vide : on recherche seulement baseName
			if ((fileValue = getAjaxFile(fileName)) != null)	      
	         pv_processTextResult(fileValue);
	      else
	      	throw new Error('[ResourceBundleCreator-pv_init]' + fileName + ' not found');
		}
		else
		{
			var regLocaletoString = new RegExp('^$|^([a-z]{2})?(?:_([A-Z]{2})?(?:_([a-zA-Z0-9]+))?)?$');
      	var tabLoc = regLocaletoString.exec(me.defaultLocale);
      	//var tmp, tabRech = [], i;
      	var tabRech, i;
      	
      	if (tabLoc == null)
      		throw new Error('[ResourceBundleCreator-pv_init]' + me.defaultLocale + ' local analysis failed');
      		      		
	      tabRech = pv_createSearchBundlesName(tabLoc);
	      for (i = 0; i < tabRech.length; i++)
	      {
	      	if ((fileValue = getAjaxFile(fileNameWithoutExtension + tabRech[i] + '.' + extension)) != null)	      
	      	{
	         	pv_processTextResult(fileValue);
	         	return;
	         }
	      }
	      // La recherche de baseName avec la locale par defaut a echoue
	      // On fait la meme recherche avec la locale de la jvm (AWSRESOURCES_DEFAULT_LANG)
	      if (AWSRESOURCES_DEFAULT_LANG == '')
			{
				// locale vide : on recherche seulement baseName
				if ((fileValue = getAjaxFile(fileName)) != null)	      
		         pv_processTextResult(fileValue);
		      else
		      	throw new Error('[ResourceBundleCreator-pv_init]' + fileName + ' not found');
			}
			else
			{
	      	tabLoc = regLocaletoString.exec(AWSRESOURCES_DEFAULT_LANG);	      		      	
	      	
	      	if (tabLoc == null)
	      		throw new Error('[ResourceBundleCreator-pv_init]' + AWSRESOURCES_DEFAULT_LANG + ' local analysis failed');
	      
		      tabRech = pv_createSearchBundlesName(tabLoc);
		      for (i = 0; i < tabRech.length; i++)
		      {
		      	if ((fileValue = getAjaxFile(fileNameWithoutExtension + tabRech[i] + '.' + extension)) != null)	      
		      	{
		         	pv_processTextResult(fileValue);
		         	return;
		         }
		      }
		      // La recherche baseName avec locale de la jvm a echoue
		      // On recherche baseName seul
				if ((fileValue = getAjaxFile(fileName)) != null)	      
		         pv_processTextResult(fileValue);
		      else
		      	throw new Error('[ResourceBundleCreator-pv_init]' + fileName + ' not found');	      		      
			}   
		}
   }

   /*
   *
   */	
	function pv_processTextResult(propText)
   {
   	var lineFeed, i, j, tabLine;
   	
   	if (propText.indexOf('\r\n') != -1)
   	   // Windows
         lineFeed = '\r\n';
      else if (propText.indexOf('\n') != -1)
   	   // Unix
         lineFeed = '\n';
      else if (propText.indexOf('\r') != -1)
   	   // Mac
         lineFeed = '\r';
      else
   	   return false;
   		      
      // Expression reguliere de la syntaxe d'une ligne d'un fichier 'properties'
		// Une ligne est soit :
		// - un commentaire commencant par # (ou espaces #)
		// - KEY = VALEUR (VALEUR peut contenir un car '=')
   	var regLine = new RegExp('^\\s*([^#\\s\\=]+)\\s*\\=\\s*(.*)$');	
      var tabFile = propText.split(lineFeed);
   	
   	for (i = 0; i < tabFile.length; i++)
   	{   		
   		tabLine = regLine.exec(tabFile[i]);
   		if ((tabLine != null) && (tabLine.length == 3))   		
   			me.hashTable[tabLine[1]] = tabLine[2];   		
   	}
   	return true;
   }
	
	// Corps du constructeur
	pv_init();
}

ResourceBundleCreator.prototype.getString = function (key)
{
	var res = this.hashTable[key];
	
	if (typeof(res) != 'undefined')
	   return res;
   else
	   return null;
}

ResourceBundleCreator.prototype.getLocale = function ()
{
	return this.defaultLocale;
}

/*
* Ajoute dans un formulaire les cases a cochees adelia non cochees
* Ceci permet de resoudre le cas de case a cochees non presentes
* car contenues dans une balise condiftion fausse
*/
function setUncheckedCheckboxValue(formName)
{
	var objForm = document.forms[formName];
	var tab = objForm.getElementsByTagName('input');
	var i, obj, tmp, lg = tab.length;
	var docFragment = document.createDocumentFragment();
	
	for (i = 0; i < lg; i++)
	{
		obj = tab[i];   
   	if ((obj.type == 'checkbox') && ! obj.checked && ! obj.disabled)
   	{
   		tmp = document.createElement('input');
   		tmp.setAttribute('name', obj.name);
   		tmp.setAttribute('type', 'hidden');
   		tmp.setAttribute('value', 'off');
   		docFragment.appendChild(tmp);
   	}
	}
	if (docFragment.hasChildNodes())
		objForm.appendChild(docFragment);
}

