//-----------------------------------------------------------------------------------
// Grabbed from  http://codetale.com/2007/11/19/javascript-calendar-widget-v107/
// Documentation: http://codetale.com/2007/02/23/javascript-calendar-widget/
//-----------------------------------------------------------------------------------


/*
 * If the date is not set, make it the clients PC date
 */
if(typeof(iWeekdayRestriction) == 'undefined')
	iWeekdayRestriction = 'null';
if(typeof(iMonth) == 'undefined')
	iMonth = new Date().getMonth();
if(typeof(iYear) == 'undefined')
	iYear = new Date().getFullYear();
if(typeof(iDay) == 'undefined')
	iDay = new Date().getDate();
if(typeof(itype) == 'undefined')
	var itype = 'strict'; //loose->any date|strict->limit to maxDays
if(typeof(iMaxDays) == 'undefined')
	iMaxDays = 1000 //counts only if itype=strict. Enable selection iMaxDays from start date
if(typeof(startDay) == 'undefined')
	startDay = iDay; //enable selection from this date
if(typeof(startMonth) == 'undefined')
	startMonth = iMonth;
if(typeof(startYear) == 'undefined')
	startYear = iYear;
if(typeof(addZero) == 'undefined')
	addZero = true; //true|false. Put 0 in front of days&months if <10
if(typeof(offsetX) == 'undefined')
	offsetX = 0 // x distance from the mouse.
if(typeof(offsetY) == 'undefined')
	offsetY = 0 // y distance from the mouse.
if(typeof(formatInputs) == 'undefined')
	formatInputs = 1 // Gather the data from no. of inputs
if(typeof(formatSplitter) == 'undefined')
	formatSplitter = ' / ' // Character to add betwen day/month/year
if(typeof(monthFormat) == 'undefined')
	monthFormat = 'mm';
if(typeof(yearFormat) == 'undefined')
	yearFormat = 'yyyy';
if(typeof(drawBelowMouse) == 'undefined')
	drawBelowMouse = false;
if(typeof(formatType) == 'undefined')
	formatType = 'dd'+formatSplitter+monthFormat+formatSplitter+yearFormat; //Format data type
if(typeof(callNotice) == 'undefined')
	callNotice = 'fallsilent()'; //call another function that a date has been selected.


if (window.addEventListener)
	window.addEventListener("load", createBase, false);
else if (window.attachEvent)
	window.attachEvent("onload", createBase);
else if (document.getElementById)
	window.onload=createBase;


document.onmousemove = getMouseXY;
var IE = document.all ? true : false;
if (!IE) document.captureEvents(Event.MOUSEMOVE);

var tempX = 0;
var tempY = 0;

function getMouseXY(e) {
  if (IE) { // grab the x-y pos.s if browser is IE
    tempX = event.clientX + document.body.scrollLeft;
    tempY = event.clientY + document.body.scrollTop;
  } else {  // grab the x-y pos.s if browser is NS
    tempX = e.pageX;
    tempY = e.pageY;
  }  
  if (tempX < 0){tempX = 0}
  if (tempY < 0){tempY = 0}  

  return true
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function getPosition(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		return [curleft,curtop];
	}
}



/*
 * Shortcut functions to ease the implementation.
 */
function createElement(obj){ return document.createElement(obj);  }
function appendChild(obj, elem){ return  obj.appendChild(elem); }

var DayCol = new Array("M", "T", "W", "T", "F", "S", "S");
var MonthCol = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov", "Dec")

/*
 * Base class for the widget
 */   
var cw = {
	currMonth: iMonth,
	currYear: iYear,
	currDay: iDay,
	selectedMonth: iMonth,
	selectedYear: iYear,
	selectedDay: iDay,
	config: itype,
	maxDays: iMaxDays,
	startMonth : startMonth,
	startYear : startYear,
	startDay : startDay,
	endMonth : 11,
	endYear : iYear,
	endDay : 31,
	addZero: addZero, 
	setMarks: function()
	{
		if(this.config == 'strict')
		{
			this.startDay = iDay;
			this.startMonth = iMonth;
			this.startYear = iYear;
			this.getEnd();
		}
	},
	getConfMonths: function()
	{
		if(this.config == 'strict')
			cw.setMarks();
		ulMonth = createElement("ul");
		ulMonth.id = "months";
		cw.setBrowseMonths(); // Adds month browse li
		return ulMonth;
	},
	getConfDays: function()
	{
		daysInMonth = getDaysInMonth(this.selectedMonth, this.selectedYear);
		daysCount = 0;
		ulDays = createElement("ul");
		ulDays.id = "days";
		for(i=0;i<7;i++)
		{
			dayCell = createElement("li");
			dayCell.className = "headDay";
			dayCell.innerHTML = DayCol[i];
			appendChild(ulDays, dayCell);
		}
		var iFirstartDay = new Date(this.selectedYear, this.selectedMonth, 1).getDay();
		iFirstartDay--;
		if (iFirstartDay < 0) {iFirstartDay = 6;}
		for (i=0 ; i<iFirstartDay ; i++)
		{
			dayCell = createElement ('li');
			dayCell.className = "dayBlank";
			dayCell.innerHTML = "&nbsp;";
			appendChild (ulDays, dayCell);
			daysCount++
		}
		for (i=1 ; i <= daysInMonth ; i++)
		{
			dayCell = createElement('li');
			if(cw.isValidDate(i))
			{
				dayCell.className = "dayNormal";
				if(cw.isWeekend(i))
					dayCell.className = "dayWeekend";
				if(cw.isCurrentDay(i))
					dayCell.className = "dayCurrent";
				dayLink = createElement('a');
				dayLink.href="javascript: newDay("+ i + ");fillBackDate("+i+","+this.selectedMonth+","+ this.selectedYear+")";
				dayLink.innerHTML = i;
				appendChild(dayCell, dayLink);
			}
			else
			{
				dayCell.className = "dayDisabled";
				dayCell.innerHTML = i;
			}
			daysCount++
			appendChild(ulDays, dayCell)
		}
		for (i = daysCount ; i < 42 ; i++) {			
			dayCell = createElement ('li');
			dayCell.className = "dayBlank";
			dayCell.innerHTML = "&nbsp;";
			appendChild (ulDays, dayCell);
		}		
		return ulDays;
	},
	setBrowseMonths: function()
	{
		brsMonth = createElement('li');
		brsMonth.className = "monthBrowse";
		if(this.selectedMonth <= this.startMonth && this.selectedYear <= this.startYear && this.config == "strict")
		{
			backB = createElement('span');	
			backB.className = "monthDisabled";
		}
		else
		{
			backB= createElement('a');
			backB.href = "javascript: changeMonth(-1);";
		}
		backB.innerHTML = "&#9668;";
		yText = createElement("b");
		yText.innerHTML = "&nbsp;&nbsp;&nbsp;"+MonthCol[cw.selectedMonth]+' '+cw.selectedYear+"&nbsp;&nbsp;&nbsp;";
		if(this.selectedMonth >= this.endMonth && this.selectedYear >= this.endYear && this.config == "strict") 
		{
			fwdB = createElement('span');
			fwdB.className = "monthDisabled";
		}
		else
		{
			fwdB = createElement('a');
			fwdB.href= "javascript: changeMonth(1);";
		}
		fwdB.innerHTML = "&#9658;";
		appendChild(brsMonth, backB);
		appendChild(brsMonth, yText);
		appendChild(brsMonth, fwdB);
		appendChild(ulMonth, brsMonth);
	},
	getEnd: function()
	{
		imaxD = iMaxDays - (getDaysInMonth(this.startMonth, this.startYear) - this.startDay);
		tmpM = this.startMonth;
		tmpY = this.startYear;
		tmpD = this.startDay;
		i=0;
		while(imaxD >= getDaysInMonth(tmpM, tmpY))
		{
			tmpM++
			if(tmpM>11)
			{
				tmpM=0
				tmpY++;
			}
			tmpD = imaxD -= getDaysInMonth(tmpM, tmpY);
		}
		tmpM++
		if(tmpM>11){tmpM=0; tmpY++}
		this.endMonth = tmpM;
		this.endDay = tmpD;
		this.endYear = tmpY;
	},
	isValidDate: function(tDay)
	{
		if(this.config == "loose")
			return true;
		if(this.selectedYear==this.startYear)
		{
			if(this.selectedMonth<this.startMonth)
				return false;
			if(this.selectedMonth==this.startMonth && tDay <this.startDay)
				return false;
		}
		if(this.selectedYear==this.endYear)
		{
			if(this.selectedMonth>this.endMonth)
				return false;
			if(this.selectedMonth==this.endMonth && tDay>this.endDay)
				return false;
				
		}
		if(this.selectedYear == this.endYear && this.selectedYear==this.startYear){
			if(this.selectedMonth> this.endMonth || this.selectedMonth<this.startMonth)
				return false;
			}
		if(this.selectedYear>this.endYear)
			return false;
		return true;
		
	},
	isWeekend: function(tDay)
	{
		sun = new Date(this.selectedYear, this.selectedMonth, tDay).getDay();
		if(sun==6||sun==0)
			return true;
		return false;
	},
	isCurrentDay: function(tDay)
	{
		if(this.selectedDay == tDay && this.selectedMonth == this.currMonth && this.selectedYear == this.currYear)
			return true;
		return false;
	},
	isValidMonth: function(m)
	{
		if(this.config == "loose")
			return true;
		else
		{
			if(this.selectedYear< this.startYear)
				return false;
			if(this.selectedYear==this.startYear && m<this.startMonth)
				return false;
			if(this.selectedYear>this.endYear)
				return false;
			if(this.selectedYear==this.endYear && m>this.endMonth)
				return false;
		}	
		return true;
	},
	isCurrentMonth: function(i)
	{
		if(i==this.selectedMonth)
			return true
		return false;
	}
}

cw.setMarks();
function createBase()
{
	var el = createElement('div');
	el.id = "datePicker";
	el.style.display = "none";
	if(typeof(elToAppend) == "undefined")
		tDocument = document.getElementsByTagName('body').item(0);
	else
	{
		var tt = elToAppend;
		tDocument = document.getElementById(tt);
	}
	appendChild(tDocument, el);	
}


function createCalendarElements()
{
	var divDP = document.getElementById('datePicker');
	var divElements = createElement('div');
	divElements.id = "elements";
	while(divDP.firstChild)
		divDP.removeChild(divDP.firstChild);
	appendChild(divDP, divElements);
	ulMonth = cw.getConfMonths();
	appendChild(divElements, ulMonth);
	dayStruct = cw.getConfDays();
	appendChild(divElements, dayStruct);

	closeBtn = createElement('div');
	closeBtn.id = "closeBtn";
	closeBtn.onclick = closeCalendar;
	closeBtna = createElement('a');
	closeBtna.href = "javascript: closeCalendar()";
	closeBtna.innerHTML = "close";
	appendChild(closeBtn, closeBtna);
	appendChild(divDP, closeBtn);
}


function changeMonth(way)
{
	newYear = cw.selectedYear;
	newMonth = cw.selectedMonth;	
	newMonth += way;
	if (newMonth > 11) {
		newYear++;
		newMonth = 0;
	}
	if (newMonth < 0) {
		newYear--;
		newMonth = 11;
	}
	cw.selectedYear = newYear;
	cw.selectedMonth = newMonth;	
	createCalendarElements();
}
function newDay(newD)
{
	cw.selectedDay = newD;
	createCalendarElements();
}

var enteredDate;
var inputId;
var mA=0;
var yA=0;
var mm = new Array('mm', 'mmm');
var yy = new Array('yy', 'yyyy');
var textField = '';

function drawDatePicker(id)
{
	textField = document.getElementById(id);
	var tmpString = textField.value;
	enteredDate  = tmpString.split(formatSplitter);
	var dateFormatArray = formatType.split(formatSplitter);
	var dC = ''; 
	var tC = '';
	if(enteredDate.length == dateFormatArray.length)
	{
		for(i=0 ; i < enteredDate.length ; i++)
		{
			if(enteredDate[i].length < 2)
				enteredDate[i] = "0"+enteredDate[i];
			dC += enteredDate[i];
			tC += dateFormatArray[i]; 
		}
		if(dC.length == tC.length)
			orderData();
	}
	else
		enteredDate = new Array(cw.selectedDay, cw.selectedMonth, cw.selectedYear);
	createCalendarElements();
	offsets = getScrollXY();
	document.getElementById('datePicker').style.display = "block";

	if(drawBelowMouse)
	{ // Display datePicker below mouse
		var browser=navigator.appName;
		if(browser=="Microsoft Internet Explorer")
		{
			document.getElementById('datePicker').style.left = parseInt(tempX)+parseInt(offsetX)+parseInt(offsets[0]) + 'px';
			document.getElementById('datePicker').style.top = parseInt(tempY)+parseInt(offsetY)+parseInt(offsets[1]) + 'px';
		}
		else
		{
			document.getElementById('datePicker').style.left = parseInt(tempX)+parseInt(offsetX)+ 'px';
			document.getElementById('datePicker').style.top = parseInt(tempY)+parseInt(offsetY)+ 'px';	
		}
	}
	else { // Display datePicker below input element.
		var textFieldPosition = getPosition(textField);	
		document.getElementById('datePicker').style.left  = textFieldPosition[0] +  "px";
		document.getElementById('datePicker').style.top  = parseInt(textFieldPosition[1]) + parseInt(textField.offsetHeight) - 4 + "px";
	}
	order = new String(formatType).split(formatSplitter);

	for(i=0;i<mm.length;i++)
	{
		for(j=0;j<order.length;j++)
		{
			if(mm[i] == order[j])
				mA = i;
			if(yy[i] == order[j])
				yA = i;
		}
	}
}

function orderData()
{
	order = new String(formatType).split(formatSplitter);

	for(i=0;i<order.length;i++)
	{
		for(j=0;j<mm.length;j++)
		{
			if(mm[j] == order[i])
			{
				cw.selectedMonth = cw.currMonth = enteredDate[i];
				if(cw.selectedMonth.slice(0, 1) == 0)
					cw.selectedMonth = cw.currMonth = parseInt(cw.selectedMonth.slice(1, cw.selectedMonth.length))-1;
				else if(cw.selectedMonth.length<3)
					cw.selectedMonth = cw.currMonth = parseInt(cw.selectedMonth)-1;
				if(j==1)
				{
					for(k=0;k<MonthCol.length;k++)
					{
						if(MonthCol[k].toLowerCase() == cw.selectedMonth.toLowerCase() )
						{
							cw.selectedMonth = cw.currMonth = k;
							break;
						}
					}
				}
			}
			if(yy[j] == order[i])
			{
				cw.selectedYear = cw.currYear = enteredDate[i];
				if(cw.selectedYear.slice(0, 1) == 0)
					cw.selectedYear = cw.currYear = parseInt(cw.selectedYear.slice(1, cw.selectedYear.length));
				if(j==0)
					cw.selectedYear = cw.currYear = 2000 + parseInt(cw.selectedYear);
			}				
		}
		if(order[i].toLowerCase() == 'dd')
		{
			cw.selectedDay = cw.currDay = enteredDate[i];
			if(cw.selectedDay.slice(0, 1) == 0)
				cw.selectedDay = cw.currDay = parseInt(cw.selectedDay.slice(1, cw.selectedDay.length));
		}
	}
}

function fillBackDate(tDay, tMonth, tYear)
{
	if(mA==1)
		tMonth = MonthCol[tMonth];
	if(mA==0)
	{
		tMonth++;
		if(tMonth<10  && cw.addZero == true)
			tMonth = "0"+tMonth;
	}
	if(yA==0)
		tYear = new String(tYear).slice(2,4);
	if(tDay<10 && cw.addZero == true)
	{
		tDay = "0"+tDay;
	}
	textField.value = tDay + formatSplitter + tMonth + formatSplitter + tYear;
	setTimeout(callNotice, 0);
	
	closeCalendar();
}

function closeCalendar()
{
	var datePicker = document.getElementById('datePicker');
	if (datePicker && datePicker.style.display == "block")
		datePicker.style.display = "none";
	if (textField)
		currentToDefaultValue(textField); // Function from [Scripts/functions.js], to prevent a bug (see function description) on certain pages
}

function fallsilent(){}
