var nowDate = new Date();
var todayDate = new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate());
var weekEndDate = new Date();
weekEndDate.setDate(todayDate.getDate()+6);

function CalendarSelection(iStartWeekDay){ // 0 - Sunday, 1-Monday, ...
	var now = new Date();
	this.STARTWEEKDAY = isNaN(parseInt(iStartWeekDay)) ? 0 : parseInt(iStartWeekDay); 
	this.DAY = 1;
	this.WEEK = 2;
	this.CURRENTWEEK = now.getDate() - now.getDay() + this.STARTWEEKDAY;
	this.CURRENTDAY = now.getDate();

	this.type = this.DAY;
	this.days = new Array(); 
}

function CalendarDay(sDivSufix, iDayValueOf, bIsSelected){
	this.divSufix = sDivSufix;
	this.valueOf = iDayValueOf;
	this.selected = bIsSelected;
}

function CalendarColors(sDateBgColor, sSelectedDateBgColor, sNoDateBgColor, sSelectedNoDateBgColor){
	this.dateBgColor = sDateBgColor;
	this.selectedDateBgColor = sSelectedDateBgColor;
	this.noDateBgColor = sNoDateBgColor;
	this.selectedNoDateBgColor = sSelectedNoDateBgColor;
}

//-----------------------------------------------------------------------------
function Calendar(iStartWeekDay, sCalendarVarName, sDivName, iWidth, oColors, displayDate) {
	
	//some constants:
	this.STARTWEEKDAY = isNaN(parseInt(iStartWeekDay)) ? 0 : parseInt(iStartWeekDay); 	
	this.NODIV = true;
	this.monthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	this.daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	this.name = sCalendarVarName;
	this.divName = sDivName;
	this.sDayDivPrefix = "_calDay";
	this.width = iWidth;
	this.colors = oColors;
	this.calendarDays = new Object();
	this.today = displayDate;	
	//this.today = new Date();
	//this.today.setFullYear(2007,01-1,01);	
	//this.today.setDate(displayDate);
	
	this.displayYear = this.today.getFullYear();
	this.displayMonth = this.today.getMonth();
	
	this.onDateClick = null;
	this.onDateLinkWrite = null;
	this.onDrawButton = null;
	
	if(document.all) {
		var sUA = window.navigator.userAgent;
		var i = sUA.indexOf("MSIE ");
		var v, bIsMac = false;
		if(i > -1){
			v = parseFloat(sUA.substr(i + 5));
			bIsMac = (sUA.indexOf("Mac") > -1);
		}
		if(bIsMac && v<5.1){
			this.bFixedMac = true;
			this.divName += 'ie5Mac';
			this.browserHtmlWrite =  _calendar_ie5MacWrite;
			this.browserColorCell = _calendar_ieColorCell;
			this.browserDraw = _calendar_refreshDraw;
			this.display = _calendar_displayIE5Mac;
		} else {
			this.browserHtmlWrite =  _calendar_ieHtmlWrite;
			this.browserColorCell = _calendar_ieColorCell;
			this.browserDraw = _calendar_nonRefreshDraw;
			this.display = _calendar_display2;
		}
	} else if(document.getElementById) {
		this.browserHtmlWrite = _calendar_domHtmlWrite;
		this.browserColorCell = _calendar_domColorCell;
		this.browserDraw = _calendar_nonRefreshDraw;
		this.display = _calendar_display2;
	} else {
		this.browserHtmlWrite = _calendar_ns4HtmlWrite;
		this.browserColorCell = _calendar_ns4ColorCell;
		this.browserDraw = _calendar_refreshDraw;
		this.display = _calendar_displayNS4;
	}
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_display2(oPreselection){
	this.browserHtmlWrite(this.divName, this.getCalendarHtml());

	if(oPreselection && oPreselection.constructor == CalendarSelection) {
		var aDays = oPreselection.days;
		if(oPreselection.type == oPreselection.DAY){
			for(var i=0; i<aDays.length; i++){
				this.selectDay(aDays[i]);
			}
		} else if(oPreselection.type == oPreselection.WEEK){
			for(var i=0; i<aDays.length; i++){
				this.selectWeek(aDays[i]);
			}
		}
	}
}

//-----------------------------------------------------------------------------
function _calendar_displayIE5Mac(oPreselection) {
	document.open();
	document.write('\n<div id="' + this.divName + '" style="position:absolute;">\n');
	document.write(this.getCalendarHtml());
	document.write('\n</div>');
	document.close();
}

//-----------------------------------------------------------------------------
function _calendar_displayNS4(oPreselection) {
	document.open();
	document.write('\n<div id="' + this.divName + '">\n');
	document.write(this.getCalendarHtml());
	document.write('\n</div>');
	document.close();
}

Calendar.prototype.canDisplayPrevMonth = function() {
    
    // check whether to display the prev month select in cal				
	var tmpDateCompare = new Date(todayDate.getFullYear(),todayDate.getMonth(),1);
	var tmpDateDisplay = new Date(this.displayYear, this.displayMonth, 1);
		
	if (tmpDateCompare.valueOf()>tmpDateDisplay.valueOf()) {
	    document.getElementById("cal-prev-month").innerHTML = "";
	    return false;
	}
	else {
	    document.getElementById("cal-prev-month").innerHTML = "&lt;";
	    return true;
	}
}   

//-----------------------------------------------------------------------------
Calendar.prototype.incMonth = function (delta) {
	this.displayMonth += delta;
	if(this.displayMonth >= 12) {
		this.displayMonth = 0;
		this.incYear(1);
	} else if(this.displayMonth <= -1) {
		this.displayMonth = 11;
		this.incYear(-1);
	} else {
		this.browserDraw();
	}	
	
	this.canDisplayPrevMonth();	
	//if(frm["vw"]) { calendarWeekHover(); }
	calendarWeekHover();
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.incYear = function (delta) {
	this.displayYear += delta;
	this.browserDraw();
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.getDaysInMonth = function (month, year) {
	if (1 == month){ // test for leap year
		return ((0 == year % 4) && (0 != (year % 100))) || (0 == year % 400) ? 29 : 28;
	} else {
		return this.daysInMonth[month];
	}//fi
}//getDays()
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.getCalendarHtml = function() {
	var sOut = '';
	var iOffset = (this.STARTWEEKDAY - (new Date(this.displayYear,this.displayMonth,1)).getDay() - 6) % 7;
	if(iOffset == -6) iOffset = 1;
	var iDaysInMonth = this.getDaysInMonth(this.displayMonth, this.displayYear);
	var iDayOfMonth, sDayOfMonth;
	var bFinished = false, bDrawEmptyLine;
	var dTemp, sDay, sMonth, sYear;

	this.calendarDays = new Object();
	this.offsetDays = iOffset;
	
	sOut += '	<table border="0" width="146px" cellspacing="1" cellpadding="0">\n';
	sOut += '	<caption>\n';
	sOut += '		<a id="cal-prev-month" href="#previous month" class="prev-link" title="Previous" onclick="' + this.name + '.incMonth(-1); return false;">&lt;</a><a href="#next month" class="next-link" title="Next" onclick="' + this.name + '.incMonth(1); return false;">&gt;</a> ' + this.monthNames[this.displayMonth] + ' ' + this.displayYear + '\n';
	sOut += '	</caption>\n';	
	sOut += '		<tr>\n';	
	sOut += '		  <th scope="col"><acronym name="Monday">M</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Tuesday">T</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Wednesday">W</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Thursday">T</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Friday">F</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Saturday">S</acronym></th>\n';
	sOut += '		  <th scope="col"><acronym name="Sunday">S</acronym></th>\n';
	sOut += '		</tr>\n';

	for(var iWeek = 0; iWeek < 6; iWeek++) {
		sOut += '	  <tr>';
						
		for(var iDay=0; iDay<7; iDay++) {
			iDayOfMonth = (iWeek * 7) + iDay + iOffset;
			if(iDayOfMonth < 1){ 			    
			    //this is a special case for NS4.7x on PC. The 'else' case should have been sufficient, but... 
				sYear = this.displayMonth ? this.displayYear : (this.displayYear-1);				
				sMonth = this.displayMonth ? this.displayMonth-1 : 11;
				sDay = this.getDaysInMonth(sMonth, sYear) + iDayOfMonth;				
				dTemp = new Date(sYear, sMonth, sDay);				
			} else {			    
				dTemp = new Date(this.displayYear, this.displayMonth, iDayOfMonth);				
			}
			this.calendarDays['' + iDayOfMonth] = new CalendarDay(iDayOfMonth, dTemp.valueOf(), false);			
			sOut += this.getDayHtml(iDayOfMonth, dTemp);
			bFinished = this.displayMonth < dTemp.getMonth();
		}
		
		sOut += '		</tr>\n';
		if(bFinished || (iDayOfMonth >= iDaysInMonth)){
			bDrawEmptyLine = iWeek < 5;
			break;
		}
	}
	//if(this.onDrawButton) {
	//	sOut += '<tr><td colspan="7">' + this.onDrawButton() + '</td></tr>\n';
	//}	
	//if(bDrawEmptyLine) {
	//	sOut +=  '<tr><td colspan="7" background="" height="20">&#160;</td></tr>\n';
	//}
	sOut += '</table>';
	return(sOut);
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.selectDay = function(iDayOfMonth) {
	var sColor;
	var oCalendarDay, dTemp;
	var sRez = '' + iDayOfMonth;
	
	oCalendarDay = this.calendarDays[sRez];
	dTemp = new Date(oCalendarDay.valueOf);
	oCalendarDay.selected = !oCalendarDay.selected;
	
	if(dTemp.getMonth() == this.displayMonth){
		sColor = oCalendarDay.selected ? this.colors.selectedDateBgColor : this.colors.dateBgColor;
	} else {
		sColor = oCalendarDay.selected ? this.colors.selectedNoDateBgColor : this.colors.noDateBgColor;
	}
	this.browserColorCell(this.sDayDivPrefix + iDayOfMonth, sColor);

	if(this.onDateClick){
		return(this.onDateClick(dTemp, oCalendarDay.selected));
	} 
	dTemp = null;
	return(false);
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.deselectAll = function (){
	var dayOfMonth;
	if(arguments.length){
		var o = arguments[0];
		for(dayOfMonth in this.calendarDays){
			if(!o[dayOfMonth] && this.calendarDays[dayOfMonth].selected){
				this.selectDay(dayOfMonth); 
			}
		}
	} else {
		for(dayOfMonth in this.calendarDays){
			if(this.calendarDays[dayOfMonth].selected){
				this.selectDay(dayOfMonth); 
			}
		}
	}
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
Calendar.prototype.selectWeek = function(iDayOfMonth) {
	var iNextWeek = iDayOfMonth+7;
	var i;
	var bAllEqual = true;
	for(i=iDayOfMonth+1; i<iNextWeek; i++){
		bAllEqual = bAllEqual && (this.calendarDays[i].selected == this.calendarDays[i-1].selected);
	}
	for(i=iDayOfMonth; i<iNextWeek; i++){
		if(bAllEqual || !this.calendarDays[i].selected) this.selectDay(i);
	}
}
//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
Calendar.prototype.getDayHtml = function(iDayOfMonth, dDay) {	    
	var sOut = ''
	var iDay = ((dDay.getDate() < 10) ? '0' : '') + dDay.getDate();
	var iMonth = (((dDay.getMonth()+1) < 10) ? '0' : '') + (dDay.getMonth()+1);
	var iYear = dDay.getFullYear();
	var sDate = iYear + '-' + iMonth + '-' + iDay;
	var sClass = "";
	var todaystyle = "";
	var isLink = true;	
	
	if ((dDay.getMonth())!=this.displayMonth) { 
	    sClass='non-current-month';	
	    var currMonth = new Date(this.displayYear, this.displayMonth, 1);
	    var altMonth = new Date(dDay.getFullYear(), dDay.getMonth(), 1);	    
	    var thisMonth = new Date(todayDate.getFullYear(),todayDate.getMonth(),1);
	    if ((altMonth.valueOf()<currMonth.valueOf()) && (thisMonth.valueOf()>currMonth)) { isLink=false; }
	}	
	if (selectedDateString.indexOf(sDate)!=-1) { 
		if (sClass!="") { sClass='selected-'+sClass }
		else { sClass='selected'; }		
	}
	
	if(frm["vw"] && frm["vw"].value=="y")	
	{
	    if (dDay.valueOf()>=todayDate.valueOf() && dDay.valueOf()<weekEndDate.valueOf()) { todaystyle=" today"; }
	    //todaystyle="font-weight:bold;background-color:#fff;";	    
	}
	else 
	{
	    if (todayDate.valueOf()==dDay.valueOf()) { todaystyle=" today"; }					    
    }	
    sClass+=todaystyle;
    
	
	if (isLink) {
	    sOut += '				<td class="'+ sClass + '"><a href="javascript:dateclick(\'' + sDate + '\');void(0);">' + iDay + '</a></td>\n';		
	} else {
	    sOut += '				<td class="'+ sClass + '">' + iDay + '</td>\n';		
	}
	
	
	return(sOut);
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_refreshDraw() {
	window.document.location.replace(window.document.location.pathname + '?year=' + this.displayYear + '&month=' + this.displayMonth);
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_nonRefreshDraw() {
	this.browserHtmlWrite(this.divName, this.getCalendarHtml());
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_domHtmlWrite(sElement, sHtml){
	var o = document.getElementById(sElement);
	if(o) o.innerHTML = sHtml; //else alert(sElement + ' not found');
}
function _calendar_domColorCell(sElement, sColor){
	var o = document.getElementById(sElement);
	if(o) o.style.backgroundColor = sColor; //else alert(sElement + ' not found');
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_ie5MacWrite(sElement, sHtml){
	document.open();
	document.write(sHtml);
	document.close();
}

function _calendar_ieHtmlWrite(sElement, sHtml){
	var o = document.all(sElement);
	if(o) o.innerHTML = sHtml; //else alert(sElement + ' not found');
}

function _calendar_ieColorCell(sElement, sColor){
	var o = document.all(sElement);
	if(o) o.style.backgroundColor = sColor; //else alert(sElement + ' not found');
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function _calendar_ns4HtmlWrite(sElement, sHtml){
	var d = document.layers[sElement].document;
	d.open();
	d.write( sHtml );
	d.close();
}

function _calendar_ns4ColorCell(sElement, sColor){
	var s = sElement.replace(this.sDayDivPrefix, '');
	document.layers[Number(s) + Math.abs(this.offsetDays)].bgColor = sColor;
}
//-----------------------------------------------------------------------------
