/** 
*	@file www/js/date.js
*	@author COPHIGNON CYRIL
*	@date	31/08/2006
*	@brief Librairie de gestion des dates et des heures
*	@date 07/12/2006 : ajustement pour prendre en compte le format hh-mm et hhmm dans les heures
*	@date 06/10/2008 : ajout de la fonction expire
*/

/**
 * @fn IsDateFr(valeur)
 * @brief Fonction verifiant que la valeur de l'element d'un forumulaire est bien une date valide
 * @param date string date au format d/m/Y
 * @param true ou false
 */
function IsDateFr(valeur) 
{ 
	
	var pivot = 30; //Variable utilisée au cas ou la date ne comporte que 2 chiffres au niveau des années 
					// si inférieur à pivot on ajoute 20 pour compléter sinon 19
					// ex: 49 => 1949 
					//     21 => 2021
 	ctl = /^(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d)(\d\d)?$/;
 	var tab = valeur.match(ctl);
 	if (tab)
	{	
		//Si l'année n'est saisie qu'avec 2 caractères, on compléte de manière à en avoir 4.
		if ((tab.length == 6) || (!tab[6])) 
			tab[5] = ((tab[5] < pivot) ? 2000 : 1900) + tab[5];
   		else tab[5] = parseInt(tab[5].concat(tab[6]));
   		var unedate = new Date(tab[5], tab[3]-1, tab[1]);
		//On verifie que la date est valide
		if (!((unedate.getFullYear() == tab[5]) && (unedate.getMonth() == tab[3]-1) && (unedate.getDate() == tab[1])))
		{
			return false;
		}
		else return true;
	}
	else
	{
		return false;
	}
}

/**
 * @fn ch_en_date(valeur) 
 * @brief Fonction formattant un string en date d/m/Y ou m/d/Y
 * @param date string la string
 * @param retourne la chaine formatte
 */
function ch_en_date(valeur) 
{
	var pivot = 30;
 	ctl = /^(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d?)(\d\d?)?$/;
 	var tab = ctl.exec(valeur);
	try
	{
		//Ajout des 0 pour respecter le format JJ ou MM
		tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
		tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
		tab[5] = ((tab[5].length == 1 && tab[5] <= 9) ? "0" : "")+ tab[5];
	
 		if ((tab.length > 6) && (tab[6])) tab[5] += tab[6];
 		else tab[5] = ((tab[5] < pivot) ? "20" : "19") + tab[5];
 			
		//Inversion au cas où la date serait au format anglais
		if (tab[3]>12) return tab[3]+"/"+tab[1]+"/"+tab[5];
		else return tab[1]+"/"+tab[3]+"/"+tab[5]; 
	}
	catch(e)
	{
		return valeur;
	}
}

/**
 * @fn FormatDate(IdElement)
 * @brief Fonction verifiant le format d'une date
 * @param IdElement string identifiant de l'element du formulaire
 * @param true ou false 
 */
function FormatDate(IdElement)
{
	var ElementbyId=document.getElementById(IdElement);
	// formatage de la chaine a tester avec le nouveau caractère
	
	if (TestToucheOK == true)
	{
		TestToucheOK = false;
		switch (ElementbyId.value.length)
		{
			case 2 :
					if (ElementbyId.value.substring(ElementbyId.value.length-1,ElementbyId.value.length)=="/") ElementbyId.value = "0"+ElementbyId.value;
					else if (ElementbyId.value > 31) return false;
					else ElementbyId.value += "/";
			break;		// fin de l'écriture du jour
						
		case 5 :	if (ElementbyId.value.substring(ElementbyId.value.length-1,ElementbyId.value.length)=="/") ElementbyId.value = ElementbyId.value.substring(0,3)+"0"+ElementbyId.value.substring(3,5);
					else if (Number(ElementbyId.value.substring(3,5))>12) return false;
					else ElementbyId.value += "/";
		break;		// fin de l'écriture du mois
					
		default: 	if (ElementbyId.value.substring(ElementbyId.value.length-1,ElementbyId.value.length)=="/")
					{ 	// Vérification si pas écriture du séparateur de jour / mois
						// Vérification si le '/' est bien placé
						if ((ElementbyId.value.length == 1) || (ElementbyId.value.length > 6)) return false;
					}
		}
	}
	return true;
}

/**
 * @fn dateFrToEng(valeur)
 * @brief Fonction qui recoit un string au format d/m/Y et le met au format Y-m-d
 * @param valeur date au format d/m/Y
 * @param true ou false 
 */
function dateFrToEng(valeur)
{
	var pivot = 30;
 	ctl = /^(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d?)(\d\d?)?$/;
 	var tab = ctl.exec(valeur);
	try
	{
		if ((tab.length > 6) && (tab[6]))
		{
			//Ajout des 0 pour respecter le format JJ ou MM
			tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
			tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
			tab[5] = ((tab[5].length == 1 && tab[5] <= 9) ? "0" : "")+ tab[5];
			tab[5] += tab[6];
			return tab[5]+"-"+tab[3]+"-"+tab[1]; 
		}
		else
		{
			tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
			tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
			tab[5] = ((tab[5].length == 1 && tab[5] <= 9) ? "0" : "")+ tab[5];
			tab[5] = ((tab[5] < pivot) ? "20" : "19") + tab[5];
			return tab[5]+"-"+tab[3]+"-"+tab[1]; 
		}
	}
	catch(e)
	{
		return valeur;
	}	
}

/**
 * @fn dateEngToFr(valeur)
 * @brief Fonction qui recoit un string au format Y-m-d et le met au format d/m/Y
 * @param valeur date au format Y-m-d
 * @param true ou false 
 */
//Recoit un string au format YYYY-MM-DD et le met au format JJ/MM/YYYY 
function dateEngToFr(valeur)
{
	var pivot = 30;
 	ctl = /^(\d\d?)(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d?)?$/;
 	var tab = ctl.exec(valeur);
	try
	{
		if ((tab.length > 6) && (tab[6]))
		{
			//Ajout des 0 pour respecter le format JJ ou MM
			tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
			tab[4] = ((tab[4].length == 1 && tab[4] <= 9) ? "0" : "")+ tab[4];
			tab[6] = ((tab[6].length == 1 && tab[6] <= 9) ? "0" : "")+ tab[6];
			tab[1] += tab[2];
			return tab[6]+"/"+tab[4]+"/"+tab[1]; 
		}
		else
		{
			tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
			tab[1] = ((tab[1] < pivot) ? "20" : "19") + tab[1];
			tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
			tab[5] = ((tab[5].length == 1 && tab[5] <= 9) ? "0" : "")+ tab[5];
			return tab[5]+"/"+tab[3]+"/"+tab[1]; 
		}
	}
	catch(e)
	{
		return valeur;
	}	
}

/**
 * @fn expire(valeur, format)
 * @brief Fonction calcul le delais d'expiration d'une date
 * @param [date] valeur date au format JJ/MM/AAAA
 * @param [char] unite de temps (Y: annee, M: mois, D: jour) 
 * @param [int] le nombre d'unite de temps avant/apres l'expriration ou false si erreur
 */
function expire(valeur, format)
{
	if (!IsDateFr(valeur)) return false;
	
	var reg = new RegExp("[ ,;\/.]+", "g");
	var tab = valeur.split(reg);
	
	//Nombre de milisecondes dans un jour
	var diviseur = 1000 * 60 * 60 * 24;
	if(format =='M') diviseur*=30.4375;
	else if(format =='Y') diviseur*=365.25;
	
	try
	{
		var date_exp = new Date(tab[2], tab[1]-1, tab[0]);
		var date_jour = new Date();
		
		return Math.round((date_exp.getTime()-date_jour.getTime())/diviseur);
		
	}
	catch(e)
	{
		return false;
	}	
}
//------------------------------------ PARTIE SUR LES HEURES -----------------------------------------------------

/**
 * @fn IsHeureMimute(valeur) 
 * @brief Fonction verifiant que la valeur de l'element d'un forumulaire est bien une heure valdie
 * @param valeur date au format H:i
 * @param true ou false 
 */
//Fonction vérifiant que la valeur de l'élément d'un forumulaire est bien une date valide
function IsHeureMimute(valeur) 
{ 
	ctl = /^(\d\d?)(:|h|-)?(\d\d?)?$/;
 	var tab = valeur.match(ctl);
 	if (tab)
	{	
		//Si l'année n'est saisie qu'avec 2 caractères, on compléte de manière à en avoir 4.
		if(tab[1]>=0 && tab[1]<=24 && tab[3]<=59 && tab[3]>=0)
		{
			return true;
		}
		else return false;
	}
	else
	{
		return false;
	}
}

/**
 * @fn IsHeureMimuteSeconde(valeur) 
 * @brief Fonction verifiant que la valeur de l'element d'un forumulaire est bien une heure valdie
 * @param valeur date au format H:i:s
 * @param true ou false 
 */
function IsHeureMimuteSeconde(valeur) 
{ 
	
	ctl = /^(\d\d?)(:|h|-)?(\d\d?)(:|m|-)?(\d\d?)?$/;
 	var tab = valeur.match(ctl);
 	if (tab)
	{	
		//Si l'année n'est saisie qu'avec 2 caractères, on compléte de manière à en avoir 4.
		if(tab[1]>=0 && tab[1]<24 && tab[3]<=59 && tab[3]>=0 && tab[5]>=0 && tab[5]<=59)
		{
			return true;
		}
		else return false;
	}
	else
	{
		return false;
	}
}

/**
 * @fn ch_en_HeureMinute(valeur)  
 * @brief Fonction formattant un string en date en date au format H:i
 * @param valeur string la string
 * @param retourne la chaine formatte
 */
function ch_en_HeureMinute(valeur) 
{
	ctl = /^(\d\d?)(:|h|-)?(\d\d?)?$/;
 	var tab = ctl.exec(valeur);
	try
	{
		//Ajout des 0 pour respecter le format JJ ou MM
		tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
			
		if(tab[3] == '') tab[3]='00';
		else tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
		
		if(Number(tab[1]) < 24 && Number(tab[3]) < 60) return tab[1]+":"+tab[3]; 
		else return 'Err.'; 
	}
	catch(e)
	{
		return valeur;
	}
}

/**
 * @fn ch_en_HeureMinuteSeconde(valeur)
 * @brief Fonction formattant un string en date en date au format H:i:s
 * @param valeur string la string
 * @param retourne la chaine formatte
 */
function ch_en_HeureMinuteSeconde(valeur) 
{
	ctl = /^(\d\d?)(:|h|-)?(\d\d?)(:|m|-)?(\d\d?)?$/;
 	var tab = ctl.exec(valeur);
	try
	{
		//Ajout des 0 pour respecter le format JJ ou MM
		tab[1] = ((tab[1].length == 1 && tab[1] <= 9) ? "0" : "")+ tab[1];
		tab[3] = ((tab[3].length == 1 && tab[3] <= 9) ? "0" : "")+ tab[3];
		tab[5] = ((tab[5].length == 1 && tab[5] <= 9) ? "0" : "")+ tab[5];
														
		return tab[1]+":"+tab[3]+":"+tab[5]; 
	}
	catch(e)
	{
		return valeur;
	}
}

/**
 * @fn recup_date()
 * @brief Fonction retounant la date du jour
 * @param retounant la date du jour au format d/m/Y
 */
function recup_date()
{
	var la_date=new Date();
	var jour=la_date.getDay();
	var mois=la_date.getMonth();
	var annee=la_date.getFullYear();
	
	//Formatage des jours et mois pour avoir toujours deux chiffres
	if(mois<10) mois="0"+mois;
	if(jour<10) jour="0"+jour;
	return jour+"/"+mois+"/"+annee;	
}

/**
 * @fn recup_heure()
 * @brief Fonction retounant l'heure
 * @param retounant la date du jour au format H:i:s
 */
function recup_heure()
{
	var la_date=new Date();
	var heures=la_date.getHours();
	var minutes=la_date.getMinutes();
	var secondes=la_date.getSeconds();
	
	//Formatage pour avoir toujours deux chiffres
	if(heures<10) heures="0"+heures;
	if(minutes<10) minutes="0"+minutes;
	if(secondes<10) secondes="0"+secondes;
	return heures+":"+minutes+":"+secondes;	
}

/**
 * @brief Date.create_date(): ajout d'un constructeur au format natif de date en javascript
 * @brief Fonction creant une date a partir de la date et l'heure en string passees en parametre
*/
Date.prototype.create_date=function(date,heure)
{
	this.setSeconds(heure.substring(6,8));
	this.setMinutes(heure.substring(3,5));
	this.setHours(heure.substring(0,2));
	this.setDate(date.substring(0,2));
	this.setMonth(date.substring(3,5)-1);
	this.setFullYear(date.substring(6,10));
}