// ===================================================
// 	Bibliothèque de fonctions JS de portée générale
// ===================================================
//
// function getXhr       //  Instancie un objet XMLHttpRequest
// function Text2Html(sText)
// function LoadLogonData ()
// function SaveLogonData()
// function DateAdd (depart, nbjour) // Ajoute (ou retranche un nombre de jours à une date de départ 
// function Right(theText, nbCar) // Renvoie les nbCar de droite
// function Substr(theText, depart, longueur) // Renvoie une sous-chaine en donnant la première position et la longueur
// function LTrim (theText) // Suppression des espaces de gauche
// function RTrim (theText) // Suppression des espaces de droite
// function Trim (theText) // Suppression des espaces de gauche et droite
// function Encrypt(theText) // Fonction de cryptage
// function unEncrypt(theText) // Fonction de decryptage
// function isSpecial(CAR) // est un caractère spécial ?
// function isA(CAR) // est un caractère [a..z] | [A..Z] 
// function isC(CAR) // Est un caractère Ascii 128 - (special && sp) 
// function isD(CAR) // est un Chiffre [0..9]
// function isAD(CAR) // est un alphanumérique
// function isAlphaNum(STR)
// function isNum(STR)
// function isString(STR)
// function isDotString(STR)
// function isLocalPart(STR)
// function isLetDigHyp(CAR)
// function isName(STR)
// function isDomaine(STR)
// function testEmail(chaine)
// function getCookieVal (offset)
// function GetCookie (name)
// function SetCookie (name, value)
// function DecomposeDate(LeParam1) // Sépare les jours, les mois et les années dans une date de type "22/05/1981"
									// Renvoie le tout dans un tableau de taille 3
// function DateMachine(LeParam1)   // Renvoie une date sans les 0 dans les mois ou les jours "02/03/1981" -> "2/3/1981"
// function DateAnglaise(LeParam1,LeParam2) // Renvoie une date en format anglais avec le séparateur choisi "02/03/1981" -> "1981-3-2"
		// Le premier paramètre est la date a convertir, le second est le caractère de séparation choisi
// function ComparerDates(LeParam1,LeParam2) // Compare 2 dates au format jj/mm/aaaa
		// Renvoye 0 si égalité, 1 si la première est supérieure, sinon 2
//
// ===================================================


function getXhr(){
	var xhr = null; 
	if(window.XMLHttpRequest) // Firefox et autres
	   xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
	   try {
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
	}
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
	   xhr = false; 
	} 
	return xhr
}


function Text2Html(sText)
{
   var sResult = new String;
   
   iLen = sText.length;
   
   for (var i = 0; i < iLen; i++)
   {
      switch (sText.charCodeAt(i))
      {
         case 13:
            if ((i != iLen) && (sText.charCodeAt(i + 1) == 10))
               sResult += "<br>";
         case 10:
            break;
         default:
            sResult += sText.charAt(i);
      }
   }
   
   return sResult;
}

function LoadLogonData ()
{
	var sLogin;
  
   if(!(sLogin = GetCookie("Login"))) 
      sLogin = "";
       
   with (document.forms[0]) 
      clientlogin.value = Trim(sLogin);
   
	return null;
}

function SaveLogonData()
{
	var expdate = new Date();
	
	with (document.forms[0])  
	{
	   expdate.setTime(expdate.getTime() +  (24 * 60 * 60 * 1000 * 31)); 
	   SetCookie ("Login", Trim(clientlogin.value), expdate);
	}
	
	return null;
}

// Ajoute (ou retranche un nombre de jours à une date de départ :
function DateAdd (depart, nbjour) {
	var jour, mois, annee;
	jour = Substr(depart, 1, 2);
	mois = Substr(depart, 4, 2) - 1;
	annee = Substr(depart, 7, 4);
	var xdate = new Date(annee, mois, jour) ;
	xdate.setDate(xdate.getDate()+nbjour) ;
	jour = Right("0" + xdate.getDate(), 2);
	mois = xdate.getMonth() + 1;
	mois = Right("0" + mois, 2);
	annee = xdate.getFullYear();
	ch = jour + "/" + mois + "/" + annee;
	return (ch);
}		  

// Renvoie les nbCar de droite
function Right(theText, nbCar) {
	var sResult = new String;
	sResult = Trim(theText);
	var iLen = sResult.length;
	sResult = sResult.substring(iLen-nbCar, iLen);
	return (sResult);
}

// Renvoie une sous-chaine en donnant la première position et la longueur
function Substr(theText, depart, longueur) {
	var sResult = new String;
	depart = depart -1;
	fin = depart + longueur;
	sResult = theText.substring(depart, fin);
	return (sResult);
}

// Suppression des espaces de gauche
function LTrim (theText)
{
   var sResult = new String;
   var iLen = theText.length;
   var iNbSpaces = 0;
   
   for (var i = 0; i < iLen; i++)
      if (theText.charAt(i) == " ")
         iNbSpaces++;
      else
      	break;
      	
   sResult = theText.substr (iNbSpaces, iLen - iNbSpaces);
   
   return sResult;
}

// Suppression des espaces de droite
function RTrim (theText)
{
   var sResult = new String;
   var iLen = theText.length;
   var iNbSpaces = 0;
   
   for (var i = iLen - 1; i >= 0; i--)
      if (theText.charAt(i) == " ")
         iNbSpaces++;
      else
      	break;
      	
   sResult = theText.substr (0, iLen - iNbSpaces);
   
   return sResult;
}

// Suppression des espaces de gauche et droite
function Trim (theText)
{
   return RTrim(LTrim(theText));
}


// Fonction de cryptage
function Encrypt(theText)
{
   var output = new String;
   var Temp = new Array();
   var Temp2 = new Array();
   var TextSize = theText.length;
   
   for (var i = 0; i < TextSize; i++)
   {
		rnd = Math.round(Math.random() * 122) + 68;
		Temp[i] = theText.charCodeAt(i) + rnd;
		Temp2[i] = rnd;
	}
	
	for (var i = 0; i < TextSize; i++)
		output += String.fromCharCode(Temp[i], Temp2[i]);

	return output;
}

 // Fonction de decryptage
function unEncrypt(theText)
{
	var output = new String;
	var Temp = new Array();
	var Temp2 = new Array();
	var TextSize = theText.length;
	
	for (i = 0; i < TextSize; i++)
	{
		Temp[i] = theText.charCodeAt(i);
		Temp2[i] = theText.charCodeAt(i + 1);
	}
	
	for (i = 0; i < TextSize; i = i+2) 
		output += String.fromCharCode(Temp[i] - Temp2[i]);
	
	return output;
}


// est un caractère spécial ?
function isSpecial(CAR)
{
   // La liste des caractères spéciaux
   var Special = new Array("<",">","(",")","[","]","\\",".",",",";",":","#"," ","'","\"")
   
   for(var IndSpe=0;IndSpe < Special.length ; IndSpe++)
		if (CAR == Special[IndSpe])
      	return true;
   
   return false; 
}

// est un caractère [a..z] | [A..Z] 
function isA(CAR)
{   
   return ((CAR >= "a") && (CAR <= "z")) || ((CAR >= "A") && (CAR <= "Z"));
}


// Est un caractère Ascii 128 - (special && sp) ?
function isC(CAR)
{
   return (CAR.charCodeAt(0) <= 126) && (CAR.charCodeAt(0) >= 32) && !isSpecial(CAR); 
}


function isD(CAR)
{
   return (CAR >= "0") && (CAR <= "9");
}

// est un alphanumérique
function isAD(CAR)
{
   return isA(CAR) || isD(CAR);
}

function isAlphaNum(STR)
{
	// vérifie chaque caractère de la chaine STR
	for (var IndStr=0; IndStr < STR.length ; IndStr++)
		if (!isAD(STR.charAt(IndStr)) && !(STR.charAt(IndStr) == "-")) 
         return false;
	
   return true;
}	

function isNum(STR)
{
	// vérifie chaque caractère de la chaine STR
	for (var IndStr=0; IndStr < STR.length ; IndStr++)
		if (!(isD(STR.charAt(IndStr))) ) 
         return false;
	
   return true;
}	


// est une Chaine de caractères
function isString(STR)
{
   // vérifie chaque caractère de la chaine STR
	for (var IndStr=0; IndStr < STR.length ; IndStr++)
		if (!(isC(STR.charAt(IndStr))) ) 
         return false;
	
   return true;
}

function isDotString(STR)
{
   var POINT = STR.indexOf(".");
   
   if (POINT > 0)
   {
      var LeftPart = STR.slice(0,POINT);
   	var RightPart = STR.slice(POINT + 1,STR.length);
   	
      return (isString(LeftPart)) && (isDotString(RightPart));
  	}
  	else
   	return isString(STR);
}

// est LocalPart
function isLocalPart(STR)
{
  return isDotString(STR);
}

function isLetDigHyp(CAR)
{
   return isAD(CAR) || (CAR == "-");
}

function isName(STR)
{
   // Vérifie que le 1er caractère de la chaine sont des [A..Z] ou [a..z]
   //if (!isA( STR.charAt(0))) 
   //   return false;
      
   // Vérifie que les caractères suivants sont des [a..z] || [A..Z] || [0..9] || "-"
   for (var IndName=1 ; IndName < STR.length ; IndName++)
      if (!isLetDigHyp(STR.charAt(IndName)))
         return false;
  
  return true;            
}

// est Domaine
function isDomaine(STR)
{
  var POINT = STR.indexOf(".")

  if (POINT > 0)
  {
	  var LeftPart = STR.slice(0,POINT);
     var RightPart = STR.slice(POINT + 1 , STR.length); 
      
     return isName(LeftPart) && (isDomaine(RightPart) || isString(RightPart));
  }
  else 
     return false;
}

function testEmail(chaine)
{	
	var Arobace = chaine.indexOf("@");
	
	chaine = chaine.toLowerCase();
	
	// Commence les tests : Arobace présente et pas en premier
	if (Arobace > 0)
	{
   	var LocalPart = chaine.slice(0,Arobace);
   	var Domaine = chaine.slice(Arobace + 1, chaine.length);
   	
   	return isLocalPart(LocalPart) && isDomaine(Domaine);
   }
	else
	   return false;
}

function getCookieVal (offset)
{
   var endstr = document.cookie.indexOf (";", offset);
   
   if (endstr == -1)
      endstr = document.cookie.length;
   
   return unescape(document.cookie.substring(offset, endstr));
}


function GetCookie (name)
{
   var arg = name + "=";
   var alen = arg.length;
   var clen = document.cookie.length;
   var i = 0;
   
   while (i < clen)
   {
      var j = i + alen;
		if (document.cookie.substring(i, j) == arg)
			return getCookieVal (j);
		
		i = document.cookie.indexOf(" ", i) + 1;
		
		if (i == 0)
			break; 
	}
	
	return null;
}

  
function SetCookie (name, value)
{	
	var argv = SetCookie.arguments;
	var argc = SetCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	
	document.cookie = name + "=" + escape (value) +
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
	((path == null) ? "" : ("; path=" + path)) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((secure == true) ? "; secure" : "");
}




function DecomposeDate(LeParam1){ 

// Sépare les jours, les mois et les années dans une date de type "22/05/1981"
// Renvoye le tout dans un tableau de taille 3

LeRetour = new Array(3);
LeJour="";
LeMois="";
LeAnnee="";

// Extraction du jour
i=0;
while((LeParam1.charAt(i)!="/")&&(i<10)){
LeJour+=LeParam1.charAt(i);
i++;
}
if(LeJour.charAt(0)=="0"){
LeJour=LeJour.charAt(1);
}
LeParam1=LeParam1.substring(i+1,LeParam1.length);

// Extraction du mois
i=0;
while((LeParam1.charAt(i)!="/")&&(i<10)){
LeMois+=LeParam1.charAt(i);
i++;
}
if(LeMois.charAt(0)=="0"){
LeMois=LeMois.charAt(1);
}
LeParam1=LeParam1.substring(i+1,LeParam1.length);


// Extraction de l'année
LeAnnee=LeParam1;
LeRetour[0]=LeJour;
LeRetour[1]=LeMois;
LeRetour[2]=LeAnnee;
return LeRetour;
}



// -------------------------------------------



function DateMachine(LeParam1){

// Renvoie une date sans les 0 dans les mois ou les jours "02/03/1981" -> "2/3/1981"

LaDate = new Array(3);
LaDate = DecomposeDate(LeParam1);
LeRetour = LaDate[0]+"/"+LaDate[1]+"/"+LaDate[2];
return LeRetour;
}


function DateAnglaise(LeParam1,LeParam2){
// Renvoie une date en format anglais avec le séparateur choisi "02/03/1981" -> "1981-3-2"
// Le premier paramètre est la date a convertir, le second est le caractère de séparation choisi

LaDate = new Array(3);
LaDate = DecomposeDate(LeParam1);

LeRetour = LaDate[2]+LeParam2+LaDate[1]+LeParam2+LaDate[0];
return LeRetour;
}



// -------------------------------------------


function ComparerDates(LeParam1,LeParam2){

// Compare 2 dates au format jj/mm/aaaa
// Renvoye 0 si égalité, 1 si la première est supérieure, sinon 2

var LeParam1 = DateAnglaise(LeParam1,"/");// Ne pas oublier d'utiliser cette fonction
// pour convertir en date anglaise, sinon le 05/07/2003 sera compris "7 mai 2003" par JavaScript

var LeParam2 = DateAnglaise(LeParam2,"/");
LeParam1 = Date.parse(LeParam1);
LeParam2 = Date.parse(LeParam2);

if (LeParam1 == LeParam2) { 
return 0;
}

if (LeParam1 > LeParam2){
return 1;
}else{
return 2;
}
}



// -------------------------------------------

function VerifierDates(LeParam1,LeParam2,LeParam3,LeParam4){

// Vérifie les dates de début et de fin des courses
// Cette fonction est un exemple de script tests complets sur des dates
// LeParam1 = date de début entrée par l'utilisateur
// LeParam2 = date de fin entrée par l'utilisateur
// LeParam3 = date de début minimale
// LeParam4 = date de fin maximale

ErreurDate=0;
var LaDateDebut = new Array(3);
var LaDateFin = new Array(3);

LaDateDebut=DecomposeDate(LeParam1);
LaDateFin=DecomposeDate(LeParam2);

// Vérification des dates
if(isNaN(LaDateDebut[0])||isNaN(LaDateDebut[1])||isNaN(LaDateDebut[2])||
LaDateDebut[0]==""|| LaDateDebut[1]==""||LaDateDebut[2]==""){
window.alert("La date de début des courses est érronnée, veuillez la corriger.");
ErreurDate=1;
}

if(isNaN(LaDateFin[0])||isNaN(LaDateFin[1])||isNaN(LaDateFin[2])||
LaDateFin[0]==""||LaDateFin[1]==""||LaDateFin[2]==""){
window.alert("La date de fin des courses est érronnée, veuillez la corriger.");
ErreurDate=1;
}

LeParam1=DateMachine(LeParam1);
LeParam2=DateMachine(LeParam2);

var LaDate=new Date;// Dans cette variable, nous allons attribuer notre date décomposée.
// Ainsi, si la date que l'on attribue (comme le 30/02/2003), JavaScript la corriger à la date la plus proche

LaDate.setDate(LaDateDebut[0]);
LaDate.setMonth(LaDateDebut[1]-1);// On enlève 1 car les mois sont indicés à partir de 0 en JavaScript
LaDate.setYear(LaDateDebut[2]);
if(LeParam1!=(LaDate.getDate()+"/"+(LaDate.getMonth()+1)+"/"+LaDate.getFullYear())){
// Ici nous comparons la date corrigée par JavaScript avec celle entrée par l'utilisateur. Si elles sont différente,
// celà signifie que JavaScript à été obligé de la corriger car la date entrée par l'utilisateur n'existe pas.


// On préviens donc que la date est fausse.
window.alert("La date de début des courses est érronnée, veuillez la corriger.");
ErreurDate=1;
}

var LaDate=new Date;
LaDate.setDate(parseInt(LaDateFin[0]));
LaDate.setMonth(parseInt(LaDateFin[1])-1);
LaDate.setYear(parseInt(LaDateFin[2]));
if(LeParam2!=(LaDate.getDate()+"/"+(LaDate.getMonth()+1)+"/"+LaDate.getFullYear())){
window.alert("La date de fin des courses est érronnée, veuillez la corriger.");
ErreurDate=1;
}

if(ErreurDate==0){
if(ComparerDates(LeParam1,LeParam3)==2){
window.alert("La date de début des courses est trop ancienne.");
ErreurDate=1;
}
if(ComparerDates(LeParam2,LeParam4)==1){
window.alert("La date de fin des courses est trop récente.");
ErreurDate=1;
}
}

return ErreurDate;
}




	
