//var imagesLoc="../resources/calendar/"; This should come from the script
var initCalendar = false;
var titleMode=1;
var dayWidth=13;
var dayDigits=1;
var borderColor="lightblue";
var calFormat = "mm/dd/yyyy";
// ------

// codes
var cal="cal";
var cals = new Array();
var currentCal = new calOBJ(null, null, null, null);

var months=new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var days=new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

var isN6=(navigator.userAgent.indexOf("Gecko")!=-1 || navigator.userAgent.indexOf("opera") !=-1);
var isN4=(document.layers)?true:false;
var isIE=(document.all)?true:false;

var layers=null;
if (isIE) {
  	layers=document.all;
}
else if (isN4) {
  	layers=document.layers;
}

function calOBJ(name, form) {
	this.name = name;
  	this.id = name;
  	this.field = name;
  	this.formName = form;
  	this.form = null
}


function setWidth(tWidth, tMode, dWidth, dDigits) {
	if (tWidth > 0) {
    	titleWidth=tWidth;
  	}
  	if (tMode == 1 || tMode == 2) {
    	titleMode=tMode;
  	}
  	if (dWidth > 0) {
    	dayWidth=dWidth;
  	}
  	if (dDigits ==1 || dDigits == 3) {
    	dayDigits=dDigits;
  	}
}

function setFormat(format) {
  calFormat = format;
}

function getDayName(y,m,d) {
  	var wd=new Date(y,m,d);
  	return days[wd.getDay()].substring(0,3);
}

function getMonthFromName(m3) {
  	for (var i = 0; i < months.length; i++) {
    	if (months[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() {
  	if (isIE) {
	 	ToggleIEDropdownVisibility("visible");
    	layers[cal].innerHTML="";
  	}
  	else if (isN4) {
    	layers[cal].visibility="hide";
    	layers[cal].document.open();
    	layers[cal].document.close();
  	}
  	else if (isN6) {
    	document.getElementById(cal).innerHTML="";
  	}
}

function getLeftIE(x) {
	return x.offsetLeft
}

function getTopIE(x,calH,winH) {
	var returnTop = 0;
    
	if((x.offsetHeight + x.offsetTop+calH)>winH)
		{
			returnTop = x.offsetTop - calH
		}
      else
      	{
      		returnTop = x.offsetTop + x.offsetHeight
      	}
	return returnTop
}

function getLeftN4(l) { return l.pageX; }
function getTopN4(l) { return l.pageY; }

function getLeftN6(l) { return l.offsetLeft; }
function getTopN6(l) { return l.offsetTop; }

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 days[i];
  	}
  	else {
    	return days[i].substring(0,dayDigits);
  	}
}

function calTitle(d) {
  	var yy=d.getFullYear(), mm=months[d.getMonth()];
  	var s;

  	if (titleMode == 2) {
    	s="<tr align='center' class='calTitle'><td colspan='7'><table cellpadding='0' cellspacing='0' border='0'><tr align='center' valign='middle'><td><b><a href='javascript:prepYear("+yy+")'><img alt='Next' border='0' src='" + imagesLoc + "prev.gif'></a></b></td><td width='"+titleWidth+"' class='calTitle'><b>"+yy+"</b></td><td><b><a href='javascript:nextYear("+yy+")' style='text-decoration:none;><img alt='Prev.' border='0' src='" + imagesLoc + "next.gif'></a></b></td></tr><tr align='center' valign='middle'><td><b><a href='javascript:prepMonth("+d.getMonth()+")'><img border='0' src='" + imagesLoc + "prev.gif'></a></b></td><td width='"+titleWidth+"' class='calTitle'><b>"+mm+"</b></td><td><b><a href='javascript:nextMonth("+d.getMonth()+")'><img border='0' src='" + imagesLoc + "next.gif'></a></b></td></tr></table></td></tr><tr align='center'>";  }
  	else {
    	s="<tr align='center'><td class='calTitle' colspan='7'><table cellpadding='0' cellspacing='0' border='0'><tr align='center' valign='middle'><td><b><a href='javascript:prepMonth("+d.getMonth()+")' style='text-decoration:none;'><img border='0' src='" + imagesLoc + "prev.gif'></a></b></td><td width=100% class='calTitle'><nobr>"+mm+"&nbsp;"+yy+"</nobr></td><td><b><a href='javascript:nextMonth("+d.getMonth()+")' style='text-decoration:none;'><img border='0' src='" + imagesLoc + "next.gif'></a></b></td></tr></table></td></tr><tr align='center'>";
  	}

  	for (var i=0; i<days.length; i++) {
    	s+="<td width='"+dayWidth+"' class='DayHeader'>"+dayDisplay(i)+"</td>";
  	}

  	s+="</tr>";

  	return s;
}

function calHeader() {
  	return "<table bgcolor='"+borderColor+"' cellspacing='0' cellpadding='1' class='calHeader'><tr><td><table cellspacing='0' cellpadding='3' border='0'><tr><td";
}

function calFooter() {
  	return "<tr><td class='calFooter' colspan='7' align='center'><b><img alt='clear' src='" + imagesLoc + "btnsmClear.gif' class='btnImage' onclick='javascript:clearDate();'><img src='" + imagesLoc + "spacer.gif' width-'4'><img alt='Close' src='" + imagesLoc + "btnsmClose.gif' onclick='javascript:hideCal();' class='btnImage'></b></td></tr></table></td></tr></table>";
}

function calBody(d,day) {
  	var s="", dayCount=1, fd=firstDay(d), ld=lastDay(d);
  	for (var i=0; i<6; i++) {
    	s+="<tr align='center'>";
    	for (var j=0; j<7; j++) {
      		if (i*7+j<fd || dayCount>ld) {
        		s+="<td class='calNonDay'>&nbsp;</td>";
      		}
      		else {
       			if (dayCount==day) 
        		{ 
					s+="<td align='right' onClick='pickDate("+dayCount+");' onMouseOver='togglePointer(this,true);' onMouseOut='togglePointer(this,false);' class='calSel' value='1'><a href='javascript:pickDate("+dayCount+")' class='calDayText'>"+(dayCount++)+"</a></td>";
        		}
        		else
        		{
        			s+="<td align='right' onClick='pickDate("+dayCount+");' onMouseOver='togglePointer(this,true);' onMouseOut='togglePointer(this,false);' class='calDay'><a href='javascript:pickDate("+dayCount+")' class='calDayText'>"+(dayCount++)+"</a></td>";
      			}
      		}
   		}
    	s+="</tr>";
  	}
  	return s;
}

function togglePointer(obj,status) {
	if(status){
		obj.className="calDayOver"
	}
	else{
		//is this the selected day?
		if(obj.value==1){
			obj.className="calSel"
		}
		else{
			obj.className="calDay"
		}
	}
}

function prepYear(y) {
  	cY=y-1;
  	var nd=new Date(cY,cM,1);
  	changeCal(nd);
}

function nextYear(y) {
  	cY=y+1;
  	var nd=new Date(cY,cM,1);
  	changeCal(nd);
}

function prepMonth(m) {
  	cM=m-1;
  	if (cM<0) { cM=11; cY--; }
  	var nd=new Date(cY,cM,1);
  	changeCal(nd);
}

function nextMonth(m) {
  	cM=m+1;
  	if (cM>11) { cM=0; cY++;}
  	var nd=new Date(cY,cM,1);
  	changeCal(nd);
}

function changeCal(d) {
  	var dd = 0;

  	if (currentCal != null) {
    	var calRE = getFormat();

    	if (currentCal.form[currentCal.field].value!="" && calRE.test(currentCal.form[currentCal.field].value)) {
      		var cd = getDateNumbers(currentCal.form[currentCal.field].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();
      		}
    	}
  	}

  	var calendar=calHeader()+calTitle(d)+calBody(d,dd)+calFooter();

  	if (isIE) {
    	layers[cal].innerHTML=calendar;
  	}
  	else if (isN4) {
    	layers[cal].document.open();
    	layers[cal].document.writeln(calendar);
    	layers[cal].document.close();
  	}
  	else if (isN6) {
    	document.getElementById(cal).innerHTML=calendar;
  	}
}

function showCal(sName,BasePos,form) {
 	var d=new Date();
	//var oName = eval('document.all.' + sName);
	//var oForm = eval('document.all.' + sName +'.form');
	var oName = document.getElementById(sName);
	var oForm = document.forms[form];

  	currentCal.formName = oForm.name;
  	currentCal.field = sName;
  	currentCal.form = oForm;
  	currentCal.id = BasePos

  	if (currentCal != null) {
    	var calRE = getFormat();

    	if (currentCal.form[currentCal.field].value!="" && calRE.test(currentCal.form[currentCal.field].value)) {
      		var cd = getDateNumbers(currentCal.form[currentCal.field].value);
      		d=new Date(cd[0],cd[1],cd[2]);

      		cY=cd[0];
      		cM=cd[1];
      		dd=cd[2];
    	}
    	else {
      		cY=d.getFullYear();
      		cM=d.getMonth();
      		dd=d.getDate();
    	}

    	var calendar=calHeader()+calTitle(d)+calBody(d,dd)+calFooter();

    	if (isIE) {
			if (layers[cal].innerHTML != "" && layers[cal].innerHTML != "&nbsp;") {
				hideCal();
			}
			else {
				ToggleIEDropdownVisibility("hidden");
      			layers[cal].innerHTML=calendar;

				var windowHeight = document.body.offsetHeight;
				var calHeight = (layers[cal].children[0].offsetHeight);
			
			
				layers[cal].style.pixelTop=getTopIE(currentCal.id, calHeight,windowHeight)
   	   			layers[cal].style.pixelLeft=getLeftIE(currentCal.id);
	    		layers[cal].style.clip = "rect(0px; " + layers[cal].children[0].offsetWidth + "px; " + layers[cal].children[0].offsetHeight + "px; 0px)";
			}
    	}
    	else if (isN4) {
			if (layers[cal].visibility == "show") {
				hideCal();
			}
			else {
	      		layers[cal].top=getTopN4(currentCal.id);
   	   			layers[cal].left=getLeftN4(currentCal.id);
      			layers[cal].document.open();
	      		layers[cal].document.writeln(calendar);
   	   			layers[cal].document.close();
      			layers[cal].visibility="show";
			}
   		}
    	else if (isN6) {
			if (document.getElementById(cal).innerHTML.substring(0,10) == calendar.substring(0,10)) {
				hideCal();
			}
			else {
	      		var l=currentCal.id;
   	   			layer=document.getElementById(cal);
      			layer.style.top=getTopN6(l)+"px";
	      		layer.style.left=getLeftN6(l)+"px";
   	   			layer.innerHTML=calendar;
			}
    	}
  	}
 	else {
    	alert("Calendar ["+name+"] not found");
  	}
	return false;
}

function ToggleIEDropdownVisibility(visibility) {
	//A bug in IE causes the popup calendar to appear behind <SELECT> tags (dropdown lists).  This code
	//hides them when a popup is visible.  Valid values for the visibility parm are "hidden" and "visible".
	var ndx;
	var selectTagsCount = document.all.tags("select").length;
	
	for (ndx=0; ndx < selectTagsCount; ndx++) {
		document.all.tags("select")[ndx].style.visibility = visibility;
	}
}

function get2Digits(n) {
  	return ((n<10)?"0":"")+n;
}

function clearDate() {
  	currentCal.form[currentCal.field].value="";
  	hideCal();
}

function pickDate(d) {
  	var date=calFormat;
  	date = date.replace(/yyyy/i, cY);
  	date = date.replace(/mm/i, get2Digits(cM+1));
 	date = date.replace(/MON/, months[cM].substring(0,3).toUpperCase());
  	date = date.replace(/Mon/i, months[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));

  	currentCal.form[currentCal.field].value=date;

  	hideCal();
}
// ------

// the cal layer
if (isN4) {
  	document.writeln("<layer id='"+cal+"'>&nbsp;</layer>");
}
else {
  	document.writeln("<div id='"+cal+"' style='position:absolute;z-index:1;'>&nbsp;</div>");
}
// ----

// user functions
function checkDate(name) {
  	var thisCal = currentCal

  	if (thisCal != null) {
    	var calRE = getFormat();

    	if (calRE.test(thisCal.form[thisCal.field].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 = getDateNumbers(date1);
  	}
  	else {
    	d1 = getDateNumbers(getCurrentDate());
  	}

  	if (calRE.test(date2)) {
    	d2 = getDateNumbers(date2);
  	}
  	else {
    	d2 = getDateNumbers(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 {
      		m = getMonthFromName(date.substring(m3Idx,m3Idx+3))+1;
    	}
    	d=date.substring(dIdx,dIdx+2);

    	return new Array(y,m,d);
  	}
  	else {
    	return new Array("", "", "");
  	}
}
