/**
 * Teste si un jour est férié ou non
 *
 * Teste si un jour donné tombe un jour férié français, ou éventuellement un week-end
 *
 * @param date $date - Date du jour a tester (entre 00h00 et 23h59)
 * @param boolean $weekend - Détection des week-end comme jour fériés
 * @return boolean - TRUE si le jour transmis en férié, FALSE sinon
 */
function estFerie( date, weekend )
{

	// Initialisation de la date de début
	var jour  = date.getDate();
	var mois  = date.getMonth();
	var annee = date.getFullYear();

	// Vérification parmis les jours férié fixes
	if( (jour == 1 && mois == 0) ||			//  1er Janvier 	(Jour de l'an)
		(jour == 1 && mois == 4) || 		//  1er Mai 		(Fête du travail)
		(jour == 8 && mois == 4) || 		//  8   Mai 		(Fête de la victoire - Fin de la seconde guerre mondiale)
		(jour == 14 && mois == 6) || 		// 14   Juillet 	(Fête nationale)
		(jour == 15 && mois == 7) || 		// 15   Aout 	(Assomption)
		(jour == 1 && mois == 10) || 		//  1er Novembre 	(Toussain)
		(jour == 11 && mois == 10) || 		// 11   Novembre 	(Armistice 1918)
		(jour == 25 && mois == 11) ) 		// 25   Décembre 	(Noël)
	{
		return true;
	}

	// Si le week-end doit être considéré comme jour férié
	if( weekend != false )
	{
		var jour_semaine 	= date.getDay();
		//Samedi (6) et dimanche (0)
		if(jour_semaine == 0 || jour_semaine == 6)
		{
			return true;
		}
	}

	// Calcul du jour de pâques
	var G = annee%19;
	var C = Math.floor(annee/100);
	var H = (C - Math.floor(C/4) - Math.floor((8*C+13)/25) + 19*G + 15)%30;
	var I = H - Math.floor(H/28)*(1 - Math.floor(H/28)*Math.floor(29/(H + 1))*Math.floor((21 - G)/11));
	var J = (annee*1 + Math.floor(annee/4) + I + 2 - C + Math.floor(C/4))%7;
	var L = I - J;
	var mois_paques = 3 + Math.floor((L + 40)/44);
	var jour_paques = L + 28 - 31*Math.floor(mois_paques/4) ;

	// Si le jour testé est le jour de paques
	if(jour_paques == jour && eval(mois_paques - 1) == mois)
	{
		return true;
	}

	// Calcul du jour du lundi de pâques
	var date_lundi_paques = new Date( annee, mois_paques - 1, jour_paques + 1 );
	var jour_lundi_paques = date_lundi_paques.getDate();
	var mois_lundi_paques = date_lundi_paques.getMonth();

	// Si le jour testé est le lundi de paques
	if(jour_lundi_paques == jour && mois_lundi_paques == mois)
	{
		return true;
	}
	
	// Calcul du jour de l'ascension (39 jours après Paques)
	var date_ascension = new Date( annee, mois_paques - 1, jour_paques + 39 );
	var jour_ascension = date_ascension.getDate();
	var mois_ascension = date_ascension.getMonth();

	// Si le jour testé est le jour de l'ascension
	if(jour_ascension == jour && mois_ascension == mois)
	{
		return true;
	}

	// Calcul de Pentecôte (7 semaines après Paques)
	var date_pentecote = new Date( annee, mois_paques - 1, jour_paques + 49 );
	var jour_pentecote = date_pentecote.getDate();
	var mois_pentecote = date_pentecote.getMonth();

	// Si le jour testé est le jour de la pentecote
	if(jour_pentecote == jour && mois_pentecote == mois)
	{
		return true;
	}

	// Calcul du lundi de Pentecôte (Lendemain de pentecote)
	var date_lundi_pentecote = new Date( annee, mois_pentecote - 1, jour_pentecote + 1 );
	var jour_lundi_pentecote = date_lundi_pentecote.getDate();
	var mois_lundi_pentecote = date_lundi_pentecote.getMonth();

	// Si le jour testé est le jour du lundi de pentecote
	if(jour_lundi_pentecote == jour && mois_lundi_pentecote == mois)
	{
		return true;
	}

	// Si l'execution est parvenue jusque là, c'est que le jour transmis n'est pas férié
	return false;

}

/**
 * Mise en forme de la date pour affichage du format FR
 *
 * @param date $date - Date du jour à afficher

 * @return string
 */
function getDateToStringFr(date)
{
	var moisFr = new Array("janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre");

	return date.getDate()+" "+moisFr[date.getMonth()]+" "+date.getFullYear();
}

/**
 * Découpage d'un datetime
 * 
 * @param datetime
 * 
 * @return array()
 */
function explodeMssqlDatetime(datetime)
{
	var a_result 		= new Array(0,0,0,0,0);
	
	var a_date_heure 	= datetime.split(' ');
	if(a_date_heure.length == 2)
	{
		var a_date		= a_date_heure[0].split('-');
		if(a_date.length == 3)
		{
			a_result[0] = a_date[0];
			a_result[1] = a_date[1];
			a_result[2] = a_date[2];
		}
		
		var a_heure		= a_date_heure[1].split(':');
		if(a_heure.length == 3)
		{
			a_result[3] = a_heure[0];
			a_result[4] = a_heure[1];
			a_result[5] = a_heure[2];
		}
	}
	
	return a_result;
}

/**
 * Comparaison de 2 datetime mssql
 * 
 * @param datetime_debut
 * @param datetime_fin
 * 
 * @return Int {-1, 0, 1}
 * 
 */
function compareMssqlDatetime(datetime_debut, datetime_fin)
{
	a_datetime_debut = explodeMssqlDatetime(datetime_debut);
	a_datetime_fin = explodeMssqlDatetime(datetime_fin);
	
	date_debut = new Date(a_datetime_debut[0], a_datetime_debut[1], a_datetime_debut[2], a_datetime_debut[3], a_datetime_debut[4], a_datetime_debut[5]);
	date_fin = new Date(a_datetime_fin[0], a_datetime_fin[1], a_datetime_fin[2], a_datetime_fin[3], a_datetime_fin[4], a_datetime_fin[5]);
	
	if(date_debut.getTime() > date_fin.getTime())
	{
		return -1;
	}
	else if(date_debut.getTime() < date_fin.getTime())
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
