var calendarCollection = [];
var isIE = (navigator.userAgent.indexOf("MSIE")!=-1 && navigator.userAgent.indexOf("Opera")==-1);
var isOpera = navigator.userAgent.indexOf("Opera")!=-1;

var aData = new Array();
var aFundsSelected = new Array();

var active_calendar = true;

function createComponentCalendar(containerId)
{
	return (calendarCollection[containerId] = new classCalendar(containerId));
}

function classCalendar(containerId)
{
	var inputClass = "";

	/* CONSTANTS is used for customization */
	var CLNDR_IMG_PATH = "";
	var CLNDR_IMG_BUTTON = "../img/calendarButton.gif";
	var CLNDR_IMG_CLOSE = "../img/calendarClose.gif";

	/* SERVICE PROPERTIES */
	this.containerId = containerId;
	this.containerObj = null;
	this.state = 0; // 0 - closed (default); 1 - opened

	/* FORM FILED PROPERTIES */
	this.name = '';
	this.id = '';

	/* DATE PROPERTIES */
	this.monthArray = new Array ('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь','Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек');
	this.dayNamesArray = new Array ('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Вс','Пн','Вт','Ср','Чт','Пт','Сб');
	this.datesArray = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	this.DEFAULT_DATE_FORMAT = "MMM d, yyyy";
	this.DEFAULT_TIME_FORMAT = "hh:mm:ssa";

	/* CSS FILE */
	this.cssFile = "css/calendar.css";

	/* IMAGE PROPERTIES */
	this.calendImg = CLNDR_IMG_PATH + CLNDR_IMG_BUTTON;
	this.calendCloseImg = CLNDR_IMG_PATH + CLNDR_IMG_CLOSE;

	/* PARAMETERS OF DISPLAYING CALENDAR */
	this.daysOrder = ''; // H - horizontal (default); V - vertical
	this.startDay = ''; // S - sunday (default); M - monday
	this.changingDates = ''; // A - arrows (default); I - input fields
	this.holidaysSelection = ''; // N - disabled (default); Y - enabled
	this.pastDaysSelection = ''; // Y - enabled (default); N - disabled
	this.futureDaysSelection = ''; // Y - enabled (default); N - disabled
	this.pastMonthDaysDisplay = ''; // N - no (default); Y - yes
	this.withTime = ''; // N - no (default); Y - yes
	this.withIntervals = ''; // N - no (default); Y - yes
	this.weekIntervalSelection = ''; // N - no (default); Y - yes
	this.width = null; // value of width of input field
	this.readonly = ''; // Y - yes (default); N - no
	this.closeOnSelection = ''; // N - no (default); Y - yes
	this.startDate = null;
	this.endDate = null;
	this.startYear = null;
	this.endYear = null;
	this.dateFormat = ''; // The format string consists of the following abbreviations:
	  /*Field        | Full Form          | Short Form
		-------------|--------------------|-----------------------
		Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
		Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
					 | NNN (abbr.)        |
		Day of Month | dd (2 digits)      | d (1 or 2 digits)
		Day of Week  | EE (name)          | E (abbr)
		Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
		Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
		Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
		Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
		Minute       | mm (2 digits)      | m (1 or 2 digits)
		Second       | ss (2 digits)      | s (1 or 2 digits)
		AM/PM        | a                  |
		NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
		Examples:
		 "MMM d, y" matches: January 01, 2000
							 Dec 1, 1900
							 Nov 20, 00
		 "M/d/yy"   matches: 01/20/00
							 9/2/00
		 "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
	  */


	/* METHODS */
	this.init = __calendar_init;
	this.render = __calendar_render;
	this.show = __calendar_show;
	this.setMonth = __calendar_setMonth;
	this.setYear = __calendar_setYear;
	this.setChoosenDate = __calendar_setChoosenDate;
	this.formatDate = __calendar_formatDate;
	this.getDateFromFormat = __calendar_getDateFromFormat;
	this.getTop = __calendar_getTop;
	this.getLeft = __calendar_getLeft;

	/* EVENTS */
	this.onclick = null;
	this.onchange = null ;
	this.checkDate = null;
}

function __calendar_init(params)
{
	this.containerObj = document.getElementById(this.containerId);
	this.name = params.name;
	this.id = (params.id) ? params.id : params.name;
	this.daysOrder = (params.daysOrder)?params.daysOrder:'H';
	this.startDay = (params.startDay)?params.startDay:'M';
	this.changingDates = (params.changingDates)?params.changingDates:'A';
	this.pastDaysSelection = (params.pastDaysSelection)?params.pastDaysSelection:'Y';
	this.futureDaysSelection = (params.futureDaysSelection)?params.futureDaysSelection:'Y';
	this.pastMonthDaysDisplay = (params.pastMonthDaysDisplay)?params.pastMonthDaysDisplay:'N';
	this.holidaysSelection = (params.holidaysSelection)?params.holidaysSelection:'N';
	this.withTime = (params.withTime)?params.withTime:'N';
	this.withIntervals = (params.withIntervals)?params.withIntervals:'N';
	this.weekIntervalSelection = (params.weekIntervalSelection)?params.weekIntervalSelection:'N';
	this.width = (params.width)?params.width:null;
	this.readonly = (params.readonly)?params.readonly:'Y';
	this.closeOnSelection = (params.closeOnSelection)?params.closeOnSelection:'N';
	this.startYear = (params.startYear)?params.startYear:1970;
	this.endYear = (params.endYear)?params.endYear:2100;
	this.dateFormat = (params.dateFormat)?params.dateFormat:this.DEFAULT_DATE_FORMAT;
	this.initDate = (params.initDate)?params.initDate:'';
	if (!params.dateFormat && this.withTime == 'Y') {
		this.dateFormat += ' '+this.DEFAULT_TIME_FORMAT;
	}
	this.paramDate = new Date();
	
	if (this.futureDaysSelection == "N") {
		if (!params.endDate) {
			this.endDate = new Date () ;
		}
		else {
			this.endDate = new Date (params.endDate) ;
		}
		this.endYear = this.endDate.getFullYear () + 1 ;
	}

	this.choosenDate = new Date();
	if (this.withIntervals=='Y') {
		this.startIntervalDate = new Date();
		this.endIntervalDate = new Date();
		this.waitForEndInterval = false;
		this.startEndDateDelimiter = (params.startEndDateDelimiter)?params.startEndDateDelimiter:' - ';
	}
}

function calendarScroll(event)
{
	if (window.navigator.appName != "Netscape")
		{
		if(!event) event = window.event;
		var bottomedge = document.body.clientHeight - event.clientY;    
		if (bottomedge < 155) {		
			window.scrollBy(0, 155);
		}
	}
}

function __calendar_render()
{
	if (this.name == '')
	{
		alert('ERROR: NAME property is not defined!');
		this.containerObj.style.display = 'none';
		return false;
	}

	var html = '';
	html += '<input type="Text" name="'+this.name+'" id="'+this.id+'" style="width: '+((this.width)?this.width:80)+'px;"'+((this.readonly=='Y')?' readonly=""':'')+' value="'+((this.initDate=='')?'':this.initDate) + '"' + ((this.inputClass=="")?'':' class="'+this.inputClass + '"') + '>&nbsp;';
	html += '<a href="#" onclick=\'if (active_calendar) {calendarScroll(event);__calendar_show.call(calendarCollection["'+this.containerId+'"],event);return false;}\'>' +
			'<img src="'+this.calendImg+'" align="absmiddle" border="0"></a>';
	html += '<div style="display:none;position:absolute;z-index:1000;top:0px;left:0px;" class="calendarLayout"></div>';

	this.containerObj.className = "calendar";

	this.containerObj.innerHTML = html;
	this.inputObj = this.containerObj.getElementsByTagName("INPUT")[0];
	this.divObj = this.containerObj.getElementsByTagName("DIV")[0];
}

function __calendar_show()
{
	if (this.startDate) this.startYear = this.startDate.getFullYear();

	if (!this.state) {
		if (this.inputObj.value!='') {
			if (this.withIntervals=='Y') {
				var inputValue = this.inputObj.value.split(this.startEndDateDelimiter);
				var startTimeFromInput = this.getDateFromFormat(inputValue[0],this.dateFormat);
				var endTimeFromInput = this.getDateFromFormat(inputValue[1],this.dateFormat);
				if (startTimeFromInput==0 || endTimeFromInput==0) {
					alert('The date in input field is in wrong format. Please correct the date value.\nDate should be in format: ' + this.dateFormat + this.startEndDateDelimiter + this.dateFormat);
					return false;
				}
				this.paramDate.setTime(endTimeFromInput);
				this.choosenDate.setTime(endTimeFromInput);
				this.startIntervalDate.setTime(startTimeFromInput);
				this.endIntervalDate.setTime(endTimeFromInput);
				this.waitForEndInterval = false;
			} else {
				var timeFromInput = this.getDateFromFormat(this.inputObj.value,this.dateFormat);
				if (timeFromInput==0) {
					alert('The date in input field is in wrong format. Please correct the date value.\nDate should be in format: '+this.dateFormat);
					return false;
				}
				this.paramDate.setTime(timeFromInput);
				this.choosenDate.setTime(timeFromInput);
			}
		} else {
			if (this.startDate && this.startDate!=""){
				this.paramDate = this.startDate;
				this.choosenDate = this.startDate;
			}
			else {
				this.paramDate = new Date();
				this.choosenDate = new Date();
			}
		}
	}

	var paramYear = this.paramDate.getFullYear();
	if ( ((paramYear%4==0)&&(paramYear%100 != 0)) || paramYear%400==0) {
		this.datesArray[1] = 29; // Leap Year
	} else {
		this.datesArray[1] = 28;
	}
	var paramMonth   = this.paramDate.getMonth();
	var paramDay     = this.paramDate.getDate();
	var paramHours   = this.paramDate.getHours();
	var paramMinutes = this.paramDate.getMinutes();
	var paramSeconds = this.paramDate.getSeconds();

	var choosenYear  = this.choosenDate.getFullYear();
	var choosenMonth = this.choosenDate.getMonth();
	var choosenDay   = this.choosenDate.getDate();
	
	if (this.withIntervals=='Y') {
		var choosenStartIntervalYear = this.startIntervalDate.getFullYear();
		var choosenStartIntervalMonth = this.startIntervalDate.getMonth();
		var choosenStartIntervalDay = this.startIntervalDate.getDate();

		var choosenEndIntervalYear = this.endIntervalDate.getFullYear();
		var choosenEndIntervalMonth = this.endIntervalDate.getMonth();
		var choosenEndIntervalDay = this.endIntervalDate.getDate();
	}

	var firstDate = new Date(paramYear,paramMonth,1);
	var paramStartDay = firstDate.getDay();

	var lastDate = new Date(paramYear,paramMonth,this.datesArray[paramMonth]);
	var paramEndDay = lastDate.getDay();
	var firstDayOfWeek = (this.startDay=='M')?1:0;
	if (firstDayOfWeek) {
		paramStartDay = (paramStartDay==0)?6:paramStartDay-1;
		paramEndDay = (paramEndDay==0)?6:paramEndDay-1;
	}

	if (this.weekIntervalSelection) {
		this.startEndWeeks = new Array();
	}

	//Building html of Calendar
	var html = '<table cellpadding="0" cellspacing="0" class="mainTable" width="100%"><tr><td class="header" height="18" style="text-align:right"><a href="#" onclick=\''+(isIE?'top.':'')+''+(isIE?'top.':'')+'__calendar_closeAll();return false;\'><img src="'+this.calendCloseImg+'" border="0"></a></td></tr><tr><td>';

	if (this.changingDates=='I')
	{
		html += '<table width="100%" class="navigationLayout" cellspacing="0"><tr><td>' +
				'<select name="month" style="height:20px;width:142px" onchange=\''+(isIE?'top.':'')+'__calendar_setMonth.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],this.selectedIndex);return false;\'>';
		for (var i=0;i<12;i++) {
			html += '<option value="'+i+'"'+((i==paramMonth)?' selected':'')+'>'+this.monthArray[i]+'</option>';
		}
		html += '</select>' +
				'</td><td width="70">' +
				'<select name="year" style="height:20px;width:60px"  onchange=\''+(isIE?'top.':'')+'__calendar_setYear.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],this.value);return false;\'>';
		for (var i=this.startYear;i<this.endYear;i++) {
			html += '<option value="'+i+'"'+((i==paramYear)?' selected':'')+'>'+i+'</option>';
		}
		html += '</select>' +
				'</td></tr></table>';
	} else {
		html += '<table width="100%" class="navigationLayout" cellspacing="0"><tr>' +
				'<td nowrap><a href="#" class="navigationArrow" onclick=\''+(isIE?'top.':'')+'__calendar_setYear.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],"-1");return false;\'>&lt;&lt;</a>&nbsp;&nbsp;' +
				'<a href="#" class="navigationArrow" onclick=\''+(isIE?'top.':'')+'__calendar_setMonth.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],"-1");return false;\'>&lt;</a></td>' +
				'<td width="100%">' +
				'<a' + ((this.withIntervals=='Y')?' class="intervalSelect" href="#" onclick=\''+(isIE?'top.':'')+'__setMonthInterval.call('+(isIE?'top.':'')+'calendarCollection["' + this.containerId + '"],' + paramMonth + ');return false;\'':'')+'>' + this.monthArray[paramMonth] + '</a>' +
				',&nbsp;' +
				'<a' + ((this.withIntervals=='Y')?' class="intervalSelect" href="#" onclick=\''+(isIE?'top.':'')+'__setYearInterval.call('+(isIE?'top.':'')+'calendarCollection["' + this.containerId + '"],' + paramYear + ');return false;\'':'')+'>' + paramYear + '</a>' +
				'</td><td nowrap>' +
				'<a href="#" class="navigationArrow" onclick=\''+(isIE?'top.':'')+'__calendar_setMonth.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],"+1");return false;\'>&gt;</a>&nbsp;&nbsp;' +
				'<a href="#" class="navigationArrow" onclick=\''+(isIE?'top.':'')+'__calendar_setYear.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],"+1");return false;\'>&gt;&gt;</a></td>' +
				'</tr></table>';
	}

	html += '</td></tr><tr><td>';

	html += '<table width="100%" class="daysLayout"><tr>';

	if (this.daysOrder=='V')
	{
		//Displaying days upright
		var numberOfColumns = (this.datesArray[paramMonth]+paramStartDay+6-paramEndDay)/7;
		for (var i=0;i<7;i++) {
			html += '<td class="dayName'+( ( (i+firstDayOfWeek+1)%7==0 || (i+firstDayOfWeek)%7==0 )?' holiday':'')+'"><a>'+this.dayNamesArray[(i+firstDayOfWeek)%7+7]+'</a></td>';
			for (var j=0;j<numberOfColumns;j++) {
				var day = j*7+i-paramStartDay+1;
				var isChoosenDay = (day==choosenDay && paramMonth==choosenMonth && paramYear==choosenYear);
				var isHoliday = ( (day+paramStartDay+firstDayOfWeek)%7==0 || (day+paramStartDay+firstDayOfWeek-1)%7==0 );
				var pastDay = ( (day<choosenDay && paramMonth==choosenMonth && paramYear==choosenYear) || (paramMonth<choosenMonth && paramYear==choosenYear) || (paramYear<choosenYear) );
				if (this.futureDaysSelection == "N") {
					var todayDate = this.endDate;
				}
				else {
					var todayDate = new Date();
				}
				var todayDay = todayDate.getDate();
				var todayMonth = todayDate.getMonth();
				var todayYear = todayDate.getFullYear();
				var futureDay = ( (day>todayDay && paramMonth==todayMonth && paramYear==todayYear) || (paramMonth>todayMonth && paramYear==todayYear) || (paramYear>todayYear) );
				if (this.startDate && !futureDay) {
					var startDay = this.startDate.getDay ();
					var startMonth = this.startDate.getMonth ();
					var startYear = this.startDate.getFullYear ();
					futureDay = ( (day<startDay && paramMonth==startMonth && paramYear==startYear) || (paramMonth<startMonth && paramYear==startYear) || (paramYear<startYear) );
				}
				if (this.withIntervals=='Y' && this.weekIntervalSelection=='Y') {
					if (this.holidaysSelection=='N'&&!isHoliday || this.holidaysSelection=='Y') {
						if (!this.startEndWeeks[j]) this.startEndWeeks[j] = new Array();
						if (!this.startEndWeeks[j].start) this.startEndWeeks[j].start = day;
						this.startEndWeeks[j].end = day;
					}
				}
				if (day<1 || day>this.datesArray[paramMonth]) {
					if (this.pastMonthDaysDisplay=='Y') {
						var tempDate = new Date();
						tempDate.setTime(this.paramDate.getTime());
						tempDate.setDate(day);
						var dayToShow = tempDate.getDate();
						html += '<td class="';
						if (this.withIntervals=='Y' && this.waitForEndInterval && (dayToShow==choosenDay && tempDate.getMonth()==choosenMonth && paramYear==tempDate.getFullYear())) {
							html += 'startSelectInterval';
						} else if (this.withIntervals=='Y' && __isInIntervalValue(dayToShow, tempDate.getMonth(), tempDate.getFullYear(), choosenStartIntervalDay, choosenStartIntervalMonth, choosenStartIntervalYear, choosenEndIntervalDay, choosenEndIntervalMonth, choosenEndIntervalYear) && !this.waitForEndInterval || this.withIntervals=='N' && __isInIntervalValue(dayToShow, tempDate.getMonth(), tempDate.getFullYear(), choosenDay, choosenMonth, choosenYear, choosenDay, choosenMonth, choosenYear)) {
							html += 'pastMonthInervalDay';
						} else {
							html += 'pastMonthDay';
						}
						html += '"><a'+((isHoliday && this.holidaysSelection=='N' || pastDay && this.pastDaysSelection=='N' || futureDay &&  this.futureDaysSelection=='N')?'':' href="#" onclick=\''+(isIE?'top.':'')+'__calendar_setChoosenDate.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+day+');return false\'')+'>';
						html += dayToShow
						html += '</a></td>';
					} else {
						html += '<td>&nbsp;</td>';
					}
				} else {
					html += '<td class="';
					if (this.withIntervals=='Y') {
						if (this.waitForEndInterval) {
							if (isChoosenDay) {
								html += 'startSelectInterval';
							} else if (isHoliday) {
								html += 'holiday';
							}
						} else {
							var isInInterval = __isInIntervalValue(day, paramMonth, paramYear, choosenStartIntervalDay, choosenStartIntervalMonth, choosenStartIntervalYear, choosenEndIntervalDay, choosenEndIntervalMonth, choosenEndIntervalYear);
							if (isInInterval && isHoliday) {
								html += 'intervalHoliday';
							} else if (isInInterval) {
								html += 'intervalDay';
							} else if (isHoliday) {
								html += 'holiday';
							}
						}
					} else {
						if (isChoosenDay) {
							html += 'selectedDay';
						} else {
							if (isHoliday && futureDay) {
								html += 'futureHoliday';
							} else {
								if (isHoliday) html += 'holiday';
								if (futureDay) html += 'futureDay';
							}
						}
					}
					html += '">';
					html += '<a'+((isHoliday && this.holidaysSelection=='N' || pastDay && this.pastDaysSelection=='N' || futureDay && this.futureDaysSelection=='N')?'':' href="#" onclick=\''+(isIE?'top.':'')+'__calendar_setChoosenDate.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+day+');return false\'')+'>';
					html += day;
					html += '</a>';
					html += '</td>';
				}
			}
			html += '</tr>';
			if (i!=6) html += '<tr>';
		}
		if (this.withIntervals=='Y' && this.weekIntervalSelection=='Y')
		{
			html += '<tr>';
			html += '<td class="dayName">&nbsp;</td>';
			for (var i=0;i<numberOfColumns;i++) {
				html += '<td>'+((this.startEndWeeks[i])?'<a href="#" onclick=\''+(isIE?'top.':'')+'__setWeekInterval.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+i+');return false;\'><b>^</b></a>':'&nbsp;')+'</td>';
			}
			html += '</tr>';
		}
	}
	else
	{
		//Displaying days across
		var numberOfRows = (this.datesArray[paramMonth]+paramStartDay+6-paramEndDay)/7;
		for (var i=0;i<7;i++) html += '<td class="dayName'+( ((i+firstDayOfWeek+1)%7==0 || (i+firstDayOfWeek)%7==0 )?' holiday':'')+'"><a>'+this.dayNamesArray[(i+firstDayOfWeek)%7+7]+'</a></td>';
		if (this.withIntervals=='Y' && this.weekIntervalSelection=='Y') {
			html += '<td class="dayName">&nbsp;</td>';
		}
		html += '</tr><tr>';
		for (var i=0;i<numberOfRows;i++) {
			for (var j=0;j<7;j++) {
				var day = i*7+j-paramStartDay+1;
				var isChoosenDay = (day==choosenDay && paramMonth == choosenMonth && paramYear == choosenYear);
				var isHoliday = ( (day+paramStartDay+firstDayOfWeek)%7==0 || (day+paramStartDay+firstDayOfWeek-1)%7==0 );
				var pastDay = ( (day<choosenDay && paramMonth==choosenMonth && paramYear==choosenYear) || (paramMonth<choosenMonth && paramYear==choosenYear) || (paramYear<choosenYear) );
				if (this.futureDaysSelection == "N") {
					var todayDate = this.endDate;
				}
				else {
					var todayDate = new Date();
				}
				var todayDay = todayDate.getDate();
				var todayMonth = todayDate.getMonth();
				var todayYear = todayDate.getFullYear();
				var futureDay = ( (day>todayDay && paramMonth==todayMonth && paramYear==todayYear) || (paramMonth>todayMonth && paramYear==todayYear) || (paramYear>todayYear) );
				if (this.startDate && !futureDay) {
					var startDay = this.startDate.getDate ();
					var startMonth = this.startDate.getMonth ();
					var startYear = this.startDate.getFullYear ();
					futureDay = ( (day<startDay && paramMonth==startMonth && paramYear==startYear) || (paramMonth<startMonth && paramYear==startYear) || (paramYear<startYear) );
				}
				//alert(day);
				if (this.withIntervals=='Y' && this.weekIntervalSelection=='Y') {
					if (this.holidaysSelection=='N'&&!isHoliday || this.holidaysSelection=='Y') {
						if (!this.startEndWeeks[i]) this.startEndWeeks[i] = new Array();
						if (!this.startEndWeeks[i].start) this.startEndWeeks[i].start = day;
						this.startEndWeeks[i].end = day;
					}
				}
				if (day<1 || day>this.datesArray[paramMonth]) {
					if (this.pastMonthDaysDisplay=='Y') {
						var tempDate = new Date();
						tempDate.setTime(this.paramDate.getTime());
						tempDate.setDate(day);
						var dayToShow = tempDate.getDate();
						html += '<td class="';
						if (this.withIntervals=='Y' && this.waitForEndInterval && (dayToShow==choosenDay && tempDate.getMonth()==choosenMonth && paramYear==tempDate.getFullYear())) {
							html += 'startSelectInterval';
						} else if (this.withIntervals=='Y' && __isInIntervalValue(dayToShow, tempDate.getMonth(), tempDate.getFullYear(), choosenStartIntervalDay, choosenStartIntervalMonth, choosenStartIntervalYear, choosenEndIntervalDay, choosenEndIntervalMonth, choosenEndIntervalYear) && !this.waitForEndInterval || this.withIntervals=='N' && __isInIntervalValue(dayToShow, tempDate.getMonth(), tempDate.getFullYear(), choosenDay, choosenMonth, choosenYear, choosenDay, choosenMonth, choosenYear)) {
							html += "pastMonthInervalDay";
						} else {
							html += "pastMonthDay";
						}
						html += '"><a'+((isHoliday && this.holidaysSelection=='N' || pastDay && this.pastDaysSelection=='N' || futureDay && this.futureDaysSelection=='N')?'':' href="#" onclick=\''+(isIE?'top.':'')+'__calendar_setChoosenDate.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+day+');return false\'')+'>';
						html += dayToShow
						html += '</a></td>';
					} else {
						html += '<td>&nbsp;</td>';
					}
				} else {
					html += '<td class="';
					if (this.withIntervals=='Y') {
						if (this.waitForEndInterval) {
							if (isChoosenDay) {
								html += 'startSelectInterval';
							} else if (isHoliday) {
								html += 'holiday';
							}
						} else {
							var isInInterval = __isInIntervalValue(day, paramMonth, paramYear, choosenStartIntervalDay, choosenStartIntervalMonth, choosenStartIntervalYear, choosenEndIntervalDay, choosenEndIntervalMonth, choosenEndIntervalYear);
							if ( isInInterval && isHoliday ) {
								html += 'intervalHoliday';
							} else if (isInInterval) {
								html += 'intervalDay';
							} else if (isHoliday) {
								html += 'holiday';
							}
						}
					} else {
						if (isChoosenDay) {
							html += 'selectedDay';
						} else {
							if (isHoliday && futureDay) {
								html += 'futureHoliday';
							} else {
								if (isHoliday) html += 'holiday';
								if (futureDay) html += 'futureDay';
							}
						}
					}

					var dateSelectable = this.checkDate ? this.checkDate(paramYear, paramMonth, day) : true;
					//if (dateSelectable) alert(paramYear+' '+paramMonth+' '+day);
					html += '">';
					html += '<a'+(((isHoliday && this.holidaysSelection=='N' || pastDay && this.pastDaysSelection=='N' || futureDay && this.futureDaysSelection=='N') || !dateSelectable)?'':' href="#" class= "underLine" onclick=\''+(isIE?'top.':'')+'__calendar_setChoosenDate.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+day+');return false\'')+'>';
					html += day;
					html += '</a>';
					html += '</td>';
				}
				if (this.withIntervals=='Y' && this.weekIntervalSelection=='Y' && j==6) {
					html += '<td>'+((this.startEndWeeks[i])?'<a href="#" onclick=\''+(isIE?'top.':'')+'__setWeekInterval.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],'+i+');return false;\'><b>&lt;</b></a>':'&nbsp;')+'</td>';
				}
			}
			html += '</tr>';
			if (i!=numberOfRows-1) html += '<tr>';
		}
	}
	html += '</table>';
	html += '</td></tr>';
	if (this.withTime=='Y') {
		html += '<tr><td class="timeLayout">';
		html += '<select name="hours" onchange=\''+(isIE?'top.':'')+'__calendar_setHours.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],this.value);return false;\'>';
		for (var i=0;i<24;i++) {
			html += '<option value="'+i+'"'+((paramHours==i)?' selected':'')+'>'+__LZ(i)+'</option>';
		}
		html += '</select>';
		html += '&nbsp;<b>:</b>&nbsp;';
		html += '<select name="minutes" onchange=\''+(isIE?'top.':'')+'__calendar_setMinutes.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],this.value);return false;\'>';
		for (var i=0;i<60;i++) {
			html += '<option value="'+i+'"'+((paramMinutes==i)?' selected':'')+'>'+__LZ(i)+'</option>';
		}
		html += '</select>';
		html += '&nbsp;<b>:</b>&nbsp;';
		html += '<select name="seconds" onchange=\''+(isIE?'top.':'')+'__calendar_setSeconds.call('+(isIE?'top.':'')+'calendarCollection["'+this.containerId+'"],this.value);return false;\'>';
		for (var i=0;i<60;i++) {
			html += '<option value="'+i+'"'+((paramSeconds==i)?' selected':'')+'>'+__LZ(i)+'</option>';
		}
		html += '</select>';
		html += '</td></tr>';
	}
	html += '</table>';
	if (!this.state) {
		this.divObj.style.left = 0;
		this.divObj.style.top = 0;
	}

	if (isIE) {
		var strCssLink = '<link rel="stylesheet" type="text/css" href="'+this.cssFile+'" />';
		this.divObj.innerHTML = "<iframe id=\"calendarFrame\" name=\"calendarFrame\" src=\"javascript:'calendar'\" scrolling=\"no\" marginheight=\"0\" marginwidth=\"0\" frameborder=\"0\" width=\"100%\" height=\"100%\"></iframe>";
		var iframeObj = this.divObj.getElementsByTagName("IFRAME")[0].contentWindow;
		iframeObj.document.open();
		iframeObj.document.write("<html><head>" + strCssLink + "</head><body class='calendar'>" + html + "</body></html>");
		iframeObj.document.close();
	} else {
		this.divObj.innerHTML = html;
	}

	if (!this.state) {
		//Hide other calendars
		__calendar_closeAll();
		this.divObj.style.visibility = "hidden";
		this.divObj.style.display = "block";
		var x = this.getLeft();
		var y = this.getTop()+this.inputObj.offsetHeight+1;
		if (isIE) this.divObj.style.height = iframeObj.document.body.childNodes[0].offsetHeight + 3;
		x = ( x + this.divObj.offsetWidth > document.body.clientWidth ) ? document.body.clientWidth - this.divObj.offsetWidth - 10 + document.body.scrollLeft : x;
//		y = ( y + this.divObj.offsetHeight > document.body.clientHeight ) ? document.body.clientHeight - this.divObj.offsetHeight - 10 + document.body.scrollTop : y;
		this.divObj.style.left = ((x<document.body.scrollLeft)?document.body.scrollLeft:x) + "px";
		this.divObj.style.top = ((y<document.body.scrollTop)?document.body.scrollTop:y) + "px";
		this.divObj.style.visibility = "visible";
		this.state = 1;
		document.onclick = __calendar_close;
		window.onscroll = __calendar_closeAll;
		window.onresize = __calendar_closeAll;
	} else if (isIE) {
		this.divObj.style.height = iframeObj.document.body.childNodes[0].offsetHeight + 3 + "px";
		this.divObj.childNodes[0].height = iframeObj.document.body.childNodes[0].offsetHeight + 3;
	}
}

function __calendar_close(e)
{
	srcEl = (e)?e.target:window.event.srcElement;
	if (navigator.userAgent.indexOf("Opera")!=-1 && !srcEl.parentNode && srcEl.tagName!="HTML") return false;
	for (var i in calendarCollection) {
		if (calendarCollection[i].state) {
			var closeClndr = true;
			do {
				if (srcEl==calendarCollection[i].containerObj) {
					closeClndr = false;
					break;
				}
			} while (srcEl=srcEl.parentNode)
			if (closeClndr) {
				document.onclick = null;
				window.onscroll = null;
				window.onresize = null;
				calendarCollection[i].paramDate.setTime(calendarCollection[i].choosenDate.getTime());
				calendarCollection[i].divObj.style.display="none";
				calendarCollection[i].state = 0;
			}
		}
	}
}

function __calendar_closeAll()
{
	for (var i in calendarCollection) {
		if (calendarCollection[i].state) {
			calendarCollection[i].paramDate.setTime(calendarCollection[i].choosenDate.getTime());
			calendarCollection[i].divObj.style.display="none";
			calendarCollection[i].state = 0;
		}
	}
	document.onclick = null;
}

function __calendar_setChoosenDate(_dayNum)
{
	if (this.withIntervals=='Y') {
		if (this.waitForEndInterval) {
			this.endIntervalDate.setFullYear(this.paramDate.getFullYear(), this.paramDate.getMonth(), _dayNum);
			this.endIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
			if (this.endIntervalDate < this.startIntervalDate) {
				var tempDate = this.endIntervalDate.getTime();
				this.endIntervalDate.setTime(this.startIntervalDate.getTime());
				this.startIntervalDate.setTime(tempDate);
			}
			this.waitForEndInterval = false;
			this.choosenDate.setTime(this.endIntervalDate.getTime());
			this.inputObj.value = this.formatDate(this.startIntervalDate,this.dateFormat) + this.startEndDateDelimiter + this.formatDate(this.endIntervalDate,this.dateFormat);
	  if (this.onchange) {
		this.onchange() ;
	  }

			if (this.closeOnSelection=='Y') {
				this.divObj.style.display = "none";
				this.state = 0;
			} else {
				this.show();
			}
		} else {
			this.startIntervalDate.setFullYear(this.paramDate.getFullYear(), this.paramDate.getMonth(), _dayNum);
			this.startIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
			this.choosenDate.setTime(this.startIntervalDate.getTime());
			this.waitForEndInterval = true;
			this.show();
		}
	} else {
		this.choosenDate.setFullYear(this.paramDate.getFullYear(), this.paramDate.getMonth(), _dayNum);
		this.choosenDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
		this.inputObj.value = this.formatDate(this.choosenDate,this.dateFormat);

	if (this.onchange) {
	  this.onchange () ;
	}

		if (this.closeOnSelection=='Y') {
			this.divObj.style.display = "none";
			this.state = 0;
		} else {
			this.show();
		}
	}
}

function __calendar_setMonth(_toSet)
{
	switch (_toSet)
	{
		case "-1":
			if (this.paramDate.getMonth()==0)
			{
				this.setYear("-1");
				this.setMonth("11");
				return true;
			}
			else
			{
				this.paramDate.setMonth(this.paramDate.getMonth()-1,1);
			}
			break;
		case "+1":
			if (this.paramDate.getMonth()==11)
			{
				this.setYear("+1");
				this.setMonth("0");
				return true;
			}
			else
			{
				this.paramDate.setMonth(this.paramDate.getMonth()+1,1);
			}
			break;
		default:
			var toSet = parseInt(_toSet);
			if (isNaN(toSet) || toSet<0 || toSet>11) return false;
			this.paramDate.setMonth(toSet,1);
	}
	this.show();
	return true;
}

function __calendar_setYear(_toSet)
{
	switch (_toSet)
	{
		case "-1":
			this.paramDate.setFullYear(this.paramDate.getFullYear()-1);
			break;
		case "+1":
			this.paramDate.setFullYear(this.paramDate.getFullYear()+1);
			break;
		default:
			var toSet = parseInt(_toSet);
			if (isNaN(toSet)) return false;
			this.paramDate.setFullYear(toSet);
	}
	this.show();
	return true;
}

function __calendar_setHours(_toSet)
{
	var toSet = parseInt(_toSet);
	if (isNaN(toSet)) return false;
	this.paramDate.setHours(toSet);
}

function __calendar_setMinutes(_toSet)
{
	var toSet = parseInt(_toSet);
	if (isNaN(toSet)) return false;
	this.paramDate.setMinutes(toSet);
}

function __calendar_setSeconds(_toSet)
{
	var toSet = parseInt(_toSet);
	if (isNaN(toSet)) return false;
	this.paramDate.setSeconds(toSet);
}

function __isInIntervalValue(day,month,year,dayStart,monthStart,yearStart,dayEnd,monthEnd,yearEnd)
{
	return ((day>=dayStart&&month==monthStart&&year==yearStart || month>monthStart&&year==yearStart || year>yearStart) && (day<=dayEnd&&month==monthEnd&&year==yearEnd || month<monthEnd&&year==yearEnd || year<yearEnd));
}

function __setWeekInterval(_toSet)
{
	this.startIntervalDate.setFullYear(this.paramDate.getFullYear(), this.paramDate.getMonth(), this.startEndWeeks[_toSet].start);
	this.startIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
	this.endIntervalDate.setFullYear(this.paramDate.getFullYear(), this.paramDate.getMonth(), this.startEndWeeks[_toSet].end);
	this.endIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
	this.inputObj.value = this.formatDate(this.startIntervalDate,this.dateFormat) + this.startEndDateDelimiter + this.formatDate(this.endIntervalDate,this.dateFormat);
	if (this.closeOnSelection=='Y') {
		this.divObj.style.display = "none";
		this.state = 0;
	} else {
		this.show();
	}
}

function __setMonthInterval(_toSet)
{
	this.startIntervalDate.setFullYear(this.paramDate.getFullYear(), _toSet, 1);
	this.startIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
	this.endIntervalDate.setFullYear(this.paramDate.getFullYear(), _toSet, this.datesArray[_toSet]);
	this.endIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());

	this.inputObj.value = this.formatDate(this.startIntervalDate,this.dateFormat) + this.startEndDateDelimiter + this.formatDate(this.endIntervalDate,this.dateFormat);
	if (this.closeOnSelection=='Y') {
		this.divObj.style.display = "none";
		this.state = 0;
	} else {
		this.show();
	}
}

function __setYearInterval(_toSet)
{
	this.startIntervalDate.setFullYear(_toSet, 0, 1);
	this.startIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());
	this.endIntervalDate.setFullYear(_toSet, 11, this.datesArray[11]);
	this.endIntervalDate.setHours(this.paramDate.getHours(), this.paramDate.getMinutes(), this.paramDate.getSeconds());

	this.inputObj.value = this.formatDate(this.startIntervalDate,this.dateFormat) + this.startEndDateDelimiter + this.formatDate(this.endIntervalDate,this.dateFormat);
	if (this.closeOnSelection=='Y') {
		this.divObj.style.display = "none";
		this.state = 0;
	} else {
		this.show();
	}
}

function __calendar_getTop()
{
	var obj = this.inputObj;
	var top = 0;
	while ((obj.tagName != "BODY") && (obj.tagName != "HTML"))
	{
	top += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return top ;
}

function __calendar_getLeft()
{
	var obj = this.inputObj;
	var left = 0;
	while ((obj.tagName != "BODY") && (obj.tagName != "HTML") && (obj.className != "epBody") )
	{
		/*if ( !(isOpera && obj.offsetParent.tagName == "BODY") )*/ left += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return left;
}

function __LZ(x) {
	return (x<0||x>9?"":"0")+x;
}

function __calendar_formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	var value=new Object();
	if(y.length < 4) {
		y=""+(y-0+1900);
	}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=__LZ(M);
	value["MMM"]=this.monthArray[M-1];
	value["NNN"]=this.monthArray[M+11];
	value["d"]=d;
	value["dd"]=__LZ(d);
	value["E"]=this.dayNamesArray[E+7];
	value["EE"]=this.dayNamesArray[E];
	value["H"]=H;
	value["HH"]=__LZ(H);
	if(H==0) {
		value["h"]=12;
	} else if(H>12) {
		value["h"]=H-12;
	} else {
		value["h"]=H;
	}
	value["hh"]=__LZ(value["h"]);
	if(H>11) {
		value["K"]=H-12;
	} else {
		value["K"]=H;
	}
	value["k"]=H+1;
	value["KK"]=__LZ(value["K"]);
	value["kk"]=__LZ(value["k"]);
	if(H > 11) {
		value["a"]="PM";
	} else {
		value["a"]="AM";
	}
	value["m"]=m;
	value["mm"]=__LZ(m);
	value["s"]=s;
	value["ss"]=__LZ(s);
	while(i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while((format.charAt(i_format)==c) &&(i_format < format.length)) {
			token += format.charAt(i_format++);
		}
		if(value[token] != null) {
			result=result + value[token];
		} else {
		result=result + token;
		}
	}
	return result;
}

function __calendar_getDateFromFormat(val,format) {
	function _getInt(str,i,minlength,maxlength) {
		for(var x=maxlength;x>=minlength;x--) {
			var token=str.substring(i,i+x);
			if(token.length < minlength) {
				return null;
			}
			if(_isInteger(token)) {
				return token;
			}
		}
		return null;
	}
	function _isInteger(val) {
		var digits="1234567890";
		for(var i=0;i < val.length;i++) {
			if(digits.indexOf(val.charAt(i))==-1) {
				return false;
			}
		}
		return true;
	}
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	while(i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while((format.charAt(i_format)==c) &&(i_format < format.length)) {
			token += format.charAt(i_format++);
		}
		if(token=="yyyy" || token=="yy" || token=="y") {
			if(token=="yyyy") {
				x=4;y=4;
			}
			if(token=="yy") {
				x=2;y=2;
			}
			if(token=="y") {
				x=2;y=4;
			}
			year=_getInt(val,i_val,x,y);
			if(year==null) {
				return 0;
			}
			i_val += year.length;
			if(year.length==2) {
				if(year > 70) {
					year=1900+(year-0);
				} else {
					year=2000+(year-0);
				}
			}
		} else if(token=="MMM"||token=="NNN") {
			month=0;
			for(var i=0;i<this.monthArray.length;i++) {
				var month_name=this.monthArray[i];
				if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if(token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if(month>12) {
							month -= 12;
						}
						i_val += month_name.length;break;
					}
				}
			}
			if((month < 1)||(month>12)) {
				return 0;
			}
		} else if(token=="EE"||token=="E") {
			for(var i=0;i<DAY_NAMES.length;i++) {
				var day_name=DAY_NAMES[i];
				if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;break;
				}
			}
		} else if(token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)) {
				return 0;
			}
			i_val+=month.length;
		} else if(token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)) {
				return 0;
			}
			i_val+=date.length;
		} else if(token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)) {
				return 0;
			}
			i_val+=hh.length;
		} else if(token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)) {
				return 0;
			}
			i_val+=hh.length;
		} else if(token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)) {
				return 0;
			}
			i_val+=hh.length;
		} else if(token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)) {
				return 0;
			}
			i_val+=hh.length;hh--;
		} else if(token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)) {
				return 0;
			}
			i_val+=mm.length;
		} else if(token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)) {
				return 0;
			}
			i_val+=ss.length;
		} else if(token=="a") {
			if(val.substring(i_val,i_val+2).toLowerCase()=="am") {
				ampm="AM";
			} else if(val.substring(i_val,i_val+2).toLowerCase()=="pm") {
				ampm="PM";
			} else {
				return 0;
			}
			i_val+=2;
		} else {
			if(val.substring(i_val,i_val+token.length)!=token) {
				return 0;
			} else {
				i_val+=token.length;
			}
		}
	}
	if(i_val != val.length) {
		return 0;
	}
	if(month==2) {
		if( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) ) {
			if(date > 29) {
				return 0;
			}
		} else {
			if(date > 28) {
				return 0;
			}
		}
	}
	if((month==4)||(month==6)||(month==9)||(month==11)) {
		if(date > 30) {
			return 0;
		}
	}
	if(hh<12 && ampm=="PM") {
		hh=hh-0+12;
	} else if(hh>11 && ampm=="AM") {
		hh-=12;
	}
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
}