var dDate = new Date();
var dCurMonth = dDate.getMonth();
var dCurDayOfMonth = dDate.getDate();
var dCurYear = dDate.getFullYear();
var currentDate = dDate.getDate()+"/"+(dDate.getMonth()+1)+"/"+dDate.getFullYear();
var objPrevElement = new Object();
var nomJour = new Array("Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche");
var StaticNBJour = 0;
var add_nbr_inday = 1;

// retourne la date a n jour suivant la date actuelle
function nDaysAfter(n) {
	return Date.parse();
}

function isFirefoxBrowser(){
    // return -1 if is not firefox browser, more else
    return navigator.userAgent.indexOf('Firefox');
}

function oteZero(jour,elemId) {
	if (jour.substring(0,1) == "0") {
		document.getElementById(elemId).value = jour.substring(1,jour.length);
		return jour.substring(1,jour.length);
	} else {
		return jour;
	}
}


function getNomJour(initialDay,increment) {
	var incre = increment;
	var indexDay = 0;
	var newIndex;
	for (var i=0; i<7; i++) {
		if (nomJour[i] == initialDay) {indexDay = i;}
	}
	newIndex = (indexDay+incre)%7;
	//alert("initial index : "+indexDay+"\nincrement : "+increment+"\nnew index : "+newIndex+"\nNew day : "+nomJour[newIndex]);
	return nomJour[newIndex];
}

function instantDayName(objDate) {
	var correctorValue = 86400000-4300000;
	var startDateMsI = new Date(parseFloat(Date.parse(convertDateToNonEuropeen(objDate)))-correctorValue);
	var day_name = getNomJour(0,startDateMsI.getDay());

	return day_name;
}

function is31(amois) {
	var en31 = new Array("1","3","5","7","8","10","12");
	for (i=0; i<en31.length; i++) {
		if (en31[i] == amois) {return true;}
	}
	return false;
}

function bisexstile(an) {
	if ((an%4 == 0) && (an%100 != 0) || (an%400 ==0)) {
		return true;
	} else {
		return false;
	}
}

function alertError(message) {
	alert (message);
	initCalendar();
}

function isValidDate(dateStr, format) {
   if (format == null) { format = "MDY"; }
   format = format.toUpperCase();
   if (format.length != 3) { format = "MDY"; }
   if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) ) { format = "MDY"; }
   if (format.substring(0, 1) == "Y") {
      var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
      var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
   } else if (format.substring(1, 2) == "Y") {
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
   } else {
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
   }
   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
   var parts = dateStr.split(RegExp.$1);
   if (format.substring(0, 1) == "M") { var mm = parts[0]; } else
      if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
   if (format.substring(0, 1) == "D") { var dd = parts[0]; } else
      if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
   if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else
      if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
   if (parseFloat(dd) != dt.getDate()) { return false; }
   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
   return true;
}

function Jdemain(debVal) {
	if (debVal == "") {
		alertError("Veuillez entrer une date de d?part !");
	}
	if (!isValidDate(debVal,"DMY")) {
		alertError("Date de d?part mal form?e (non valide)!");
	}
	var startDateMsJ = parseFloat(Date.parse(convertDateToNonEuropeen(debVal)));
	//add_nbrday_inday
	oneDaysMs = 86400000*add_nbr_inday;
	var demain = startDateMsJ + oneDaysMs;
	var dateFin = new Date(demain);
	var dateStr = dateFin.getDate()+"/"+(dateFin.getMonth()+1)+"/"+dateFin.getFullYear();
	return dateStr;
}

function legalDateFormat(aDate) {
	var tab = aDate.split("/");
	var an = tab[2];
	var mois = tab[1];
	var jour = tab[0];
	if (tab[1].length < 2) {mois = "0" + tab[1]}
	if (tab[0].length < 2) {jour = "0" + tab[0]}
	return an+mois+jour;
}

function buildDate(dDate,type) {
	if (type == "deb") {
		var el_mois = frmCalendarSample.tbSelMonth;
		var el_year = frmCalendarSample.tbSelYear;
		var mois = el_mois.options[el_mois.selectedIndex].value;
		var year = el_year.options[el_year.selectedIndex].value;
		var theDate = dDate+"/"+mois+"/"+year;
		return theDate;
	}else {
		var el_mois = frmCalendarSample_2.tbSelMonth_2;
		var el_year = frmCalendarSample_2.tbSelYear_2;
		var mois = el_mois.options[el_mois.selectedIndex].value;
		var year = el_year.options[el_year.selectedIndex].value;
		var theDate = dDate+"/"+mois+"/"+year;
		return theDate;
	}
}

function dateToMs(maDate) {
	var tab = maDate.split("/");
	var chaine = tab[2]+tab[1]+tab[0];
	var bizDate = new Date(tab[2],tab[1]-1,tab[0]);
	return bizDate;
}

function convertDateToNonEuropeen(aDate) {
	var date_element = aDate.split("/");
	var jour = date_element[0];
	var mois = date_element[1];
	var annee = date_element[2];
	var convertedDate = mois+"/"+jour+"/"+annee;
	return convertedDate;
}

function nuitee(date1,date2) {
	var date1 = parseFloat(Date.parse(convertDateToNonEuropeen(date1)));
	var date2 = parseFloat(Date.parse(convertDateToNonEuropeen(date2)));
	var difmilli = date2-date1;
	var msPerDay = 86400000;
	var nb_jour = (difmilli/msPerDay);
	// la valeur 0.05 correspond au reajustement de l'erreur introduite par la methode Date.parse()
	var nb_ajusted = nb_jour+0.05;
	return nb_ajusted;
}

function nuiteeEnInteger(date1,date2) {
	var date1 = parseFloat(Date.parse(convertDateToNonEuropeen(date1)));
	var date2 = parseFloat(Date.parse(convertDateToNonEuropeen(date2)));
	var difmilli = date2-date1;
	var msPerDay = 86400000;
	var nb_jour = parseInt((difmilli/msPerDay));
	return nb_jour;
}

function getNuiteeBySelDay() {
	var selElem = document.getElementById("selNuit");
	var debut = document.getElementById("ddeb").value;
	var nbDays = selElem.options[selElem.selectedIndex].value;
	add_nbr_inday = nbDays;
	var startDateMsG = parseFloat(Date.parse(convertDateToNonEuropeen(debut)));
	nbDaysMs = (nbDays*86400000)+3601000;
	var dateFinMs = startDateMsG+nbDaysMs;
	var dateFinN = new Date(dateFinMs);
	var dateStr = dateFinN.getDate()+"/"+(dateFinN.getMonth()+1)+"/"+dateFinN.getFullYear();
	document.getElementById("jfin").innerHTML = getNomJour(document.getElementById("jdeb").innerHTML,parseInt(nbDays));
	document.getElementById("dfin").value =dateStr;
}

/* Calcule et retourne le n?me jour apr?s la date d */
function dateadd(n,d) {
   d.setDate(d.getDate()+n);
   return d
}

function reloadSelectedOnchange() {
	var d1 = document.getElementById("ddeb").value;
	var d2 = document.getElementById("dfin").value;
	if (isNaN(nuitee(d1,d2))) {
		initCalendar();
		fUpdateCal('calSelectedDate',dCurYear, dCurMonth+1);
		return;
	}
	if ((nuitee(d1,d2)-1)<0) {
		document.getElementById("selNuit").options[30].selected = true;
	} else {
		add_nbr_inday = parseInt(nuitee(d1,d2));
		document.getElementById("selNuit").options[(add_nbr_inday-1)].selected = true;
	}
}

function getNuitee(whereFrom) {
	// Construction de la date de test pour comparaison
	//var d = new Date();
	//var ty = d.getFullYear();
	//var tm = d.getMonth();
	//var td = d.getDate();
	//var dtest = new Date(ty,tm,eval(td-1),23,59,59);
	//dtest.setSeconds(1);
	var dtestObj = new nDaysAfterObj(fromDate(new Date()),1);
	var dtest = new Date(dCurDateObj.annee,(dCurDateObj.mois-1),dCurDateObj.jour);
	var d1 = document.getElementById("ddeb").value;
	var d2 = document.getElementById("dfin").value;
	d1 = oteZero(d1,"ddeb");
	d2 = oteZero(d2,"dfin");
	var nb_jour = nuitee(d1,d2);
	if (dateToMs(d1) < dtest) {
		alertError("Veuillez choisir une date de d?part sup?rieure ou ?gale ? "+dtest.getDate()+"/"+(dtest.getMonth()+1)+"/"+dtest.getFullYear());
		return;
	}
 	if (whereFrom == "cal") {
		document.getElementById("dfin").value = Jdemain(d1);
 		reloadSelectedOnchange();
 	}
 	if (whereFrom == "deb") {
 		if (isValidDate(document.getElementById("ddeb").value,"DMY")) {
	 		document.getElementById("jdeb").innerHTML = instantDayName(document.getElementById("ddeb").value);
	 		document.getElementById("jfin").innerHTML = instantDayName(Jdemain(document.getElementById("ddeb").value));
			document.getElementById("dfin").value = Jdemain(d1);
			reloadSelectedOnchange();
  		} else {
  			alertError("Date de d?part mal form?e !");
  		}
 	}
 	if (whereFrom == "fin") {
		if (nb_jour > 30) {
			alertError("La dur?e de r?servation ne peut exceder 30 jours");
			return;
		}
 		if (isValidDate(document.getElementById("dfin").value,"DMY")) {
			document.getElementById("jfin").innerHTML = instantDayName(document.getElementById("dfin").value);
			reloadSelectedOnchange();
  		} else {
  			alertError("Date de fin mal form?e !");
  		}
 	}

}

function fSetSelectedDay(myElement, id_type,whichDay) {
	var elemGrp = (myElement.id).substring(0,11);
	if (elemGrp == "calDateText") {
		if (id_type == "deb") {
			if (myElement.innerHTML == "X") {return;}
			document.getElementById("ddeb").value = buildDate(myElement.innerHTML,id_type);
			document.getElementById("jdeb").innerHTML = whichDay;
			document.getElementById("jfin").innerHTML = getNomJour(whichDay,add_nbr_inday);
			getNuitee("cal");
			document.getElementById("cal_deb").style.visibility = "hidden";
		} else {
			document.getElementById("dfin").value = buildDate(myElement.innerHTML,id_type);
			getNuitee("cal");
			document.getElementById("cal_fin").style.visibility = "hidden";
		}
   	}
}

function fGetDaysInMonth(iMonth, iYear) {
	var dPrevDate = new Date(iYear, iMonth, 0);
	return dPrevDate.getDate();
}


function fBuildCal(iYear, iMonth, iDayStyle) {
	var aMonth = new Array();
	aMonth[0] = new Array(7);
	aMonth[1] = new Array(7);
	aMonth[2] = new Array(7);
	aMonth[3] = new Array(7);
	aMonth[4] = new Array(7);
	aMonth[5] = new Array(7);
	aMonth[6] = new Array(7);
	var dCalDate = new Date(iYear, iMonth-1, 1);
	var iDayOfFirst = dCalDate.getDay();
	var iDaysInMonth = fGetDaysInMonth(iMonth, iYear);
	var iVarDate = 1;
	var i, d, w;
	if (iDayStyle == 2) {
		aMonth[0][0] = "Dimanche";
		aMonth[0][1] = "Lundi";
		aMonth[0][2] = "Mardi";
		aMonth[0][3] = "Mercredi";
		aMonth[0][4] = "Jeudi";
		aMonth[0][5] = "Vendredi";
		aMonth[0][6] = "Samedi";
	} else if (iDayStyle == 1) {
		aMonth[0][0] = "Dim";
		aMonth[0][1] = "Lun";
		aMonth[0][2] = "Mar";
		aMonth[0][3] = "Mer";
		aMonth[0][4] = "Jeu";
		aMonth[0][5] = "Ven";
		aMonth[0][6] = "Sam";
	} else {
		aMonth[0][0] = "Di";
		aMonth[0][1] = "Lu";
		aMonth[0][2] = "Ma";
		aMonth[0][3] = "Me";
		aMonth[0][4] = "Je";
		aMonth[0][5] = "Ve";
		aMonth[0][6] = "Sa";
	}
	for (d = iDayOfFirst; d < 7; d++) {
		aMonth[1][d] = iVarDate;
		iVarDate++;
	}
	for (w = 2; w < 7; w++) {
		for (d = 0; d < 7; d++) {
			if (iVarDate <= iDaysInMonth) {
				aMonth[w][d] = iVarDate;
				iVarDate++;
	      	}
	   	}
	}
	return aMonth;
}

function fDrawCal(iYear, iMonth, iDayStyle, id_type_cal) {
	var myMonth;
	myMonth = fBuildCal(iYear, iMonth, iDayStyle);
	document.write("<table cellpadding='0' cellspacing='0' border='1'>")
	document.write("<tr>");
	document.write("<td align='center' class='cell'>Di</td>");
	document.write("<td align='center' class='cell'>Lu</td>");
	document.write("<td align='center' class='cell'>Ma</td>");
	document.write("<td align='center' class='cell'>Me</td>");
	document.write("<td align='center' class='cell'>Je</td>");
	document.write("<td align='center' class='cell'>Ve</td>");
	document.write("<td align='center' class='cell'>Sa</td>");
	document.write("</tr>");
	for (w = 1; w < 7; w++) {
		document.write("<tr>")
		for (d = 0; d < 7; d++) {
			document.write("<td align='left' valign='top' class='cellday' id='calCell' onclick=''>");
			if(id_type_cal == "deb") {
				if (!isNaN(myMonth[w][d])) {
					document.write("<font id='calDateText' name='calDateText' class='fontday' onclick=fSetSelectedDay(this,'deb','"+myMonth[0][d]+"')>" + myMonth[w][d] + "</font>");
				} else {
					document.write("<font id='calDateText' name='calDateText' class='fontday' onclick=fSetSelectedDay(this,'deb','"+myMonth[0][d]+"')>&nbsp;</font>");
				}
			} else {
				if (!isNaN(myMonth[w][d])) {
					document.write("<font id='calDateText_2' name='calDateText_2' class='fontday' onclick=fSetSelectedDay(this,'fin','"+myMonth[0][d]+"')>" + myMonth[w][d] + "</font>");
				} else {
					document.write("<font id='calDateText_2' name='calDateText_2' class='fontday' onclick=fSetSelectedDay(this,'fin','"+myMonth[0][d]+"')>&nbsp;</font>");
				}
			}
			document.write("</td>");
		}
		document.write("</tr>");
	}
	document.write("</table>")
}

function fUpdateCal(elemDate,iYear, iMonth) {
	var dateObj = new nDaysAfterObj(fromDate(new Date()),1);
	var date = new Date(dCurDateObj.annee,(dCurDateObj.mois-1),dCurDateObj.jour);
	var selYear = document.getElementById("tbSelYear");
	if ((iMonth<date.getMonth()+1) && (iYear == date.getFullYear())) {
		selYear.options[selYear.selectedIndex+1].selected = true;
	}
	if ((iMonth>=date.getMonth()+1) && (iYear > date.getFullYear())) {
		selYear.options[0].selected = true;
	}
	myMonth = fBuildCal(selYear.options[selYear.selectedIndex].value, iMonth);
	objPrevElement.bgColor = "";

	document.getElementById(elemDate).value = "";	


    if( isFirefoxBrowser() > -1 ){
        calDateText = document.getElementsByName('calDateText');
        calDateText_2 = document.getElementsByName('calDateText_2');
    }

	//document.getElementById(elemDate).value = "";
	if (elemDate == "calSelectedDate") {
		for (w = 1; w < 7; w++) {
			for (d = 0; d < 7; d++) {
				if (!isNaN(myMonth[w][d])) {
						if (((myMonth[w][d] < date.getDate())&&(iMonth==date.getMonth()+1))) {
							calDateText[((7*w)+d)-7].innerHTML = "X";
						} else {
							calDateText[((7*w)+d)-7].innerHTML = myMonth[w][d];
						}
				} else {
					calDateText[((7*w)+d)-7].innerHTML = " ";
		 		}
	     	}
		}
	} else {
		for (w = 1; w < 7; w++) {
			for (d = 0; d < 7; d++) {
				if (!isNaN(myMonth[w][d])) {
					calDateText_2[((7*w)+d)-7].innerHTML = myMonth[w][d];
				} else {
					calDateText_2[((7*w)+d)-7].innerHTML = " ";
		 		}
	      	}
	   	}
	}
}

function isMonth31(mois) {
	var tab=new Array("1","3","5","7","8","10","12");
	for(var i=0;i<tab.length;i++)
		if(mois==tab[i])
			return (true);
	return (false);
}

// Donne la date n jour apres la date d'entree
// date d'entree au format jj/mm/yyyy
function nDaysAfterObj(date,n) {
	function getNbJour() {
		return n;
	}
	function getResult() {
		var oneDay = 86400000;
		return getInit()+(oneDay*n);
	}
	function getInit() {
		var dateInit = new Date();
		var curDate = new Date(dateToMs(date));
		dateInit.setFullYear(curDate.getFullYear());
		dateInit.setMonth(curDate.getMonth());
		dateInit.setDate(curDate.getDate());
		dateInit.setHours(0);
		dateInit.setMinutes(0);
		dateInit.setSeconds(0);
		dateInit.setMilliseconds(1);
		return Date.parse(dateInit);
	}
	function formatedDate() {
		var theDate = new Date(getResult());
//alert("getResult : "+getResult()+"   /   formatter : "+new Date(getResult()));
		return theDate.getDate()+"/"+(theDate.getMonth()+1)+"/"+theDate.getFullYear();
	}
	function getJour() {
		return (new Date(getResult())).getDate();
	}
	function getMois() {
		return (new Date(getResult())).getMonth()+1;
	}
	function getAnnee() {
		return (new Date(getResult())).getFullYear();
	}
	this.n = getNbJour();
	this.result = getResult();
	this.todayInMs = getInit();
	this.getNbJour = getNbJour;
	this.getResult = getResult;
	this.getInit = getInit;
	this.formatedDate = formatedDate();
	this.jour = getJour();
	this.mois = getMois();
	this.annee = getAnnee();
}

function initCalendar() {
	// j + init_inday
	var theDate = new nDaysAfterObj(currentDate,init_inday);
	var dCurDate = new Date(theDate.result);
	frmCalendarSample.tbSelMonth.options[dCurDate.getMonth()].selected = true;
	frmCalendarSample.tbSelYear.options[0].selected = true;
	// fait un update du calendrier
	fUpdateCal("calSelectedDate",frmCalendarSample.tbSelYear.options[0].value,frmCalendarSample.tbSelMonth.options[dCurDate.getMonth()].value);
	var date_debut = theDate.formatedDate;
	var date_fin = Jdemain(date_debut);
	document.getElementById("ddeb").value = date_debut;
	document.getElementById("dfin").value = date_fin;
	document.getElementById("jdeb").innerHTML = instantDayName(date_debut);
	document.getElementById("jfin").innerHTML = instantDayName(date_fin);
}

function initCalendarSpecialOffer(nbr_day) {
	// j + init_inday
	var theDate = new nDaysAfterObj(currentDate,init_inday);
	var dCurDate = new Date(theDate.result);
	frmCalendarSample.tbSelMonth.options[dCurDate.getMonth()].selected = true;
	frmCalendarSample.tbSelYear.options[0].selected = true;
	// fait un update du calendrier
	fUpdateCal("calSelectedDate",frmCalendarSample.tbSelYear.options[0].value,frmCalendarSample.tbSelMonth.options[dCurDate.getMonth()].value);
	var date_debut = theDate.formatedDate;
	var date_fin = (new nDaysAfterObj(currentDate,(nbr_day))).formatedDate;//Jdemain(date_debut);
	document.getElementById("ddeb").value = date_debut;
	document.getElementById("dfin").value = date_fin;
	document.getElementById("jdeb").innerHTML = instantDayName(date_debut);
	document.getElementById("jfin").innerHTML = instantDayName(date_fin);
	document.getElementById("selNuit").options[0].selected = true;
}

function initScript(in_date,nbr_day,min_inday) {
	var date_element = in_date.split("/");
	var day = date_element[0];
	var month = date_element[1];
	var year = date_element[2];
	dDate.setDate(day);
	dDate.setMonth(month-1);
	dDate.setYear(year);
	dCurMonth = dDate.getMonth();
	dCurDayOfMonth = dDate.getDate();
	dCurYear = dDate.getFullYear();
	currentDate = dDate.getDate()+"/"+(dDate.getMonth()+1)+"/"+dDate.getFullYear();
	add_nbr_inday = nbr_day;
	init_inday = 0;
	document.getElementById("selNuit").options[nbr_day-1].selected = true;
}

function initScriptOffer(in_date,nbr_day,min_inday) {
	
	var date_element = in_date.split("/");
	var day = date_element[0];
	var month = date_element[1];
	var year = date_element[2];
	dDate.setDate(day);
	dDate.setMonth(month-1);
	dDate.setYear(year);
	dCurMonth = dDate.getMonth();
	dCurDayOfMonth = dDate.getDate();
	dCurYear = dDate.getFullYear();
	currentDate = dDate.getDate()+"/"+(dDate.getMonth()+1)+"/"+dDate.getFullYear();
	add_nbr_inday = nbr_day;
	init_inday = 0;
	document.getElementById("selNuit").options[0].selected = true;
}

function genSelNum(init,num) {
	var init = parseInt(init);
	var limite = parseInt(num);
	for (var i=init; i<limite; i++) {
		document.write("<option value='"+i+"'>"+i+"</option>");
	}
}

function fromDate(date) {
	return date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear();
}
