﻿var curDate = new Date();
var curOpenCalendar = null;
var CALENDAR_CONFIG ={
    appRoot : "",
    img  : "img/calendar.gif" ,
    weekdays : new Array("Вс","Пн","Вт","Ср","Чт","Пт","Сб"),
    months : new Array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"),
    minYear : 1900 ,
    maxYear : 2100 ,
    delimeter : "." ,
    wrong_format :"Неверный формат даты  \r\n используйте ДД{0}ММ{1}ГГГГ "
}
function initCalendarControl( elementId ,cbFunc ){
	var clndrElem = document.getElementById(elementId) ;
	if (clndrElem == null)
		return null;
	clndrElem.calendar = new KSVCalendar(clndrElem,cbFunc);
	return clndrElem.calendar ;
}
function getCalendar(obj){
	if (obj.calendar )
		return obj.calendar ;
	else return obj;
}
function getDaysInMonth (year ,month){
    return new Date(year, month + 1, 0).getDate();
}

function getStrDate(dDate, sDelim){
	var sDate = "";
	var zif = dDate.getDate();
	if (zif<10 ) sDate+="0" ;
	sDate+=zif+sDelim ;
	zif = dDate.getMonth()+1;
	if (zif<10 ) sDate+="0" ;
	sDate+=zif+sDelim ;
	sDate+=dDate.getFullYear() ;
	return sDate ;
}

var calendar_elements = new Array();
var bKeyPress = window.onkeypress;

window.document.onkeypress = function(ev1){
	var ev =  ev1 || window.event ;
	if (ev && ev.keyCode ==27){
      for(var s = 0 ; s < calendar_elements.length ;s ++){
        var ret = calendar_elements[s].closePopups();
		ev.cancelBubble  = ev.cancelBubble || ret;
		if (ret)
			return false;
      }
	}
	if (bKeyPress) return bKeyPress (ev); else return true;
}

function KSVCalendar(elem , cbFunc){
	var oThis = this;
	oThis.textElement = elem;
	oThis.textElement.setAttribute( "autocomplete","off" );
	var _img_ = document.createElement('img');
	_img_.src = CALENDAR_CONFIG.appRoot+CALENDAR_CONFIG.img;
	_img_.style.verticalAlign = "top";
    _img_.style.marginRight = "6px";
    _img_.style.marginTop = "1px";
    _img_.align = "middle";
	_img_.style.marginLeft = "3px";
	_img_.border = "0";
	_img_.onclick = oThis.onclick;
	_img_.calendar = oThis;
	insertAfter( _img_  , elem );
	oThis.textElement.ondblclick = oThis.onclick;
	oThis.textElement.showCalendar =oThis.showCalendar;
	var bSubmit = oThis.textElement.form.onsubmit;
    if (!oThis.textElement.form.baseSubmit)
        oThis.textElement.form.baseSubmit = bSubmit  ? bSubmit  : function(){return true};
    if (!oThis.textElement.form.addSubmit)
        oThis.textElement.form.addSubmit = new Array();
    oThis.textElement.form.addSubmit.push(function(ev){
        if (!oThis.checkDate(ev))
            return false;
        else return true;
    });
    oThis.textElement.form.onsubmit = function (ev){
        var isOk = true;
        if(oThis.textElement.form.addSubmit){
            for (var i = 0 ; i < oThis.textElement.form.addSubmit.length ;i ++ ){
                isOk = oThis.textElement.form.addSubmit[i](ev);
                if (isOk == undefined)
                    isOk = true;
                if (!isOk) return false;
            }
        }
        if (isOk )
            isOk = oThis.textElement.form.baseSubmit(ev);
        return isOk;
	}
	oThis.divElement = createElement(oThis.textElement.parentNode , "div", "cdrDiv");

	if (cbFunc)
		oThis.callBackFunction = cbFunc;
	oThis.fullYear = true ;
	oThis.autoScroll = false ;
	oThis.minYear = CALENDAR_CONFIG.minYear;
	oThis.maxYear = CALENDAR_CONFIG.maxYear;
	oThis.cDay=curDate.getDate();
	oThis.cMonth=curDate.getMonth();
	oThis.cYear = curDate.getFullYear();
	oThis.enableNull =true;
	oThis.delimeter = CALENDAR_CONFIG.delimeter;
	calendar_elements.push(oThis);
}
KSVCalendar.prototype.onclick = function(e){
	getCalendar(this).showCalendar();
}


KSVCalendar.prototype.parseDate = function (){
	var calendar = getCalendar(this);
	var sDate = calendar.textElement.value;
	if( sDate==null || sDate == undefined || sDate=="" )
		return calendar.enableNull;

	if( sDate.length<7 || sDate.length>10) return false;
	var pos = sDate.indexOf(calendar.delimeter);
	if (pos!=1 && pos!=2) return false;
	var sDay = sDate.substring(0,pos);
	if(sDay.charAt(0)=="0") sDay = sDay.substring(1,2);
	var pos1 = sDate.indexOf(calendar.delimeter ,pos +1);
	if ((pos1-pos)>3) return false;
	var sMonth = sDate.substring(pos+1,pos1);
	if(sMonth.charAt(0)=="0") sMonth = sMonth.substring(1,2);
	var sYear = sDate.substring(pos1+1);
	var cDay = parseInt(sDay);
	var cMonth = parseInt(sMonth)-1;
	var cYear = parseInt(sYear);
	if(isNaN(cYear) || cYear.toString().length!=4) return false;
	if(isNaN(cMonth) || cMonth<0 || cMonth>11) return false;
	if(isNaN(cDay) || cDay<=0 || cDay>getDaysInMonth(cYear ,cMonth)) return false;
	calendar.cDay = cDay;
	calendar.cMonth = cMonth;
	calendar.cYear = cYear;
	return true;
}

KSVCalendar.prototype.checkDate = function  (ev){
	var o = this;
	if (ev && ev.type == "blur"){
		var q = ev.srcElement || ev.target;
		if (q.calendar)
			o = q.calendar;
	}
	if (!o.parseDate()){
		var type= "";
		if (ev){
			ev.cancelBubble = true;
			type = ev.type;
		}else type = ev;
		if (! o.handled){
			o.handled = true;
			alert(getFormattedMessage(CALENDAR_CONFIG.wrong_format ,o.delimeter ,o.delimeter));
			o.handled = false;
		}
		o.textElement.select();
		o.textElement.focus();
		return false;
	}
	return true;
}

KSVCalendar.prototype.hideCalendar = function ( virt){
	var calendar = getCalendar(this);
	if (calendar.autoScroll ) calendar.stopAutoScroll();
	if ( calendar.yearElement )
		calendar.yearElement .style.visibility = "hidden" ;
	if ( calendar.monthElement )
		calendar.monthElement .style.visibility = "hidden" ;
	calendar.divElement.style.visibility = "hidden" ;
	if(!virt) {
        stateSelectElements(true);
        curOpenCalendar = null;
    }

    return false;
}
KSVCalendar.prototype.closePopups = function (){
	var calendar = getCalendar(this);
	if (calendar.autoScroll ) {
		calendar.stopAutoScroll();
		return true;
	}
	if ( calendar.yearElement  && calendar.yearElement.style.visibility =="visible"){
		calendar.yearElement.style.visibility = "hidden" ;
		return true;
	}
	if ( calendar.monthElement && calendar.monthElement.style.visibility =="visible"){
		calendar.monthElement.style.visibility = "hidden" ;
		return true;
	}
	if (calendar.divElement.style.visibility =="visible"){
		calendar.hideCalendar();
		return true;
	}
	return false;
}

KSVCalendar.prototype.showCalendar = function (){

	var calendar = getCalendar(this);
	calendar.hideCalendar(true);
	calendar.parseDate();
	var ofs = fGetXY(calendar.textElement ,null);
	var popupCoordX = ofs.x +"px";
	var popupCoordY = (ofs.y+calendar.textElement.clientHeight+2)+"px";
	calendar.divElement.style.left=popupCoordX;
	calendar.divElement.style.top=popupCoordY;
	stateSelectElements(false);
    if (curOpenCalendar  != null)
        curOpenCalendar.hideCalendar();
    curOpenCalendar  = calendar;
    calendar.drawCalendar ();
}

KSVCalendar.prototype.okdate = function (day ,sm){
	var calendar = getCalendar(this);
	if (sm){
		calendar.cMonth +=sm;
		while(calendar.cMonth > 11){
			calendar.cMonth -=12;
			calendar.cYear +=1;
		}
		while(calendar.cMonth < 0){
			calendar.cMonth +=12;
			calendar.cYear -=1;
		}
	}
	var sDay = day.toString();
	if(sDay.length==1)sDay = "0"+sDay;
	var sMonth = (calendar.cMonth+1).toString();
	if(sMonth.length==1) sMonth="0"+sMonth;
	var date = sDay+"."+sMonth+"."+calendar.cYear;
	calendar.textElement.value = date;
	calendar.hideCalendar();
	if (calendar.callBackFunction)
		calendar.callBackFunction(date);
}
KSVCalendar.prototype.shiftYear = function (num){
	var calendar = getCalendar(this);
	calendar.cYear +=num;
	calendar.drawCalendar ();
}
KSVCalendar.prototype.okYear = function (num){
	var calendar = getCalendar(this);
	calendar.cYear =num;
	calendar.drawCalendar ();
}

KSVCalendar.prototype.shiftMonth = function (num){
	var calendar = getCalendar(this);
	calendar.cMonth +=num;
	while(calendar.cMonth > 11){
		calendar.cMonth -=12;
		calendar.cYear +=1;
	}
	while(calendar.cMonth < 0){
		calendar.cMonth +=12;
		calendar.cYear -=1;
	}
	calendar.drawCalendar ();
}

KSVCalendar.prototype.okMonth = function (num){
	var calendar = getCalendar(this);
	calendar.cMonth =num;
	calendar.drawCalendar ();
}

KSVCalendar.prototype.drawCalendar = function (){
	var calendar = getCalendar(this);
	if (calendar.autoScroll )calendar.stopAutoScroll();
	var nbspi = "";
	var nbspe = "&nbsp;";
	calendar.autoScroll = false ;
	calendar.divElement.innerHTML = "";
	var oTable = createElement(calendar.divElement , "table");
	oTable.border=0;
	oTable.cellSpacing=1;
	oTable.cellPadding=0;
	var oTBody = createElement(oTable, "tbody");
	var oTd = createElement(createElement(oTBody, "tr"), "td");
	oTd.colSpan = 7;
	oTd.align = "left";
	var oTable2 = createElement(oTd , "table" , "cdrTableControl");
	oTable2.border=0;
	oTable2.width="100%";
	oTable2.cellSpacing=0;
	oTable2.cellPadding=0;
	var oTr = createElement(createElement(oTable2, "tbody"), "tr");
	var linkSM1 = createElement(createElement(oTr, "td"), "a" ,"cdrShiftMonthYear");
	linkSM1.href="#"
	linkSM1.innerHTML  = nbspe+"&lsaquo;"+nbspi;
	linkSM1.calendar =calendar;
	linkSM1.onclick = function(){calendar.shiftMonth(-1); return false;}
	calendar.monthCell = createElement(oTr, "td" ,"cdrMonthYear");
	calendar.monthCell.style.width ="65px";
	calendar.monthCell.innerHTML = CALENDAR_CONFIG.months[calendar.cMonth];
	var selMonth = createElement(createElement(oTr, "td"), "button" ,"cdrButt");
	selMonth.innerHTML="..." ;
	selMonth.calendar =calendar;
	selMonth.onclick = calendar.selectMonth;
	var linkSM2 = createElement(createElement(oTr, "td"), "a" ,"cdrShiftMonthYear");
	linkSM2.href="#"
	linkSM2.innerHTML  = nbspi+"&rsaquo;"+nbspe;
	linkSM2.calendar =calendar;
	linkSM2.onclick = function(){calendar.shiftMonth(1); return false;}

	var linkSY1 = createElement(createElement(oTr, "td"), "a" ,"cdrShiftMonthYear");
	linkSY1.href="#"
	linkSY1.innerHTML  = nbspe+"&lsaquo;"+nbspi;
	linkSY1.calendar =calendar;
	linkSY1.onclick = function(){calendar.shiftYear(-1); return false;}

	calendar.yearCell = createElement(oTr, "td" ,"cdrMonthYear");
	calendar.yearCell.innerHTML = calendar.cYear;

	var selYear = createElement(createElement(oTr, "td"), "button" ,"cdrButt");
	selYear.innerHTML="..." ;
	selYear.calendar =calendar;
	selYear.onclick = calendar.selectYear;

	var linkSY2 = createElement(createElement(oTr, "td"), "a" ,"cdrShiftMonthYear");
	linkSY2.href="#";
	linkSY2.innerHTML  = nbspi+"&rsaquo;"+nbspe;
	linkSY2.calendar =calendar;
	linkSY2.onclick = function(){calendar.shiftYear(1); return false;}

	var closeButt  = createElement(createElement(oTr, "td"), "a" ,"cdrClose");
	closeButt.href="#";
	closeButt.innerHTML="x" ;
	closeButt.calendar =calendar;
	closeButt.onclick = calendar.hideCalendar;

	var days = getDaysInMonth(calendar.cYear ,calendar.cMonth);
	var cday = calendar.cDay ;
	if (cday > days) cday = days;
	var firstDate = new Date(calendar.cYear ,calendar.cMonth, 1);
	var start = firstDate.getDay();
	if (start ==0) start =7;
	var trWeek = createElement(oTBody, "tr");
	for ( var i = 0; i<7; i++){
		var z = i+1 ;
		if (z==CALENDAR_CONFIG.weekdays.length) z=0 ;
		createElement(trWeek,"td" ,"cdrWeek").innerHTML = CALENDAR_CONFIG.weekdays[z];
	}
	var num = 0 ;
	var st ,hst,ast , val;
	for( var r = 0; r<6; r++){
		if (num-start+2>days) break ;
		var trDays = createElement(oTBody, "tr");
		for( var c = 1; c<8; c++){
			num=r*7+c;
			var sm = num<start ? -1 : num-start+1>days ? 1 : 0;
			val = new Date(calendar.cYear, calendar.cMonth, num-start+1).getDate();
			st = hst = "cdrDayCell";
			ast ="cdrWorkDay";
			hst +="Selected";
			if(c==7 || c==6) ast= "cdrWeekEnd";
			if (sm !=0){
				st = hst = "cdrOtherMonth";
				ast +="O";
			}
			if (val == cday  && sm == 0) st += "Selected";
			var oTDDay = createElement(trDays,"td" ,st) ;
			oTDDay.onmouseover  = new Function("this.className=\""+hst+"\";");
			oTDDay.onmouseout = new Function("this.className=\""+st+"\";");
			var likDate = createElement(oTDDay,"a"  ,ast);
			likDate.href= "#";
			likDate.calendar =calendar;
			likDate.onclick = new Function("getCalendar(this).okdate("+val+","+sm+" ); return false;");
			likDate.innerHTML = val;
		}
	}
	calendar.yearElement = null;
	calendar.monthElement = null;
	calendar.divElement.style.visibility = "visible";
}

KSVCalendar.prototype.selectMonth = function (){
	var calendar = getCalendar(this);
	if (calendar.autoScroll ) calendar.stopAutoScroll();
	if ( calendar.yearElement ) calendar.yearElement.style.visibility = "hidden" ;
	if ( !calendar.monthElement ){
		calendar.monthElement = createElement(calendar.divElement, "div" ,"cdrMonthSelect");
		var oTable = createElement(calendar.monthElement, "table");
		oTable.border=0;
		oTable.cellSpacing=0;
		oTable.cellPadding=0;
		var oTBody = createElement(oTable, "tbody");
		for (var i = 0 ; i < 4 ;i++){
			var oTR = createElement(oTBody, "tr");
			for (var j = 0 ; j < 3 ;j++){
				var oLink = createElement(createElement(oTR, "td"), "a" , "cdrMonthYearSelect");
				oLink.style.marginRight ="5px";
				oLink.calendar = calendar;
				oLink.href = "#";
				oLink.onclick = new Function("getCalendar(this).okMonth("+(i*3+j)+"); return false;");
				oLink.innerHTML = CALENDAR_CONFIG.months[i*3+j];
			}
		}
		var ofs = fGetXY(calendar.monthCell,null);
		var ofs1 = fGetXY(calendar.divElement,null);
		calendar.monthElement.style.left =   (ofs.x-ofs1.x)+"px";
		calendar.monthElement.style.top =   (ofs.y-ofs1.y+calendar.monthCell.clientHeight) +"px";
	}
	calendar.monthElement.style.visibility = "visible" ;
	return false;
}



KSVCalendar.prototype.selectYear = function  (){
	var calendar = getCalendar(this);
	if (calendar.autoScroll ) calendar.stopAutoScroll();
	calendar.showYears(calendar.cYear ,true);
	return false;
}

KSVCalendar.prototype.showYears =  function (y ,ishow){
	var calendar = getCalendar(this);
	var startYear = parseInt(y)-2 ;
	if (startYear < calendar.minYear)
		startYear  = calendar.minYear;
	if (startYear +4 >calendar.maxYear )
		startYear  =calendar.maxYear -4;
	if ( !calendar.yearElement ){
		calendar.yearElement = createElement( calendar.divElement , "div" ,"cdrYearSelect");
		var linkless = createElement( calendar.yearElement, "a" ,"cdrMonthYearSelect");
		linkless.calendar = calendar;
		linkless.href = "#";
		linkless.style.marginRight = "5px";
		linkless.onclick = new Function("getCalendar(this).showYears("+(startYear +1)+",false);return false;");
		linkless.onmousedown = new Function("var calendar = getCalendar(this);if (calendar.setAutoScroll())  calendar.startAutoScroll(500, "+(startYear +1)+",-1);");
		linkless.onmouseup =linkless.onmouseout= new Function("getCalendar(this).stopAutoScroll()");
		linkless.innerHTML ="...";
		linkless.style.textAlign  ="right";

		createElement( calendar.yearElement , "br");

		for (var i = startYear ; i < startYear+5 ;i++){
			var linkyear = createElement( calendar.yearElement , "a" ,"cdrMonthYearSelect");
			linkyear.calendar = calendar;
			linkyear.href = "#";
			linkyear.style.marginRight = "5px";
			linkyear.onclick = new Function("getCalendar(this).okYear("+i+");return false;");
			linkyear.innerHTML =""+i;
			createElement( calendar.yearElement, "br");
		}
		var linkgreat = createElement( calendar.yearElement, "a" ,"cdrMonthYearSelect");
		linkgreat.calendar = calendar;
		linkgreat.href = "#";
		linkgreat.style.marginRight = "5px";
		linkgreat.onclick = new Function("getCalendar(this).showYears("+(startYear +3)+",false);return false;");
		linkgreat.onmousedown = new Function("var calendar = getCalendar(this);if (calendar.setAutoScroll())  calendar.startAutoScroll(500, "+(startYear +3)+",1);");
		linkgreat.onmouseup =linkgreat.onmouseout= new Function("getCalendar(this).stopAutoScroll()");
		linkgreat.innerHTML ="...";
	}else {
		calendar.yearElement.childNodes[0].onclick = new Function("getCalendar(this).showYears("+(startYear +1)+",false);return false;");
		calendar.yearElement.childNodes[0].onmousedown = new Function("var calendar = getCalendar(this);if (calendar.setAutoScroll())  calendar.startAutoScroll(500, "+(startYear +1)+",-1);");
		for (var j = startYear ; j < startYear+5 ;j++){
			linkyear = calendar.yearElement.childNodes[(j-startYear+1)*2];
			linkyear.onclick = new Function("getCalendar(this).okYear("+j+");return false;");
			linkyear.innerHTML =""+j;
		}
		calendar.yearElement.childNodes[12].onclick = new Function("getCalendar(this).showYears("+(startYear +3)+",false);return false;");
		calendar.yearElement.childNodes[12].onmousedown = new Function("var calendar = getCalendar(this);if (calendar.setAutoScroll())  calendar.startAutoScroll(500, "+(startYear +3)+",1);");
	}
	if (ishow ){
		if ( calendar.monthElement )
			calendar.monthElement .style.visibility = "hidden" ;
		var ofs = fGetXY(calendar.yearCell,null);
		var ofs1 = fGetXY(calendar.divElement,null);
		calendar.yearElement.style.left =   (ofs.x-ofs1.x)+"px";
		calendar.yearElement.style.top =   (ofs.y-ofs1.y+calendar.yearCell.clientHeight) +"px";
		calendar.yearElement.style.visibility = "visible" ;
	}
}

KSVCalendar.prototype.setAutoScroll = function (){
	var calendar = getCalendar(this);
	var ret = !calendar.autoScroll ;
	calendar.autoScroll = true ;
	return ret ;
}
KSVCalendar.prototype.startAutoScroll = function (i_msec ,y, sht){
	var calendar = getCalendar(this);
	if ( calendar.autoScroll && !isNaN(y) ){
		i_msec =  i_msec - 50;
		if (i_msec < 100) i_msec = 100 ;
		calendar.showYears(y,false);
		if (y >= calendar.minYear  && y <= calendar.maxYear)
			calendar.scrollTimeOut = window.setTimeout(function(){calendar.startAutoScroll(i_msec ,y+sht ,sht)},i_msec);
	}
}

KSVCalendar.prototype.stopAutoScroll = function (){
	var calendar = getCalendar(this);
	var ret = calendar.autoScroll ;
	calendar.autoScroll = false ;
	if (calendar.scrollTimeOut ){
		window.clearTimeout(calendar.scrollTimeOut);
		calendar.scrollTimeOut = null;
	}
	return ret;
}
var openedelements = 0;
function stateSelectElements(b){
	if(isIE){
		if(b === false) openedelements++; else  openedelements--;
		if (b === false || openedelements ==0 ){
			for (var i=0;i<20;i++ ) {
				var slc = document.getElementById("hide4menu"+i);
				if (slc !=null) slc.style.visibility =(b === false ? "hidden" : "");
			}
		}
	}
}
function getFormattedMessage (patt ){
    var retstr = patt;
    if (arguments.length > 1){
        for (var i = 1 ; i < arguments.length ;i++)
            retstr = retstr.replace("{"+(i-1)+"}" ,arguments[i]);
    }
}

