
// default settings
var counter=0;
var counterb=0;

var titleWidth=90;
var titleMode=1;
var dayWidth=12;
var dayDigits=1;


var weekDay = 0;
var calWidth=200, calHeight=200, calOffsetX=-200, calOffsetY=16;
var calWin=null;
var winX=0, winY=0;
var cal="cal";
var cals=new Array();
var currentCal=null;


var divName = "calDiv";
var title = "Choose Date";
var calStatus = false;
var calFormat = "yyyy/mm/dd";

var yxMonths=new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var yxDays=new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
var yxLinks=new Array("[close]", "[clear]");

var calResultTargetField;
var status = false;

var restrictReporting = false;

function a1(className) {
	return "<a class=\"calendar"+className+"\" href=";
}

function setFormat(format) {
	calFormat = format;
}

function setSize(width, height, ox, oy) {
	if (width > 0) {
		calWidth=width;
	}
	if (height > 0) {
		calHeight=height;
	}

	calOffsetX=ox;
	calOffsetY=oy;
}

function setWeekDay(wDay) {
	if (wDay == 0 || wDay == 1) {
		weekDay = wDay;
	}
}

function setMonthNames(janName, febName, marName, aprName, mayName, junName, julName, augName, sepName, octName, novName, decName) {
	if (janName != "") {
		yxMonths[0] = janName;
	}
	if (febName != "") {
		yxMonths[1] = febName;
	}
	if (marName != "") {
		yxMonths[2] = marName;
	}
	if (aprName != "") {
		yxMonths[3] = aprName;
	}
	if (mayName != "") {
		yxMonths[4] = mayName;
	}
	if (junName != "") {
		yxMonths[5] = junName;
	}
	if (julName != "") {
		yxMonths[6] = julName;
	}
	if (augName != "") {
		yxMonths[7] = augName;
	}
	if (sepName != "") {
		yxMonths[8] = sepName;
	}
	if (octName != "") {
		yxMonths[9] = octName;
	}
	if (novName != "") {
		yxMonths[10] = novName;
	}
	if (decName != "") {
		yxMonths[11] = decName;
	}
}

function setDayNames(sunName, monName, tueName, wedName, thuName, friName, satName) {
	if (sunName != "") {
		yxDays[0] = sunName;
		yxDays[7] = sunName;
	}
	if (monName != "") {
		yxDays[1] = monName;
	}
	if (tueName != "") {
		yxDays[2] = tueName;
	}
	if (wedName != "") {
		yxDays[3] = wedName;
	}
	if (thuName != "") {
		yxDays[4] = thuName;
	}
	if (friName != "") {
		yxDays[5] = friName;
	}
	if (satName != "") {
		yxDays[6] = satName;
	}
}


function setLinkNames(closeLink, clearLink) {
	if (closeLink != "") {
		yxLinks[0] = closeLink;
	}
	if (clearLink != "") {
		yxLinks[1] = clearLink;
	}
}


function findCalendar(name) {
	for (var i = 0; i < cals.length; i++) {
		if (cals[i].name == name) {
			if (cals[i].form == null) {
				if (cals[i].formName == "") {
					if (document.forms[0]) {
						cals[i].form = document.forms[0];
					}
				}
				else if (document.forms[cals[i].formName]) {
					cals[i].form = document.forms[cals[i].formName];
				}
			}

			return cals[i];
		}
	}
	return null;
}


function getDayName(y,m,d) {
	var wd=new Date(y,m,d);
	return yxDays[wd.getDay()].substring(0,3);
}


function getMonthFromName(m3) {
	for (var i = 0; i < yxMonths.length; i++) {
		if (yxMonths[i].toLowerCase().substring(0,3) == m3.toLowerCase()) {
			return i;
		}
	}

	return 0;
}


function getFormat() {
	var calF = calFormat;
	calF = calF.replace(/\\/g, '\\\\');
	calF = calF.replace(/\//g, '\\\/');
	calF = calF.replace(/\[/g, '\\\[');
	calF = calF.replace(/\]/g, '\\\]');
	calF = calF.replace(/\(/g, '\\\(');
	calF = calF.replace(/\)/g, '\\\)');
	calF = calF.replace(/\{/g, '\\\{');
	calF = calF.replace(/\}/g, '\\\}');
	calF = calF.replace(/\</g, '\\\<');
	calF = calF.replace(/\>/g, '\\\>');
	calF = calF.replace(/\|/g, '\\\|');
	calF = calF.replace(/\* /g, '\\\*');
	calF = calF.replace(/\?/g, '\\\?');
	calF = calF.replace(/\+/g, '\\\+');
	calF = calF.replace(/\^/g, '\\\^');
	calF = calF.replace(/\$/g, '\\\$');

	calF = calF.replace(/dd/i, '\\d\\d');
	calF = calF.replace(/mm/i, '\\d\\d');
	calF = calF.replace(/yyyy/i, '\\d\\d\\d\\d');
	calF = calF.replace(/day/i, '\\w\\w\\w');
	calF = calF.replace(/mon/i, '\\w\\w\\w');

	return new RegExp(calF);
}

function getDateNumbers(date) {
	var y, m, d;

	var yIdx = calFormat.search(/yyyy/i);
	var mIdx = calFormat.search(/mm/i);
	var m3Idx = calFormat.search(/mon/i);
	var dIdx = calFormat.search(/dd/i);

	y=date.substring(yIdx,yIdx+4)-0;
	if (mIdx != -1) {
		m=date.substring(mIdx,mIdx+2)-1;
	}
	else {
		var m = getMonthFromName(date.substring(m3Idx,m3Idx+3));
	}
	d=date.substring(dIdx,dIdx+2)-0;

	return new Array(y,m,d);
}

function hideCal() {

	// remove the div
	calWin.style.visibility = "hidden";
	window.status = "";
}


function lastDay(d) {
	var yy=d.getFullYear(), mm=d.getMonth();
	for (var i=31; i>=28; i--) {
		var nd=new Date(yy,mm,i);
		if (mm == nd.getMonth()) {
			return i;
		}
	}
}

function firstDay(d) {
	var yy=d.getFullYear(), mm=d.getMonth();
	var fd=new Date(yy,mm,1);
	return fd.getDay();
}

function dayDisplay(i) {
	if (dayDigits == 0) {
		return yxDays[i];
	}
	else {
		return yxDays[i].substring(0,dayDigits);
	}
}

function calTitle(d)
{
	var yy=d.getFullYear(), mm=yxMonths[d.getMonth()];
	var s;
	s = "<table cellspacing='0' cellpadding='3' border='0' class=\"calendartable\">\n";
	s+= "<tr class=\"calendartitle\">\n";
	s+= "<td colspan=2><nobr><b>";
	if(!restrictReporting) s+= a1("titlea")+"'javascript:moveYear(-1)'>&nbsp;&#171;</a>&nbsp;";
	if(!restrictReporting || counterb > -8) s+= a1("titlea")+"'javascript:prepMonth("+d.getMonth()+")'>&#139;&nbsp;</a>\n";
	s+= "</b></nobr></td>";
	s+= "<td colspan='5' align=center><nobr><b>"+mm+" "+yy+"</b></nobr></td>";
	s+= "<td colspan=2><nobr><b>";
	s+= a1("titlea")+"'javascript:nextMonth("+d.getMonth()+")'>&nbsp;&#155;</a>&nbsp;";
	if(!restrictReporting) s+= a1("titlea")+"'javascript:moveYear(1)'>&#187;&nbsp;</a>\n";
	s+= "</b></nobr></td>";
	s+= "</tr>\n";

	return s;
}

function calReport(d,from)
{
	var yy=d.getFullYear(), mm=yxMonths[d.getMonth()];
	var s;
	s = "<table cellspacing='0' cellpadding='3' border='0' class=\"calendartable\">\n";
	s+= "<tr class=\"calendartitle\">\n";
	s+= "<td colspan='9'><nobr>\n";
	// can't go back in time
	if (counter > 0)
		s+= "<b>&nbsp;"+a1("titlea")+"'javascript:prepMonth("+d.getMonth()+","+from+")'>&#139;&nbsp;</a></b>\n";
	else
		s+= "&nbsp;\n";

	s+= "<b>"+mm+" "+yy+"</b>\n";

	// can't go more than 6 months forward
	if (counter != 6)
		s+= "<b>"+a1("titlea")+"'javascript:nextMonth("+d.getMonth()+","+from+")'>&nbsp;&#155;</a></b>\n";
	else
		s+= "&nbsp;\n";

	s+= "</nobr></td></tr>\n";


	return s;


}

function calHeader() {
	return "";
}

function calFooter() {
	return "<tr><td colspan='9' align='center' class=\"calendarfoot\"><b>"+a1("foota")+"'javascript:hideCal()'>"+yxLinks[0]+"</a>&nbsp;&nbsp;"+a1("foota")+"'javascript:clearDate()'>"+yxLinks[1]+"</a></b></td></tr></table>\n</td></tr></table>\n";
}

function calBody(d,day) {
	var s="", dayCount=1;
	if (weekDay > 0 && fd == 0) {
		fd = 7;
	}

	s+= "<tr align='center'>\n";
	s+="<td></td>\n";
	for (var i=weekDay; i<weekDay+7; i++) {
		s+= "<td width='"+dayWidth+"' class=\"calendardays\">"+dayDisplay(i)+"</td>\n";
	}

	s+="<td class='calendarrowend'><img src=\"images/blank.gif\" width=1 height=1></td>\n";
	s+= "</tr>\n";

	arrMonth = new Array(new Array(0,0,0,0,0,0,0), new Array(0,0,0,0,0,0,0), new Array(0,0,0,0,0,0,0), new Array(0,0,0,0,0,0,0), new Array(0,0,0,0,0,0,0), new Array(0,0,0,0,0,0,0));

	week = 0;
	totalWeeks = 0;
	/*while(dayCount < ld)
	{
		for (var dayOfWeek=0; dayOfWeek<7; dayOfWeek++)
		{
			//calWeek = week;
			//if(calWeek == 5) calWeek = 0;

			if (week*7 + dayOfWeek>=fd && dayCount<=ld)
			{
				//calWeek = week;
				//if(calWeek == 5) calWeek = 0;
				arrMonth[week][dayOfWeek] = dayCount;
				dayCount++;
			}
		}
		week++;
	}*/

	yr = d.getFullYear();
	mth = d.getMonth();
	ld = 1;
	
	while(ld <= lastDay(d))
	{

		thisDay = new Date(yr, mth, ld);
		dayOfWeek = thisDay.getDay();

		if(dayOfWeek == 0 && ld != 1)
		{
			// new week
			week++;
			if(week == 5) week = 0;
		}
		arrMonth[week][dayOfWeek] = ld;

		ld++;
	}



	nextDay = 0;
	for (week=0; week<5; week++) // loop weeks
	{
		if(nextDay < ld)
		{
			s+="<tr align='center'>\n";
			s+="<td></td>\n";
			for (dayOfWeek=0; dayOfWeek<7; dayOfWeek++)
			{
				nextDay = arrMonth[week][dayOfWeek];
				if (nextDay == 0)
				{
					s+="<td class=\"calendardaydisabled\">&nbsp;</td>\n";
				}else{
					var className="day";

					if (nextDay==day) {
						className="currentday";
					}

					var currentTime = new Date()
					currentDay=currentTime.getDate();
					currentMonth=currentTime.getMonth()+1;
					currentYear=currentTime.getYear();
					gm=d.getMonth()+1;
					gy=d.getYear();
					gd=nextDay;
					gDate= gy + "" + (gm < 10 ? "0" + gm	: gm) + "" + (gd < 10 ? "0" + gd : gd);
					cDate= currentYear + "" + (currentMonth < 10 ? "0" + currentMonth	: currentMonth) + "" + (currentDay < 10 ? "0" + currentDay : currentDay);
					gDate=parseFloat(gDate);
					cDate=parseFloat(cDate);

					script ="pickDate("+nextDay+")";
					cell = "<td class=\"calendar"+className+"\" onClick=\""+script+"\">"+a1(className)+"'javascript:"+script+"'>"+nextDay+"</a></td>\n";

					s = s + cell;
				}
			}
			s+="<td class='calendarrowend'><img src=\"images/blank.gif\" width=1 height=1></td>\n";
			s+="</tr>\n";
		}
	}


	s+= "<tr align='center'>\n";
	s+="<td></td>\n";
	for (var i=weekDay; i<weekDay+7; i++) {
		s+= "<td class=\"calendarend\"><img src=\"images/blank.gif\" width=1 height=1></td>\n";
	}

	s+="<td></td>\n";
	s+= "</tr>\n";

	return s;
}


function moveYear(dy,from) {
	cY+=dy;
	var nd=new Date(cY,cM,1);
	changeCal(nd,from);
}


function prepMonth(m,from) {
	if (from) counter--;
	counterb--;
	cM=m-1;
	if (cM<0) { cM=11; cY--; }
	var nd=new Date(cY,cM,1);
	changeCal(nd,from);
}

function nextMonth(m,from) {
	if (from) counter++;
	counterb++;
	cM=m+1;
	if (cM>11) { cM=0; cY++;}
	var nd=new Date(cY,cM,1);
	changeCal(nd,from);
}


function changeCal(d,from)
{
	var dd = 0;

	var calRE = getFormat();

	if (calResultTargetField.value!="" && calRE.test(calResultTargetField.value)) {
		var cd = getDateNumbers(calResultTargetField.value);
		if (cd[0] == d.getFullYear() && cd[1] == d.getMonth()) {
			dd=cd[2];
		}
	}
	else {
		var cd = new Date();
		if (cd.getFullYear() == d.getFullYear() && cd.getMonth() == d.getMonth()) {
			dd=cd.getDate();
		}
	}
      if (from) var calendar=calHeader()+calReport(d,from)+calBody(d,dd)+calFooter();
      else	var calendar=calHeader()+calTitle(d)+calBody(d,dd)+calFooter();


	/*calIframe = getElemById("calframe");
	elemDoc = calIframe.contentWindow.document;

	calHTML = "<html>\n<head>\n<link rel=\"stylesheet\" href=\"themes/default/calendar.css\">\n</head>\n<body>\n"+calendar+"</body></html>\n";

	elemDoc.open("text/html","replace");
	elemDoc.write(calHTML);
	elemDoc.close();*/
	calWin.innerHTML = calendar;
	status = true;
}


function ShowCalReporting(e, caller, from)
{
	restrictReporting=true;
	ShowCal(e, caller, from);
}


function ShowCal(e, caller, from)
{
	calWin = getElemById(divName);
	if(calWin == null) return;

	// hide the div if it's visible and the same field got clicked on
	if((status == true && calResultTargetField == caller))
	{
		hideCal();
		status = false;
	}else{
		var d=new Date();
		cY=d.getFullYear();
		cM=d.getMonth();
		dd=d.getDate();

		var calRE = getFormat();

		calResultTargetField = caller;

		calFieldName = 'cal_'+calResultTargetField.name;

		posX = getxpos(calResultTargetField);
		posY = getypos(calResultTargetField) + calResultTargetField.offsetHeight;


		calWin.innerHTML = "";

		calWin.style.visibility  = "visible";
		calWin.style.position  = "absolute";

		calWin.style.left = posX + "px";
		calWin.style.top  = posY + "px";

		// if a date was set, use ot as the default
		if (calResultTargetField.value!="" && calRE.test(calResultTargetField.value))
		{
			var cd = getDateNumbers(calResultTargetField.value);
			d=new Date(cd[0],cd[1],cd[2]);

			cY=cd[0];
			cM=cd[1];
			dd=cd[2];
		}

		// change to the selected calendar
		changeCal(d,from);
	}
}


function get2Digits(n) {
	return ((n<10)?"0":"")+n;
}


function clearDate() {
	calResultTargetField.value="";
	hideCal();
}


function pickDate(d)
{
	if(status && calResultTargetField)
	{
		var date=calFormat;

		date = date.replace(/yyyy/i, cY);
		date = date.replace(/mm/i, get2Digits(cM+1));
		date = date.replace(/MON/, yxMonths[cM].substring(0,3).toUpperCase());
		date = date.replace(/Mon/i, yxMonths[cM].substring(0,3));
		date = date.replace(/dd/i, get2Digits(d));
		date = date.replace(/DAY/, getDayName(cY,cM,d).toUpperCase());
		date = date.replace(/day/i, getDayName(cY,cM,d));

		calResultTargetField.focus();
		calResultTargetField.value=date;

		hideCal();
	}
}

// user functions
function checkDate(name) {
	if (calResultTargetField) {
		var calRE = getFormat();

		if (calRE.test(calResultTargetField.value)) {
			return 0;
		}
		else {
			return 1;
		}
	}
	else {
		return 2;
	}
}

function getCurrentDate() {
	var date=calFormat, d = new Date();
	date = date.replace(/yyyy/i, d.getFullYear());
	date = date.replace(/mm/i, get2Digits(d.getMonth()+1));
	date = date.replace(/dd/i, get2Digits(d.getDate()));

	return date;
}

function compareDates(date1, date2) {
	var calRE = getFormat();
	var d1, d2;

	if (calRE.test(date1)) {
		d1 = getNumbers(date1);
	}
	else {
		d1 = getNumbers(getCurrentDate());
	}

	if (calRE.test(date2)) {
		d2 = getNumbers(date2);
	}
	else {
		d2 = getNumbers(getCurrentDate());
	}

	var dStr1 = d1[0] + "" + d1[1] + "" + d1[2];
	var dStr2 = d2[0] + "" + d2[1] + "" + d2[2];

	if (dStr1 == dStr2) {
		return 0;
	}
	else if (dStr1 > dStr2) {
		return 1;
	}
	else {
		return -1;
	}
}

function getNumbers(date) {
	var calRE = getFormat();
	var y, m, d;

	if (calRE.test(date)) {
		var yIdx = calFormat.search(/yyyy/i);
		var mIdx = calFormat.search(/mm/i);
		var m3Idx = calFormat.search(/mon/i);
		var dIdx = calFormat.search(/dd/i);

		y=date.substring(yIdx,yIdx+4);
		if (mIdx != -1) {
			m=date.substring(mIdx,mIdx+2);
		}
		else {
			var mm=getMonthFromName(date.substring(m3Idx,m3Idx+3))+1;
			m=(mm<10)?("0"+mm):(""+mm);
		}
		d=date.substring(dIdx,dIdx+2);

		return new Array(y,m,d);
	}
	else {
		return new Array("", "", "");
	}
}


// default settings for English
setFormat("dd/mm/yyyy");
startUp = function(){createDiv(divName, 'blank')};

//setTimeout(startUp, 1000); //invoke function 

addTargetEvent(window, "load", startUp);

