/*9 avril 2002
  Réalisé par Michaël Albaladejo
  
  Ce fichier JavaScript contient un ensemble de fonction bien utiles
  pour la gestion des dates.
  
  En particulier la fonction ShowCalendar permet d'afficher un calendrier*/

/*	Permet d'afficher un calendrier
	str_target : nom de l'objet qui recevra la date sélectionée
	str_date   : si cette valeur est une date, le calendrier s'ouvrira
				 sur cette date
*/
function ShowCalendar(str_target, str_date, str_dateinf, str_datesup) {

	//jours de la semaine en anglais
	var arr_months_eng = ["January", "February", "March", "April", "May", "June",
		"July", "August", "September", "October", "November", "December"];
	var week_days_eng = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
	
	//jour de la semaine en fraçais
	var arr_months_fr = ["Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin",
		"Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"];
	var week_days_fr = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"];
	
	var arr_months = arr_months_fr;
	var week_days = week_days_fr;
	var n_weekstart = 1; // 0 si la semaine commence le dimanche (UK)
						// 1 si la semaine commence le lundi (FR)
	var i_nbweeks = 0;
													
	var Dateinf = StringToDate(str_dateinf);	//date inferieure du range	
	if (Dateinf == null){							
		Dateinf = new Date(100,1,1);				
		str_dateinf = DateToString(Dateinf);		
	}												
													
	var Datesup = StringToDate(str_datesup);	//date superieure du range		
	if (Datesup == null){							
		Datesup = new Date(4000,1,1);				
		str_datesup = DateToString(Datesup);		
	}												
													
	var dt_date = StringToDate(str_date);			
	if (dt_date == null ){							
		var tmp = new Date();						
		var dt_date = new Date(tmp.getFullYear(),tmp.getMonth(),tmp.getDate());
		tmp = null;
	}
	
	//Mois precedent le mois selectionne
	var dt_prev_month = new Date(dt_date);
	dt_prev_month.setMonth(dt_date.getMonth()-1);
	
	//Mois suivant le mois selectionne
	var dt_next_month = new Date(dt_date);
	dt_next_month.setMonth(dt_date.getMonth()+1);
	
	//Date du premier lundi du calendier 
	//si le mois ne commence pas un lundi, c'est une date du mois precedent
	var dt_firstday = new Date(dt_date);
	dt_firstday.setDate(1);//Premier jour du mois
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	
	//Dernier jour du mois
	var dt_lastday = new Date(dt_next_month);
	dt_lastday.setDate(0);
	
	var dt_current_day = new Date(dt_firstday);
	
	// génération du code html qui dessine le calendrier
	var str_buffer = new String (
		"<html>\n"+
		"<head>\n"+
		"	<title>Calendar</title>\n"+
		"</head>\n"+  
		"<body bgcolor=\"#6699ff\" size=\"1\">\n"+
		"<table  cellspacing=\"0\"  width=\"100\" bgcolor=\"#4682B4\" align=\"center\">\n"+
		"<tr><td bgcolor=\"#4682B4\" align=\"center\">\n"+
		"<a href=\"javascript:window.opener.ShowCalendar('"+
		str_target + "', '" + DateToString(dt_prev_month) + "', '" + str_dateinf + "','" + str_datesup + "');\">" +
		"<img src=\"/centrale_achat/prev.gif\" width=\"20\" height=\"20\" border=\"0\""+
		" alt=\"previous month\"></a></td>\n"+
		"	<td bgcolor=\"#4682B4\" colspan=\"7\" align=\"center\">"+
		"<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"
		+"<b>"+arr_months[dt_date.getMonth()]+"</b></font></td>\n"+
		"	<td bgcolor=\"#4682B4\" align=\"center\"><a href=\"javascript:window.opener.ShowCalendar('"
		+str_target+"', '" + DateToString(dt_next_month) + "', '" + str_dateinf + "','" + str_datesup + "');\">" +
		"<img src=\"/centrale_achat/next.gif\" width=\"20\" height=\"20\" border=\"0\""+
		" alt=\"next month\"></a></td>\n</tr>\n\<tr>\n<td>\n</td><td colspan=\"7\"><table cellspacing=\"0\">"
	);
	
	// Ecrit les jours de la semaines
	str_buffer += "<tr>\n";
	for (var n=0; n<7; n++)
		str_buffer += "	<td bgcolor=\"#87CEFA\">"+
		"<font color=\"white\" face=\"Arial\" size=\"2\"><center><b>"+
		week_days[(n_weekstart+n)%7]+"</b></center></font></td>\n";
		
	
	str_buffer += "</tr>\n";
	
	//Remplis le calendrier
	while (dt_current_day.getMonth() == dt_date.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()) 
	{
		str_buffer += "<tr>\n";
		i_nbweeks++;
		//Parcour une semaine
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) 
		{
			//Si la date courante est compris dans le range definit
			if(pIsBetween(dt_current_day,Dateinf,Datesup))
			{
				// Jour courant
				//Met le fond en rose
				if (dt_current_day.getDate() == dt_date.getDate() &&
					dt_current_day.getMonth() == dt_date.getMonth())
					
					str_buffer += "	<td bgcolor=\"#FFB6C1\" align=\"center\" style='CURSOR:Hand' "+
									"onMouseOver=\"this.bgColor='#FF9900'\" "+
									"onMouseOut=\"this.style.color='#FF9900';this.bgColor='#FFB6C1'\" "+
									"onClick=\"javascript:window.opener."+str_target+
									".value='"+DateToString(dt_current_day)+"'; window.close();\">";

				//Week-End
				//Met les jours du Week End en bleu
				else if ((dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)){
					//Si le jour apartient au mois affiché => on créer le lien
					if( dt_current_day.getMonth() == dt_date.getMonth() )

						str_buffer += "	<td bgcolor=\"#DBEAF5\" align=\"center\" style='CURSOR:Hand' "+
										"onMouseOver=\"this.bgColor='#FF9900'\" "+
										"onMouseOut=\"this.style.color='#FF9900';this.bgColor='#DBEAF5'\" "+
										"onClick=\"javascript:window.opener."+str_target+
										".value='"+DateToString(dt_current_day)+"'; window.close();\">";
						//Le jour n'apartient au mois affiché => on ne créer pas le lien
						else
							str_buffer += "<td bgcolor=\"#DBEAF5\" > ";
						
				}//end else if ((dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6))
				//Jours ouvres du mois
				else if(dt_current_day.getMonth() == dt_date.getMonth())

					str_buffer += "	<td bgcolor=\"white\" align=\"center\" style='CURSOR:Hand' "+
									"onMouseOver=\"this.bgColor='#FF9900'\" "+
									"onMouseOut=\"this.style.color='#FF9900';this.bgColor='white'\" "+
									"onClick=\"javascript:window.opener."+str_target+
									".value='"+DateToString(dt_current_day)+"'; window.close();\">";
				
				//Jours qui n'appartiennent pas au mois affiché
				else
					str_buffer+="<td bgcolor=\"white\">";
					
				//Jours du mois courant
				if (dt_current_day.getMonth() == dt_date.getMonth()){
					
					str_buffer += "<font color=\"black\" face=\"Book Antiqua\" size=\"2\" >";
					str_buffer += dt_current_day.getDate()+"</font>";
				}
				str_buffer +="</td>\n";

			}//end if(pIsBetween(dt_current_day,Dateinf,Datesup)
			else{//Les jours suivants sont en dehors du range
				// Jour courant
				//Met le fond en rose
				if (dt_current_day.getDate() == dt_date.getDate() &&
					dt_current_day.getMonth() == dt_date.getMonth())
					
					str_buffer += "	<td bgcolor=\"#FFB6C1\" align=\"center\" >";

				//Week-End
				//Met les jours du Week End en bleu
				else if ((dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)){
					//Si le jour apartient au mois affiché => on créer le lien
					if( dt_current_day.getMonth() == dt_date.getMonth() )

						str_buffer += "	<td bgcolor=\"#DBEAF5\" >";
						//Le jour n'apartient au mois affiché => on ne créer pas le lien
						else
							str_buffer += "<td bgcolor=\"#DBEAF5\" > ";
						
				}//end else if ((dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6))
				//Jours ouvres du mois
				else if(dt_current_day.getMonth() == dt_date.getMonth())

					str_buffer += "	<td bgcolor=\"white\" align=\"center\" >";
				
				//Jours qui n'appartiennent pas au mois affiché
				else
					str_buffer+="<td bgcolor=\"white\">";
				
				//Jours du mois courant
				if (dt_current_day.getMonth() == dt_date.getMonth()){
					
					str_buffer += "<font color=\"LightGrey\" face=\"Book Antiqua\" size=\"2\" >";
					str_buffer += dt_current_day.getDate()+"</font>";
				}
				str_buffer +="</td>\n";

			}
			
			//Passage au jour suivant 
			dt_current_day.setDate(dt_current_day.getDate()+1);
		}//end for
		str_buffer += "</tr>\n";
	}//end while
	
	
	str_buffer +="<tr><td colspan=\"9\" align=\"center\">"+
				"<font color=\"white\" face=\"tahoma, verdana\" size=\"2\"><b>"
				 +dt_date.getFullYear()+"</b></table></td></tr></table>\n" + 
				 "</body>\n" +"</html>\n";
	
	//ouvre la fenètre qui contiendra le calendrier
	var vWinCal = window.open("", "Calendar",
			"width=240,height=210,status=no,resizable=no,top=200,left=200");
	vWinCal.opener = self;
	var calc_doc = vWinCal.document;
	calc_doc.write (str_buffer);
	calc_doc.close();
}

//--------------------------------------------------------------------------------//

//Renvoie true si la date day,month,year ou "jj/mm/aaaa" existe
//Renvoie false et affiche une popup sinon
function IsDate(day,month,year)// ou IsDate(date)
{
	if (!month && !year)//IsDate("jj/mm/aaaa")
	{
		if (!StringToDate(day))
		{
			//alert("La date est incorecte");
			return false;
		}
		else
			return true;	
	}
	else //IsDate(day,month,year)
	{
		if(!IntToDate(day, month , year))
		{
			//alert("La date est incorecte");
			return false;
		}
		else
			return true;
	}
}

//Renvoie dans l'objet objDest le nombre de jour de l'année year
//Renvoie false et affiche une popup si year n'est pas valide
function GetNbrDaysYears(year,objDest)
{
	var d;
	d=IntToDate(1,1,year);
	
	if(d == null)
	{
		alert("L'année est incorecte!");
		return false;
	}
	else{
		objDest.value = pGetNbrDaysYears(d);
		return objDest.value;
	}
}

//Renvoie dans l'objet objDest le nombre de jour du mois month/year
//Renvoie false et affiche une popup si month/year n'est pas valide
function GetNbrDaysMonths(month,year,objDest)
{
	var d;
	
	d=IntToDate(1, month , year)
	
	if(d == null)
	{
		alert("La date est incorecte!");
		return 0;
	}
	else{
		objDest.value =pGetNbrDaysMonths(d); 
		return objDest.value;
	}
}

function NumOfDay(day, month, year)
{
	if(IsDate(day, month, year))
	{
		if(month)
			var date = IntToDate(day, month, year);	
		else
			var date = StringToDate(day);
			
		return date.getDay();
	}
	else
		return null;
}

//--------------------------------------------------------------------------------//

// Vérifie que le format de la date est correct : jj/mm/aaaa
// Vérifie que la date existe
// Return un objet Date correspondant
function StringToDate (str_date) 
{
	var re_date = /^(\d+)\/(\d+)\/(\d\d\d\d)$/;
	
	if (!re_date.exec(str_date)){
		//alert("incorrect!");
		return null;
	}
	else
	{
		if (!pIsDate(RegExp.$1,RegExp.$2,RegExp.$3 )){//Vérifie si la date existe
			//alert("n'existe pas!");
			return null ;
		}
	}
	var d = new Date (RegExp.$3, RegExp.$2-1, RegExp.$1);
	return ( d);
}


// Vérifie que la date existe
// Return un objet Date correspondant
function IntToDate(day,month,year)
{
	if( !pIsDate(day,month,year) ){
		return null;
	}
	var d = new Date(year,month-1,day);
	return d;
}

//Return un chaine de caractères contenant la date
//jj/mm/aaaa
function DateToString (d_date) 
{
	var s=""
	if(d_date!=null)
		s = new String ( d_date.getDate()+ "/"+ (1+d_date.getMonth())+ "/" +d_date.getFullYear() );
	return s 
}

//Verifie qu'une date existe
function pIsDate (day,month,year) 
{
    var today = new Date();
    if(!year)	return false;
	
	if(!month) return false;
		
    if (!day) return false;
    
    var test = new Date(year,month-1,day);
    
    if ( (test.getFullYear() == year) &&
         (month == test.getMonth()+1) &&
         (day == test.getDate()) )
        return true;
    else
        return false;
}

//Compare 2 dates
//retourne true si d1<d2
function pIsInferior(d1,d2)
{
	if((d1!=null) && (d2!=null)){
		if(d1 < d2)
			return true;
	}
	return false;
}

//Compare 2 dates
//retourne true si d1>d2
function pIsSuperior(d1,d2)
{
	if((d1!=null) && (d2!=null)){
		if(d1 > d2)
			return true;
	}
	return false;}

//Compare 2 dates
//retourne true si d1=d2
function pIsEqual(d1,d2)
{
	if( (!pIsInferior(d1,d2)) && (!pIsSuperior(d1,d2)) )
		return true;
	
	return false;
}

//Renvoie true si d_before < d < d_after
function pIsBetween(d,d_before,d_after)
{
	if (pIsInferior(d_before,d_after)){
		dinf = d_before;
		dsup = d_after;
	}
	else{
		dinf = d_after;
		dsup = d_before;
	}
	
	if(pIsEqual(dinf,d))
		return true;
	else if(pIsEqual(dsup,d) )
		return true;
	else if (pIsInferior(d,dsup) && pIsSuperior(d,dinf))
		return true;
	
	return false;
}

//renvoi le nom du jour de la date d
function pGetDay(d)
{
	Day = new Array("Dimanche", "Lundi", "Mardi","Mercredi","Jeudi", "Vendredi","Samedi");
	return Day[d.getDay()];
}	

function pGetNbrDaysYears(d)
{
	if(pIsDate(29,2,d.getFullYear()))
		return 366;
	else
		return 365;
}

function pGetNbrDaysMonths(d)
{
	var nbDay = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var n = d.getMonth();
	
	if (n != 1) // pas fevrier
		return nbDay[n];
	else{
		if(pGetNbrDaysYears(d) == 365)
			return nbDay[n];
		else
			return nbDay[n]+1;
	}
}

function pGetNumMonth(d)
{
	return d.getMonth() + 1;
}

function pGetNumDay()
{
		return d.getDay();
}
