
//------------------------------------------------ PAT Calendar ------------------------------------------------
//--------------------------------------------------------------------------------------------------------------

function ClndInit(name, defval)
{
    objList[name] = new Calendar(name, defval);
}

function ClndSetVal(name, date)
{
    if(objList[name] && objList[name].SetVal) objList[name].SetVal(date);
    else OnError("Invalid Calendar object. (ClndSetVal)");
}

function ClndClose(name)
{
    if(objList[name] && objList[name].Close) objList[name].Close();
    else OnError("Invalid Calendar object. (ClndClose)");
}

function ClndDecMonth(name)
{
    if(objList[name] && objList[name].decMonth) objList[name].decMonth();
    else OnError("Invalid Calendar object. (ClndDecMonth)");
}

function ClndIncMonth(name)
{
    if(objList[name] && objList[name].incMonth) objList[name].incMonth();
    else OnError("Invalid Calendar object. (ClndIncMonth)");
}

function ClndSetMonth(name, val)
{
    if(objList[name] && objList[name].setMonth) objList[name].setMonth(val);
    else OnError("Invalid Calendar object. (ClndSetMonth)");
}

function ClndShowMonthSel(name, show)
{
    if(objList[name] && objList[name].showMonthSel) objList[name].showMonthSel(show);
    else OnError("Invalid Calendar object. (ClndShowMonthSel)");
}

function ClndShowYearSel(name, show)
{
    if(objList[name] && objList[name].showYearSel) objList[name].showYearSel(show);
    else OnError("Invalid Calendar object. (ClndShowYearSel)");
}

function ClndSetYear(name, val)
{
    if(objList[name] && objList[name].setYear) objList[name].setYear(val);
    else OnError("Invalid Calendar object. (ClndSetYear)");
}

function ClndScrollYearUp(name)
{
    if(objList[name] && objList[name].scrollYearUp) objList[name].scrollYearUp();
    else OnError("Invalid Calendar object. (ClndScrollYearUp)");
}

function ClndScrollYearDn(name)
{
    if(objList[name] && objList[name].scrollYearDn) objList[name].scrollYearDn();
    else OnError("Invalid Calendar object. (ClndScrollYearDn)");
}

function ClndStopYearScroll(name)
{
    if(objList[name] && objList[name].stopYearScroll) objList[name].stopYearScroll();
    else OnError("Invalid Calendar object. (ClndStopYearScroll)");
}

function ClndPopUp(name) 
{
    if(objList[name] && objList[name].popUpCalendar) objList[name].popUpCalendar();
    else OnError("Invalid Calendar object. (ClndPopUp)");
}

function ClndDisable(name, dis)
{
    if(objList[name] && objList[name].Disable) objList[name].Disable(dis);
    else OnError("Invalid Calendar object. (ClndDisable)");
}

function ClndGetValue(name)
{
    if(objList[name]) return objList[name].value;
    OnError("Invalid Calendar object. (ClndGetValue)");
    return null;
}

function Calendar(name, defval)
{
    var self = this;

    self.name = name;
    self.value = null;
    self.defVl = defval;
    self.base = $get(self.name);

	self.today = new Date();
	self.dateNow = self.today.getDate();
	self.monthNow = self.today.getMonth();
	self.yearNow = self.today.getYear();

	self.Format = (self.base.getAttribute("Format") ? self.base.getAttribute("Format") : "mm/dd/yyyy");
	self.startAt = (self.base.getAttribute("startAt") == "1" ? "1" : "0"); // 0 - sunday ; 1 - monday
	self.MaxYear = (self.base.getAttribute("MaxYear") ? self.base.getAttribute("MaxYear") : "3000");
	self.MinYear = (self.base.getAttribute("MinYear") ? self.base.getAttribute("MinYear") : "1900");
	self.imgDir = "PAT/Calendar/"	// directory for images ... e.g. var imgDir="/img/"
	
	self.DataChangeNotifyList = self.base.getAttribute("DataChangeNotifyList");
	self.onChange = self.base.getAttribute("onChange");

	self.dateSelected  = self.today.getDate();
	self.monthSelected = self.today.getMonth();
	self.yearSelected  = self.today.getFullYear();
	
	self.fYear = null;

	self.monthName = new Array("January","February","March","April","May","June","July","August","September","October","November","December")
	if (self.startAt == 0)
		self.dayName = new Array ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
	else
		self.dayName = new Array ("Mon","Tue","Wed","Thu","Fri","Sat","Sun");

    self.base.innerHTML = "<table class='CalendarTable'><tr><td><div id='" + self.name + "_input'></div></td><td><img id='" + self.name + "_button' alt='' src='"+self.imgDir+"calendar.gif' /></td></tr></table><div id='" + self.name + "_clndddn' class='div-style'><table width=220 class='table-style'><tr class='title-background-style' ><td><table width='218'><tr><td class='title-style'><B><span id='" + self.name + "_caption'></span></B></td><td align=right><IMG SRC='"+self.imgDir+"close.gif' width='15' height='13' border='0' alt='Close the Calendar' style='cursor:pointer;' onclick='ClndClose(\"" + self.name + "\")'></td></tr></table></td></tr><tr><td class='body-style'><span id='" + self.name + "_content'></span></td></tr><tr class='today-style'><td><span id='" + self.name + "_lbToday'></span></td></tr></table></div><div id='" + self.name + "_slMonth' class='div-style'></div><div id='" + self.name + "_slYear' class='div-style'></div>";

    self.clndddn = $get(self.name + "_clndddn");
    self.caption = $get(self.name + "_caption");
    self.content = $get(self.name + "_content");
    self.lbToday = $get(self.name + "_lbToday");
    self.slMonth = $get(self.name + "_slMonth");
    self.slYear  = $get(self.name + "_slYear");

    self.input = $get(self.name + "_input");
    self.button = $get(self.name + "_button");

	self.clndddn.style.display="none";
	self.slMonth.style.display="none";
	self.slYear.style.display="none";
    self.input.className = (self.base.getAttribute("impCss")? self.base.getAttribute("impCss") : "def_clnd_imp_css");  
    self.button.className = (self.base.getAttribute("btnCss")? self.base.getAttribute("btnCss") : "def_clnd_btn_css");  

    self.initCalendar = function () 
    {
        AddHandler(self.button, "click", self.popUpCalendar);
        AddHandler(self.input, "click", self.popUpCalendar);
        AddHandler(self.clndddn, "click", self.onPopUpClick);

	    self.lbToday.innerHTML = "Today is <span class='today-style'>"+self.dayName[(self.today.getDay()-self.startAt==-1)?6:(self.today.getDay()-self.startAt)]+", " + self.dateNow + " " + self.monthName[self.monthNow].substring(0,3) + " " + self.yearNow + "</span>"

		var sHTML1= "<span style='cursor: pointer;' title='Previous month' onclick='ClndDecMonth(\"" + self.name + "\")'>&nbsp<IMG id='changeLeft' SRC='"+self.imgDir+"left.gif' width=10 height=11 BORDER=0/></span>&nbsp;"
		sHTML1+="<span style='cursor: pointer;' title='Next month' onclick='ClndIncMonth(\"" + self.name + "\")'>&nbsp<IMG id='changeRight' SRC='"+self.imgDir+"right.gif' width=10 height=11 BORDER=0/></span>&nbsp;"
		sHTML1+="<span id='" + self.name + "_lbMonth' style='cursor: pointer;' title='Click to select a month' onclick='ClndShowMonthSel(\"" + self.name + "\", true)'></span>&nbsp;"
		sHTML1+="<span id='" + self.name + "_lbYear' style='cursor: pointer;' title='Click to select a year' onclick='ClndShowYearSel(\"" + self.name + "\", true)'></span>&nbsp;"
		
		self.caption.innerHTML = sHTML1;
		
		self.lbMonth = $get(self.name + "_lbMonth");
		self.lbYear = $get(self.name + "_lbYear");
        
        self.constructCalendar();
        if(self.defVl) self.SetVal(self.defVl);
	}

    self.Close = function () 
	{
		self.showMonthSel(false);
		self.showYearSel(false);
        HidePopUp(self.clndddn);
	}

    self.padZero = function (num) { return (num	< 10)? '0' + num : num ; }

    self.constructDate = function (d,m,y)
	{
		var sTmp = self.Format
		sTmp = sTmp.replace	("dd","<e>")
		sTmp = sTmp.replace	("d","<d>")
		sTmp = sTmp.replace	("<e>",self.padZero(d))
		sTmp = sTmp.replace	("<d>",d)
		sTmp = sTmp.replace	("mmm","<o>")
		sTmp = sTmp.replace	("mm","<n>")
		sTmp = sTmp.replace	("m","<m>")
		sTmp = sTmp.replace	("<m>",m+1)
		sTmp = sTmp.replace	("<n>",self.padZero(m+1))
		sTmp = sTmp.replace	("<o>",self.monthName[m])
		return sTmp.replace ("yyyy",y)
	}

    self.Disable = function(dis)
    {
        if(dis)
        {
            RmvHandler(self.button, "click", self.popUpCalendar);
            RmvHandler(self.input, "click", self.popUpCalendar);
        }
        else
        {
            AddHandler(self.button, "click", self.popUpCalendar);
            AddHandler(self.input, "click", self.popUpCalendar);
        }
    }

	self.SetVal = function(date) 
	{
        var val = new Date(date);
        if(isNaN(val)) return OnError("Invalid date. (SetVal)");
	    self.value = val;
		self.input.innerHTML = date;

		self.dateSelected = val.getDate();
		self.monthSelected = val.getMonth();
		self.yearSelected = val.getFullYear();
		self.constructCalendar();
		
		if(self.onChange) try{eval(self.onChange + "(self, date);");}catch(ex){OnError("Invalid custom " + self.onChange + " function. (SetVal)");}
		if(DataChangeNotify) DataChangeNotify(self.DataChangeNotifyList, Hash("act", "clnd_setval", "value", date));
	}


	/*** Month Pulldown	***/

	self.incMonth = function() 
	{
		self.monthSelected++;
		if (self.monthSelected > 11) 
		{
			self.monthSelected = 0;
			self.yearSelected++;
		}
		self.constructCalendar();
	}

	self.decMonth = function() 
	{
		self.monthSelected--;
		if (self.monthSelected < 0) 
		{
			self.monthSelected = 11;
			self.yearSelected--;
		}
		self.constructCalendar();
	}

	self.setMonth = function(m) 
	{
	    if(!ValidateInt(m) || m < 0 || m > 11) OnError("Invalid Month value. (setMonth)");
		self.monthSelected = m;
		self.constructCalendar();
	}

	self.constructMonth = function() 
	{
		var sHTML =	""
		for	(i=0; i<12;	i++)
			sHTML += "<tr><td id='m" + i + "' onmouseover='this.className=\"dropdown-select-style\"' onmouseout='this.className=\"\"' onclick='ClndSetMonth(\"" + self.name + "\", " + i + ");ClndShowMonthSel(\"" + self.name + "\", false);'>" + self.monthName[i] + "</td></tr>"

		self.slMonth.innerHTML = "<table width='70' class='dropdown-style' cellspacing=0>" + sHTML + "</table>"
	}

	 self.showMonthSel = function(show) 
	 {
		self.slMonth.style.display = (show ? "" : "none");
		if(show)
		{
    		SetDropDownPos(self.lbMonth, self.slMonth);
            self.showYearSel(false);
		}
	}


	/*** Year Pulldown ***/
	self.incYear = function() 
	{
	    if(self.fYear >= self.MaxYear) return;
		self.fYear++;
		for	(i=0; i<7; i++)
			self.slYear.firstChild.firstChild.childNodes[i+1].firstChild.innerHTML = (i+self.fYear);
	}

	self.decYear = function() 
	{
	    if(self.fYear <= self.MinYear) return;
		self.fYear--;
		for	(i=0; i<7; i++)
			self.slYear.firstChild.firstChild.childNodes[i+1].firstChild.innerHTML = (i+self.fYear);
	}

	self.scrollYearUp = function() 
	{
	    self.scrollYearInterval = setInterval(self.decYear,30);
	}

	self.scrollYearDn = function() 
	{
	    self.scrollYearInterval = setInterval(self.incYear,30);
	}

	self.stopYearScroll = function() 
	{
        clearInterval(self.scrollYearInterval);
    }

	self.setYear = function(y) 
	{
	    if(!ValidateInt(y) || y < self.MinYear || y > self.MaxYear) OnError("Invalid year value. (setYear)");
		self.yearSelected = y;
		self.constructCalendar();
	}

	 self.constructYear = function() 
     {
		self.fYear = self.yearSelected-3;
		sHTML =	"<tr><td align='center'	onmouseover='this.className=\"dropdown-select-style\"' onmouseout='this.className=\"\"' onmousedown='ClndScrollYearUp(\"" + self.name + "\");' onmouseup='ClndStopYearScroll(\"" + self.name + "\");'>-</td></tr>"
		for	(i=0; i<7; i++)
			sHTML += "<tr><td align='center' class='dropdown-d-style' onmouseover='this.className=\"dropdown-select-style\"' onmouseout='this.className=\"dropdown-d-style\"' onclick='ClndSetYear(\"" + self.name + "\",this.innerHTML);ClndShowYearSel(\"" + self.name + "\",false);'>" + (i+self.fYear) + "</td></tr>"

		sHTML += "<tr><td align='center' onmouseover='this.className=\"dropdown-select-style\"' onmouseout='this.className=\"\"' onmousedown='ClndScrollYearDn(\"" + self.name + "\");'	onmouseup='ClndStopYearScroll(\"" + self.name + "\");'>+</td></tr>"

		self.slYear.innerHTML = "<table width=44 class='dropdown-style' cellspacing=0>"	+ sHTML	+ "</table>"
	}

	 self.showYearSel = function(show) 
	 {
		self.slYear.style.display = (show ? "" : "none");
		if(show)
		{
    		SetDropDownPos(self.lbYear, self.slYear);
            self.showMonthSel(false);
		}
	}

	self.constructCalendar = function() 
	{
		var	startDate =	new	Date(self.yearSelected, self.monthSelected, 1);
		var	endDate	= new Date(self.yearSelected, self.monthSelected + 1, 1);
		endDate	= new Date(endDate - (24*60*60*1000));

		var datePointer	= 0;
		var dayPointer = startDate.getDay() - self.startAt;
		if (dayPointer < 0) dayPointer = 6;

		var sHTML =	"<table	border=0 class='body-style'><tr>";
		for	(i=0; i<7; i++)	sHTML += "<td width='27' align='right'><B>"+ self.dayName[i]+"</B></td>";
		sHTML +="</tr><tr>";
		
		for(var i=1; i<=dayPointer; i++) sHTML += "<td>&nbsp;</td>";
	
		for(datePointer=1; datePointer<=endDate.getDate(); datePointer++)
		{
		    dayPointer++;
			sHTML += "<td align=right>"

			var sStyle="normal-day-style"; //regular day
			if (self.value && (datePointer == self.value.getDate()) && (self.monthSelected==self.value.getMonth()) && (self.yearSelected==self.value.getYear())) //selected day
			    sStyle += " selected-day-style";
			else if ((datePointer == self.dateNow)&&(self.monthSelected == self.monthNow)&&(self.yearSelected == self.yearNow)) //today
			    sStyle = "current-day-style";
			else if	(dayPointer % 7 == (self.startAt * -1) +1) //end-of-the-week day
			    sStyle = "end-of-weekday-style";

            var date = self.constructDate(datePointer,self.monthSelected,self.yearSelected);
			sHTML += "<span class='"+sStyle+"' title='Select " + date + " as date.' onclick=\"ClndSetVal('" + self.name + "', '" + date + "');ClndClose('" + self.name +"');\">&nbsp;" + datePointer + "&nbsp;</span>"

			if ((dayPointer + self.startAt) % 7 == self.startAt) sHTML += "</tr><tr>";
		}

		self.content.innerHTML = sHTML;
		self.lbMonth.innerHTML = "&nbsp;" +	self.monthName[self.monthSelected] + "&nbsp;<IMG id='changeMonth' SRC='"+self.imgDir+"drop.gif' WIDTH='12' HEIGHT='10' BORDER=0>"
		self.lbYear.innerHTML  = "&nbsp;" + self.yearSelected + "&nbsp;<IMG id='changeYear' SRC='"+self.imgDir+"drop.gif' WIDTH='12' HEIGHT='10' BORDER=0>"

        self.constructYear();
        self.constructMonth();
	}
	
	self.popUpCalendar = function(obj, evt) 
	{
        ShowPopUp(self.clndddn, self.input);
        CancelBubbling(evt);
	}
	
	self.onPopUpClick = function(obj, evt) 
	{
        CancelBubbling(evt);
	}

	self.initCalendar();
}
