/*
	Calendar control. Client Javascript
*/

//month names for months dropdown
var calMonthNames = new Array
//	('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	("ßíâ", "Ôåâ", "Ìàð", "Àïð", "Ìàé", "Èþí", "Èþë", "Àâã", "Ñåí", "Îêò", "Íîÿ", "Äåê");	
	
//full month names for popup calendar	
var calMonthFullNames = new Array
//	('January','February','March','April','May','June','July','August','September','October','November','December');
	("ßíâàðü", "Ôåâðàëü", "Ìàðò", "Àïðåëü", "Ìàé", "Èþíü", "Èþëü", "Àâãóñò", "Ñåíòÿáðü", "Îêòÿáðü", "Íîÿáðü", "Äåêàáðü");

 
//day of week names	
var calDayWeekNames = new Array
//	('S', 'M', 'T', 'W', 'T', 'F', 'S');
	("Âñê", "Ïîí", "Âòð", "Ñðä", "×åò", "Ïÿò", "Ñóá", "Âñê");

//days count in months.
var calDaysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

var emptyOption = null;

function createEmptyOption()
{
//	if(emptyOption == null)
	{
		mOption = document.createElement('OPTION');
		mOption.text = "--";
		mOption.value = "";
		emptyOption = mOption;
	}
	return emptyOption;
}

//creating or changing month/day/year dropdowns
//isSet - set date from storage place (default value at loading, or changed in popup calendar)
function excalFillData(isSet)
{
	var refreshPrevValues = false;
	var date = this.getDate();
	var time = this.getTime();

	var curYear = date[0];
	var curMonth = date[1] - 1;
	var curDay = date[2];
	var curHour = time[0];
	var curMinute = time[1];
	var curSecond = time[2];
	var calMonthDrop = document.getElementById(this.prefix + 'calMonth');
	var calYearDrop = document.getElementById(this.prefix + 'calYear');
	var calDayDrop = document.getElementById(this.prefix + 'calDay');
	var calHourDrop = document.getElementById(this.prefix + 'calHour');
	var calHourAmPmDrop = document.getElementById(this.prefix + 'calHourAmPm');
	var calMinuteDrop = document.getElementById(this.prefix + 'calMinute');
	var calSecondDrop = document.getElementById(this.prefix + 'calSecond');

	//if empty date selected, change all controls to empty value
	if(this.showEmptyDate)
	{
		if(!isSet && 
				(
					(calYearDrop && calYearDrop.type == 'select-one' && calYearDrop.selectedIndex == 0 && this.prevCalYearDropValue != 0) ||
					(calYearDrop && calYearDrop.type == 'text' && parseYear(calYearDrop.value) == 0 && this.prevCalYearDropValue != 0) ||
					(calMonthDrop && calMonthDrop.selectedIndex == 0 && this.prevCalMonthDropValue != 0) ||
					(calDayDrop && calDayDrop.selectedIndex == 0 && this.prevCalDayDropValue != 0)
				)
			)
		{
			if(calYearDrop)
				calYearDrop.selectedIndex = 0;
			if(calMonthDrop)	
				calMonthDrop.selectedIndex = 0;
			if(calDayDrop)
				calDayDrop.selectedIndex = 0;
			this.prevCalYearDropValue = 0;
			this.prevCalMonthDropValue = 0;
			this.prevCalDayDropValue = 0;
		}
		else
			if(!isSet)
			{
				if(calYearDrop && calYearDrop.type == 'text')
				{
					this.prevCalYearDropValue = parseYear(calYearDrop.value);
				}
				else if(calYearDrop && calYearDrop.type == 'select-one' && calYearDrop.selectedIndex >= 0)
				{
					this.prevCalYearDropValue = calYearDrop.selectedIndex;
				}
				if(calMonthDrop && calMonthDrop.selectedIndex >= 0)
					this.prevCalMonthDropValue = calMonthDrop.selectedIndex;
				if(calDayDrop && calDayDrop.selectedIndex >= 0)
					this.prevCalDayDropValue = calDayDrop.selectedIndex;
			}	
			else
			{
				refreshPrevValues = true;
			}
	}

	//filling years dropdown
	if(calYearDrop && calYearDrop.type == 'text')
	{
		if(isSet || !this.inited)
		{
			calYearDrop.value = (curYear==0) ? '' : curYear;
			// this.inited = true;
		}	
	}
	else if(calYearDrop && calYearDrop.type == 'select-one')
	{
		if(calYearDrop.options.length == 0)
		{
			if(this.showEmptyDate)
			{
				calYearDrop.options.add(createEmptyOption());
			}
			if(!this.descendingYears)
			{
				for(i = this.yearMin; i <= this.yearMax; i ++)
				{
					mOption = document.createElement('OPTION');
					calYearDrop.options.add(mOption);
					mOption.text = (i).toString();
					mOption.value = (i).toString();
				}
			}
			else
			{
				yMin = this.yearMin;
				opts = calYearDrop.options;
				k = opts.length;				
				opts.length = k + this.yearMax - yMin + 1;
				
				for(i = this.yearMax; i >= yMin; i --)
				{
					mOption = opts[k];
					mOption.text = i;
					mOption.value = i;
					k ++;
				}
			}	
			if(curYear == 0)
				calYearDrop.selectedIndex = 0;
			else
			{
				if(!this.descendingYears)
					calYearDrop.selectedIndex = curYear - this.yearMin + this.showEmptyDate;
				else
					calYearDrop.selectedIndex = this.yearMax - curYear + this.showEmptyDate;	
			}
		}
		if(isSet)
		{
			if(!this.descendingYears)
				calYearDrop.selectedIndex = curYear - this.yearMin + this.showEmptyDate;
			else	
				calYearDrop.selectedIndex = this.yearMax - curYear + this.showEmptyDate;
		}	
	}		
	
	//filling months dropdown
	if(calMonthDrop && calMonthDrop.type == 'text')
	{
		curMonth++;
		if(isSet || !this.inited)
		{
			calMonthDrop.value = (curMonth == 0) ? '' : (curMonth < 10) ? '0' + curMonth : curMonth;
			// this.inited = true;
		}	
	}
	else if(calMonthDrop && calMonthDrop.type == 'select-one')
	{
		if(calMonthDrop.options.length == 0)
		{
			if(this.showEmptyDate)
			{
				calMonthDrop.options.add(createEmptyOption());
			}

			for(i = 0; i < calMonthNames.length; i ++)
			{
				mOption = document.createElement('OPTION');
				calMonthDrop.options.add(mOption);
				mOption.text = calMonthNames[i];
				mOption.value = (i).toString();
			}
			calMonthDrop.selectedIndex = curMonth + this.showEmptyDate;;
		}
		if(isSet)
			calMonthDrop.selectedIndex = curMonth + this.showEmptyDate;;
	}
	
	if(calDayDrop)
	{
		var selYear;
		if(calYearDrop && calYearDrop.type == 'text')
		{
			selYear = parseYear(calYearDrop.value);
		}
		else
		{
			if(calYearDrop && calYearDrop.type == 'select-one')
			{
				selYear = calYearDrop.selectedIndex - this.showEmptyDate;
			}
			else
			{
				selYear = 1999;
			}
	
			if(!this.descendingYears)
				selYear += this.yearMin;
			else
				selYear = this.yearMax - selYear;	
				
			if(selYear < 100)
				selYear += 2000;
		}
		
		// define count of days in month
		var daysCnt;
		if (calMonthDrop)
		{
			daysCnt = calDaysInMonth[calMonthDrop.selectedIndex - this.showEmptyDate];
			if(calMonthDrop.selectedIndex == 1 + this.showEmptyDate && ((selYear % 4 == 0) && ((selYear % 100 != 0) || (selYear % 400 == 0))))
				daysCnt = 29;
		}
		else
		{
			daysCnt = 31;
		}

		// filling days dropdown
		if(calDayDrop.type == 'text')
		{
			if(isSet || !this.inited)
			{
				calDayDrop.value = (curDay == 0) ? '' : (curDay < 10) ? '0' + curDay : curDay;
				// this.inited = true;
			}	
		}
		else if(calDayDrop.type == 'select-one')
		{
			if(calDayDrop.options.length == 0)
			{
				if(this.showEmptyDate)
				{
					calDayDrop.options.add(createEmptyOption());
				}
				for(i = 1; i <= daysCnt; i++)
				{
					mOption = document.createElement('OPTION');
					calDayDrop.options.add(mOption);
					mOption.text = i.toString();
					mOption.value = i.toString();			
				}
				calDayDrop.selectedIndex = curDay - 1 + this.showEmptyDate;
			}
			else
			{
				daysCnt += this.showEmptyDate;
				//changing items count in days dropdown
				//changing month -> changed days count
				if(calDayDrop.options.length > daysCnt)
				{
					if(calDayDrop.selectedIndex >= daysCnt)
						calDayDrop.selectedIndex = daysCnt - 1;
				
					for(i = calDayDrop.options.length; i > daysCnt; i --)
						calDayDrop.options.remove(i - 1);
				}
				if(calDayDrop.options.length < daysCnt)
				{
					for(i = calDayDrop.options.length + 1;i <= daysCnt; i ++)
					{
						mOption = document.createElement('OPTION');
						calDayDrop.options.add(mOption);
						var tmpV = i - this.showEmptyDate;
						mOption.text = tmpV.toString();
						mOption.value = tmpV.toString();			
					}
				}
			}
			if(isSet) 
				while(calDayDrop.selectedIndex != curDay - 1 + this.showEmptyDate) //opera hack
					calDayDrop.selectedIndex = curDay - 1 + this.showEmptyDate;
		}
	}

	this.inited = true;

	//filling hours dropdown
	var showEmpyCorrection = this.showEmptyDate ? 1 : 0;
	if(calHourDrop)
	{
		if(calHourAmPmDrop)
		{
			if(calHourAmPmDrop.options.length == 0)
			{
				mOption = document.createElement('OPTION');
				calHourAmPmDrop.options.add(mOption);
				mOption.text = "AM";
				mOption.value = "AM";
				mOption = document.createElement('OPTION');
				calHourAmPmDrop.options.add(mOption);
				mOption.text = "PM";
				mOption.value = "PM";
			}
		}
		
		if(calHourDrop.options.length == 0)
		{
			if(this.showEmptyDate)
			{
				calHourDrop.options.add(createEmptyOption());
			}

			var endHour = (calHourAmPmDrop) ? 12 : 24;
			for(i = 0; i < endHour; i ++)
			{
				mOption = document.createElement('OPTION');
				calHourDrop.options.add(mOption);
				mOption.text = (i==0 && calHourAmPmDrop)? "12" : padLeftWithZero(i, this.hourHaveLeadingZero);
				mOption.value = i;
			}
			var selectedHourIndex = parseInt(curHour);
			if(calHourAmPmDrop && curHour >= 12)
			{
				calHourAmPmDrop.selectedIndex = 1; // set PM
				selectedHourIndex -= 12;
			}
			calHourDrop.selectedIndex = selectedHourIndex + showEmpyCorrection;
		}
	}
	
	//filling minutes dropdown
	if(calMinuteDrop)
	{
		if(calMinuteDrop.options.length == 0)
		{
			if(this.showEmptyDate)
			{
				calMinuteDrop.options.add(createEmptyOption());
			}

			for(i = 0; i < 60; i+=this.minStep)
			{
				mOption = document.createElement('OPTION');
				calMinuteDrop.options.add(mOption);
				mOption.text = padLeftWithZero(i, this.minuteHaveLeadingZero);
				mOption.value = (i).toString();
			}
			calMinuteDrop.selectedIndex = showEmpyCorrection + parseInt(curMinute)/this.minStep;
		}
		//if(isSet)
		//	calMinuteDrop.selectedIndex = showEmpyCorrection + curMinute;
	}
	
	//filling seconds dropdown
	if(calSecondDrop)
	{
		if(calSecondDrop.options.length == 0)
		{
			if(this.showEmptyDate)
			{
				calSecondDrop.options.add(createEmptyOption());
			}

			for(i = 0; i < 60; i+=this.secStep)
			{
				mOption = document.createElement('OPTION');
				calSecondDrop.options.add(mOption);
				mOption.text = padLeftWithZero(i, this.secondHaveLeadingZero);
				mOption.value = (i).toString();
			}
			calSecondDrop.selectedIndex = showEmpyCorrection + parseInt(curSecond)/this.secStep;
		}
		//if(isSet)
		//	calMinuteDrop.selectedIndex = showEmpyCorrection + curMinute;
	}
	if(refreshPrevValues)
	{
		if(calYearDrop && calYearDrop.type == 'text')
		{
			this.prevCalYearDropValue = parseYear(calYearDrop.value);
		}
		else if(calYearDrop && calYearDrop.type == 'select-one' && calYearDrop.selectedIndex >= 0)
		{
			this.prevCalYearDropValue = calYearDrop.selectedIndex;
		}
		
		if(calMonthDrop && calMonthDrop.selectedIndex >= 0)
			this.prevCalMonthDropValue = calMonthDrop.selectedIndex;
		if(calDayDrop && calDayDrop.selectedIndex >= 0)
			this.prevCalDayDropValue = calDayDrop.selectedIndex;
	}	
	if(!isSet)
		this.setDate();
		
	if (this.inited && document.readyState == "complete") this.processAutoPostBack();
}

//initialization
function excalInitData()
{
	//fixed for incorrect behaviour at empty date and setting not empty date
	var date = this.getDate();
	if(date[1] != 0 && this.showEmptyDate)
	{
		this.prevCalYearDropValue = 1;
		this.prevCalMonthDropValue = 1;
		this.prevCalDayDropValue = 1;
	}
	//end fixed
	this.fillData(false);
}

//returns date from storage place
//array of 3 integers - year, month, day
//if no value stored, returns null date or current date
function excalGetDate()
{
	var selDate = document.getElementById(this.dateInput);
	var dValue = selDate.value;

	var spaceIndex = dValue.indexOf(' ');
	if (spaceIndex > -1) dValue = dValue.substring(0, spaceIndex);
	var dArr = dValue.split('-');
	if(dArr.length < 3 || dValue == '0-0-0')
	{
		if(this.showEmptyDate)
			return new Array(0, 0, 0);
		var dt = new Date();
		return new Array(dt.getFullYear(), dt.getMonth() + 1, dt.getDate());
	}
	else
	{
		return new Array(Math.round(dArr[0]), Math.round(dArr[1]), Math.round(dArr[2]));
	}
}
// returns time from storage place
function excalGetTime()
{
	var selDate = document.getElementById(this.dateInput);
	var dValue = selDate.value;

	var spaceIndex = dValue.indexOf(' ');
	if (spaceIndex > -1) 
	{
		dValue = dValue.substring(spaceIndex+1);
		var dArr = dValue.split(':');
		return new Array(dArr[0], dArr[1], dArr[2]);
	}
	else
	{
		return new Array(-1, -1, -1);
	}
}

//save date in storage place
function excalSetDateWithVals(year, month, day)
{
	var selDate = document.getElementById(this.dateInput);
	selDate.value = year.toString() + '-' + (month + 1).toString() + '-' + (day).toString();
	this.setTime();
	var calHolder = document.getElementById(this.prefix);
	calHolder.value = selDate.value;
	this.fillData(true);
}

function excalSetDateString(date)
{
	var selDate = document.getElementById(this.dateInput);
	selDate.value = date;
	this.setTime();
	var calHolder = document.getElementById(this.prefix);
	calHolder.value = selDate.value;
	this.fillData(true);
}

function excalProcessAutoPostBack()
{
	// note: process auto post back only if validation of PartialDate (..._v0) and DateRange (..._v1) passed
	if (this.postBackEvent && this.postBackEvent != '')
	{
		var selDate = document.getElementById(this.dateInput);
		var v0 = document.getElementById(this.prefix + "_v0");
		var v1 = document.getElementById(this.prefix + "_v1");
		if (v0 && v1)
		{
				// init validation arguments
				v0.IsValid = v1.IsValid = true;
				v0.Value = v1.Value = selDate.value;
				// validate
				validatePartialDate(v0, v0);
				validateDateRange(v1, v1);
				// check if both valid
				if (v0.IsValid && v1.IsValid)
				{
						eval(this.postBackEvent);
				}
		}
		else
		{
				// validators not found
				eval(this.postBackEvent);
		}
	}
}

//save date in storage place from dropdowns
function excalSetDate()
{
	var selDate = document.getElementById(this.dateInput);
	var calMonthDrop = document.getElementById(this.prefix + 'calMonth');
	var calYearDrop = document.getElementById(this.prefix + 'calYear');
	var calDayDrop = document.getElementById(this.prefix + 'calDay');
	var calHolder = document.getElementById(this.prefix);
	// year
	if (calYearDrop)
	{
		var showYearAs = calYearDrop.type;
		if(calYearDrop && showYearAs == 'text') 
			calYearDrop = parseYear(calYearDrop.value);
		else if(calYearDrop && showYearAs == 'select-one') 
			calYearDrop = calYearDrop.selectedIndex;
		else 
			calYearDrop = 0;
	} else calYearDrop = 0;
	// calMonthDrop = calMonthDrop ? calMonthDrop.selectedIndex : 0;
	if (calMonthDrop)
	{
		var showMonthAs = calMonthDrop.type;
		if(calMonthDrop && showMonthAs == 'text') 
			calMonthDrop = Math.round(calMonthDrop.value);
		else if(calMonthDrop && showMonthAs == 'select-one') 
			calMonthDrop = calMonthDrop.selectedIndex;
		else 
			calMonthDrop = 0;
	} else calMonthDrop = 0;
	// calDayDrop = calDayDrop ? calDayDrop.selectedIndex : 0;
	if (calDayDrop)
	{
		var showDayAs = calDayDrop.type;
		if(calDayDrop && showDayAs == 'text') 
			calDayDrop = Math.round(calDayDrop.value);
		else if(calDayDrop && showDayAs == 'select-one') 
			calDayDrop = calDayDrop.selectedIndex;
		else 
			calDayDrop = 0;
	} else calDayDrop = 0;

	var resDate = "";
	if(this.showEmptyDate && (calYearDrop == 0 && calMonthDrop == 0 && calDayDrop == 0))
	{
		resDate = "0-0-0"
	}
	else
	{
		if(calYearDrop && showYearAs == 'select-one') 
		{
			if(this.descendingYears)
				resDate += calYearDrop >= 0 ? (this.yearMax - calYearDrop + this.showEmptyDate).toString() + '-' : '0-';
			else	
				resDate += calYearDrop >= 0 ? (calYearDrop + this.yearMin - this.showEmptyDate).toString() + '-' : '0-';
		}
		else
		{
			resDate += calYearDrop.toString() + '-';
		}
		
		resDate += calMonthDrop >= 0 ? (calMonthDrop + 1 - this.showEmptyDate).toString() + '-' : '1-';
		resDate += calDayDrop >= 0 ? (calDayDrop + 1 - this.showEmptyDate).toString() : '1';
	}

	selDate.value = resDate;
	this.setTime();
	calHolder.value = selDate.value;
	
	if(document.createEvent)
	{
		ev = document.createEvent('HTMLEvents');
		ev.initEvent('change', true, true)
		selDate.dispatchEvent(ev);
	}
	else
		selDate.fireEvent("onchange");
	if(this.clientFunction)
		setTimeout(this.clientFunction + "(" + this.name + ", '" + selDate.value + "')", 5);
}

//save time in storage place from dropdowns
function excalSetTime()
{
	var selDate = document.getElementById(this.dateInput);
	var showEmpyCorrection = this.showEmptyDate ? 1 : 0;
	var calHourDrop = document.getElementById(this.prefix + 'calHour');
	var calHourAmPmDrop = document.getElementById(this.prefix + 'calHourAmPm');
	var calMinuteDrop = document.getElementById(this.prefix + 'calMinute');
	var calSecondDrop = document.getElementById(this.prefix + 'calSecond');
	calHourDrop = calHourDrop ? calHourDrop.selectedIndex - showEmpyCorrection : -1;
	calHourAmPmDrop = (calHourAmPmDrop && calHourAmPmDrop.selectedIndex == 1) ? 12 : 0;
	calMinuteDrop = calMinuteDrop ? calMinuteDrop.selectedIndex - showEmpyCorrection : -1;
	calSecondDrop = calSecondDrop ? calSecondDrop.selectedIndex - showEmpyCorrection : -1;

	var resTime = (selDate.value == "") ? "" : " ";
	resTime += (calHourDrop >= 0) ? calHourDrop + calHourAmPmDrop : -1;
	resTime += ":";
	resTime += (calMinuteDrop >= 0) ? calMinuteDrop * this.minStep : -1;
	resTime += ":";
	resTime += (calSecondDrop >= 0) ? calSecondDrop * this.secStep : -1;
	selDate.value += resTime;
}

var calObjCount = 0;

//creating new Calendar object
//prefix - prefix for controls
//name - name of calendar variable
//cssfile - name of css file
//showEmptyDate - show empty date or not
//dateInput - name of control for storage data
//clientFunction - client event on date changed
//descendingYears - is years in descending order
//hourHaveLeadingZero - leading zero for values less than 10 in hours dropdown
//minuteHaveLeadingZero - leading zero for values less than 10 in minutes dropdown
//secondHaveLeadingZero - leading zero for values less than 10 in seconds dropdown
//minStep, secStep - step for values in minutes and seconds dropdown
function FogSoftCalendar(prefix, name, yearMin, yearMax, cssFile, showEmptyDate, dateInput, clientFunction, 
					descendingYears, hourHaveLeadingZero, minuteHaveLeadingZero, secondHaveLeadingZero, minStep, secStep, postBackEvent)
{
	this.fillData = excalFillData;
	this.initData = excalInitData;
	this.setDate = excalSetDate;
	this.setTime = excalSetTime;
	this.setDateWithVals = excalSetDateWithVals;
	this.setDateString = excalSetDateString;
	this.getDate = excalGetDate;
	this.getTime = excalGetTime;
	this.prefix = prefix;
	this.name = name;
	this.yearMin = yearMin;
	this.yearMax = yearMax;
	this.cssFile = cssFile;
	this.prevCalYearDropValue = 0;
	this.prevCalMonthDropValue = 0;
	this.prevCalDayDropValue = 0;
	this.clientFunction = clientFunction;
	this.processAutoPostBack = excalProcessAutoPostBack

	if(showEmptyDate)
		this.showEmptyDate = 1;
	else
		this.showEmptyDate = 0;
	if(descendingYears)
		this.descendingYears = 1;
	else
		this.descendingYears = 0;

	this.dateInput = dateInput;
	this.hourHaveLeadingZero = (hourHaveLeadingZero) ? 1 : 0;
	this.minuteHaveLeadingZero = (minuteHaveLeadingZero) ? 1 : 0;
	this.secondHaveLeadingZero = (secondHaveLeadingZero) ? 1 : 0;
	this.minStep = (minStep && minStep > 0) ? minStep : 5;
	this.secStep = (secStep && secStep > 0) ? secStep : 5;
	this.postBackEvent = postBackEvent;
	this.inited = false; // controls inited from storage place
}

function padLeftWithZero(value, mustHaveLeadingZero)
{
	return (value < 10 && mustHaveLeadingZero) ? "0"+value : value;
}

function parseYear(value)
{
	var result = parseInt(value);
	return isNaN(result) ? 0 : result;
}

function validatePartialDate(source, arguments)
{
	validateDateTime(source, arguments, "partial");
}

function validateRequiredDate(source, arguments)
{
	validateDateTime(source, arguments, "required");
}

function validateDateTime(source, arguments, validationType)
{
	var datePattern = source.datePattern;
	var dateValue = arguments.Value;
	var timeValue = "";
	var spaceIndex = dateValue.indexOf(' ');
	if (spaceIndex > -1)
	{
		timeValue = dateValue.substring(spaceIndex + 1);
		dateValue = dateValue.substring(0, spaceIndex);
	}
	
	var result = ""; // valid
	if (validationType == "required")
	{
		result += validateDate(datePattern, dateValue);
		result += validateTime(datePattern, timeValue);
	}
	else
	{
		var dateEmpty = (dateValue == "" || dateValue == "0-0-0");
		var timeEmpty = (timeValue == "" || timeValue == "-1:-1:-1");
		var needValidateDate = (!dateEmpty || (dateEmpty && !timeEmpty));
		var needValidateTime = (!timeEmpty || (timeEmpty && !dateEmpty));
		if (needValidateDate) result += validateDate(datePattern, dateValue);
		if (needValidateTime) result += validateTime(datePattern, timeValue);
	}

	// alert(validationType + " ["+dateValue+"] ["+timeValue+"] - pattern: "+datePattern+" - not valid: "+result);
	
	arguments.IsValid = (result == "");
}

function validateDate(datePattern, dateValue)
{
	var result = ""; // valid
	
	if (dateValue == null) dateValue = "";
	var parts = dateValue.split("-");
	if (parts.length != 3)
	{
		result += "yMd"
	}
	else
	{
		if (datePattern.indexOf("y") > -1 && (isNaN(parseInt(parts[0])) || parseInt(parts[0]) == 0 )) result += "y";
		if (datePattern.indexOf("M") > -1 && (isNaN(parseInt(parts[1])) || parseInt(parts[1]) == 0 )) result += "M";
		if (datePattern.indexOf("d") > -1 && (isNaN(parseInt(parts[2])) || parseInt(parts[2]) == 0 )) result += "d";
	}
	
	return result;
}

function validateTime(datePattern, timeValue)
{
	var result = ""; // valid
	if ((datePattern.indexOf("h") > -1 ||
			datePattern.indexOf("H") > -1) && timeValue.indexOf("-1:") == 0) result += "h";
	if (datePattern.indexOf("m") > -1 && timeValue.indexOf(":-1:") > -1) result += "m";
	if (datePattern.indexOf("s") > -1 && timeValue.indexOf(":-1") > -1) result += "s";
	return result;
}

function validateDateRange(source, arguments)
{
	var dateValue = arguments.Value;
	var spaceIndex = dateValue.indexOf(' ');
	if (spaceIndex > -1) dateValue = dateValue.substring(0, spaceIndex);

	// check ONLY range - empty date is valid
	if (dateValue == '' || dateValue.indexOf('0-') == 0)
	{
		arguments.IsValid = true; return;
	}

	var index = dateValue.indexOf('-');
	if (index > -1) dateValue = dateValue.substring(0, index);
	
	var year = parseInt(dateValue);
	arguments.IsValid = (year >= 1753 && year <= 9999);
}

function validateDateCommon(source, arguments)
{
	var datePattern = source.datePattern;
	var dateValue = arguments.Value;
	var timeValue = "";
	var spaceIndex = dateValue.indexOf(' ');
	if (spaceIndex > -1)
	{
		timeValue = dateValue.substring(spaceIndex + 1);
		dateValue = dateValue.substring(0, spaceIndex);
	}
	
	var dp = dateValue.split('-');
	var tp = timeValue.split(':');
	var result = ""; // valid
	
	var dateEmpty = (dateValue == "" || dateValue == "0-0-0");
	var timeEmpty = (timeValue == "" || timeValue == "-1:-1:-1");
	
//	var d = new Date(dp[2], dp[1], dp[0], tp[0], tp[1], tp[2]);
	var d = new Date(0,0,1,0,0,0);

	if (!dateEmpty) 
	{
		for(i=0;i<dp.length;i++) dp[i] = parseInt(dp[i]);
		if (datePattern.indexOf("y") > -1)	d.setFullYear(dp[0]);
		if (datePattern.indexOf("M") > -1)	d.setMonth(dp[1]-1);
		if (datePattern.indexOf("d") > -1)	d.setDate(dp[2]);
	}
	if (!timeEmpty) 
	{
		for(i=0;i<tp.length;i++) tp[i] = parseInt(tp[i]);
		if (datePattern.indexOf("h") > -1) 	d.setHour(tp[0]);
		if (datePattern.indexOf("m") > -1)	d.setMinutes(tp[1]);
		if (datePattern.indexOf("s") > -1)	d.setSeconds(tp[2]);
	}

	if (!dateEmpty) 
	{
		if (datePattern.indexOf("y") > -1)	result += dp[0] != d.getFullYear() ? "y" : "";
		if (datePattern.indexOf("M") > -1)	result += dp[1] != d.getMonth() + 1 ? "M" : "";
		if (datePattern.indexOf("d") > -1)	result += dp[2] != d.getDate() ? "d" : "";
	}
	if (!timeEmpty)
	{
		if (datePattern.indexOf("h") > -1)	result += tp[0] != d.getHour() ? "h" : "";
		if (datePattern.indexOf("m") > -1)	result += tp[1] != d.getMinutes() ? "m" : "";
		if (datePattern.indexOf("s") > -1)	result += tp[2] != d.getSeconds() ? "s" : "";
	}
	
	arguments.IsValid = (result == "");
}

function UpdateCalendar(oECalendar, calendar, date)
{
	oECalendar.setDateString(date);

	if(calendar.dateClicked)
	{
		calendar.callCloseHandler();
	}
}
