// On initialise les variables des calendriers

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');



function DateAdd(quel,nb,date){

	// Permet de determiner une nouvelle date a partir d'une date donnee (d) et d'une periode (type=per, n=nb)

	switch(quel){

		case "yyyy":	date.setYear(date.getFullYear()+nb);		break

		case "m":		date.setMonth(date.getMonth()+nb);			break

		case "ww":		nb*=7

		case "d":		date.setDate(date.getDate()+nb);		break

		case "h":		date.setHours(date.getHours()+nb); 		break

		case "n":		date.setMinutes(date.getMinutes()+nb); 	break

		case "s":		date.setSeconds(date.getSeconds()+nb)

	}

	return date

}

function LZ(x)	{

	// Formate l'entier x pour qu'il soit ŕ 2 chiffres

	return(x<0||x>9?"":"0")+x

}

function formatDate(date,format)	{

	// Formate la date au format souhaité

	format=format+"";

	var result="";	var i_format=0;	var c="";	var token="";

	var y=date.getYear()+"";	var M=date.getMonth()+1;	var d=date.getDate();

	var E=date.getDay();

	var H=date.getHours();	var m=date.getMinutes();	var s=date.getSeconds();

	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;

	var value=new Object();

	if (y.length < 4)	{	y=""+(y-0+1900);	}

	value["y"]=""+y;	value["yyyy"]=y;	value["yy"]=y.substring(2,4);

	value["M"]=M;		value["MM"]=LZ(M);	value["MMM"]=MONTH_NAMES[M-1];	value["NNN"]=MONTH_NAMES[M+11];

	value["d"]=d;		value["dd"]=LZ(d);	value["E"]=DAY_NAMES[E+7];		value["EE"]=DAY_NAMES[E];

	value["H"]=H; 		value["HH"]=LZ(H); 

	if (H==0)		{	value["h"]=12;	}

	else if (H>12)	{	value["h"]=H-12;}

	else 			{	value["h"]=H;	}

	value["hh"]=LZ(value["h"]);

	if (H>11)	{	value["K"]=H-12;	}

	else		{	value["K"]=H;	}

	value["k"]=H+1;	value["KK"]=LZ(value["K"]);	value["kk"]=LZ(value["k"]);

	if (H > 11)	{	value["a"]="PM";	}

	else		{	value["a"]="AM";	}

	value["m"]=m; 	value["mm"]=LZ(m);	value["s"]=s;	value["ss"]=LZ(s); 

	while (i_format < format.length)	{

		c=format.charAt(i_format);	token="";

		while ((format.charAt(i_format)==c) && (i_format < format.length))	{

			token += format.charAt(i_format++);

		}

		if (value[token] != null)	{	result=result + value[token];	}

		else	{	result=result + token;	}

	}

	return result;

}

function _isInteger(val)	{

	// Verifie si la donnee fournie est un entier (si un caractere de la donnee n'est pas numerique, elle renvoie false)

	var digits="1234567890";

	for (var i=0; i < val.length; i++)	{

		if (digits.indexOf(val.charAt(i))==-1)	{	return false;	}

	}

	return true;

}

function _getInt(str,i,minlength,maxlength)	{

	// Renvoie la partie entiere de la donnee fournie (ou null si elle n'en trouve pas)

	for (var x=maxlength; x>=minlength; x--)	{

		var token=str.substring(i,i+x);

		if (token.length < minlength)	{	return null;	}

		if (_isInteger(token))	{	return token;	}

	} 

	return null;

}

function getDateFromFormat(val,format) {

	// Decompose la date "val", qui est au format "format", pour creer une nouvelle variable date avec getTime

	val=val+""; format=format+""; var i_val=0; var i_format=0; var c=""; var token=""; var token2=""; var x,y;

	var now=new Date(); var year=now.getYear(); var month=now.getMonth()+1; var date=1; var hh=now.getHours(); var mm=now.getMinutes(); var ss=now.getSeconds(); var ampm="";

	while (i_format < format.length)	{

		c=format.charAt(i_format);

		token="";

		while ((format.charAt(i_format)==c) && (i_format < format.length))	{

			token += format.charAt(i_format++);

		}

		if (token=="yyyy" || token=="yy" || token=="y")	{

			if (token=="yyyy")	{	x=4;y=4;	}

			if (token=="yy")	{	x=2;y=2;	}

			if (token=="y") 	{ 	x=2;y=4;	}

			year=_getInt(val,i_val,x,y);

			if (year==null)	{	return 0;	}

			i_val += year.length;

			if (year.length==2)	{

				if (year > 70)	{	year=1900+(year-0);	}

				else			{ 	year=2000+(year-0);	}

			}

		}

		else if (token=="MMM"||token=="NNN")	{

			month=0;

			for (var i=0; i<MONTH_NAMES.length; i++)	{

				var month_name=MONTH_NAMES[i];

				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase())	{

					if (token=="MMM"||(token=="NNN"&&i>11))	{

						month=i+1;

						if (month>12)	{	month -= 12;	}

						i_val += month_name.length;

						break;

					}

				}

			}

			if ((month < 1)||(month>12))	{	return 0;	}

		}

		else if (token=="EE"||token=="E")	{

			for (var i=0; i<DAY_NAMES.length; i++)	{

				var day_name=DAY_NAMES[i];

				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase())	{

					i_val += day_name.length;

					break;

				}

			}

		}

		else if (token=="MM"||token=="M")	{

			month=_getInt(val,i_val,token.length,2);

			if(month==null||(month<1)||(month>12))	{	return 0;	}

			i_val+=month.length;

		}

		else if (token=="dd"||token=="d")	{

			date=_getInt(val,i_val,token.length,2);

			if(date==null||(date<1)||(date>31))	{	return 0;	}

			i_val+=date.length;

		}

		else if (token=="hh"||token=="h") 	{

			hh=_getInt(val,i_val,token.length,2);

			if(hh==null||(hh<1)||(hh>12))	{	return 0;	}

			i_val+=hh.length;

		}

		else if (token=="HH"||token=="H")	{

			hh=_getInt(val,i_val,token.length,2);

			if(hh==null||(hh<0)||(hh>23))	{	return 0;	}

			i_val+=hh.length;

		}

		else if (token=="KK"||token=="K") 	{

			hh=_getInt(val,i_val,token.length,2);

			if(hh==null||(hh<0)||(hh>11))	{	return 0;	}

			i_val+=hh.length;

		}

		else if (token=="kk"||token=="k")	{

			hh=_getInt(val,i_val,token.length,2);

			if(hh==null||(hh<1)||(hh>24))	{	return 0;	}

			i_val+=hh.length;	hh--;

		}

		else if (token=="mm"||token=="m")	{

			mm=_getInt(val,i_val,token.length,2);

			if(mm==null||(mm<0)||(mm>59))	{	return 0;	}

			i_val+=mm.length;

		}

		else if (token=="ss"||token=="s")	{

			ss=_getInt(val,i_val,token.length,2);

			if(ss==null||(ss<0)||(ss>59))	{	return 0;	}

			i_val+=ss.length;

		}

		else if (token=="a")	{

			if (val.substring(i_val,i_val+2).toLowerCase()=="am")		{	ampm="AM";	}

			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") 	{	ampm="PM";	}

			else	{	return 0;	}

			i_val+=2;

		}

		else	{

			if (val.substring(i_val,i_val+token.length)!=token)	{	return 0;	}

			else	{	i_val+=token.length;	}

		}

	}

	if (i_val != val.length)	{	return 0;	}

	if (month==2)	{

		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) )	{ // leap year

			if (date > 29)	{	return 0;	}

		}

		else	{

			if (date > 28)	{	return 0;	}

		}

	}

	if ((month==4)||(month==6)||(month==9)||(month==11))	{

		if (date > 30) 	{	return 0;	}

	}

	if (hh<12 && ampm=="PM")		{	hh=hh-0+12;	}

	else if (hh>11 && ampm=="AM") 	{ 	hh-=12;	}

	var newdate=new Date(year,month-1,date,hh,mm,ss);

	return newdate.getTime();

}

function parseDate(val) {

	// Si la donnee "val" correspond a un format de date connu, on renvoie la date correspondante

	var preferEuro=(arguments.length==2)?arguments[1]:false;

	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');

	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');

	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');

	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');

	var d=null;

	for (var i=0; i<checkList.length; i++)	{

		var l=window[checkList[i]];

		for (var j=0; j<l.length; j++)	{

			d=getDateFromFormat(val,l[j]);

			if (d!=0)	{	return new Date(d);	}

		}

	}

	return null;

}

function getAnchorPosition(anchorname)	{

	// Retourne les coordonnees (x,y) de l'objet anchorname

	var useWindow=false;	var coordinates=new Object();

	var x=0,y=0; 

	var use_gebi=false, use_css=false, use_layers=false;

	if (document.getElementById)	{	use_gebi=true;	}

	else if (document.all)			{	use_css=true;	}

	else if (document.layers)		{ 	use_layers=true;}

	if (use_gebi && document.all)	{

		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);

		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);

	}

	else if (use_gebi)	{

		var o=document.getElementById(anchorname);

		x=AnchorPosition_getPageOffsetLeft(o);

		y=AnchorPosition_getPageOffsetTop(o);

	}

	else if (use_css)	{

		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);

		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);

	}

	else if (use_layers)	{

		var found=0;

		for (var i=0; i<document.anchors.length; i++)	{

			if (document.anchors[i].name==anchorname)	{	found=1; 	break;	}

		}

		if (found==0)	{	coordinates.x=0;	coordinates.y=0;	return coordinates;	}

		x=document.anchors[i].x;

		y=document.anchors[i].y;

	}

	else	{	coordinates.x=0; coordinates.y=0; return coordinates;	}

	coordinates.x=x;

	coordinates.y=y;

	return coordinates;

}

function getAnchorWindowPosition(anchorname) {

	// Retourne les coordonnees (x,y) de l'objet anchorname (necessaire pour MAC)

	var coordinates=getAnchorPosition(anchorname);

	var x=0;

	var y=0;

	if (document.getElementById) {

		if (isNaN(window.screenX)) {

			x=coordinates.x-document.body.scrollLeft+window.screenLeft;

			y=coordinates.y-document.body.scrollTop+window.screenTop;

		}

		else {

			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;

			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;

		}

	}

	else if (document.all) {

		x=coordinates.x-document.body.scrollLeft+window.screenLeft;

		y=coordinates.y-document.body.scrollTop+window.screenTop;

	}

	else if (document.layers) {

		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;

		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;

	}

	coordinates.x=x;

	coordinates.y=y;

	return coordinates;

}

function AnchorPosition_getPageOffsetLeft (el)	{

	// Renvoie la coordonnee horizontale de l'objet "el" par rapport au bord gauche de l'ecran

	var ol=el.offsetLeft;

	while ((el=el.offsetParent) != null)	{	ol += el.offsetLeft;	}

	return ol;

}

function AnchorPosition_getWindowOffsetLeft (el) {

	// Renvoie la coordonnee horizontale de l'objet "el" par rapport au bord gauche de l'ecran (pour MAC)

	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;

} 

function AnchorPosition_getPageOffsetTop (el)	{

	// Renvoie la coordonnee verticale de l'objet "el" par rapport au sommet de l'ecran

	var ot=el.offsetTop;

	while((el=el.offsetParent) != null)		{	ot += el.offsetTop;	}

	return ot;

}

function AnchorPosition_getWindowOffsetTop (el) {

	// Renvoie la coordonnee verticale de l'objet "el" par rapport au sommet de l'ecran (pour MAC)

	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;

}

function PopupWindow_getXYPosition(anchorname) {

	// Renvoie les coordonnees de la pop-up

	var coordinates;

	if (this.type == "WINDOW")	{	coordinates = getAnchorWindowPosition(anchorname);	}

	else	{	coordinates = getAnchorPosition(anchorname);	}

	this.x = coordinates.x;

	this.y = coordinates.y;

}

function PopupWindow_setSize(width,height)	{

	// Renvoie les dimensions de la pop-up

	this.width = width;

	this.height = height;

}

function PopupWindow_populate(contents) {

	// Change les attributs de la pop-up

	this.contents = contents;

	this.populated = false;

}

function PopupWindow_setUrl(url) {

	// Modifie l'adresse url de la pop-up

	this.url = url;

}

function PopupWindow_setWindowProperties(props)	{

	// Change les proprietes de la pop-up

	this.windowProperties = props;

}

function PopupWindow_refresh() {

	// Reactualise la pop-up (attributs, proprietes, etc.)

	if (this.divName != null)	{

		if (this.use_gebi)		{	document.getElementById(this.divName).innerHTML = this.contents;	}

		else if (this.use_css)	{	document.all[this.divName].innerHTML = this.contents;	}

		else if (this.use_layers)	{

			var d = document.layers[this.divName]; 

			d.document.open();

			d.document.writeln(this.contents);

			d.document.close();

		}

	}

	else	{

		if (this.popupWindow != null && !this.popupWindow.closed)	{

			if (this.url!="")	{	this.popupWindow.location.href=this.url;	}

			else	{

				this.popupWindow.document.open();

				this.popupWindow.document.writeln(this.contents);

				this.popupWindow.document.close();

			}

			this.popupWindow.focus();

		}

	}

}

function PopupWindow_showPopup(anchorname)	{

	// Rend la pop-up visible (la positionne, l'affiche, etc.)

	this.getXYPosition(anchorname);

	this.x += this.offsetX;

	this.y += this.offsetY;

	if (!this.populated && (this.contents != ""))	{

		this.populated = true;

		this.refresh();

	}

	if (this.divName != null)	{

		if (this.use_gebi)	{

			document.getElementById(this.divName).style.left = this.x - 25;

			document.getElementById(this.divName).style.top = this.y + 30;

			document.getElementById(this.divName).style.visibility = "visible";

		}

		else if (this.use_css)	{

			document.all[this.divName].style.left = this.x;

			document.all[this.divName].style.top = this.y;

			document.all[this.divName].style.visibility = "visible";

		}

		else if (this.use_layers)	{

			document.layers[this.divName].left = this.x;

			document.layers[this.divName].top = this.y;

			document.layers[this.divName].visibility = "visible";

		}

	}

	else	{

		if (this.popupWindow == null || this.popupWindow.closed)	{

			if (this.x<0)	{	this.x=0;	}

			if (this.y<0) 	{ 	this.y=0;	}

			if (screen && screen.availHeight)	{

				if ((this.y + this.height) > screen.availHeight)	{	this.y = screen.availHeight - this.height;	}

			}

			if (screen && screen.availWidth)	{

				if ((this.x + this.width) > screen.availWidth)	{	this.x = screen.availWidth - this.width;	}

			}

			var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );

			this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"");

		}

		this.refresh();

	}

}

function PopupWindow_hidePopup()	{

	// Masque la pop-up (ou la ferme completement)

	if (this.divName != null)	{

		if (this.use_gebi)	{	document.getElementById(this.divName).style.visibility = "hidden";	}

		else if (this.use_css)	{	document.all[this.divName].style.visibility = "hidden";	}

		else if (this.use_layers)	{	document.layers[this.divName].visibility = "hidden";	}

	}

	else	{

		if (this.popupWindow && !this.popupWindow.closed)	{

			this.popupWindow.close();

			this.popupWindow = null;

		}

	}

}

function PopupWindow_isClicked(e) {

	// Verifie si les coordonnees du clic de la souris correspondent a la pop-up (a-t-on clique dessus ou a cote ?)

	if (this.divName != null)	{

		if (this.use_layers)	{

			var clickX = e.pageX;

			var clickY = e.pageY;

			var t = document.layers[this.divName];

			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height))	{

				return true;

			}

			else	{	return false;	}

		}

		else if (document.all)	{ // Need to hard-code this to trap IE for error-handling

			var t = window.event.srcElement;

			while (t.parentElement != null)	{

				if (t.id==this.divName)	{	return true;	}

				t = t.parentElement;

			}

			return false;

		}

		else if (this.use_gebi)	{

			var t = e.originalTarget;

			while (t.parentNode != null)	{

				if (t.id==this.divName)	{	return true;	}

				t = t.parentNode;

			}

			return false;

		}

		return false;

	}

	return false;

}

function PopupWindow_hideIfNotClicked(e)	{

	// Masque la pop-up si elle doit se masquer automatiquement

	if (this.autoHideEnabled && !this.isClicked(e))	{	this.hidePopup();	}

}

function PopupWindow_autoHide()	{

	// Passe la propriete de la pop-up de se masquer automatiquement a true

	this.autoHideEnabled = true;

}

function PopupWindow_hidePopupWindows(e)	{

	// Masque toutes les pop-ups

	for (var i=0; i<popupWindowObjects.length; i++)	{

		if (popupWindowObjects[i] != null)	{

			var p = popupWindowObjects[i];

			p.hideIfNotClicked(e);

		}

	}

}

function PopupWindow_attachListener() {

	// Utilite inconnue

	if (document.layers)	{	document.captureEvents(Event.MOUSEUP);	}

	window.popupWindowOldEventListener = document.onmouseup;

	if (window.popupWindowOldEventListener != null)	{	

		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");

	}

	else	{	document.onmouseup = PopupWindow_hidePopupWindows;	}

}

function PopupWindow()	{

	// Cree une fenetre pop-up

	if (!window.popupWindowIndex)	{	window.popupWindowIndex = 0;	}

	if (!window.popupWindowObjects)	{	window.popupWindowObjects = new Array();	}

	if (!window.listenerAttached)	{

		window.listenerAttached = true;

		PopupWindow_attachListener();

	}

	this.index = popupWindowIndex++;

	popupWindowObjects[this.index] = this;

	this.divName = null;

	this.popupWindow = null;

	this.width=0;

	this.height=0;

	this.populated = false;

	this.visible = false;

	this.autoHideEnabled = false;

	this.contents = "";

	this.url="";

	this.windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";

	if (arguments.length>0)	{

		this.type="DIV";

		this.divName = arguments[0];

	}

	else	{	this.type="WINDOW";	}

	this.use_gebi = false;

	this.use_css = false;

	this.use_layers = false;

	if (document.getElementById)	{	this.use_gebi = true;	}

	else if (document.all)			{	this.use_css = true;	}

	else if (document.layers) 		{ 	this.use_layers = true;	}

	else	{	this.type = "WINDOW";	}

	this.offsetX = 0;

	this.offsetY = 0;

	this.getXYPosition = PopupWindow_getXYPosition;

	this.populate = PopupWindow_populate;

	this.setUrl = PopupWindow_setUrl;

	this.setWindowProperties = PopupWindow_setWindowProperties;

	this.refresh = PopupWindow_refresh;

	this.showPopup = PopupWindow_showPopup;

	this.hidePopup = PopupWindow_hidePopup;

	this.setSize = PopupWindow_setSize;

	this.isClicked = PopupWindow_isClicked;

	this.autoHide = PopupWindow_autoHide;

	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;

}

function CalendarPopup()	{

	// Cree et initialise un calendrier pop-up

	var c;

	if (arguments.length>0)	{	c = new PopupWindow(arguments[0]);	}

	else	{

		c = new PopupWindow();

		c.setSize(150,175);

	}

	// Coordonnees de la pop-up creee par rapport au curseur de la souris

	c.offsetX = -100;

	c.offsetY = -165;

	c.autoHide();

	c.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");

	c.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

	c.dayHeaders = new Array("S","M","T","W","T","F","S");

	c.returnFunction = "CP_tmpReturnFunction";

	c.returnMonthFunction = "CP_tmpReturnMonthFunction";

	c.returnQuarterFunction = "CP_tmpReturnQuarterFunction";

	c.returnYearFunction = "CP_tmpReturnYearFunction";

	c.weekStartDay = 0;

	c.isShowYearNavigation = false;

	c.displayType = "date";

	c.disabledWeekDays = new Object();

	c.disabledDatesExpression = "";

	c.yearSelectStartOffset = 2;

	c.currentDate = null;

	c.todayText="Today";

	c.cssPrefix="";

	c.isShowYearNavigationInput=false;

	window.CP_targetInput = null;

	window.CP_dateFormat = "MM/dd/yyyy";

	c.setReturnFunction = CP_setReturnFunction;

	c.setReturnMonthFunction = CP_setReturnMonthFunction;

	c.setReturnQuarterFunction = CP_setReturnQuarterFunction;

	c.setReturnYearFunction = CP_setReturnYearFunction;

	c.setMonthNames = CP_setMonthNames;

	c.setMonthAbbreviations = CP_setMonthAbbreviations;

	c.setDayHeaders = CP_setDayHeaders;

	c.setWeekStartDay = CP_setWeekStartDay;

	c.setDisplayType = CP_setDisplayType;

	c.setDisabledWeekDays = CP_setDisabledWeekDays;

	c.addDisabledDates = CP_addDisabledDates;

	c.setYearSelectStartOffset = CP_setYearSelectStartOffset;

	c.setTodayText = CP_setTodayText;

	c.showYearNavigation = CP_showYearNavigation;

	c.showCalendar = CP_showCalendar;

	c.hideCalendar = CP_hideCalendar;

	c.getStyles = getCalendarStyles;

	c.refreshCalendar = CP_refreshCalendar;

	c.getCalendar = CP_getCalendar;

	c.select = CP_select;

	c.setCssPrefix = CP_setCssPrefix;

	c.showYearNavigationInput = CP_showYearNavigationInput

	return c;

}

function CP_tmpReturnFunction(y,m,d) {

	// Recupere la valeur cliquee sur le calendrier

	if (window.CP_targetInput!=null)	{

		var dt = new Date(y,m-1,d,0,0,0);

		window.CP_targetInput.value = formatDate(dt,window.CP_dateFormat);

	}

	else	{	alert('Use setReturnFunction() to define which function will get the clicked results!');	}

}



// Fonctions non totalement reconnues

function CP_setReturnFunction(name)			{	this.returnFunction = name;			}

function CP_setReturnMonthFunction(name)	{	this.returnMonthFunction = name;	}

function CP_setReturnQuarterFunction(name)	{	this.returnQuarterFunction = name;	}

function CP_setReturnYearFunction(name)		{	this.returnYearFunction = name;		}



function CP_setMonthNames()	{

	// Initialise le nom des mois du calendrier

	for (var i=0; i<arguments.length; i++)	{	this.monthNames[i] = arguments[i];	}

}

function CP_setMonthAbbreviations() {

	// Initialise les abreviations des mois du calendrier

	for (var i=0; i<arguments.length; i++)	{	this.monthAbbreviations[i] = arguments[i];	}

}

function CP_setDayHeaders()	{

	// Initialise les entetes des jours de la semaine

	for (var i=0; i<arguments.length; i++)	{	this.dayHeaders[i] = arguments[i];	}

}



// Initialise la date du premier jour accessible sur le calendrier

function CP_setWeekStartDay(day)	{	this.weekStartDay = day;	}



// Affiche la navigation (mois annee) en haut du calendrier

function CP_showYearNavigation()	{	this.isShowYearNavigation = (arguments.length>0)?arguments[0]:true;	}



function CP_setDisplayType(type)	{

	// Utilite inconnue

	if (type!="date"&&type!="week-end"&&type!="month"&&type!="quarter"&&type!="year")	{

		alert("Invalid display type! Must be one of: date,week-end,month,quarter,year");

		return false;

	}

 	this.displayType=type;

}



// Utilite inconnue

function CP_setYearSelectStartOffset(num)	{	this.yearSelectStartOffset=num;	}



function CP_setDisabledWeekDays()	{

	// Passe les dates non accessibles sur le calendrier en disable

	this.disabledWeekDays = new Object();

	for (var i=0; i<arguments.length; i++)	{	this.disabledWeekDays[arguments[i]] = true;	}

}

function CP_addDisabledDates(start, end) {

	// Recupere les dates non accessibles sur le calendrier

	if (arguments.length==1)	{	end=start;	}

	if (start==null && end==null) {	return;	}

	if (this.disabledDatesExpression!="")	{	this.disabledDatesExpression+= "||";	}

	if (start!=null)	{	

		start = parseDate(start); 

		start=""+start.getFullYear()+LZ(start.getMonth()+1)+LZ(start.getDate());

	}

	if (end!=null)	{

		end=parseDate(end);

		end=""+end.getFullYear()+LZ(end.getMonth()+1)+LZ(end.getDate());

	}

	if (start==null)		{	this.disabledDatesExpression+="(ds<="+end+")";					}

	else if (end ==null)	{ 	this.disabledDatesExpression+="(ds>="+start+")";				}

	else 					{ 	this.disabledDatesExpression+="(ds>="+start+"&&ds<="+end+")";	}

}

// Initialise le texte pour le lien de selection du jour courant

function CP_setTodayText(text)	{	this.todayText = text;	}

// Utile pour les CSS

function CP_setCssPrefix(val)	{ 	this.cssPrefix = val;	}



// Utilite inconnue

function CP_showYearNavigationInput()	{	this.isShowYearNavigationInput = (arguments.length>0)?arguments[0]:true;	}



function CP_hideCalendar()	{

	// Masque le calendrier

	if (arguments.length > 0)	{	window.popupWindowObjects[arguments[0]].hidePopup();	}

	else	{	this.hidePopup();	}

}

function CP_refreshCalendar(index) {

	// Rafraichit le calendrier

	var calObject = window.popupWindowObjects[index];

	if (arguments.length>1)	{	calObject.populate(calObject.getCalendar(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]));	}

	else	{	calObject.populate(calObject.getCalendar());	}

	calObject.refresh();

}

function CP_showCalendar(anchorname)	{

	// Affiche le calendrier

	if (false && (this.currentDate == null))	{	this.currentDate=new Date(parseDate('2005-04-05'));	} 

	if (arguments.length>1)	{

		if (arguments[1]==null||arguments[1]=="")	{	this.currentDate=new Date();	}

		else	{	this.currentDate=new Date(parseDate(arguments[1]));	}

	}

	this.populate(this.getCalendar());

	this.showPopup(anchorname);

}

function CP_select(inputobj, linkname, format) {

	// Affichage du calendrier (par selection de celui-ci)

	var selectedDate=(arguments.length>3)?arguments[3]:null;

	if (!window.getDateFromFormat)	{	alert("calendar.select: To use this method you must also include 'date.js' for date formatting");	return;	}

	if (this.displayType!="date"&&this.displayType!="week-end") {	alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");	return;	}

	if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea")	{

		alert("calendar.select: Input object passed is not a valid form input object"); 

		window.CP_targetInput=null;

		return;

	}

	window.CP_targetInput = inputobj;

	this.currentDate=null;

	var time=0;

	if (selectedDate!=null)	{	time = getDateFromFormat(selectedDate,format)	}

	else if (inputobj.value!="")	{	time = getDateFromFormat(inputobj.value,format);	}

	if (selectedDate!=null || inputobj.value!="")	{

		if (time==0)	{	this.currentDate=null;	}

		else			{	this.currentDate=new Date(time);	}

	}

	window.CP_dateFormat = format;

	this.showCalendar(linkname);

}

function getCalendarStyles() {

	// Mise en forme du calendrier

	var result = "";

	var p = "";

	if (this!=null && typeof(this.cssPrefix)!="undefined" && this.cssPrefix!=null && this.cssPrefix!="")	{	p=this.cssPrefix;	}

	result += "<STYLE>\n";

	result += "."+p+"cpYearNavigation,."+p+"cpMonthNavigation { background-color:#C0C0C0; text-align:center; vertical-align:center; text-decoration:none; color:#000000; font-weight:bold;}\n";

	result += "."+p+"cpDayColumnHeader, ."+p+"cpYearNavigation,."+p+"cpMonthNavigation,."+p+"cpCurrentMonthDate,."+p+"cpCurrentMonthDateDisabled,."+p+"cpOtherMonthDate,."+p+"cpOtherMonthDateDisabled,."+p+"cpCurrentDate,."+p+"cpCurrentDateDisabled,."+p+"cpText { font-family:arial; font-size:8pt;}\n";

	result += "TD."+p+"cpDayColumnHeader { text-align:right; border:solid thin #C0C0C0;border-width:0 0 1 0;}\n";

	result += "."+p+"cpCurrentMonthDate, ."+p+"cpOtherMonthDate, ."+p+"cpCurrentDate { text-align:right; text-decoration:none;}\n";

	result += "."+p+"cpCurrentMonthDateDisabled, ."+p+"cpOtherMonthDateDisabled, ."+p+"cpCurrentDateDisabled { color:#D0D0D0; text-align:right; text-decoration:line-through;}\n";

	result += "."+p+"cpCurrentMonthDate, .cpCurrentDate { color:#000000;}\n";

	result += "."+p+"cpOtherMonthDate { color:#808080;}\n";

	result += "TD."+p+"cpCurrentDate { color:white; background-color: #C0C0C0; border-width:1; border:solid thin #800000;}\n";

	result += "TD."+p+"cpCurrentDateDisabled { border-width:1; border:solid thin #FFAAAA;}\n";

	result += "."+p+"cpBorder { border:solid thin #808080;}\n";

	result += "</STYLE>\n";

	return result;

}

function CP_getCalendar() {

	var now = new Date(); 

	if (this.type == "WINDOW")	{	var windowref = "window.opener.";	}

	else	{	var windowref = "";	}

	var result = "";

	if (this.type == "WINDOW")	{

		result += "<HTML><HEAD><TITLE>Calendrier</TITLE>"+this.getStyles()+"</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";

		result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';

	}

	else	{

		result += '<TABLE CLASS="'+this.cssPrefix+'cpBorder" WIDTH=144 BORDER=1 BORDERWIDTH=1 CELLSPACING=0 CELLPADDING=1>\n';

		result += '<TR><TD ALIGN=CENTER>\n';

		result += '<CENTER>\n';

	}

	if (this.displayType=="date" || this.displayType=="week-end")	{

		if (this.currentDate==null)	{	this.currentDate = now;	}

		if (arguments.length > 0) 	{ var month = arguments[0];	}

		else	{	var month = this.currentDate.getMonth()+1;	}

		if (arguments.length > 1 && arguments[1]>0 && arguments[1]-0==arguments[1])	{	var year = arguments[1];	}

		else	{	var year = this.currentDate.getFullYear();	}

		var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);

		if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) )	{	daysinmonth[2] = 29;	}

		var current_month = new Date(year,month-1,1);

		var display_year = year; var display_month = month; var display_date = 1;

		var weekday= current_month.getDay(); 

		var offset = 0; offset = (weekday >= this.weekStartDay) ? weekday-this.weekStartDay : 7-this.weekStartDay+weekday ;

		if (offset > 0)	{

			display_month--;

			if (display_month < 1)	{	display_month = 12; display_year--;	}

			display_date = daysinmonth[display_month]-offset+1;

		}

		var next_month = month+1; var next_month_year = year; 

		if (next_month > 12)	{ 	next_month=1; next_month_year++;	} 

		var last_month = month-1; var last_month_year = year; 

		if (last_month < 1) 	{ 	last_month=12; last_month_year--;	} 

		var date_class;

		if (this.type!="WINDOW")	{ result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>"; 	}

		result += '<TR>\n'; var refresh = 'javascript:'+windowref+'CP_refreshCalendar';

		if (this.isShowYearNavigation)	{

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');">&lt;</A></TD>';

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="58"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+'</SPAN></TD>';

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');">&gt;</A></TD>';

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';

			result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refresh+'('+this.index+','+month+','+(year-1)+');">&lt;</A></TD>';

			if (this.isShowYearNavigationInput)	{

				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="36"><INPUT NAME="cpYear" CLASS="'+this.cssPrefix+'cpYearNavigation" SIZE="4" MAXLENGTH="4" VALUE="'+year+'" onBlur="'+refresh+'('+this.index+','+month+',this.value-0);"></TD>';

			} 

			else	{	

				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="36"><SPAN CLASS="'+this.cssPrefix+'cpYearNavigation">'+year+'</SPAN></TD>'; 

			}

			result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refresh+'('+this.index+','+month+','+(year+1)+');">&gt;</A></TD>';

		}

		else	{

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');"><img src="img/prev.gif" border=0></A></TD>\n';

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="100"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+' '+year+'</SPAN></TD>\n';

			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');"><img src="img/next.gif" border=0></A></TD>\n';

		}

		result += '</TR></TABLE>';

		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=0 CELLPADDING=1 ALIGN=CENTER>\n';

		result += '<TR>\n';

		for (var j=0; j<7; j++)	{

			result += '<TD CLASS="'+this.cssPrefix+'cpDayColumnHeader" WIDTH="14%"><SPAN CLASS="'+this.cssPrefix+'cpDayColumnHeader">'+this.dayHeaders[(this.weekStartDay+j)%7]+'</TD>\n';

		}

		result += '</TR>\n';

		for (var row=1; row<=6; row++)	{

			result += '<TR>\n';

			for (var col=1; col<=7; col++) {

				var disabled=false;

				if (this.disabledDatesExpression!="")	{

					var ds=""+display_year+LZ(display_month)+LZ(display_date);

					eval("disabled=("+this.disabledDatesExpression+")");

				}

				var dateClass = ""; 

				if ((display_month == this.currentDate.getMonth()+1) && (display_date==this.currentDate.getDate()) && (display_year==this.currentDate.getFullYear()))	{

					dateClass = "cpCurrentDate"; 

				}

				else if (display_month == month)	{	dateClass = "cpCurrentMonthDate";	}

				else	{	dateClass = "cpOtherMonthDate";	}

				if (disabled || this.disabledWeekDays[col-1])	{

					result += ' <TD CLASS="'+this.cssPrefix+dateClass+'"><SPAN CLASS="'+this.cssPrefix+dateClass+'Disabled">'+display_date+'</SPAN></TD>\n';

				}

				else	{

					var selected_date = display_date; var selected_month = display_month; var selected_year = display_year;

					if (this.displayType=="week-end")	{

						var d = new Date(selected_year,selected_month-1,selected_date,0,0,0,0); d.setDate(d.getDate() + (7-col)); selected_year = d.getYear(); 

						if (selected_year < 1000)	{	selected_year += 1900;	} 

						selected_month = d.getMonth()+1; selected_date = d.getDate();

					}

					result += ' <TD CLASS="'+this.cssPrefix+dateClass+'"><A HREF="javascript:'+windowref+this.returnFunction+'('+selected_year+','+selected_month+','+selected_date+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+this.cssPrefix+dateClass+'">'+display_date+'</A></TD>\n';

				}

				display_date++;

				if (display_date > daysinmonth[display_month])	{	display_date=1; display_month++;	}

				if (display_month > 12)	{	display_month=1; display_year++;	}

			}

			result += '</TR>';

		}

		var current_weekday = now.getDay() - this.weekStartDay;

		if (current_weekday < 0)	{	current_weekday += 7;	}

		result += '<TR>\n';

		if (this.disabledDatesExpression!="")	{

			var ds=""+now.getFullYear()+LZ(now.getMonth()+1)+LZ(now.getDate());

			eval("disabled=("+this.disabledDatesExpression+")");

		}

		result += ' <BR>\n';

		result += ' </TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';

	}

	if (this.displayType=="month" || this.displayType=="quarter" || this.displayType=="year")	{

		if (arguments.length > 0)	{	var year = arguments[0];	}

		else	{ 

			if (this.displayType=="year")	{	var year = now.getFullYear()-this.yearSelectStartOffset;	}

			else	{	var year = now.getFullYear();	}

		}

		if (this.displayType!="year" && this.isShowYearNavigation)	{

			result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";

			result += '<TR>\n';

			result += ' <TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year-1)+');"><IMG BORDER=0 WIDTH=16 HEIGHT=16 SRC="/images/booking_engine/prev.gif"></A></TD>\n';

			result += ' <TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="100">'+year+'</TD>\n';

			result += ' <TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year+1)+');"><IMG BORDER=0 WIDTH=16 HEIGHT=16 SRC="/images/booking_engine/next.gif"></A></TD>\n';

			result += '</TR></TABLE>\n';

		}

	}

	if (this.displayType=="month")	{

		// If POPUP, write entire HTML document

		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';

		for (var i=0; i<4; i++) {

			result += '<TR>';

			for (var j=0; j<3; j++) {

				var monthindex = ((i*3)+j);

				result += '<TD WIDTH=33% ALIGN=CENTER><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnMonthFunction+'('+year+','+(monthindex+1)+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+this.monthAbbreviations[monthindex]+'</A></TD>';

			}

			result += '</TR>';

		}

		result += '</TABLE></CENTER></TD></TR></TABLE>\n';

	}

	if (this.displayType=="quarter") {

		result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';

		for (var i=0; i<2; i++) {

			result += '<TR>';

			for (var j=0; j<2; j++) {

				var quarter = ((i*2)+j+1);

				result += '<TD WIDTH=50% ALIGN=CENTER><BR><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnQuarterFunction+'('+year+','+quarter+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">Q'+quarter+'</A><BR><BR></TD>';

			}

			result += '</TR>';

		}

		result += '</TABLE></CENTER></TD></TR></TABLE>\n';

	}

	if (this.displayType=="year") {

		var yearColumnSize = 4;

		result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";

		result += '<TR>\n';

		result += ' <TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="50%"><A CLASS="cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year-(yearColumnSize*2))+');"><IMG BORDER=0 WIDTH=16 HEIGHT=16 SRC="/images/booking_engine/prev.gif"></A></TD>\n';

		result += ' <TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="50%"><A CLASS="cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year+(yearColumnSize*2))+');"><IMG BORDER=0 WIDTH=16 HEIGHT=16 SRC="/images/booking_engine/next.gif"></A></TD>\n';

		result += '</TR></TABLE>\n';

		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';

		for (var i=0; i<yearColumnSize; i++) {

			for (var j=0; j<2; j++) {

				var currentyear = year+(j*yearColumnSize)+i;

				result += '<TD WIDTH=50% ALIGN=CENTER><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnYearFunction+'('+currentyear+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+currentyear+'</A></TD>';

			}

			result += '</TR>';

		}

		result += '</TABLE></CENTER></TD></TR></TABLE>\n';

	}

	// Common

	if (this.type == "WINDOW") {	result += "</BODY></HTML>\n";	}

	return result;

}