/*
	Copyright Binfinity Web, Inc. 2007. All rights reserved.
*/

	var sCalendarElementId = "binf_cal";
	var sSelMonthElementId = "sel_month";	
	var sSelYearElementId = "sel_year";	
	var sCalendarBodyElementId = "sp_calendar";
	var sToDayBtnId = "inpToday";
	var sMonthLabelId = "lbl_m_lower";
	var sGoNextId = "lbl_m_next"
	var sGoPrevId = "lbl_m_prev"
	var sInDayElementId, sInMonthElementId, sInYearElementId;
	var iYearFrom, iYearTo;
	var igMonthBase = 0;
	var arFullMonths = initMonthNamesArray();	



	drawCalendarTable();
	
	document.all?document.attachEvent('onclick',clickOut):document.addEventListener('click',clickOut,false);

	

	function openCalendar(oStartEmement, iMinYear, iMaxYear, sInDayId, sInMonthId, sInYearId, iMonthBase){
		
		sInDayElementId = sInDayId;
		sInMonthElementId = sInMonthId;
		sInYearElementId = sInYearId;
		iYearFrom = iMinYear; 
		iYearTo = iMaxYear;
		if(iMonthBase == undefined) 
			igMonthBase = 0;
		else
			igMonthBase = iMonthBase;
		
		initCalendar(iMinYear, iMaxYear);	

		oCalendar = getElement(sCalendarElementId);
		var positions = [0,0];
		var positions = getParentOffset(oStartEmement, positions);	
		oCalendar.style.left = positions[0]+'px';		
		oCalendar.style.top = positions[1]+'px';		
	
		oCalendar.style.display='block';
		oStartEmement.style.zIndex  = 0;
		

	  

	}
	
	function getParentOffset(el, positions)
	{
		positions[0] += el.offsetLeft;
		positions[1] += el.offsetTop;
		if (el.offsetParent)
			positions = getParentOffset(el.offsetParent, positions);
		return positions;
	}


	function closeCalendar(){
		
		oCalendar = getElement(sCalendarElementId);
		oCalendar.style.display="none";
	}
	
	function initCalendar(iMinYear, iMaxYear)	
	{
	
		fillDropDowns(iMinYear, iMaxYear);
		
		var oSelMonth = getElement(sSelMonthElementId);
		var oSelYear = getElement(sSelYearElementId);

		
		oDay = getElement(sInDayElementId);
		oMonth = getElement(sInMonthElementId);
		oYear = getElement(sInYearElementId);
		
		var dt = getInputDate();		
		
		oSelMonth.selectedIndex = dt.getMonth();
		oSelYear.value = dt.getFullYear(); 
		oSelMonth.style.display="inline";
		oSelYear.style.display="inline";
		changeMonthYear();
		
		var oMonthLabel = getElement(sMonthLabelId);
		
		
		oMonthLabel.innerHTML = arFullMonths[oSelMonth.selectedIndex];
		
		showPrevNextLabels(oSelMonth.selectedIndex, oSelYear.value);
		
		var oInpToday = getElement(sToDayBtnId);
		if(oInpToday)		oInpToday.blur();
		
	}
	
	
	function fillDropDowns(iMinYear, iMaxYear)
	{
		var i = 0;
		var oOption;
		var oSelMonth = getElement(sSelMonthElementId);
		var oSelYear = getElement(sSelYearElementId);
		
		//Fill Up Months dropdown
		var arMonths = arFullMonths;
		//alert(oSelMonth);
		if(oSelMonth.options.length<12){
			for(i=0;i<arMonths.length;i++)
			{
				oOption = document.createElement("OPTION");
				oOption.text = arMonths[i];
				oOption.value = i.toString();
				try{			
					oSelMonth.add(oOption, null);
				}catch(ex){
	    		oSelMonth.add(oOption); // IE only
	    	}
	    }
		}
			
		//Fill Up Years dropdown
		//clean up first
		while (oSelYear.childNodes[0])
		{
			oSelYear.removeChild(oSelYear.childNodes[0]);
		}
		for(i=iMaxYear;i>=iMinYear;i--)									
		{
			oOption = document.createElement("OPTION");
			oOption.text = i.toString();
			oOption.value = i.toString();
			try{			
				oSelYear.add(oOption, null);
			}catch(ex){
				oSelYear.add(oOption);
    	}
		}
	
	}
	function changeMonthYear()
	{
		var oSelMonth = getElement(sSelMonthElementId);
		var oSelYear = getElement(sSelYearElementId);
		BuildHTMLMonthTable(oSelMonth.value, oSelYear.value);
		
		showPrevNextLabels(oSelMonth.selectedIndex, oSelYear.value);

	
	}
	
	
	function selectDate(oDate)
	{
		var oSelMonth = getElement(sSelMonthElementId);
		var oSelYear = getElement(sSelYearElementId);
		var sMonthName = oSelMonth.options[oSelMonth.selectedIndex].text;
		var iYear = oSelYear.value;
		var iMonth = oSelMonth.selectedIndex;
		var iDay  	= oDate.innerHTML;


		submitDate(iYear, iMonth, iDay);
	}

	function submitDate(iYear, iMonth, iDay)
	{

		//alert("Y=" + iYear +";" + "M=" + iMonth + ";" + "D=" + iDay);

		if(iYear==-1)
		{
			var dt = new Date();
			iDay = dt.getDate();
			iMonth = dt.getMonth();
			iYear = dt.getFullYear();
		}

		oDay = getElement(sInDayElementId);
		oMonth = getElement(sInMonthElementId);
		oYear = getElement(sInYearElementId);
		
		oDay.value = iDay;
		oMonth.value = iMonth + igMonthBase;
		oYear.value = iYear;
		//alert(sCalendarElementId);
		closeCalendar();
	}
	
	function getFormattedDateString(sDay, sMonth, sYear)
	{
		if (sDay < 10)
			sDay = "0" + sDay;
		//return  sDay + " " + sMonth + " " + sYear
		return sMonth  + " " + sDay + ", " + sYear;
	}
	
	function BuildHTMLMonthTable(iMonth, iYear)
	{
		var s = '';
		var i = 0, k = 0;
		var isEmptyRow = false;
		
		var arMonth = BuildMonthArray(iMonth, iYear)
		
		oDay = getElement(sInDayElementId);
		
		//set title row
		s = '<table cellpadding="1" cellspacing="0" border="0" width="100%">' + 
		'<tr align="center" bgColor="lemonchiffon" class="edittitle"><td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td></tr>';
		for(i=0;i<6;i++)
		{
			//if(i>0 && arMonth[i][0]==0) 
			//	break;
			s = s + '<tr align="center">'
			for(k=0;k<7;k++)
			{
				if(arMonth[i][k]==0)
					s = s + '<td class="edittitlenodata">.</td>'
				else
				{
					if(arMonth[i][k]==oDay.value){
						s = s + '<td class="actionlink-sel-out" onmouseout="setOverOutClass(this,0,true);" onmouseover="setOverOutClass(this,1,true);" onclick="selectDate(this);">'  + arMonth[i][k]   + '</td>';
					}else{	
						s = s + '<td class="actionlink-out"     onmouseout="setOverOutClass(this,0, false);" onmouseover="setOverOutClass(this,1, false);" onclick="selectDate(this);">' + arMonth[i][k] + '</td>';
					}
				}
			}
			s = s + "</tr>"
		}
		s = s + '</table>';
		var oSpCalendar = getElement(sCalendarBodyElementId);
		oSpCalendar.innerHTML = s;
	}


	function BuildMonthArray(iMonth, iYear)
	{
		var arTable = new Array(6);//(6)(7);
		var iFirstWeekDay = 0;
		var iDaysMonth = 0;
		var i = 0;
		var k = 0;
		var n = 1;
		var dtDate = new Date(iYear,iMonth,1)
		
		iDaysMonth = getNumberDaysInMonth(iMonth, iYear)
		iFirstWeekDay = dtDate.getDay();
		for(i=0;i<6;i++)
		{
			arTable[i] = new Array(7);
		    for(k=0;k<7;k++)
		    {
		        if((k >= iFirstWeekDay || i > 0) && n <= iDaysMonth)
		        {
		            arTable[i][k] = n;
		            n = n + 1;
		        }
		        else
		            arTable[i][k] = 0;
		    }
		}

		return arTable;	
	}
	function getNumberDaysInMonth(iMonth, iYear)
	{
		if(iMonth==1)
		{
			if(isLeapYear(iYear))
				return 29;
			else
				return 28
		}
		else{
			var arMonths = initMonthDaysArray(); 
			return arMonths[iMonth];		
		}
	}
	
	function isLeapYear(iYear)
	{
		return (iYear/4==Math.round(iYear/4))
	
	}
	function initMonthDaysArray()
	{
		var ar = new Array(12);
		ar[0] = 31;
		ar[1] = 28;
		ar[2] = 31;
		ar[3] = 30;
		ar[4] = 31;
		ar[5] = 30;
		ar[6] = 31;
		ar[7] = 31;
		ar[8] = 30;
		ar[9] = 31;
		ar[10] = 30;
		ar[11] = 31;
		
		return ar
	}

	function initMonthNamesArray()
	{
		var ar = new Array(12);
		ar[0] = 'January';
		ar[1] = 'February';
		ar[2] = 'March';
		ar[3] = 'April';
		ar[4] = 'May';
		ar[5] = 'June';
		ar[6] = 'July';
		ar[7] = 'August';
		ar[8] = 'September';
		ar[9] = 'October';
		ar[10] = 'November';
		ar[11] = 'December';
		
		return ar
	}

	function initMonthShortNamesArray()
	{
		var ar = new Array(12);
		ar[0] = 'Jan';
		ar[1] = 'Feb';
		ar[2] = 'Mar';
		ar[3] = 'Apr';
		ar[4] = 'May';
		ar[5] = 'Jun';
		ar[6] = 'Jul';
		ar[7] = 'Aug';
		ar[8] = 'Sep';
		ar[9] = 'Oct';
		ar[10] = 'Nov';
		ar[11] = 'Dec';
		
		return ar
	}

	function setOverOutClass(oDate,iOverOut, bSelected)
	{
		if(bSelected)
		{
			if(iOverOut==0)
				oDate.className = "actionlink-sel-out";
			else
				oDate.className = "actionlink-sel-in";
	
		}
		else
		{
			if(iOverOut==0)
				oDate.className = "actionlink-out";
			else
				oDate.className = "actionlink-in";
			
		}
	}

	function getElement(sElementId)
	{
	    if (document.getElementById) {return document.getElementById(sElementId);}
	    else if (document.all) {return document.all[sElementId];}
	    else if (document.layers) {return document.layers[sElementId];}
	    return false;	
	}

	function clickOut( e) {
		
		e?evt=e:evt=event;
		CSE=evt.target?evt.target:evt.srcElement;
		if (getElement(sCalendarElementId))
			if (!isChild(CSE,getElement(sCalendarElementId)))
				closeCalendar();
	}

	function isChild(s,d) {
		while(s) {
			if (s==d) 
				return true;
			s=s.parentNode;
		}
		return false;
	}


	function goToDay(){
		submitDate(-1, -1, -1);
	}

	function goPrevMonth(){
		shiftMonth(-1);
	}

	function goNextMonth(){
		shiftMonth(1);
	}

	function shiftMonth(del){
		
		var oSelMonth = getElement(sSelMonthElementId);
		var oSelYear = getElement(sSelYearElementId);
		
		iMonth = 		oSelMonth.selectedIndex;
		iYear = oSelYear.value;
		
		var oDt = new Date();
		
		oDt.setMonth(iMonth);
		oDt.setFullYear(iYear);
		oDt.setDate(1);
		
		oDt.setMonth(iMonth + del);

		oSelMonth.selectedIndex = oDt.getMonth();
		oSelYear.value = oDt.getFullYear(); 
		oSelMonth.style.display="inline";
		oSelYear.style.display="inline";
		changeMonthYear();

		var oMonthLabel = getElement(sMonthLabelId);
		oMonthLabel.innerHTML = arFullMonths[oDt.getMonth()];
		
		showPrevNextLabels(oDt.getMonth(), oDt.getFullYear());
			
	}
	
	function showPrevNextLabels(iMonth, iYear){
		var oPrev = getElement(sGoPrevId);
		var oNext = getElement(sGoNextId);
//alert(iMonth);
		if(iMonth==0 && iYear==iYearFrom){
			oPrev.style.display='none';
		}else{
			oPrev.style.display='block';
		}

		if(iMonth==11 && iYear==iYearTo){
			oNext.style.display='none';
		}else{
			oNext.style.display='block';
		}
	}

	
	function getInputDate(){
		
		oDay = getElement(sInDayElementId);
		oMonth = getElement(sInMonthElementId);
		oYear = getElement(sInYearElementId);
		//alert(oMonth.value + ":" + igMonthBase);
		var dt = new Date();
		if(!(trim(oDay.value)==""||trim(oMonth.value)==""||trim(oYear.value)=="")){
			iMonnthIdx = oMonth.value - igMonthBase;
			dt.setDate(oDay.value);
			dt.setMonth(iMonnthIdx, 1);
			dt.setFullYear(oYear.value);
		}
		
		//alert(dt.getMonth());
		return dt;		
	}

	function drawCalendarTable(){
		
		//alert(sCalendarElementId);
				
		document.write('<table  border="1" cellpadding="0" cellspacing="0" bgcolor="linen" class="calendar-table" id="' + sCalendarElementId + '" name="' + sCalendarElementId + '">');
		// prev | next row
		document.write('<tr><td><table  cellpadding="0" cellspacing="0" width="100%"><tr>');
		document.write('<td  class="actionlink" align="center" width="30%"><a id="' + sGoPrevId + '" onclick="goPrevMonth()" href="#">&lt;&lt;</a></td>');
		document.write('<td class="labeltext" align="middle" id="' + sMonthLabelId + '" width="40%">&nbsp;</td>');
		document.write('<td class="actionlink"  align="center" width="30%"><a  id="' + sGoNextId + '" onclick="goNextMonth()" href="#">&gt;&gt;</a></td>');
		document.write('</tr></table></td></tr>');
		
		document.write('<tr><td>');
		document.write('<table width="100%" border="0" cellpadding="2" cellspacing="0"><tr>');
		document.write('<td	align="left"><select style="display:none" id="' + sSelMonthElementId + '" class="edittext" onchange="changeMonthYear();"></select></td>');
		document.write('<td align="right"><select style="display:none" id="' + sSelYearElementId + '" class="edittext" onchange="changeMonthYear();"></select></td>');
		document.write('</tr></table>');
		document.write('</td></tr>');
		document.write('<tr><td><span id="' + sCalendarBodyElementId + '"></span></td></tr>');
		
		
		document.write('<tr><td align="center">');
		document.write('<table cellpadding="0" cellspacing="0" border="0"><tr>');
		document.write('<td><input class="btn" id="' + sToDayBtnId + '" type="button" style="width: 50px" value="Today" onclick="goToDay()"/>&nbsp;<input class="btn"  type="button" style="width: 50px" value="Close" onclick="closeCalendar();"/></td>');
		document.write('</tr></table>');
		document.write('</td></tr>');		
		document.write('</table>');
	}
	
		
		function LTrim( value ) {
			
			var re = /\s*((\S+\s*)*)/;
			return value.replace(re, "$1");
			
		}
		
		// Removes ending whitespaces
		function RTrim( value ) {
			
			var re = /((\s*\S+)*)\s*/;
			return value.replace(re, "$1");
			
		}
		
		// Removes leading and ending whitespaces
		function trim( value ) {
			
			return LTrim(RTrim(value));
			
		}
