
/***********************************************************************************
* Fichier js qui fournit les méthodes nécessaires pour manipuler les dates
************************************************************************************/


/**
* Fonction qui vérifie si la valeur qui lui est fournit correspond à une date ou non. 
* Le format de la date doit être jj/mm/aaaa ou jj/mm/aa
* @param valeurChamp valeur à vérifier 
*
* @return true si la valeur est une date, false sinon
*/
function isDate(valeurChamp) {

	/*
	* Tester la forme de l'expression
	*/ 
	
	// Expression régulière pour le format des dates jj/mm/aaaa
    filtre = new RegExp("^[0-9]{1,2}\/[0-9]{1,2}\/([0-9]{2}|[0-9]{4})$");
    
    // tester si l'expression régulière valide la forme de la date
    if (!filtre.test(valeurChamp)) // 
        return false; // Si pas bon, retourne faux

	/*
	* Tester les valeurs
	*/ 
	
    // On sépare la date en 3 variables pour vérification, 
    j = parseInt(valeurChamp.split("/")[0], 10); // jour
    m = parseInt(valeurChamp.split("/")[1], 10); // mois
    a = parseInt(valeurChamp.split("/")[2], 10); // année
  
     // Définition du dernier jour de février
     // Année bissextile si annnée divisible par 4 et que ce n'est pas un siècle, 
     // ou bien si divisible par 400
     if (a%4 == 0 && a%100 !=0 || a%400 == 0) 
     	fev = 29;
     else fev = 28;
  
     // Nombre de jours pour chaque mois
     nbJours = new Array(31,fev,31,30,31,30,31,31,30,31,30,31);
  
     // Enfin, retourne vrai si le jour est bien entre 1 et le bon nombre de jours, 
     // idem pour les mois, sinon retourn faux
     return ( m >= 1 && m <=12 && j >= 1 && j <= nbJours[m-1] );
}

/**
* Teste si une date est égale à une autre
*
* @param date1 date supérieure
* @param date2 date inférieure
*
* @return true si la date1 est supérieure à la date2, false sinon
*/
function estDatesEgales(date1, date2){

	/*
	* Découpage des dates
	*/
	// Première date
   date1SansSlash = date1.split("/");   
   
   dateForme1 = new Date(eval(date1SansSlash[2]),eval(date1SansSlash[1]),eval(date1SansSlash[0]));
   annee1 =  dateForme1.getFullYear();
   mois1 = 	dateForme1.getMonth();
   jour1 = 	dateForme1.getDate();   
   
   // Deuxième date 
   date2SansSlash = date2.split("/");   
   dateForme2 = new Date(eval(date2SansSlash[2]),eval(date2SansSlash[1]),eval(date2SansSlash[0]));
   annee2 =  dateForme2.getFullYear();
   mois2 = 	dateForme2.getMonth();
   jour2 = 	dateForme2.getDate();   
   
	/*
	* Comparaison
	*/
	if(annee2==annee1 && mois2 == mois1 && jour2 == jour1){
		return true;
   }else{
		return false;
	}
}

/**
* Teste si la valeur envoyé est égale à la date du jour
*
* @param date à comparer à la date du jour 
*
* @return true si la date fournie est supérieure à la date courante, false sinon
*/
function estEgaleADateJour(dateSaisie){
	dateJour = getDateDuJour();
	return estDatesEgales(dateSaisie, dateJour);	
}

/**
* Teste si une date est strictement supérieure à une autre
*
* @param date1 date supérieure
* @param date2 date inférieure
*
* @return true si la date1 est supérieure à la date2, false sinon
*/
function estDateSuperieure(date1, date2){

	/*
	* Découpage des dates
	*/
	// Première date
   date1SansSlash = date1.split("/");   
   
   dateForme1 = new Date(eval(date1SansSlash[2]),eval(date1SansSlash[1]),eval(date1SansSlash[0]));
   annee1 =  dateForme1.getFullYear();
   mois1 = 	dateForme1.getMonth();
   jour1 = 	dateForme1.getDate();   
   
   // Deuxième date 
   date2SansSlash = date2.split("/");   
   dateForme2 = new Date(eval(date2SansSlash[2]),eval(date2SansSlash[1]),eval(date2SansSlash[0]));
   annee2 =  dateForme2.getFullYear();
   mois2 = 	dateForme2.getMonth();
   jour2 = 	dateForme2.getDate();   
   
	/*
	* Comparaison
	*/
   if(annee2 < annee1){
   		return true;
   }else if(annee2==annee1 && mois2 < mois1){
		return true;
   }else if(annee2==annee1 && mois2 == mois1 && jour2 < jour1){
		return true;
   }else{
		return false;
	}
}

/**
* Teste si la valeur envoyé est une date strictement supérieure à la date du jour
*
* @param date à comparer à la date du jour 
*
* @return true si la date fournie est supérieure à la date courante, false sinon
*/
function estSuperieureADateJour(dateSaisie){
	dateJour = getDateDuJour();
	return estDateSuperieure(dateSaisie, dateJour);	
}

/**
* Teste si une date est supérieure ou égale à une autre
*
* @param date1 date supérieure
* @param date2 date inférieure
*
* @return true si la date1 est supérieure à la date2, false sinon
*/
function estDateSuperieureEgale(date1, date2){
	return (estDateSuperieure(date1,date2) || estDatesEgales(date1, date2));
}

/**
* Teste si la valeur envoyé est une date supérieure ou égale à la date du jour
*
* @param date à comparer à la date du jour 
*
* @return true si la date fournie est supérieure à la date courante, false sinon
*/
function estSuperieureEgaleADateJour(dateSaisie){
	return (estSuperieureADateJour(dateSaisie) || estEgaleADateJour(dateSaisie));	
}

/** 
* Permet de vérifier si le dernier caractère saisie dans le champ spécifié 
* est un numérique ou un '/' sinon il le supprime.
* Méthode à associer à l'événement 'onKeyUp' d'un champ.
* 
* @param champ à mettre à jour automatiquement
*/
function makeDate(champ) {
	// Expresion régulière pour les numériques avec une virgule ou un point
	var RE = /^[0-9]+$/;   
	
	//récuperer le dernier caractère saisie.
	var caractereSaisie = champ.value.substring(champ.value.length - 1, champ.value.length);	
	
	// Si le caractère saisie n'est pas chiffre et n'est pas '/'
	if (!RE.test(caractereSaisie) && caractereSaisie!= '/') { 
		champ.value = champ.value.substring(0, champ.value.length-1); 
	}
}


/**
* Retourne le premier jour du mois actuel sous format date.
* Exemple, pour la date du jour égale à 15/10/2006, il retourne 01/10/2006
* 
* @return Premier jour du mois actuel
*/
function datePremierJourMois(){
		var d = new Date();
		var dm = d.getMonth()+1;	
		var dan = d.getYear();
			if(dan < 999) dan+=1900;		
				var djString = new String("01");
				var dmString = new String(dm);
				var danString = new String(dan);
					if (dmString.length <2)
	  			dmString = "0"+dmString;
	return djString+"/"+dmString+"/"+danString ;
}

/**
* Retourne la date du jour courant sous format jj/mm/aaaa
* @return date actuelle sous format jj/mm/aaaa
*/
function getDateDuJour(){
	dateActuelle = new Date();
    anneeActuelle =  dateActuelle.getFullYear();
	moisActuel = dateActuelle.getMonth()+1;
   	jourActuel = dateActuelle.getDate();
   	
   	return jourActuel + "/" + moisActuel + "/" + anneeActuelle ;}

/**
* Retourne la date actuelle sous format d'entier. Cette entier correspond 
* au nombre de jour qui se sont passés depuis la date 01/01/0000
* Méthode qui sert dans le calcul du nombre de jours de différence entre deux dates.
* 
* @param date1 date à transformer
* @ retrun la transformation de la date en nombre de jours
*/
function joursd(date1) {
	var ws =new String(date1);
	var jj = Number(ws.substring(0, 2));
	var mm = Number(ws.substring(3, 5));
	var aa = Number(ws.substring(6, 10));
	
	if (mm < 3) {
		var a = aa - 1;
		var m = mm + 12;}
	else {
		var a = aa;
		var m = mm;}
	
	var jdd = (Math.floor (365.25*a));
	jdd += Math.floor(30.6001*(m+1.));
	jdd += jj;
	jdd += 1720994.5;
	if ( (aa+(mm/100.)+(jj/10000.)) > 1582.1014) {
		jdd = jdd + 2 - Math.floor (a/100.) + Math.floor (a/400.);}

	return jdd;
}

/**
* Méthode qui renvoie la différence entre deux dates en terme de jours.
* 
* @param date1 
* @param date2
*
* @return resultat en jours de date2-date1
*/
function getDifferenceDatesEnJours(date1, date2){
	nbrejours1	= joursd(date1);
	nbrejours2 = joursd(date2);
	return (nbrejours2 - nbrejours1);
}

/** 
* Permet de transformer une date sous format jj/mm/aa en date sous format jj/mm/aaaa
* Pour une année < 89, le nombre ajouté est 1900, pour les années >89 ==> 2000 est ajoutée
* 
* @param date sous format jj/mm/aa
* @return transformation de la date sous format jj/mm/aaaa
*/
function completerDate(date1){
   date1SansSlash = date1.split("/");   
   date1Forme = new Date(eval(date1SansSlash[2]),eval(date1SansSlash[1]),eval(date1SansSlash[0]));
   annee =  date1Forme.getYear();
   mois = 	date1Forme.getMonth();
   jour = 	date1Forme.getDate();
   
   if (annee < 89)  annee+=2000; 
		else annee+=1900;
				
	return jour + "/" + mois + "/" + annee;
}
