/***********************************************************************************
*********************  L I S T E  D E S  F O N C T I O N S  ************************
***********************************************************************************/

/******************************************************************
---------------------------------------------
 FORMATER LA DATE
---------------------------------------------
FormatDate (spDate, npFormat, spLangue)
UnFormatDate(spDate, spLangue)
FormatHeure (spHeure)
FusionnerDate (spDateDebut, spDateFin, spLangue)

---------------------------------------------
 RECEVOIR DE L'INFORMATION SUR LE DATE
---------------------------------------------
getDateJour (lpHeure)
getAn (spDate)
getMois (spDate)
getJour (spDate)
getHeure (spDate)
getMinute (spDate)
getSeconde (spDate)
getJoursDepuisDebutAnnee (npJour, npMois, npAn)
getJoursAvantFinAnnee (npJour, npMois, npAn)
getNbrJoursAnnee (npAn)
getNbrJoursMois (npMois, npAn)
getNomMois (npMois, spLangue, lpMajuscule)
getJourSemaine (spDate, npFormat, spLangue)
getIntervalleDate (spDateAnt, spDatePost)
getIntervalleHeure	(npHeureAnt, npHeurePost, npTypeRetour)

---------------------------------------------
 CHANGER LA DATE
---------------------------------------------
setAn (spDate, npAn)
setMois (spDate, npMois)
setJour (spDate, npJour)
setHeure (spDate, npHeure)
setMinute (spDate, npMinute)
IncDate (spDate, npNbrJours)
DecDate (spDate, npNbrJours)
IncMoisDate (spDate, npNbrMois)
DecMoisDate (spDate, npNbrMois)
IncMois (npMois, npNbrMois)
DecMois (npMois, npNbrMois)

---------------------------------------------
 VALIDER LA DATE
---------------------------------------------
ValDate (spDate)
ValMois (npMois)
ValJour (npJour, npMois, npAn)
ValHeure (npHeure)
ValMinute (npMinute)
ValAnBissextile (npAn)
******************************************************************/

/***********************************************************************************
********************  D É B U T  D E S  F O N C T I O N S  *************************
***********************************************************************************/

/***********************************************************************************
******************************  FORMATTER LA DATE  *********************************
***********************************************************************************/

// Format 1 : dd-mm-yyyy hh:mm
// Format 2 : dd MM yyyy hh:mm
// Format 3 : yyyy-mm-dd hh:mm

function FormatDate (spDate, npFormat, spLangue)
{
	var nlNbrCarDate = 0;
	var slNewDate = "";
	var slExposant = "";
	var nlAn = "-1";
	var nlMois = "-1";
	var nlJour = "-1";
	var nlHeure = "-1";
	var nlMinute = "-1";
	
	spDate = String(spDate);
	
	if (IsNumeric(spDate))
	{
		nlNbrCarDate = spDate.length
	}
	
	if (npFormat < 1 || npFormat > 3)
	{
		npFormat = 1;
	} 
	
	if (nlNbrCarDate == 6 || nlNbrCarDate == 8 || nlNbrCarDate == 12)
	{
		if (nlNbrCarDate >= 6)
		{
			nlAn = getAn(spDate);
			nlMois = getMois(spDate);
		}
		if (nlNbrCarDate >= 8)
		{
			nlJour = getJour(spDate);
		}
		if (nlNbrCarDate >= 12)
		{
			nlHeure = getHeure(spDate);
			nlMinute = getMinute(spDate);
		}
	
		switch (npFormat)
		{
			case 1:
				if (nlJour == "-1")
				{
					slNewDate = nlMois + "-" + nlAn;
				}else{
					switch (spLangue)
					{
						case "fra" : 
							slNewDate = nlJour + "-" + nlMois + "-" + nlAn;
							break;
						case "eng" : 
							slNewDate = nlMois + "-" + nlJour + "-" + nlAn;
							break;
					}
				}
				break;
			case 2:
				if (nlJour == "-1")
				{
					slNewDate = getNomMois(nlMois, spLangue, true) + " " + nlAn
				}else{
					switch(spLangue)
					{
						case "fra" : 
							if (nlJour == "01")
							{
								slExposant = "<SUP><FONT size=-1>er</FONT></SUP>";
							}
							slNewDate = Number(nlJour) + slExposant + " " + getNomMois(nlMois, spLangue, false) + " " + nlAn
							break;
						case "eng" :
							switch (nlJour)
							{
								case "01" : 
									slExposant = "<SUP><FONT size=-1>st</FONT></SUP>";
									break;
								case "02" : 
									slExposant = "<SUP><FONT size=-1>nd</FONT></SUP>";
									break;
								case "03" : 
									slExposant = "<SUP><FONT size=-1>rd</FONT></SUP>";
									break;
								default : 
									slExposant = "<SUP><FONT size=-1>th</FONT></SUP>";
									break;
							}
							slNewDate = getNomMois(nlMois, spLangue, true) + " " + Number(nlJour) + slExposant + " " + nlAn;
							break;
					}
				}
				break;
			case 3:
				slNewDate = nlAn + "-" + nlMois;
				if (nlJour != "-1")
				{
					slNewDate = slNewDate + "-" + Number(nlJour);
				}
				break;
		}
		
		if (nlHeure != "-1") 
		{
			slNewDate = slNewDate + " " + nlHeure + ":" + nlMinute;
		}
	}
	
	return slNewDate;
}

function UnFormatDate(spDate, spLangue)
{
	var slDate = spDate;
	var alDate;
	
	slDate = slDate.replace("/", "-");
	alDate = slDate.split("-");
	
	if (alDate.length == 3)
	{
		switch(spLangue)
		{
			case "fra" : 
				slDate = alDate[2] + LPad(alDate[1], "0", 2) + LPad(alDate[0], "0", 2);
				break;
			case "eng" :
				slDate = alDate[2] + LPad(alDate[0], "0", 2) + LPad(alDate[1], "0", 2);
				break;
		}
	}else{
		slDate = spDate;
	}
	
	return slDate;
}

function FormatHeure(spHeure)
{
	var slHeure;
	
	switch (spHeure.length)
	{
		case 4 : 
			slHeure = getHeure(spHeure) + ":" + getMinute(spHeure);
			break;
		case 6 : 
			slHeure = getHeure(spHeure) + ":" + getMinute(spHeure) + ":" + getSeconde(spHeure);
			break;
		default : 
			slHeure = spHeure;
			break;
	}
	
	if (Left(slHeure,1) == "0")
	{
		slHeure = Right(slHeure, slHeure.length-1);
	}
	
	return slHeure;
}

function FusionnerDate (spDateDebut, spDateFin, spLangue)
{
	var slDateDebut;
	var slDateFin;
	var slJourDebut;
	var slDateFusion;
	var slMotSep;
		
	if (spLangue == "eng")
	{
		slMotSep = " to ";
	}else if (spDateDebut.length == 6){
		slMotSep = " - ";
	}else{
		slMotSep = " au ";
	}
	
	slDateDebut = FormatDate(spDateDebut, 2, spLangue);
	
	if(spDateFin != "")
	{
		slDateFin = FormatDate(spDateFin, 2, spLangue);
		
		if(spLangue == "eng")
		{
			slDateFusion =  Left(slDateDebut, slDateDebut.length-4) + slMotSep + slDateFin;
		}else{
			if (getMois(spDateDebut) == getMois(spDateFin))
			{
				slJourDebut = getJour(spDateDebut);
				if (Number(slJourDebut) < 10)
				{
					slJourDebut = Right(slJourDebut,1);
				}
				slDateFusion = slJourDebut + slMotSep + slDateFin;
			}else if (getAn(spDateDebut) == getAn(spDateFin)){
				slDateFusion = Left(slDateDebut, slDateDebut.length-4) + slMotSep + slDateFin;
			}else{
				slDateFusion = slDateDebut + slMotSep + slDateFin;
			}
		}
	}else{
		slDateFusion = slDateDebut;
	}
		
	return slDateFusion;
}

/***********************************************************************************
********************  RECEVOIR DE L'INFORMATION SUR LE DATE  ***********************
***********************************************************************************/

function getDateJour (lpHeure)
{
	var slDate = getAn("") + getMois("") + getJour("");
	
	if(lpHeure == true)
	{
		slDate += getHeure("") + getMinute("");
	}
	return slDate;	
}

function getAn(spDate)
{
	var olDate = new Date();
	var slAn = olDate.getFullYear();
	
	switch(spDate.length)
	{
		case 6 :
		case 8 :
		case 12 : 
			slAn = Left(spDate,4);
			break;
	}
		
	return String(slAn);
}

function getMois(spDate)
{
	var olDate = new Date();
	var slMois = LPad(olDate.getMonth()+1,"0",2);
	
	switch(spDate.length)
	{
		case 6 :
		case 8 :
		case 12 : 
			slMois = spDate.substr(4,2);
			break;
	}
	
	return String(slMois);
}

function getJour(spDate)
{
	var olDate = new Date();
	var slJour = LPad(olDate.getDate(),"0",2);
	
	switch(spDate.length)
	{
		case 8 :
		case 12 : 
			slJour = spDate.substr(6,2);
			break;
	}

	return String(slJour);
}

function getHeure(spDate)
{
	var olDate = new Date();
	var slHeure = LPad(olDate.getHours(),"0",2)
	
	switch(spDate.length)
	{
		case 4 : 
			slHeure = spDate.substr(0,2);
			break;
		case 12 : 
			slHeure = spDate.substr(8,2);
			break;
	}
		
	return slHeure;
}

function getMinute(spDate)
{
	var olDate = new Date();
	var slMinute = LPad(olDate.getMinutes(),"0",2);
	
	switch(spDate.length)
	{
		case 4  : 
			slMinute = spDate.substr(2,2);
			break;
		case 6  : 
			slMinute = spDate.substr(3,2);
			break;
		case 12 : 
			slMinute = spDate.substr(10,2);
			break;
	}
		
	return slMinute;
}

function getSeconde(spDate)
{
	var olDate = new Date();
	var slSeconde = LPad(olDate.getSeconds(),"0",2);
	
	switch(spDate.length)
	{
		case 6 : 
			slSeconde = Right(spDate,2);
			break;
	}
	
	return slSeconde;
}

function getJoursDepuisDebutAnnee(npJour, npMois, npAn)
{
	var nlJours = 0;
	var i;
	
	for(i=1;i<=npMois-1;i++)
	{
		nlJours += getNbrJoursMois(i, npAn);
	}
	nlJours += Number(npJour);
	
	return nlJours;
}

function getJoursAvantFinAnnee(npJour, npMois, npAn)
{
	var nlJours = 0;
	var i;
	
	for(i=Number(npMois)+1;i<=12;i++)
	{
		nlJours += getNbrJoursMois(i, npAn);
	}
	nlJours += getNbrJoursMois(npMois, npAn) - Number(npJour);
	
	return nlJours;
}

function getNbrJoursAnnee(npAn)
{
	if (ValAnBissextile(npAn))
	{
		return 366;
	}else{
		return 365;
	}
}

function getNbrJoursMois(npMois, npAn)
{
	var nlJour;
	
	if (ValMois(npMois))
	{
		switch (Number(npMois))
		{
    		case 1 :
			case 3 :
			case 5 :
			case 7 :
			case 8 :
			case 10 :
			case 12 : 
				nlJour = 31
				break;
			case 2 :
				if (ValAnBissextile(npAn))
				{
					nlJour = 29;
				}else{
					nlJour = 28;
				}
				break;
			case 4 :
			case 6 :
			case 9 :
			case 11 :
				nlJour = 30;
				break;
		}
	}
	
	return nlJour;
}

function getNomMois(npMois, spLangue, lpMajuscule)
{
	var alMois;
	var slMois = "";

	if (ValMois(npMois))
	{
		switch(spLangue)
		{
			case "fra" : 
				alMois = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
				break;
			case "eng" : 
				alMois = new Array("january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december");
				break;
		}
		slMois = alMois[Number(npMois) - 1];
		
		if(lpMajuscule && slMois.length > 0)
		{
			slMois = Left(slMois,1).toUpperCase() + Right(slMois,slMois.length-1)
		}
	}
	
	return slMois;
}

function getJourSemaine(spDate, npFormat, spLangue)
{
	var nlIntervalle = getIntervalleDate("19950101", spDate);
	var alJourFra = Array("dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi");
	var alJourEng = Array("sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday");
	var nlNoJour;
	var llInverse = false;
	var slValeur;
	
	if(nlIntervalle < 0)
	{
		nlIntervalle = nlIntervalle * -1;
		llInverse = true;
	}
	
	nlNoJour = nlIntervalle % 7;
	
	if (llInverse && nlNoJour != 0)
	{
		nlNoJour = 7 - nlNoJour;
	}
	
	if(npFormat == 2)
	{
		switch (spLangue)
		{
			case "fra" : 
				slValeur = alJourFra[nlNoJour];
				break;
			case "eng" : 
				slValeur = alJourEng[nlNoJour];
				break;
		}
	}else{
		slValeur = nlNoJour ++;
	}
	
	return slValeur;
}

function getIntervalleDate(spDateAnt, spDatePost)
{
	var i;
	var alDatePost = new Array(2);
	var alDateAnt = new Array(2);
	var nlNbrJours = 0;
	var llInverse = false;
	var slDateTemp;
	var llTrouve = false;
	
	if(IsNumeric(spDatePost) && IsNumeric(spDateAnt))
	{
		if(spDatePost == spDateAnt)
		{
			llTrouve = true;
		}else if(spDatePost < spDateAnt){
			slDateTemp = spDatePost;
			spDatePost = spDateAnt;
			spDateAnt = slDateTemp;
			llInverse = true;
		}
		
		alDatePost[0] = Number(getAn(spDatePost));
		alDatePost[1] = getMois(spDatePost);
		alDatePost[2] = getJour(spDatePost);
		
		alDateAnt[0] = Number(getAn(spDateAnt));
		alDateAnt[1] = getMois(spDateAnt);
		alDateAnt[2] = getJour(spDateAnt);
		
		if(alDatePost[0] == alDateAnt[0])
		{
			nlNbrJours = getJoursDepuisDebutAnnee(alDatePost[2], alDatePost[1], alDatePost[0]) - getJoursDepuisDebutAnnee(alDateAnt[2], alDateAnt[1], alDateAnt[0]);
		}else{
			for(i=alDateAnt[0]+1;i<=alDatePost[0]-1;i++)
			{
				nlNbrJours += getNbrJoursAnnee(i);
			}
			nlNbrJours += getJoursAvantFinAnnee(alDateAnt[2], alDateAnt[1], alDateAnt[0]) + getJoursDepuisDebutAnnee(alDatePost[2], alDatePost[1], alDatePost[0]);
		}
		
		if(llInverse)
		{
			nlNbrJours -= (nlNbrJours * 2);
		}
	}
	
	return nlNbrJours;
}

function getIntervalleHeure(npHeureAnt, npHeurePost, npTypeRetour)
{
	var nlIntervalle = -1;
	
	switch (npHeureAnt.length)
	{
		case 4 : 
			npHeureAnt = Left(npHeureAnt, 2) + ":" + Right(npHeureAnt, 2);
			break;
		case 5,7 :
		case 6 : 
			npHeureAnt = Left(npHeureAnt, 2) + ":" + npHeureAnt.substr(2,2) + ":" + Right(npHeureAnt, 2)
			break;
		default : 
			nlIntervalle = 0
			break;
	}
	
	switch(npHeurePost.length)
	{
		case 4 : 
			npHeurePost = Left(npHeurePost, 2) + ":" + Right(npHeurePost, 2);
			break;
		case 5,7 :
		case 6 : 
			npHeurePost = Left(npHeurePost, 2) + ":" + npHeurePost.substr(2,2) + ":" + Right(npHeurePost, 2);
			break;
		default : 
			nlIntervalle = 0;
			break;
	}
	
	if(nlIntervalle != 0)
	{
		switch (npTypeRetour.toUpperCase())
		{
			case "H" : 
				nlIntervalle = DateDiff("H", npHeureAnt, npHeurePost);
				break;
			case "M" : 
				nlIntervalle = DateDiff("N", npHeureAnt, npHeurePost);
				break;
			case "S" : 
				nlIntervalle = DateDiff("S", npHeureAnt, npHeurePost);
				break;
			default : 
				nlIntervalle = 0;
				break;
		}
	}
	
	return nlIntervalle;
}

/***********************************************************************************
*******************************  CHANGER LA DATE  **********************************
***********************************************************************************/

function setAn (spDate, spAn)
{
	spAn = String(spAn)
	switch(spAn.length)
	{
		case 2 : 
			spAn = "20" + spAn;
			break;
		case 4 :
			break;
		default : 
			spAn = getAn(spDate);
			break;
	}
	
	spDate = spAn + Right(spDate,4);
	
	return spDate;
}

function setMois (spDate, npMois)
{
	if (ValMois(npMois))
	{
		spDate = getAn(spDate) + LPad(npMois, "0", 2) + getJour(spDate);
	}
	
	return spDate;
}

function setJour (spDate, npJour)
{
	if (ValJour(npJour, getMois(spDate), getAn(spDate)))
	{
		spDate = Left(spDate,6) + LPad(npJour, "0", 2);
	}

	return spDate;
}

function setHeure (spDate, npHeure)
{
	if(ValHeure(npHeure))
	{
		switch(spDate.length)
		{
			case 4 : 
				spDate = npHeure + Right(spDate,2);
				break;
			case 6 : 
				spDate = npHeure + Right(spDate,4);
				break;
			case 12 : 
				spDate = Left(spDate,8) + npHeure + Right(spDate,2);
				break;
			case 14 : 
				spDate = Left(spDate,8) + npHeure + Right(spDate,4);
				break;
		}
	}
	
	return spDate;
}

function setMinute (spDate, npMinute)
{
	if(ValMinute(npMinute))
	{
		switch(spDate.length)
		{
			case 4 : 
				spDate = Left(spDate,2) + npMinute;
				break;
			case 6 : 
				spDate = Left(spDate,2) + npMinute + Right(spDate,2);
				break;
			case 12 : 
				spDate = Left(spDate,10) + npMinute;
				break;
			case 14 : 
				spDate = Left(spDate,10) + npMinute + Right(spDate,2);
				break;
		}
	}
	
	return spDate;
}

function IncDate(spDate, npNbrJours)
{
	var nlJour = Number(getJour(spDate));
	var nlMois = Number(getMois(spDate));
	var nlAn = Number(getAn(spDate));
	var slDate;
	
	do
	{
		if(nlJour != 0)
		{
			npNbrJours -= (getNbrJoursMois(nlMois, nlAn) - nlJour);
			nlJour = 0;
		}else{
			npNbrJours -= getNbrJoursMois(nlMois, nlAn);
		}
		
		if(npNbrJours > 0)
		{
			if(nlMois == 12)
			{
				nlMois = 1;
				nlAn ++;
			}else{
				nlMois ++;
			}
		}
	}while(npNbrJours > 0)
	
	npNbrJours += getNbrJoursMois(nlMois, nlAn);
	
	slDate = nlAn + LPad(nlMois,"0",2) + LPad(npNbrJours,"0",2);
	
	return slDate;
}

function DecDate(spDate, npNbrJours)
{
	var nlJour = Number(getJour(spDate));
	var nlMois = Number(getMois(spDate));
	var nlAn = Number(getAn(spDate));
	var slDate;
	
	if(npNbrJours > 0)
	{
		do
		{
			if (nlJour != 0)
			{
				npNbrJours -= nlJour;
				nlJour = 0;
			}else{
				npNbrJours -= getNbrJoursMois(nlMois, nlAn)
			}
						
			if(npNbrJours > 0)
			{
				if (nlMois == 1)
				{
					nlMois = 12;
					nlAn--;
				}else{
					nlMois--;
				}
			}
		}while(npNbrJours > 0)
		
		npNbrJours -= (npNbrJours * 2)
		
		slDate = nlAn + LPad(nlMois,"0",2) + LPad(npNbrJours,"0",2);
	}else{
		slDate = spDate;
	}
	
	return slDate;
}

function IncMoisDate(spDate, npNbrMois)
{
	var i;
	
	for(i=1;i<=npNbrMois;i++)
	{
		if(Number(getMois(spDate)) == 12)
		{
			spDate = Number(getAn(spDate))+1 + "01" + getJour(spDate);
		}else{
			spDate = getAn(spDate) + LPad(Number(getMois(spDate))+1,"0",2) + getJour(spDate) 
		}
	}
	
	if(Number(getJour(spDate)) > Number(getNbrJoursMois(getMois(spDate), getAn(spDate))))
	{
		spDate = getAn(spDate) + getMois(spDate) + getNbrJoursMois(getMois(spDate), getAn(spDate));
	}
		
	return spDate;
}

function DecMoisDate(spDate, npNbrMois)
{
	var i;
	
	for(i=1;i<=npNbrMois;i++)
	{
		if (Number(getMois(spDate)) == 1)
		{
			spDate = Number(getAn(spDate))-1 + "12" + getJour(spDate);
		}else{
			spDate = getAn(spDate) + LPad(Number(getMois(spDate))-1,"0",2) + getJour(spDate);
		}
	}
	
	if (Number(getJour(spDate)) > Number(getNbrJoursMois(getMois(spDate), getAn(spDate))))
	{
		spDate = getAn(spDate) + getMois(spDate) + getNbrJoursMois(getMois(spDate), getAn(spDate));
	}
		
	return spDate;
}

function IncMois(npMois, npNbrMois)
{
	npMois = Number(npMois);
	
	for(i=1;i<=npNbrMois;i++)
	{
		if(npMois == 12)
		{
			npMois = 1;
		}else{
			npMois = npMois ++;
		}
	}
	
	return LPad(npMois,"0",2);
}

function DecMois(npMois, npNbrMois)
{
	npMois = Number(npMois);
	
	for(i=1;i<=npNbrMois;i++)
	{
		if(npMois == 1)
		{
			npMois = 12;
		}else{
			npMois = npMois --;
		}
	}
	
	return LPad(npMois,"0",2);
}

/***********************************************************************************
*******************************  VALIDER LA DATE  **********************************
***********************************************************************************/

function ValDate(spDate)
{
    var llValide = false;
	var nlJour;
	var nlMois;
	var nlAn;
	
	if (spDate.length == 8 && IsNumeric(spDate))
	{
		nlJour = Number(spDate.substr(6,2));
		nlMois = Number(spDate.substr(4,2));
		nlAn = Number(spDate.substr(0,4));
		
		if (ValMois(nlMois) && ValJour(nlJour, nlMois, nlAn))
		{
			llValide = true;
		}
	}
		
	ValDate = llValide
}

function ValMois(npMois)
{
	var llValide = false;
	
	if (IsNumeric(npMois))
	{
	   	if (npMois >= 1 && npMois <= 12) 
		{
			llValide = true;
		}
	}
	
	return llValide;
}

function ValJour(npJour, npMois, npAn)
{
    var llValide = false;
	var nlJourFin;
	
	if (IsNumeric(npJour))
	{
		nlJourFin = getNbrJoursMois(npMois, npAn);
		if (npJour >= 1 && npJour <= nlJourFin)
		{
			llValide = true;
		}
	}
	return llValide;
}

function ValHeure(npHeure)
{
    var llValide = false
	
	if (IsNumeric(npHeure))
	{
	   	if (npHeure >= 0 && npHeure <= 23) 
		{
			llValide = true;
		}
	}
	
    return llValide;
}

function ValMinute(npMinute)
{
    var llValide = false;
	
	if (IsNumeric(npMinute))
	{
	   	if (npMinute >= 1 && npMinute <= 59) 
		{
			llValide = true;
		}
	}
	
    return llValide;
}

function ValAnBissextile(npAn)
{
    var llValide = false;
    
    if(npAn % 4 == 0)
	{
        if(npAn % 100 == 0)
		{
            if(npAn % 400 == 0)
			{
				llValide = true;
			}
		}else{
            llValide = true;
		}
	}
    
    return llValide;
}
