// Используем ли список доступных дат
var isUseAvailDates = true;

// Даты для календарика
availDates = new Array();


// путь к картинкам
var imagesFolder = '/scripts/calendar/';

var tasksLanguage = 'ru'
// имена месяцев и т.п.
var calendarNamesHash = new Array();
calendarNamesHash.ru = new Array();
calendarNamesHash.en = new Array();
calendarNamesHash.ru.month = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
//calendarNamesHash.ru.monthShort = ['января', 'феваля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
calendarNamesHash.ru.monthShort = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
calendarNamesHash.ru.weekday = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
calendarNamesHash.ru.today= 'сегодня';
calendarNamesHash.en.month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
calendarNamesHash.en.monthShort = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
calendarNamesHash.en.weekday = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
calendarNamesHash.en.today= 'today';
var calendarNames = calendarNamesHash[ tasksLanguage == 'en' ? 'en':'ru'];


// функция инициализации
function calendar(name,value,options) {
  writeInFields(name,value,options);
  updateCalendar(name);
}

// служебные функции
function zeroFill(value){
	return (value<10 ? '0':'')+value;
}

function date2string(date){
	d = '_0'+date.getDate();
	d = d.substring( d.length-2 );
	return d + '.' + calendarNames.monthShort[date.getMonth()] + '.' + date.getFullYear();
}

function date2value(date){
	return date.getFullYear()+'-'+zeroFill(date.getMonth()+1)+'-'+zeroFill(date.getDate())+' '+ zeroFill(date.getHours())+':'+zeroFill(date.getMinutes())+':00';
}

function value2date(value){
	if (value && value != '0000-00-00 00:00:00'){
		var re = /(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/i;
		var date = re.exec(value);
		if (date) return(new Date(date[1],date[2]-1,date[3],date[4],date[5],date[6]));
	}
  return null;
}

function getDateVal(value,what){
	if (value && value != '0000-00-00 00:00:00'){
	  var re = /(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/i;
	  var date = re.exec(value);
	  if (date) {
	    if (what == 'y') return date[1];
	    if (what == 'm') return date[2];
	    if (what == 'd') return date[3];
	  }
	}
  return null;
}

// интерфейсные функции
function updateCalendar(name){
	var date = getCalendarDateUnchecked(name);
	var hiddenValue = document.getElementsByName(name)[0];
	if (hiddenValue) {
	  var dateH = hiddenValue.value;
	  var yearInput = document.getElementsByName(name+'_yyyy')[0];
	  var monthInput = document.getElementsByName(name+'_mm')[0];
	  var dayInput = document.getElementsByName(name+'_dd')[0];
	  if (yearInput) yearInput.value = getDateVal(dateH,'y');
	  if (monthInput) monthInput.value = getDateVal(dateH,'m');
	  if (dayInput) dayInput.value = getDateVal(dateH,'d');
	}
	var dateInput = document.getElementsByName(name + 'Input')[0];
	var hoursInput = document.getElementsByName(name + 'Hours')[0];
	var minutesInput = document.getElementsByName(name + 'Minutes')[0];
	if (dateInput) dateInput.value = date ? date2string(date) : ' ';
	if (hoursInput) hoursInput.value = date ? date.getHours() : '-';
	if (minutesInput) minutesInput.value = date ? zeroFill(date.getMinutes()) : '-';
}

function getCalendarDateUnchecked(name) {
  var hiddenValue = document.getElementsByName(name)[0];
  return hiddenValue ? value2date(hiddenValue.value) : null;
}

function getCalendarDate(name) {
  var date=getCalendarDateUnchecked(name);
  return date ? date : new Date();
}

function putCalendarDate(name, date) {
  var hiddenValue = document.getElementsByName(name)[0];
  if (hiddenValue){ 
    hiddenValue.value = date2value(date);
    updateCalendar(name);
  }
}

function putCalendarValue(name,value){
	var hiddenValue = document.getElementsByName(name)[0];
	if (hiddenValue){
		hiddenValue.value = value;
		updateCalendar(name);	
	}
}

function calendarCallback(name, date, mode){
}

function changeCalendarDate(name, date, mode){
	var current=getCalendarDate(name);

	putCalendarDate(name,date);
	if (date2value(date) != date2value(current)){
		calendarCallback(name, date, mode);
	}
}

//
//  служебные функции, вычисления, HTML и т.д.
//
var closeCalendarTimeOut = 0;
// все-таки придется где-нибудь хранить какой именно календарик открыть (его имя)
var activeCalendarName = '';

function now(){
	
}

// функция вызывается при клике на дату в календаре
function setDateFromCalendar(dayToSet, monthToSet, yearToSet) {
	var dateToSet = getCalendarDate(activeCalendarName);
	dateToSet.setFullYear(yearToSet);
	dateToSet.setDate(1);
	dateToSet.setMonth(monthToSet);
	dateToSet.setDate(dayToSet);
	changeCalendarDate(activeCalendarName, dateToSet, 'date');
	// закрываем календарь
	hideCalendar();
}

function setTodayFromCalendar() {
	var date=new Date();
	setDateFromCalendar(date.getDate(),date.getMonth(),date.getFullYear());
}

function getCalendarTimeFromString(fieldName) {
	var hoursInput = document.getElementsByName(fieldName + 'Hours')[0];
	var minutesInput = document.getElementsByName(fieldName + 'Minutes')[0];
	if (hoursInput && minutesInput){
		var newDate = getCalendarDate(fieldName);
		var thisHour=parseInt(hoursInput.value);
		var thisMinutes=parseInt(minutesInput.value);
		if (!isNaN(thisHour)) newDate.setHours(thisHour);
		if (!isNaN(thisMinutes)) newDate.setMinutes(thisMinutes);
		changeCalendarDate(fieldName, newDate, 'time');
	}
}

function getCalendarDateFromString(fieldName) {
	var dateInput = document.getElementsByName(fieldName + 'Input')[0];
	var re = /^\s*(\d+)[\s|\/|.]+([^\s]+)[\s|\/|.]+(\d+)\s*$/i;
	var results = re.exec(dateInput.value);
	if (results){
		// если небыло ошибки регекспа
		var newDate = getCalendarDate(fieldName);
		// определяем год
		var newYear = parseInt(results[3]);
		if (newYear < 30) newYear += 2000;
		else if (newYear < 100) newYear += 1900;
		else if (newYear < 1930) newYear += 2000;
		// что при последнем может получиться - никто не знает
		newDate.setFullYear(newYear);
		newDate.setDate(1);
		if (isNaN(parseInt(results[2]))) {
			var monthStr = results[2].toLowerCase();
		// в качестве месяца - строка
		for (var i = 0; i < 12; i++) {
			if (
				calendarNamesHash.ru.month[i].toLowerCase().indexOf(monthStr) == 0 ||
				calendarNamesHash.ru.monthShort[i].toLowerCase().indexOf(monthStr) == 0 ||
				calendarNamesHash.en.month[i].toLowerCase().indexOf(monthStr) == 0 ||
				calendarNamesHash.en.monthShort[i].toLowerCase().indexOf(monthStr) == 0
			) {
				newDate.setMonth(i);
				break;
			}
		}
	} else {
		// пришло число в качестве месяца
		// если нужно проверять не на американский манер
		// была ли передана дата, то это здесь
		newDate.setMonth(parseInt(results[2]) - 1);
	}
	newDate.setDate(parseInt(results[1]));
	changeCalendarDate(fieldName, newDate, 'date');
	} else {
		// если по какой-то причине регексп не сработал
	  if (dateInput.value){
  	  alert('Неверный формат даты');
    	updateCalendar(fieldName);
	  }
	}
}

// внешний вид и поведение
var pixelSpacer = '<div style="width: 1px; height: 1px;" ><spacer type="block" width="1" height="1" /><\/div>';
function writeInFields(name, value, options) {
// Вставляет HTML-код с необходимыми полями...
	document.write('<input type="hidden" name="' + name + '" value="' + value + '" />');
/*	
	document.write('<input type="hidden" name="' + name + '_yyyy" value="' + getDateVal(value,'y') + '" />');
	document.write('<input type="hidden" name="' + name + '_mm" value="' + getDateVal(value,'m') + '" />');
	document.write('<input type="hidden" name="' + name + '_dd" value="' + getDateVal(value,'d') + '" />');
	document.write('<input type="hidden" name="' + name + '_ping" value="1" />');
*/	
	document.write('<table cellpadding="0" cellspacing="0" border="0" class="tblInput"><tr valign="bottom">');
	if( options != 2 ){
		document.write('<td><input type="text" class="inputStr" name="' + name + 'Input" size="9" onBlur="getCalendarDateFromString(\'' + name + '\');" /><\/td>');
		document.write('<td valign="middle"><img style="border:none;" type="Image" src="' + imagesFolder + 'calBtn2.gif" class="calBtn" name="' + name + 'Btn" onClick="showCalendarForElement(\'' + name + '\', event); return false;" />');
		document.write('<\/td>');
		document.write('<td>' + pixelSpacer + '<\/td>');
		document.write('<td valign="middle">&nbsp;&nbsp;<\/td>');
	}
	if ( options == 1 || options == 2 ) {
		document.write('<td><input type="text" id="' + name + '_Hours" name="' + name + 'Hours" size="1" onBlur="getCalendarTimeFromString(\'' + name + '\');" style="text-align: right;" /><\/td>');
		document.write('<td valign="middle"><small>&nbsp;:&nbsp;<\/small><\/td>');
		document.write('<td><input type="text" id="' + name + '_Minutes" name="' + name + 'Minutes" size="1" onBlur="getCalendarTimeFromString(\'' + name + '\');" /><\/td>');
		document.write('<td valign="middle">&nbsp;&nbsp;<\/td>');
	}
	document.write('<\/tr><tr><td colspan="2"><div id="' + name + 'Ptr" style="width: 1px; height: 1px;"><spacer type="block" width="1" height="1" /><\/div><\/td>');
	document.write('<td>' + pixelSpacer + '<\/td><\/tr>');
	document.write('<\/table>');
}

function showCalendarForElement(elemName, evt) {

	var badSelect = document.getElementById('price');
	if(badSelect){badSelect.style.visibility = 'hidden'}

	var calPtr = document.getElementById(elemName + 'Ptr');
	if (calPtr) {
		// показывает календарь в слое (создает слой, если необходимо)
		var calLeer = document.getElementById('calendarLeer');
		if (!calLeer) {
			calLeer = document.createElement('div');
			calLeer.id = 'calendarLeer';
			document.getElementsByTagName('body')[0].appendChild(calLeer);
		}
		// проверяем показан ли слой, если да - скрываем
		if (calLeer.style.visibility == 'visible' && activeCalendarName == elemName) {
			calLeer.style.visibility = 'hidden';
		} else {
			activeCalendarName = elemName;
			// скрываем слой
			calLeer.style.visibility = 'hidden';
			// вычисляем где именно должен быть этот календарь.
			var calPosition = new getElementPosition(calPtr);
			// заполняем нужным кодом...
			// смотрим какая дата нас интересует
			var currDate = getCalendarDate(elemName);
			// собственно вызываем код
			calLeer.innerHTML = calendarHTML(currDate.getMonth(), currDate.getFullYear(), currDate);
			// ставим слой на место
			//calLeer.style.left = calPosition.x - calLeer.offsetWidth;
			calLeer.style.left = calPosition.x - calLeer.offsetWidth/3*2;
			calLeer.style.top = calPosition.y-2;
			// и показываем
			calLeer.style.visibility = 'visible';

			// наконец, прекращаем баблинг (может, кто-то открыл без event'а)
			if (evt) evt.cancelBubble = true;
			// и ставим свой обработчик на клик на календаре (чтобы не скрывался)
			addEvent(calLeer, 'click', calendarClick);
			// и на mouseout (чтобы скрывался, но через некоторое время ;-)
			addEvent(calLeer, 'mouseover', calendarMouseOver);
			addEvent(calLeer, 'mouseout', calendarMouseOut);
			
			calLeer.innerHTML += '';
			
			
		}
	}
	
}


function calendarClick(e) {
	evt = (e)? e : window.event;
	evt.cancelBubble = true;
}

function calendarMouseOver(e) {
	if (closeCalendarTimeOut) {
		clearTimeout(closeCalendarTimeOut);
	closeCalendarTimeOut = 0;
	}
}

function calendarMouseOut(e) {
	if (closeCalendarTimeOut) {
		clearTimeout(closeCalendarTimeOut);
	}
	closeCalendarTimeOut = setTimeout('hideCalendar()', 5000);
}

function hideCalendar() {
	var calLeer = document.getElementById('calendarLeer');
	if (calLeer) calLeer.style.visibility = 'hidden';
	closeCalendarTimeOut = 0;

	var badSelect = document.getElementById('price');
	if(badSelect){badSelect.style.visibility = 'visible'}
}

function switchMonthTo(month, year) {
	var calLeer = document.getElementById('calendarLeer');
	if (calLeer) {
		// заполняем нужным кодом...
		// смотрим какая дата нас интересует
		var currDate = getCalendarDate(activeCalendarName);
		// собственно вызываем код
		calLeer.innerHTML = calendarHTML(month, year, currDate);
	}
}

function calendarHTML(month, year, currDate) {
	// смотрим этот ли месяц показываем
	var isThisMonth = (currDate)? (currDate.getMonth() == month && currDate.getFullYear() == year) : false;
	
	// генерирует html-код для указанного месяца
	
	// устанавливаем месяц, который будем рисовать
	var drawMonth = new Date(); drawMonth.setMonth(month, 1); drawMonth.setYear(year); drawMonth.setDate(1);
	
	// переменные для кнопок навигации по месяцам/годам
	var thisMonth = drawMonth.getMonth();
	var nextMonth = (thisMonth == 11)? 0 : thisMonth + 1;
	var prevMonth = (thisMonth == 0)? 11 : thisMonth - 1;
	var thisYear = drawMonth.getFullYear();
	var nextMonthYear = (thisMonth == 11)? thisYear + 1 : thisYear;
	var nextYear = thisYear + 1;
	var prevMonthYear = (thisMonth == 0)? thisYear - 1 : thisYear;
	var prevYear = thisYear - 1;
	// запихиваем в строку весь код - открываем таблицы...
	var calendarCode = '<table class="calTable" cellpadding="0" cellspacing="0" border="0">';
	calendarCode += '<tr><td class="purpleCell"><table cellpadding="0" cellspacing="3" border="0" width="100%">';
	// здесь указываем клик на прошлый год
	calendarCode += '<tr class="tr-year"><td><img src="' + imagesFolder + 'arr-prev.gif" width="15" height="16" border="0" onClick="switchMonthTo(' + thisMonth + ', ' + prevYear + ')" style="cursor: pointer; cursor: hand;" /><\/td>';
	// текущий (показываемый) год
	calendarCode += '<td align="center" class="purpleCell">' + thisYear + '<\/td>';
	// клик на следующий год
	calendarCode += '<td align="right"><img src="' + imagesFolder + 'arr-next.gif" width="15" height="16" border="0" onClick="switchMonthTo(' + thisMonth + ', ' + nextYear + ')" style="cursor: pointer; cursor: hand;" /><\/td><\/tr>';
	// клик на предыдущий месяц
	calendarCode += '<tr class="tr-month"><td><img src="' + imagesFolder + 'arr-prev.gif" width="15" height="16" border="0" onClick="switchMonthTo(' + prevMonth + ', ' + prevMonthYear + ')" style="cursor: pointer; cursor: hand;" /><\/td>';
	// текущий месяц
	calendarCode += '<td align="center" class="purpleCell" style="width:70px;">' + calendarNames.month[thisMonth] + '<\/td>';
	// клик на следующий месяц
	calendarCode += '<td align="right"><img src="' + imagesFolder + 'arr-next.gif" width="15" height="16" border="0" onClick="switchMonthTo(' + nextMonth + ', ' + nextMonthYear + ')" style="cursor: pointer; cursor: hand;" /><\/td><\/tr>';
	calendarCode += '<\/table><\/td><\/tr>';
	// начинаем таблицу самого месяца
	calendarCode += '<tr><td style="border-top: 1px solid #D7D7D7;" bgcolor="#ffffff"><table class="tblNumCells" cellpadding="0" cellspacing="0" border="0" width="100%" style="border-bottom: 1px solid #D7D7D7;"><tr>';
	calendarCode += '<td class="whiteCell emptyCell">&nbsp;<\/td><td class="whiteCell emptyCell">&nbsp;<\/td>';
	for (var i = 0; i < calendarNames.weekday.length; i++) {
		var styleClass = (i < calendarNames.weekday.length - 1)? 'weekDay' : 'weekSunday';
		calendarCode += '<td class="'+styleClass+'" align="right">' + calendarNames.weekday[i] + '<\/td>';
	}
	calendarCode += '<td class="whiteCell emptyCell">&nbsp;<\/td><td class="whiteCell emptyCell">&nbsp;<\/td><\/tr>';

	// разделительная полоска
	calendarCode += '<tr class="div"><td height="1" nowrap="nowrap" class="emptyCell"><img class="s"><\/td>';
	calendarCode += '<td class="div-line" height="1" nowrap="nowrap" colspan="9"><img class="s"><\/td>';
	calendarCode += '<td height="1" nowrap="nowrap" class="emptyCell"><img class="s"><\/td><\/tr>';
	// сам месяц

	calendarCode += '<tr class="tr-cells"><td class="whiteCell emptyCell"><br /><\/td><td class="whiteCell emptyCell"><br /><\/td>';
	// рисуем пустые ячейки если нужно...
	var daysToStart = (drawMonth.getDay() == 0)? 7 : drawMonth.getDay();
	for (var i = 0; i < daysToStart - 1; i++) calendarCode += '<td class="whiteCell"><br /><\/td>';

	cMonth = thisMonth + 1;
	cMonth = cMonth < 10 ? '0' + cMonth : cMonth;
	cYear = thisYear;
	
	// собственно циферки
	for (var i = 1; i < 33; i++) {
		drawMonth.setDate(i);
		if (isThisMonth && i == currDate.getDate()) {
			
			if( isUseAvailDates == null || isUseAvailDates == false ){
				calendarCode += '<td class="blackCell" align="right" style="cursor: pointer; cursor: hand; font-weight:bold;"  onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" >' + i + '<\/td>';
			} else {
				cDate = cYear + '-' + cMonth + '-' + ( i < 10 ? '0' + i : i );
				if( availDates != null && availDates[cDate] != null  ){
					isAvail = true;
				}
				calendarCode += '<td class="blackCell" align="right" '+( isAvail ? ' onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" ' : '' )+' style="'+( isAvail ? ( 'cursor: pointer; cursor: hand; font-weight:bold; color:'+( (drawMonth.getDay() == 0) ? '#aa0000' : 'black' ) ) : ( 'font-weight:normal; color:'+( (drawMonth.getDay() == 0) ? '#eecccc' : '#bbbbbb' ) ) )+'">' + i + '<\/td>';
			}
			
		} else {
			if (drawMonth.getMonth() == thisMonth) {
				var styleClass = (drawMonth.getDay() == 0)? 'sundayCell' : 'whiteCell';
				
				if( isUseAvailDates == null || isUseAvailDates == false ){
					calendarCode += '<td class="' + styleClass + '" align="right" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'' + styleClass + '\';" onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" style="cursor: pointer; cursor: hand; font-weight:bold;">' + i + '<\/td>';
				} else {

					cDate = cYear + '-' + cMonth + '-' + ( i < 10 ? '0' + i : i );

					isAvail = false;
					if( availDates != null && availDates[cDate] != null  ){
						isAvail = true;
					}
				
					if( isAvail ){
						calendarCode += '<td class="' + styleClass + '" align="right" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'' + styleClass + '\';" onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" style="cursor: pointer; cursor: hand; font-weight:bold; color:'+ ( (drawMonth.getDay() == 0) ? '#aa0000' : 'black' ) +';">' + i + '<\/td>';
					} else {
						calendarCode += '<td class="' + styleClass + '" align="right" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'' + styleClass + '\';" style="color:'+ ( (drawMonth.getDay() == 0)? '#eecccc' : '#cccccc' ) +';">' + i + '<\/td>';
					}					
				}
				
			} else break;
		}
		if (drawMonth.getDay() == 0) calendarCode += '<td class="whiteCell emptyCell"><br /><\/td><td class="whiteCell emptyCell"><br /><\/td><\/tr><tr class="tr-cells"><td class="whiteCell emptyCell"><br /><\/td><td class="whiteCell emptyCell"><br /><\/td>';
	}

	// опять рисуем пустые ячейки
	if (drawMonth.getDay() != 1) {
		var daysToEnd = 8 - ((drawMonth.getDay() == 0)? 7 : drawMonth.getDay());
		for (var i = 0; i < daysToEnd; i++) calendarCode += '<td class="whiteCell"><br /><\/td>';
	}
	calendarCode += '<td class="whiteCell emptyCell"><br /><\/td><td class="whiteCell emptyCell"><br /><\/td><\/tr><\/table><\/td><\/tr>';
	// ссылка на сегодня
	calendarCode += '<tr class="tr-today"><td class="whiteCell" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'whiteCell\';" style="padding: 6px; cursor: pointer; cursor: hand;" align="center" onClick="setTodayFromCalendar();">'+calendarNames.today+'<\/td><\/tr>';
	// конец
	calendarCode += '<\/table>';
	return calendarCode;
}

function getElementPosition(elemPtr) {
	var posX = elemPtr.offsetLeft;
	var posY = elemPtr.offsetTop;
	while (elemPtr.offsetParent != null) {
		elemPtr = elemPtr.offsetParent;
		posX += elemPtr.offsetLeft;
		posY += elemPtr.offsetTop;
	}
	this.x = posX;
	this.y = posY;
	return this;
}

function addEvent(elementPtr, eventType, eventFunc) {
	if (elementPtr.addEventListener) {
		elementPtr.addEventListener(eventType, eventFunc, false);
	} 
	if (elementPtr.attachEvent) {
		elementPtr.attachEvent('on' + eventType, eventFunc);
	} else {
		// что делать если ни то ни другое не поддерживается
	}
}

addEvent(document, 'click', hideCalendar);
addEvent(window, 'resize', hideCalendar);


