
function Calendar(x,y) {
	
	this.id=x;
	this.base=_F(x);
	this.control=_F(y);	
	this.calendar_control=null;
	this.calendar_control_date=null;
	this.calendar_control_date_selected=null;
	this.calendar_today_date=null;
	this.calendar_boundary_date=null;
	this.calendar_unavailable_dates=new Array();
	this.left_month=null;
	this.right_month=null;
	this.month_name=null;
	this.onchange=null;

}

function isDateUnavailable(x, calendar) {
	for (var i=0;i<calendar.calendar_unavailable_dates.length;i++) {
		y=calendar.calendar_unavailable_dates[i];
		if (x.getMonth()==y.getMonth() && x.getFullYear()==y.getFullYear() && x.getDate()==y.getDate()) {
			return true;
			break;
		};
	};
	return false;
};

function diffDays(x, y) {
	if (x.valueOf && y.valueOf) {
		return (y.valueOf()-x.valueOf())/(1000*60*60*24);
	}
	return null;
}

function compareDates(x,y) {
	if (x.valueOf && y.valueOf) {
		if (x.valueOf()<y.valueOf()) {
			return -1;
		} else {
			if (x.valueOf()>y.valueOf()) {
				return 1;
			} else {
				return 0;
			}
		}
	}
}

function getMonthName(x) {
	switch (x) {
		case 0: return "January";
		case 1: return "February";
		case 2: return "March";
		case 3: return "April";
		case 4: return "May";
		case 5: return "June";
		case 6: return "July";
		case 7: return "August";
		case 8: return "September";
		case 9: return "October";
		case 10: return "November";
		case 11: return "December";
	};
};

function disableCalendar() {
	hideCalendar(xCalendar);
	hideCalendar(xCalendar1);
};

function initCalendar(calendar, x) {
	calendar.calendar_boundary_date=addDays(new Date(),x);
	//calendar_boundary_date=addDays(makeDate("9/24/2006",true),7);
	calendar.calendar_control_date=calendar.calendar_boundary_date;
	calendar.calendar_control_date_selected=calendar.calendar_boundary_date;
	calendar.calendar_today_date=calendar.calendar_boundary_date;
	
	//calendar.control.value=formatDate(calendar.calendar_control_date);
	//calendar.control.value=formatDate(calendar.calendar_control_date);
};

function createCalendar(calendar) {
	//document.onclick=disableCalendar;
	calendar.calendar_control="z";
	var x=calendar.base;
	if (x) {
		
		var left_coor=null;

		if (window.innerWidth) 
			left_coor=window.innerWidth;
		else 
			left_coor=document.body.clientWidth;
		
		left_coor=left_coor/2 - 330;
		
		x.style.left=left_coor;
		
		var table=x.appendChild(_C("TABLE"));
		table.cellPadding=1;
		table.cellSpacing=0;
		var tbody=table.appendChild(_C("TBODY"));
		var tr=tbody.appendChild(_C("TR"));
		var x;
		
		tr.className="close_calendar_row";
		td=tr.appendChild(_C("TD"));
		td.style.textAlign="right";
		td.colSpan=7;
		x=td.appendChild(_C("A"));
		x.href="#";
		x.id="close_calendar";
		x.appendChild(_T("close"));
		x.onclick=disableCalendar;

		tr=tbody.appendChild(_C("TR"));
		tr.className="month_row";
		td=tr.appendChild(_C("TD"));
		x=td.appendChild(_C("A"));
		x.href="#";
		//x.id="left_month";
		x.appendChild(_T("<"));
		x.onclick=processChangeMonth;
		x.calendar=calendar;		
		calendar.left_month=x;
		
		td=tr.appendChild(_C("TD"));
		td.colSpan=5;
		td.className="month_name";				
		calendar.month_name=td;
				
		td=tr.appendChild(_C("TD"));				
		td.style.textAlign="right";		
		x=td.appendChild(_C("A"));
		x.href="#";
		//x.id="right_month";
		x.appendChild(_T(">"));
		x.onclick=processChangeMonth;		
		x.calendar=calendar;
		calendar.right_month=x;		
				
		tr=tbody.appendChild(_C("TR"));
		tr.className="week_days";
		for (var i=0;i<7;i++) {
			td=tr.appendChild(_C("TD"));
			switch (i) {
				case 0: x="S";break;
				case 1: x="M";break;
				case 2: x="T";break;
				case 3: x="W";break;
				case 4: x="T";break;
				case 5: x="F";break;
				case 6: x="S";break;
			};
			td.appendChild(_T(x));
		};		
		for (var j=0;j<6;j++) {
			tr=tbody.appendChild(_C("TR"));	
			tr.className="days";
			for (var i=0;i<7;i++) {			
				td=tr.appendChild(_C("TD"));
				if (i==0 || i==6) {
					td.className="weekend";
				};
			};
		};		
		fillCalendar(calendar);
	};
};

function isLeapYear(x) {
  return new Date(x,1,29).getDate()==29;
}

function addDays(x,y) {
	var year=x.getFullYear();
	var month=x.getMonth();
	var day=x.getDate();
	day=day + y;

	var max=getMonthMaxDay(month, year);
	if (day>max) {
		month=month + 1;
		day=day - max;
		if (month==12) {
			year=year + 1;
			month=0;
		}
	};			

	return new Date(year, month, day);
};

function getMonthMaxDay(x, y) {
	switch (x) {
		case 0: return 31;
		case 1: return ((isLeapYear(y)) ? 29 : 28);
		case 2: return 31;
		case 3: return 30;
		case 4: return 31;
		case 5: return 30;
		case 6: return 31;
		case 7: return 31;
		case 8: return 30;
		case 9: return 31;
		case 10: return 30;
		case 11: return 31;
	};
};

function changeMonth(z) {
	x=z.getAttribute("date");	
	if (x) {
		var a=x.split("/");
		
		var d=new Date(a[2],a[0],a[1]);
		
		//if (d<z.calendar.calendar_boundary_date) return;
		
		z.calendar.calendar_control_date=d;
		
		fillCalendar(z.calendar);
	};
};

function changeCalendar(e) {	

	var dis=this.getAttribute("dis");		
	if (dis=="1") {
		if (!e) {
			var e = window.event
		};
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		return;
	};
	
	x=this.getAttribute("date");
			
	var a=x.split("/");
	var d=new Date(a[2],parseInt(a[0]) - 1,a[1]);

	if (x) {
		this.calendar.calendar_control_date=d;
		this.calendar.calendar_control_date_selected=d;
		fillCalendar(this.calendar);
	};
	
	this.calendar.control.value=(d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();

	hideCalendar(this.calendar);

	if (this.calendar.onchange!=null) {
		this.calendar.onchange(this);
	}
	
};

function showSelect(b) {
	var els=document.getElementsByTagName("SELECT");
	for (var i=0;i<els.length;i++) {
		els[i].style.visibility= (b) ? "visible" : "hidden";
	};
};

function disableLink(x) {
	x.setAttribute("dis","1");
	x.style.textDecoration="none";
	x.style.fontWeight="normal";
	x.style.color="#000000";
	x.style.cursor="default";
};

function enableLink(x) {	
	x.style.cursor="hand";
	x.style.textDecoration="underline";
	x.setAttribute("dis","0");
};

function makeDate(x,b) {
	var a=x.split("/");
	
	a[2]=parseInt(trimStart(a[2],"0"));
	
	//alert(x);
					
	a[2]=(parseInt(a[2]) < 100) ? (2000 + a[2]) : a[2];
	
	return new Date(a[2],(b) ? (a[0]-1) : a[0],a[1]);
};

function formatDate(x) {
	return (x.getMonth() + 1) + "/" + x.getDate() + "/" + x.getFullYear();
};

function isValidYear(x) {
	if (isPositiveNumber(x)) {

		var y=parseInt(x);
		
		return true;
		
	}
	return false;
}

function validateDate(x) {
	var a=x.split("/");
	if (a.length!=3) {
		return false;
	};
	
	if (a[0]>12) return false;	
	if (!isPositiveNumber(a[2])) return false;
	if (a[1]>getMonthMaxDay(a[0]-1,a[2])) return false;
	
	return true;
};

function fillCalendar(calendar) {

	//alert(555555555);
	
	var firstDaysRow = 3;

	var x=calendar.base;
	if (x) {
	
		var input_date=null;
		
		if (validateDate(calendar.control.value)) {
		
			input_date = makeDate(calendar.control.value,true);
		
		}
	
		if (input_date!=null && compareDates(calendar.calendar_control_date_selected,input_date)!=0 ) {
		
			calendar.calendar_control_date=input_date;
			calendar.calendar_control_date_selected=input_date;
		}
		
		
		
		var year=calendar.calendar_control_date.getFullYear();
		var month=calendar.calendar_control_date.getMonth();
		
		var d=new Date(year,month,1);
		
		calendar.month_name.innerHTML=getMonthName(calendar.calendar_control_date.getMonth()) + " " + calendar.calendar_control_date.getFullYear();
		
		var year1=year;
		var month1=month - 1;
		if (month1<0) {
			month1=11;
			year1=year1-1;
		};
		
		var year2=year;
		var month2=month + 1;
		if (month2>11) {
			month2=0;
			year2=year2+1;
		};
		
		var d1=new Date(year1,month1,1);
		var n=d.getDay(); 
		var max=getMonthMaxDay(month,calendar.calendar_control_date.getFullYear())
		
		var k=calendar.calendar_control_date.getDate();

		if (k>max) k=1;

		calendar.left_month.setAttribute("date",month1 + "/" + k + "/" + year1);
		calendar.right_month.setAttribute("date",month2 + "/" + k + "/" + year2);
		
		var max1=getMonthMaxDay(month1, year1)
		var els=x.getElementsByTagName("TR");
		var index=-1;
		var index1=1;
		for (var i=firstDaysRow;i<els.length;i++) {
			var tr=els[i];
			for (var j=0;j<7;j++) {
				var td=tr.childNodes[j];
				if (i==firstDaysRow) {
					if (j==n) {
						index=1;
					};
				};
				var cd;
				var t;
				var a=_C("A");
				a.href="#";
				
				a.calendar=calendar;
				a.onclick=changeCalendar;
				
				if (index>0 && index<=max) {
					cd=makeDate((month) + "/" + index + "/" + year);					
					t=index;
					if (
						calendar.calendar_control_date_selected.getDate() == index && 
						calendar.calendar_control_date_selected.getMonth()==month &&
						calendar.calendar_control_date_selected.getFullYear()==year
						) {
						a.className="today";
					} else {
						a.className="active";
					};
					index++;
				} else {
					if (i==firstDaysRow) {
						// t=max1 - n + j;
						// this needs to add one because the day of the week is zero based
						t=max1 - n + j + 1;
						cd=makeDate((month1) + "/" + t + "/" + year1);					
					} else {
						t=index1;
						cd=makeDate((month2) + "/" + index1 + "/" + year2);					
						index1++;
					};
					a.className="not_active";
				};					
				
				if (cd<calendar.calendar_boundary_date || isDateUnavailable(cd, calendar)) {
					disableLink(a);
				} else {
					enableLink(a);
				};
				
				a.setAttribute("date",formatDate(cd));					
				a.appendChild(_T(t));
				
				if (td.hasChildNodes()) 
					td.replaceChild(a,td.childNodes[0]);			
				else
					td.appendChild(a);
			};
		};		
	};
};

function processChangeMonth(e) {
	if (!e) {
		var e = window.event
	};
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	changeMonth(((e.target) ? e.target : e.srcElement));
};

function processShowCalendar(e, calendar) {
	if (!e) {
		var e = window.event
	};
	
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	showCalendar(calendar);
	
};

function showCalendar(calendar) {

	hideCalendar(xCalendar);
	hideCalendar(xCalendar1);

	var x=calendar.base;
	if (x) {				
		showSelect(false);		
		if (calendar.calendar_control==null) {
			createCalendar(calendar);
		} else {
			if (makeDate(calendar.control.value)!=calendar.calendar_control_date) {
				var a=new Array();
				
				if (validateDate(calendar.control.value)) {
					a=calendar.control.value.split("/");
					
					a[2]=parseInt(trimStart(a[2],"0"));
					
					a[2]=(parseInt(a[2]) < 100) ? (2000 + a[2]) : a[2];
					
				} else {
					a.push(calendar.calendar_boundary_date.getMonth() + 1);
					a.push(calendar.calendar_boundary_date.getDate());
					a.push(calendar.calendar_boundary_date.getFullYear());
				};				
				

				//alert(a);

				calendar.calendar_control_date=new Date(a[2],parseInt(a[0]) - 1,a[1]);		
				
				fillCalendar(calendar)
			};
		};				

		x.style.display="block";

	};	
	//window.event.cancel
	return false;
};
function hideCalendar(calendar) {
	var x=calendar.base;
	if (x) x.style.display="none";
	showSelect(true);
};
