/*********************************************************************************/
/**          Fichier de script qui gère l'objet ParroDatePicker               **/
/*********************************************************************************/

//tableaux contenant le nom des mois pour chacune des langues
var aMonthNameFr = new Array("Janvier", "F&eacute;vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao&ucirc;t", "Septembre", "Octobre", "Novembre", "D&eacute;cembre");
var aMonthNameEn = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

//tableaux contenant la premiere lettre du jour de la semaine pour chacune des langues
var aWeekDayFr = new Array("D", "L", "M", "M", "J", "V", "S");
var aWeekDayEn = new Array("S", "M", "T", "W", "T", "F", "S");

//fonction permettant de récupérer la lettre du jour de la semaine selon la langue
function GetWeekDayName(index, name)
{
	var edit = window.parent.document.getElementById(name);
	
	if(edit == null)
		edit = window.parent.parent.document.getElementById(name);
		
	if(edit == null)
		edit = document.getElementById(name);
		
	var lang = edit.language;
	switch(lang)
	{
		case "en": return aWeekDayEn[index];
		default: return aWeekDayFr[index];
	}
}

//permet d'obtenir le noms du mois à l'inde demandé pour la langue du contrôle
function GetMonthName(index, name)
{
	var edit = window.parent.document.getElementById(name);
	
	if(edit == null)
		edit = window.parent.parent.document.getElementById(name);
		
	if(edit == null)
		edit = document.getElementById(name);
		
	var lang = edit.language;
	switch(lang)
	{
		case "en": return aMonthNameEn[index];
		default: return aMonthNameFr[index];
	}
}

//function qui retourne vrai si la date en paramètre est bisextile
//faux dans le cas contraire
function IsLeapYear(y)
{
  if(0 == y % 4 && ((y % 100 != 0) || (y % 400 == 0))) 
	return true;
  else 
	return false;
}

//fonction qui retourne le jour de la semaine
function GetDOW(year, month, day)
{
  var dt=new Date(year, month - 1, day);
  return (dt.getDay() + 7) % 7;
}

//affiche le calendrier
function ShowCalendar(name, language, format, separator, postback, javascriptFile, cssFile)
{
	var cal = document.getElementById("div" + name);
	var edit = document.getElementById(name);
	edit.language = language;
	edit.separator = separator;
	edit.postBack = postback == 1;	
	edit.javascriptFile = javascriptFile;
	edit.cssFile = cssFile;

	//si le contrôle est désactivé, ne pas afficher le calendrier
	if(edit.disabled || edit.readOnly)
		return;
		
	if(edit.value == "" || !ValidDate(name))
	{
		var oDate = new Date();
		cal.innerHTML = GetTableCalendar(oDate.getFullYear(), oDate.getMonth() + 1, oDate.getDate(), name);
	}
	else
		cal.innerHTML = GetTableCalendar(GetYear(name), GetMonth(name), GetDay(name), name);
	
	edit.popup = window.createPopup()
	edit.popup.document.body.innerHTML = cal.innerHTML;
	
	
	var script = edit.popup.document.createElement('script');
	script.src = edit.javascriptFile;
	edit.popup.document.getElementsByTagName('head')[0].insertBefore(script);
			
	edit.popup.document.createStyleSheet(edit.cssFile);
	
	var y = GetTop(edit) > 500 ? -175 : edit.offsetHeight;
	edit.popup.show(0, y, 126, 169, edit);
}

//crée le tableau du calendrier
function GetTableCalendar(year, month, day, name)
{
	var dayOfWeek = GetDOW(year, month, 1);
	var oEdit = document.getElementById(name);
	
	if(oEdit == null)
		oEdit = window.parent.document.getElementById(name);
	
	if(oEdit == null)
		oEdit = window.parent.parent.document.getElementById(name);	
		
	oEdit.year = year;
	oEdit.month = month;
	
	//début du calendrier
	var sTable = "<table cellspacing=1 class=Calendar>";
	//ligne d'entete , le nom du mois et un bouton X pour annuler
	sTable += "<tr><td class=CalHeader onclick=\"PrevMonth('" + name + "')\">&lt;&lt;</td><td class=CalHeader colspan=4 onclick=\"ShowMonthList('" + name + "')\">" + GetMonthName(month - 1, name) + "</td><td class=CalHeader onclick=\"NextMonth('" + name + "')\">&gt;&gt;</td><td class=CalHeader onclick=\"HideAll('" + name + "')\">X</td></tr>";
	//ligne contenant l'année
	sTable += "<tr><td class=CalHeader onclick=\"PrevYear('" + name + "')\">&lt;&lt;</td><td class=CalHeader colspan=4 onclick=\"ShowYearList(" + year + ", '" + name + "')\">" + year + "</td><td class=CalHeader onclick=\"NextYear('" + name + "')\">&gt;&gt;</td><td class=CalHeader>&nbsp;</td></tr>";
	
	//les jours de la semaine
	sTable += "<tr>";
	
	for(var wd = 0; wd < 7; ++wd)
		sTable += "<td class=CalDOWHeader>" + GetWeekDayName(wd, name) + "</td>";
		
	sTable += "</tr>";
		
	var i = 1;
	var maxDay = HowManyDays(oEdit.year, oEdit.month);
	var nRow = (dayOfWeek == 6 && maxDay > 29) || (dayOfWeek == 5 && maxDay == 31) ? 6 : 5;
	
	//le mois lui-meme
	for(var i = 1; i <= nRow; ++i)
	{
		sTable += "<tr>";
			
		for(var j = 1; j <= 7; ++j)
		{
			var d = i * 7 - 7 + j - dayOfWeek;
			if(d >= 1 && d <= maxDay)
			{
				if(day == d || (d == GetDay(name) && oEdit.month == GetMonth(name)))
					sTable += "<td class=CalSelDay onclick=\"ShowDate(this, '" + name + "')\">" + d + "</td>";
				else
					sTable += "<td class=CalDay onclick=\"ShowDate(this, '" + name + "')\">" + d + "</td>";
			}
			else
				sTable += "<td class=CalDay>&nbsp;</td>";
		}
		
		sTable += "</tr>";
	}
	
	if(nRow == 5)
	{
	    sTable += "<tr><td class='CalDay' colspan='7'>&nbsp;</td></tr>";
	}
	
	//fin du calendrier
	sTable += "</table>"
	return sTable;
}

//afficher la date sélectionné dans le edit box
function ShowDate(cell, name)
{
	var edit = window.parent.document.getElementById(name);
	var day = cell.innerHTML.length == 1 ? "0" + cell.innerHTML : cell.innerHTML;
	var month = new String(edit.month);
	
	if(month.length < 2)
		month = "0" + month;

	switch(edit.format)
	{
		case "0":
			edit.value = edit.year + edit.separator + month + edit.separator + day;
			break;
		case "1":
			edit.value = day + edit.separator + month + edit.separator + edit.year;
			break;
		case "2":
			edit.value = month + edit.separator + day + edit.separator + edit.year;
			break;
	}
	
	HideAll(name);	
	edit.focus();	
	
	//Valider les validators.	
	var vals = edit.Validators;
	if(vals)
	 {
        var i;
        for (i = 0; i < vals.length; i++) {
            window.parent.ValidatorValidate(vals[i], null, window.event);
        }
        window.parent.ValidatorUpdateIsValid();
    }
	
	if (edit.postBack)
		window.parent.__doPostBack(name,'');
}
	
//Retourne le nombre de jours dans un mois
function HowManyDays(year, month)
{
	if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		return 31;
		
	if(month == 4 || month == 6 || month == 9 || month == 11)
		return 30;
		
	return IsLeapYear(year) ? 29 : 28;
}

//recule d'un mois
function PrevMonth(name)
{
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit.month == 1)
	{
		oEdit.month = 12;
		--oEdit.year;
	}
	else
		--oEdit.month;
			
	oEdit.popup.document.body.innerHTML = GetTableCalendar(oEdit.year, oEdit.month, -1, name);	
}

//avance d'un mois
function NextMonth(name)
{
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit.month == 12)
	{
		oEdit.month = 1;
		++oEdit.year;
	}
	else
		++oEdit.month;
			
	oEdit.popup.document.body.innerHTML = GetTableCalendar(oEdit.year, oEdit.month, -1, name);	
}

//avancer le calendrier d'un an
function NextYear(name)
{
	var oEdit = window.parent.document.getElementById(name);
		
	oEdit.popup.document.body.innerHTML = GetTableCalendar(++oEdit.year, oEdit.month, -1, name);	
}

//reculer le calendrier d'un an
function PrevYear(name)
{
	var oEdit = window.parent.document.getElementById(name);
			
	oEdit.popup.document.body.innerHTML = GetTableCalendar(--oEdit.year, oEdit.month, -1, name);	
}

//retourne le jour du controle dont le nom est en param
function GetDay(name)
{
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit == null)
		oEdit = window.parent.parent.document.getElementById(name);
		
	if(oEdit == null)
		oEdit = document.getElementById(name);
	
	if(oEdit.value == "")
		return oEdit.value;
	
	switch(oEdit.format)
	{
		case "0": return oEdit.value.substring(8, 10);
		case "1": return oEdit.value.substring(0, 2);
		case "2": return oEdit.value.substring(3, 5);
	}
}

//retourne le mois du controle dont le nom est en param
function GetMonth(name)
{
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit == null)
		var oEdit = document.getElementById(name);
	
	if(oEdit == null)
		var oEdit = window.parent.parent.document.getElementById(name);
		
	if(oEdit.value == "")
		return oEdit.value;
	
	switch(oEdit.format)
	{
		case "0": return oEdit.value.substring(5, 7);
		case "1": return oEdit.value.substring(3, 5);
		case "2": return oEdit.value.substring(0, 2);
	}
}

//retourne l'année du controle dont le nom est en param
function GetYear(name)
{
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit == null)
		var oEdit = document.getElementById(name);
	
	if(oEdit == null)
		var oEdit = window.parent.parent.document.getElementById(name);
		
	if(oEdit.value == "")
		return oEdit.value;
	
	switch(oEdit.format)
	{
		case "0": return oEdit.value.substring(0, 4);
		case "1": return oEdit.value.substring(6, 10);
		case "2": return oEdit.value.substring(6, 10);
	}
}

//cache tous les calques
function HideAll(name)
{	
	window.parent.document.getElementById(name).popup.hide();
}

//fonction permettant d'afficher la liste des mois
function ShowMonthList(name)
{	
	var language = window.parent.document.getElementById(name) == null ? window.parent.parent.document.getElementById(name).language : window.parent.document.getElementById(name).language;
	var sTable = "<table cellspacing=1 width=50px class=Calendar><tr><td class=CalHeader>";
	sTable += language == "en" ? "Month" : "Mois";
	sTable += "</td><td class=CalHeader onclick=\"window.parent.parent.document.getElementById('" + name + "').popupOption.hide()\">X</td></tr>";

	var edit = window.parent.document.getElementById(name) == null ? window.parent.parent.document.getElementById(name) : window.parent.document.getElementById(name); 
		
	for(var i = 0; i < 12; ++i)
		if((i + 1) == edit.month)
			sTable += "<tr onclick=\"onMonthSelected(this, '" + name + "')\"><td class=CalSelDay colspan=2>" + GetMonthName(i, name) + "</td></tr>";
		else
			sTable += "<tr onclick=\"onMonthSelected(this, '" + name + "')\"><td class=CalDay colspan=2>" + GetMonthName(i, name) + "</td></tr>";
		
		
	sTable += "</table>";
		
	var popup;
	
	if(edit.popupOption != null && edit.popupOption.isOpen)
		popup = edit.popupOption;
	else
	{
		edit.popupOption = popup = window.createPopup();
					
		var script = popup.document.createElement('script');
	    script.src = edit.javascriptFile;
	    popup.document.getElementsByTagName('head')[0].insertBefore(script);
			
	    popup.document.createStyleSheet(edit.cssFile);
	}	
		
	popup.document.body.innerHTML = sTable;
	if(!popup.isOpen)
		popup.show(127, 0, 72, 241, document.body);
}

//function permettant de choisir un mois dans une liste 
function onMonthSelected(row, name)
{	
	var year = window.parent.parent.document.getElementById(name).year;
	window.parent.document.body.innerHTML = GetTableCalendar(year, row.rowIndex, GetDay(name), name);	
	window.parent.parent.document.getElementById(name).popupOption.hide();
}

//affiche une liste d'année qui permettra d'en sélectionner une
function ShowYearList(year, name)
{	
	var language = window.parent.document.getElementById(name) == null ? window.parent.parent.document.getElementById(name).language : window.parent.document.getElementById(name).language;
	
	var sTable = "<table cellspacing=1 width=50px class=Calendar><tr><td colspan=2 class=CalHeader>";
	sTable += language == "en" ? "Year" : "Ann&eacute;e";
	sTable += "</td><td class=CalHeader onclick=\"window.parent.parent.document.getElementById('" + name + "').popupOption.hide()\">X</td></tr>";
	
	sTable += "<tr><td class=CalHeader onclick=\"ShowYearList(" + (year - 10) + ", '" + name + "')\">&lt;&lt;</td><td class=CalHeader>&nbsp;</td><td class=CalHeader onclick=\"ShowYearList(" + (year + 10) + ", '" + name + "')\">&gt;&gt;</td></tr>";
	
	for(var i = year - 5; i <= year + 5; ++i)
	{
		var theyear = window.parent.document.getElementById(name) == null ? window.parent.parent.document.getElementById(name).year : window.parent.document.getElementById(name).year;
		if(i == theyear)
			sTable += "<tr><td colspan=3 class=CalSelDay onclick=\"onYearSelected(this, '" + name + "')\">" + i + "</td></tr>";	
		else
			sTable += "<tr><td colspan=3 class=CalDay onclick=\"onYearSelected(this, '" + name + "')\">" + i + "</td></tr>";	
	}
		
	sTable += "</table>";
		
	var edit = window.parent.document.getElementById(name) == null ? window.parent.parent.document.getElementById(name) : window.parent.document.getElementById(name); 
	var popup;
	
	if(edit.popupOption != null && edit.popupOption.isOpen)
		popup = edit.popupOption;
	else
	{
		edit.popupOption = popup = window.createPopup();		
			
		var script = popup.document.createElement('script');
	    script.src = edit.javascriptFile;
	    popup.document.getElementsByTagName('head')[0].insertBefore(script);
			
	    popup.document.createStyleSheet(edit.cssFile);
	}	
		
	popup.document.body.innerHTML = sTable;
	if(!popup.isOpen)
		popup.show(127, 0, 62, 241, document.body);
}

//fonction permettant de changer l'anner avec le contenu de la cellule sélectionnée
function onYearSelected(cell, name)
{	
	var month = window.parent.parent.document.getElementById(name).month;	
	window.parent.document.body.innerHTML = GetTableCalendar(cell.innerHTML, month, GetDay(name), name);	
	window.parent.parent.document.getElementById(name).popupOption.hide();
}

//obtenir le top absolu d'un contrôle
function GetTop(obj)
{
	if(obj.style.posTop != 0)
		return obj.style.posTop;
		
	if(obj.offsetParent != null && obj.offsetParent.style.posTop == 0)
		return obj.offsetTop + GetTop(obj.offsetParent);
	else
		return obj.offsetTop;
	
}

//obtenir le left absolu d'un contrôle
function GetLeft(obj)
{
	if(obj.style.posLeft != 0)
		return obj.style.posLeft;
		
	if(obj.offsetParent != null && obj.offsetParent.style.posLeft == 0)
		return obj.offsetLeft + GetLeft(obj.offsetParent);
	else
		return obj.offsetLeft;
}

//Fonction permettant de savoir si la date est valide selon le format en cours ou non
//retourne vrai si la date est valide
function ValidDate(name)
{
	try
	{	
		var year = new Number(GetYear(name));
		var month = new Number(GetMonth(name)) - 1;
		var day = new Number(GetDay(name));
		var oDate = new Date(year, month, day);
	}
	catch(e)
	{
		return false;
	}

	if(isNaN(oDate) || oDate.getFullYear() != year || oDate.getMonth() != month || oDate.getDate() != day)
	{
		return false;
	}
	
	var oEdit = window.parent.document.getElementById(name);
	
	if(oEdit == null)
		oEdit = document.getElementById(name);
	
	if(oEdit == null)
		oEdit = window.parent.parent.document.getElementById(name);
		
    if(oEdit != null)
    {
      if(oEdit.value.length > 10)
        return false;
    }		

	return true;	
}

//méthode permettant d'obtenir la date suivante
function GetNextDay(name)
{
	var sYear = GetYear(name);
	var sMonth = GetMonth(name);
	var sDay = GetDay(name);
	
	var oDate;
	var ok = true;
	
	try
	{
		oDate = new Date(sYear, sMonth - 1, sDay);
	}
	catch(e)
	{
		ok = false;
	}
	
	if(!ok)
		return '';
		
	var oNextDay = oDate.getDate() + 1;
	oDate.setDate(oNextDay);
	
	sYear = new String(oDate.getYear());
	sMonth = new String(oDate.getMonth() + 1);
	sDay = new String(oDate.getDate());
	
	if(sMonth.length < 2)
		sMonth = '0' + sMonth;
		
	if(sDay.length < 2)
		sDay = '0' + sDay;
	
	var edit = document.getElementById(name);
	
	switch(edit.format)
	{
		case "0":
			return sYear + edit.separator + sMonth + edit.separator + sDay;
		case "1":
			return sDay + edit.separator + sMonth + edit.separator + sYear;
		case "2":
			return sMonth + edit.separator + sDay + edit.separator + sYear;
	}
	
}

//méthode permettant d'obtenir la date suivante
function GetPrevDay(name)
{
	var sYear = GetYear(name);
	var sMonth = GetMonth(name);
	var sDay = GetDay(name);
	
	var oDate;
	var ok = true;
	
	try
	{
		oDate = new Date(sYear, sMonth - 1, sDay);
	}
	catch(e)
	{
		ok = false;
	}
	
	if(!ok)
		return '';
		
	var oNextDay = oDate.getDate() - 1;
	oDate.setDate(oNextDay);
	
	sYear = new String(oDate.getYear());
	sMonth = new String(oDate.getMonth() + 1);
	sDay = new String(oDate.getDate());
	
	if(sMonth.length < 2)
		sMonth = '0' + sMonth;
		
	if(sDay.length < 2)
		sDay = '0' + sDay;
	
	var edit = document.getElementById(name);
	
	switch(edit.format)
	{
		case "0":
			return sYear + edit.separator + sMonth + edit.separator + sDay;
		case "1":
			return sDay + edit.separator + sMonth + edit.separator + sYear;
		case "2":
			return sMonth + edit.separator + sDay + edit.separator + sYear;
	}
	
}


//Calculer le nombre d'années de différence de 2 dates.
function YearDifference(dtStartDate, dtEndDate)
{
   var iYear;		  
   if (dtEndDate.getFullYear() < dtStartDate.getFullYear())
     dtEndDate = ((new Date()).getFullYear() < dtStartDate.getFullYear() ? dtStartDate : new Date());
   
   iYear = dtEndDate.getFullYear() - dtStartDate.getFullYear();

   if ((dtStartDate.getMonth() > dtEndDate.getMonth() && iYear != 0) ||
	   (dtStartDate.getMonth() == dtEndDate.getMonth() && dtStartDate.getDate() > dtEndDate.getDate()))
     if (iYear != 0)
	   iYear -= 1;

   return (dtStartDate > dtEndDate ? 0 : iYear);		
}

/// Calculer le nombre de mois entre 2 dates.
function MonthDifference(dtStartDate, dtEndDate)
{
   if (dtEndDate.getFullYear() < dtStartDate.getFullYear())
     return 0;
     
   var tmp = Math.floor(((dtEndDate.getFullYear() * 12) + dtEndDate.getMonth() + (dtEndDate.getDay() / HowManyDays(dtEndDate.getFullYear(), dtEndDate.getMonth()))) -
	                   ((dtStartDate.getFullYear() * 12) + dtStartDate.getMonth() + (dtStartDate.getDay() / HowManyDays(dtStartDate.getFullYear(), dtStartDate.getMonth()))) - (YearDifference(dtStartDate, dtEndDate) * 12));  

   if (tmp < 0)
     tmp = 0;
     
   return tmp;	                   
}
			 
//Calculer le nombre de jours séparant 2 dates.
function DayDifference(dtStartDate, dtEndDate)
{
   if (dtEndDate < dtStartDate)
     return 0;

  var daysDiff = (dtEndDate.valueOf() - dtStartDate.valueOf());
  daysDiff = Math.floor(Math.abs((((daysDiff  / 1000) / 60) / 60) / 24));
  
  return daysDiff;											  
}

//Calculer le nombre de jours séparant 2 dates mais ne retourner que les journées
//séparant la date de fin d'une année complète et dont cette année débute à la première date.
function DayDiffenceInYear(dtStartDate, dtEndDate)
{																						   								
   var iTmp = DayDifference(dtStartDate, dtEndDate);
   var iYearDiff = YearDifference(dtStartDate, dtEndDate);
   var iDays, iYears;

  for (var i = 1; i <= iYearDiff; ++i)
  {
    iYears =  dtStartDate.getFullYear() + i;
	iDays = ((iYears % 4 == 0 && (iYears % 100 != 0 || iYears % 400 == 0)) ? 366 : 365);
	iTmp -= iDays;
  }

  return iTmp;
}

//ajouter les séparateur pour une date valide si elle ne les a pas déjà
function addSeparator(name)
{
	var edit = document.getElementById(name);
	var temp = edit.value;
	if(!ValidDate(name))
	{
		switch(edit.format)
		{
			case "0":
				edit.value = edit.value.substr(0, 4) + edit.separator + edit.value.substr(4, 2) + edit.separator + edit.value.substr(6, 2);
				break;
			case "1":
				edit.value = edit.value.substr(0, 2) + edit.separator + edit.value.substr(2, 2) + edit.separator + edit.value.substr(4, 4);
				break;
			case "2":
				edit.value = edit.value.substr(0, 2) + edit.separator + edit.value.substr(2, 2) + edit.separator + edit.value.substr(4, 4);
				break;
		}
		
		if(!ValidDate(name))
			edit.value = temp;
	}
}

//Valider la date via un appel d'un custom validator.
function validateDateJS(sender, args)  
{         
  args.IsValid = ValidDate(sender.controltovalidate);    
} 