function cal_op(referenceName,date_string) {
	if(date_string != ''){
		var ymd_obj_array=new Array();
		ymd_obj_array=referenceName.split("_");
		if (ymd_obj_array[0]=="") { // if referenceName begins with '_'
			data_values_array=date_string.split("/");
			document.getElementById(ymd_obj_array[1]).value=parseInt(data_values_array[0],10);
			if (referenceName.substr(referenceName.length-1,1)=='2') {
				calendar.setMonthEndSource(document.getElementById(ymd_obj_array[1]));
			} else {
				calendar.setMonthBeginSource(document.getElementById(ymd_obj_array[1]));
			}
			document.getElementById(ymd_obj_array[2]).value=parseInt(data_values_array[1],10);
			if (referenceName.substr(referenceName.length-1,1)=='2') {
				calendar.setDayEndSource(document.getElementById(ymd_obj_array[2]));
			} else {
				calendar.setDayBeginSource(document.getElementById(ymd_obj_array[2]));
			}
			document.getElementById(ymd_obj_array[3]).value=parseInt(data_values_array[2],10);
			calendar.checkDays(document.getElementById(ymd_obj_array[3]));
		} else {
			if (is_use_time) date_string = date_string+' '+old_time_arr[0]+':'+old_time_arr[1]+':'+old_time_arr[2];
			document.getElementById(referenceName).value = date_string;
		}
	}
	document.getElementById("divCal").innerHTML = '';
	DivSetVisible(false);
}

var curElement;
var old_time_arr = new Array('00','00','00');
var is_use_time = 0;

// Size of Main calendar (english)
var calendarwidth=138; 
var calendarheight=197;
// Shift for Hot point (dragging)
var hotpointX=15;
var hotpointY=15;
// Shift to calendar-coordinates from cursor
var cursorshiftX=-5;
var cursorshiftY=10;

function DivSetVisible(state) {
	var DivRef = document.getElementById('divCal');
	var IfrRef = document.getElementById('DivShim');
	if(state) {
		IfrRef.style.width = DivRef.offsetWidth;
		IfrRef.style.height = DivRef.offsetHeight;
		IfrRef.style.top = DivRef.style.top;
		IfrRef.style.left = DivRef.style.left;
		IfrRef.style.zIndex = DivRef.style.zIndex - 1;
		IfrRef.style.display = "block";
	}else{
		IfrRef.style.display = "none";
	}
}

function doMouseMove(evt) {
	var calendarX, calendarY;
	var e = (window.event) ? window.event : evt;
	newleft=(e.clientX);
	newtop=(e.clientY);
	if ((e.button==1) && (curElement!=null)) {
		if (newleft > document.body.clientWidth-calendarwidth+hotpointX) {
			calendarX = document.body.clientWidth + document.body.scrollLeft - calendarwidth;
		} else {
			calendarX = newleft + document.body.scrollLeft - hotpointX;
		}
		if (newleft < hotpointX) calendarX=document.body.scrollLeft;
		curElement.style.left=calendarX;
		if (newtop > document.body.clientHeight-calendarheight+hotpointY) {
			calendarY = document.body.clientHeight + document.body.scrollTop - calendarheight;
		} else {
			calendarY = newtop + document.body.scrollTop - hotpointY;
		}
		if (newtop < hotpointY) calendarY=document.body.scrollTop;
		curElement.style.top=calendarY;
		e.returnValue = false;
		e.cancelBubble = true;
		DivSetVisible(true);
	}
}

function doDragStart() {
// Don't do default drag operation.
	if ("divCalCaption"==event.srcElement.id) 
		event.returnValue=false;
}

function doMouseDown(evt) {
	var e = (window.event) ? window.event : evt;
	if ((e.button==1) && (e.srcElement.id=="divCalCaption"))  
		curElement = document.getElementById("divCal");
}

document.ondragstart = doDragStart;
document.onmousedown = new Function("doMouseDown(this)");
document.onmousemove = new Function("doMouseMove(this)");
document.onmouseup = new Function("curElement=null")

/////// Vadim
document.onkeyup = handleKey;

function handleKey()
{
	var evt = (evt) ? evt : ((window.event) ? event : null);
	if(evt)
	{
		if(evt.keyCode == 27)
		{
			cal_op('CloseCal','');
		}
	}
}
///////

function cal_time(referenceName){
	cal_view(referenceName,undefined,undefined,undefined,true);
}

function cal_date(referenceName){
	cal_view(referenceName,undefined,undefined,undefined,false);
}

function cal_view(referenceName,date_today,year_string,month_string,day_string,use_time,evt){
	var e = (window.event) ? window.event : evt;
	var mn = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var dim = [31,0,31,30,31,30,31,31,30,31,30,31];
	var selectdate = null;
	var referenceName = referenceName;
	var calendarDayBeforeToday = "calendarDayBeforeToday";
	var calendarDayEmpty = "calendarDayAvailable"; 
	var calendarDaySelect = "calendarDaySelect";
	var calendarDayBooked = "calendarDayBooked";    // type = 1
	var calendarDayBlocked = "calendarDayBlocked";  // type = 2
	var calendarMYSelect = "calendarMYSelect";
	var daysMonth = null;
	var if_fulldate = false;
	var regexpD = /^\d{2,4}\/\d{1,2}\/\d{1,2}$/;
	var regexpDT = /^\d{2,4}\/\d{1,2}\/\d{1,2} \d{1,2}\:\d{1,2}\:{0,1}\d{0,2}$/;
	var old_date_arr = new Array(0,0,0);
//	var old_time_arr = new Array(0,0,0);

	if (use_time){ is_use_time = 1;}else{ is_use_time = 0;};

	var ymd_obj_array=new Array();
	ymd_obj_array=referenceName.split("_");
	if (ymd_obj_array[0]=="") { // if referenceName begins with '_'
		old_date_arr[0]=document.getElementById(ymd_obj_array[1]).value;
		old_date_arr[1]=document.getElementById(ymd_obj_array[2]).value;
		old_date_arr[2]=document.getElementById(ymd_obj_array[3]).value;
	} else {
		if (regexpD.test(document.getElementById(referenceName).value))
			old_date_arr = document.getElementById(referenceName).value.split("/");
		if (regexpDT.test(document.getElementById(referenceName).value)){
			var old_datetime_arr = document.getElementById(referenceName).value.split(" ");
			old_date_arr = old_datetime_arr[0].split("/");
			old_time_arr = old_datetime_arr[1].split(":");
		}
	}
	var todaydate;
	if (regexpD.test(date_today)) {
		ymd_today=date_today.split("/");
		todaydate = new Date(ymd_today[0],ymd_today[1]-1,ymd_today[2]);
	} else {
		todaydate = new Date();
	}
	var todaydate_month = '' + (todaydate.getMonth()+1);
	var todaydate_day = '' + todaydate.getDate();
	if (todaydate_day.length<2) todaydate_day = '0'+todaydate_day;
	if (todaydate_month.length<2) todaydate_month = '0'+todaydate_month;

	if ((year_string != undefined) && (month_string != undefined) && (day_string != undefined)){ 
		selectdate = new Date(year_string,month_string-1,day_string);
		if_fulldate = true;
	}else if((year_string != undefined) && (month_string != undefined)){
		selectdate = new Date(year_string,month_string-1,1);
	}else if((old_date_arr[0]>0) && (old_date_arr[1]>0) && (old_date_arr[2]>0)){
		selectdate = new Date(old_date_arr[0], --old_date_arr[1], old_date_arr[2]); 
		if_fulldate = true;
	}else{
		selectdate = new Date(); 
		if_fulldate = true;
	}
	var curmonth=selectdate.getMonth()+1;
	if (if_fulldate == true){
		var deltapix=0;
		var rightedge=document.body.clientWidth - e.clientX; // -document.body.scrollLeft;
		if(rightedge < calendarwidth+cursorshiftX){
			deltapix=calendarwidth+cursorshiftX-rightedge;
		}
		document.getElementById("divCal").style.left = e.clientX + document.body.scrollLeft + cursorshiftX - deltapix;
		document.getElementById("divCal").style.top = e.clientY + document.body.scrollTop + cursorshiftY;
	}
	document.getElementById("divCal").innerHTML = calendarItem((curmonth));
	DivSetVisible(true);



	function calendarItem(month_){
		if(month_>12){ return '';}
		var year_ = selectdate.getFullYear();
		var month = ((12-month_)<0)?(month_-12):month_;
		var year = ((12-month_)<0)?(year_ + 1):year_;
		var oD = new Date(year, month-1, 1);
		oD.od=oD.getDay()+1;
		var scanfortoday = (year==selectdate.getFullYear() && month==selectdate.getMonth()+1)? selectdate.getDate() : 0;
		dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
		
		var str = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#4A4A4A\" style=\"position:relative\"><tr><td><table border=\"0\" cellspacing=\"2\" cellpadding=\"0\"";
		if (document.layers) str += " bgcolor=\"#FFFFFF\">";
		else str += "\">";
		str += "<tr><td><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"2\" bgcolor=\"#FFFFFF\"><tr><td align=\"center\" class=\"calendarMonth\"><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"0\"><tr><td align=\"center\" class=\"calendarMonth\">";
		str += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"2\" width=\"100%\">";

		str += "<tr><td colspan=\"2\" align=left class=\"" + calendarMYSelect + "\" ID=\"divCalCaption\">Calendar</td><td class=\"" + calendarMYSelect + "\" onclick=\"cal_op('" + referenceName + "','');\" width=\"5%\">X</td></tr>";
		str += "<tr><td colspan=\"3\" ID=\"divCalCaption\" align=center><select style=\"width=52px\" class=\"calendarmonthsel\" onChange=\"cal_view('" + referenceName + "',undefined,this.options[this.selectedIndex].value ," + month + ");\">";
		for(var y=2010; y < 2011; y++){
			str += "<option value=\""+y+"\"";
			if(y==year_) str += " selected";
			str += ">"+y+"</option>";
		}
		str += "</select>";
		str += "<select style=\"width=68px\" class=\"calendarmonthsel\" onChange=\"cal_view('" + referenceName + "',undefined,"+ year_ + ",this.options[this.selectedIndex].value);\">";
		for(var m=0; m < 12; m++){
			str += "<option value=\""+(m+1)+"\"";
			if(m+1==month) str += "selected";
			str += ">"+mn[m]+"</option>";
		}
		str += "</select></td></tr>";

		str += "</td></tr></table></td></tr></table></td></tr><tr><td><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"0\"><tr><td><table id=\"calendarItemBlock\" cellpadding=\"0\" border=\"0\" cellspacing=\"2\" bgcolor=\"#FFFFFF\"><tr align=\"center\">";
		for(var s = 0; s < 7; s++){
			str += "<td class=\"calendarWeekDays\" height=\"16\">";
			str += "SMTWTFS".substr(s,1);
			str += "</td>";
		}
		str += "</tr><tr align=\"center\">";
		var nextDay = 0;
		for(var i = 1; i <= 42; i++){
			var x=((i-oD.od>=0)&&(i-oD.od<dim[month-1]))? i-oD.od+1 : "&nbsp;";
			var xx = ''+x;
			var mm = ''+month;
			if(xx.length<2) xx='0'+xx;
			if(mm.length<2) mm='0'+mm;
			if(x == "&nbsp;") str += "<td class=\"calendarDay\" height=\"16\">";
			else if ((x == scanfortoday) && if_fulldate) {
				str += "<td class=\"" + calendarDaySelect + "\" height=\"16\" onclick=\"cal_op('" + referenceName + "','" + year + "/" + mm + "/" + xx + "');\">";
				nextDay++;
			} else {
				str += "<td class=\"" + calendarDayEmpty + "\" height=\"16\" onclick=\"cal_op('" + referenceName + "','" + year + "/" + mm + "/" + xx + "');\">";
				nextDay++;
			}
			str += x;
			str += "</td>";
			if(((i)%7==0)&&(i<36)) str += "</tr><tr align=\"center\">";
		}
		str += "</tr><tr><td colspan=\"7\" class=\"calendarDayEmpty\" height=\"16\" onclick=\"cal_op('" + referenceName + "','" + todaydate.getFullYear() + "/" + todaydate_month + "/" + todaydate_day + "');\">today (" + todaydate.getFullYear() + "/" + todaydate_month + "/" + todaydate_day + ")</td></tr><tr>";
		str += "</tr></table></td></tr></table></td></tr></table></td></tr></table>";
		return str;
	}

}
// Example:
//
//<div id="divCal" style="position:absolute; z-index:100"></div>
//
//<input name="txt" type="text" id="txt1"><input type="button" name="Button" value="Cal" onClick="Javascript:cal_view('txt1','2004/02/02');"><br>
