//Alexey Filimonov, popup calendar
//
//last change: 30.09.03
//  Добавлены ограничения на год: >=1900 && <=9999
//29.09.03
//  Исправлена ошибка с високосными годами.
var isDateValid=isSelected=false;
var specDay=specMonth=specYear=selectedDay=selectedMonth=selectedYear=0;
var daysInMonth=Array(31,28,31,30,31,30,31,31,30,31,30,31);
var monthNames=Array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
var weekDays=Array('Вс','Пн','Вт','Ср','Чт','Пт','Сб','Вс','Пн','Вт','Ср','Чт','Пт','Сб');
var dateId;
var dateIdArray=new Array();

function calendarInit(id){
	var inArray=false;
	dateId=id;
	for(i=0;i<dateIdArray.length;i++) if(dateIdArray[i]==id){ inArray=true; break; }
	if(!inArray) dateIdArray[dateIdArray.length]=id;
	isDateValid=isSelected=checkDate(id);
}

function hideAllCalendars(except){
	for(i=0;i<dateIdArray.length;i++) if(!except || dateIdArray[i]!=except)
		document.getElementById(dateIdArray[i]+'_calendar').style.visibility='hidden';
}

//drawCalendar(<decreaseMonth?>,<increaseMonth?>,<decreaseYear?>,<increaseYear?>);
function drawCalendar(decMonth,incMonth,decYear,incYear){
	var now=new Date();
	if(isDateValid){
		if(incMonth){
			specMonth++;
			if(specMonth>12){ specMonth=1; specYear++; }
		}
		if(incYear){ specYear++;}
		if(decMonth){
			specMonth--;
			if(specMonth<1){ specMonth=12; specYear--; }
		}
		if(decYear){ specYear--;}
		showDay=specDay;
		showMonth=specMonth-1;
		showYear=specYear;
	}else{
		showDay=specDay=now.getDate();
		showMonth=specMonth=now.getMonth(); specMonth++;
		showYear=specYear=now.getFullYear();
		isDateValid=true;
		if(incMonth){
			showMonth++;
			specMonth++;
			if(specMonth>12){ specMonth=1; specYear++; }
			if(showMonth>11){ showMonth=0; showYear++; }
		}
		if(incYear){ specYear++; showYear++; }
		if(decMonth){
			showMonth--;
			specMonth--;
			if(specMonth<1){ specMonth=12; specYear--; }
			if(showMonth<0){ showMonth=11; showYear--; }
		}
		if(decYear){ specYear--; showYear--; }
	}
	specYear=(specYear<1900)?9999:specYear; showYear=(showYear<1900)?9999:showYear;
	specYear=(specYear>9999)?1900:specYear; showYear=(showYear>9999)?1900:showYear;
	if((showYear%4==0 && showYear%100!=0) || showYear%400==0) daysInMonth[1]=29;
	else daysInMonth[1]=28;
	var showDate=new Date(showYear,showMonth,1);
	calendarStr='<table border=0 class="calendarTable" cellpadding=0 cellspacing=0 bgcolor=White><tr><td align=center>';
	calendarStr+='    <table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td width=1px align=center class="calendarMonth">';
	calendarStr+='        <a href="" class="incDec" onClick="drawCalendar(true,false,false,false); return false;">&lt;</a>';
	calendarStr+='    </td><td width=80% align=center class="calendarMonth">';
	calendarStr+=         monthNames[showDate.getMonth()];
	calendarStr+='    </td><td width=1px align=center class="calendarMonth">';
	calendarStr+='        <a href="" class="incDec" onClick="drawCalendar(false,true,false,false); return false;">&gt;</a>';
	calendarStr+='    </td><td width=1px align=center class="calendarYear">';
	calendarStr+='        <a href="" class="incDec" onClick="drawCalendar(false,false,true,false); return false;">&lt;</a>';
	calendarStr+='    </td><td width=20% align=center class="calendarYear">';
	calendarStr+=         showDate.getFullYear();
	calendarStr+='    </td><td width=1px align=center class="calendarYear">';
	calendarStr+='        <a href="" class="incDec" onClick="drawCalendar(false,false,false,true); return false;">&gt;</a>';
	calendarStr+='    </td></tr></table>';
	calendarStr+='</td></tr>';
	calendarStr+='<tr><td>';
	calendarStr+='    <table border=0 cellpadding=0 cellspacing=0 height=100% width=100%><tr>';
	weekStart=document.getElementById(dateId+'_weekstart').value;
	weekEnd=1*weekStart+6;
	for(i=weekStart;i<=weekEnd;i++){
		calendarStr+='<td class="calendarWeekDays">'+weekDays[i]+'</td>';
	}
	calendarStr+='</tr><tr>';
	showDate.setDate(1);
	spaceNum=((showDate.getDay()-weekStart)<0)?(7+(showDate.getDay()-weekStart)):(showDate.getDay()-weekStart);
	for(i=0;i<spaceNum;i++){
		calendarStr+='<td>&nbsp;</td>';
	}
	for(i=1;i<=daysInMonth[showDate.getMonth()];i++){
		showDate.setDate(i);
		currentWeekDay=showDate.getDay();
		if(currentWeekDay==weekStart) calendarStr+='</tr><tr>';
		if(isSelected && showDate.getDate()==selectedDay && showDate.getMonth()==selectedMonth-1 && showDate.getFullYear()==selectedYear) calendarStr+='<td class="calendarDaySelected">'+i+'</td>';
		else if(showDate.getDate()==now.getDate() && showDate.getMonth()==now.getMonth() && showDate.getFullYear()==now.getFullYear()){
			calendarStr+='<td align="center" valign="middle"><a href="" class="calendarNow" onClick="setDate('+i+','+(1+showDate.getMonth())+','+showDate.getFullYear()+');return false;">';
			calendarStr+=i+'</a></td>';
		}else{
			calendarStr+='<td align="center" valign="middle"><a href="" class="calendarOther" onClick="setDate('+i+','+(1+showDate.getMonth())+','+showDate.getFullYear()+');return false;">';
			calendarStr+=i+'</a></td>';
		}
	}
	calendarStr+='</tr></table>';
	calendarObj=document.getElementById(dateId+'_calendar');
	calendarObj.innerHTML=calendarStr;
	calendarObj.style.top=getCalendarY(dateId);
	calendarObj.style.left=getCalendarX(dateId);
	if(incMonth || incYear || decMonth || decYear) calendarObj.style.visibility='visible';
	else {
		if(calendarObj.style.visibility=='hidden') calendarObj.style.visibility='visible';
		else {
			calendarObj.style.visibility='hidden';
			if(isSelected){ 	specDay=selectedDay; specMonth=selectedMonth; specYear=selectedYear; }
			else{ specDay=now.getDate(); specMonth=1+now.getMonth(); specYear=now.getFullYear(); }
		}
	}
}

function setDate(day,month,year){	
	selectedDay=specDay=day;
	selectedMonth=specMonth=month;
	selectedYear=specYear=year;
	day=(day<10)?'0'+day:day;
	month=(month<10)?'0'+month:month;
	formatStr=document.getElementById(dateId+'_format').value;
	if(formatStr=='DMY') document.getElementById(dateId).value=day+'.'+month+'.'+year;
	else if(formatStr=='YMD') document.getElementById(dateId).value=year+'/'+month+'/'+day;
	else{
		document.getElementById(dateId).value='';
		for(i=0;i<=2;i++){
			if(formatStr.charAt(i)=='D') document.getElementById(dateId).value+=day;
			else if(formatStr.charAt(i)=='M') document.getElementById(dateId).value+=month;
			else if(formatStr.charAt(i)=='Y') document.getElementById(dateId).value+=year;
			if(i!=2) document.getElementById(dateId).value+=' ';
		}
	}
	isDateValid=isSelected=true;
	drawCalendar(false,false,false,false);
}

function checkDate(objID){
	var date=Array();
	dateObj=document.getElementById(objID);
	var dateStr=dateObj.value;
	if(dateStr.split('/').length==3) date=dateStr.split('/');
	else if(dateStr.split('.').length==3) date=dateStr.split('.');
	else if(dateStr.split(' ').length==3) date=dateStr.split(' ');
	else {
		dateObj.value='';
		return false;
	}
	if(date.length!=3) {
		dateObj.value='';
		return false;
	}
	if(isNaN(date[0]) || isNaN(date[1]) || isNaN(date[2])) {
		dateObj.value='';
		return false;
	}
	var formatArray=Array();
	dateFormat=document.getElementById(dateId+'_format').value;
	for(i=0;i<=2;i++){
		formatArray[dateFormat.charAt(i)]=date[i];
	}
	if(formatArray['Y'].length!=2 && formatArray['Y'].length!=4 || formatArray['Y']<0) {
		dateObj.value='';
		return false;
	}
	if(formatArray['Y'].length==2) formatArray['Y']=2000+1*formatArray['Y'];
	if((formatArray['M']-1)<0 || (formatArray['M']-1)>11) {
		dateObj.value='';
		return false;
	}
	if((formatArray['Y']%4==0 && formatArray['Y']%100!=0) || (formatArray['Y']%400==0)) daysInMonth[1]=29;
	else daysInMonth[1]=28;
	if(formatArray['D']<1 || formatArray['D']>daysInMonth[formatArray['M']-1]) {
		dateObj.value='';
		return false;
	}
	specDay=formatArray['D'];	selectedDay=formatArray['D'];
	specMonth=formatArray['M'];	selectedMonth=formatArray['M'];
	specYear=formatArray['Y'];	selectedYear=formatArray['Y'];
	return true;
}

function getCalendarX(objID){
	pElem = obj=document.getElementById(objID);
	prev_offset = offset = 0;
	while ("object" == typeof(pElem = pElem.parentElement)){
		if (!pElem) break;
		if (prev_offset == pElem.offsetLeft) continue; // для пропуска элементов типа tr,form,div и т.д.
		offset += pElem.offsetLeft;
		prev_offset = pElem.offsetLeft;
	}
	offset += obj.offsetLeft;
	return offset;
}

function getCalendarY(objID){
	pElem = obj=document.getElementById(objID);
	prev_offset = offset = 0;
	while ("object" == typeof(pElem = pElem.parentElement)){
		if (!pElem) break;
		if (prev_offset == pElem.offsetTop) continue;
		offset += pElem.offsetTop;
		prev_offset = pElem.offsetTop;
	}
	if (offset == 0) offset = obj.offsetTop;
	return (offset+obj.offsetHeight+2);
}