var showLocked = true;
var firstClick = true;

var lastDay = 3650;

var today = new Date();

function yearToString(month) {
	return month == undefined ? undefined : monthNamesLong[ month ].substr(0,10);
}

function monthToString(month) {
	return month == undefined ? undefined : monthNamesLong[ month ].substr(0,10);
}

function dayToString(day) {
	return day == undefined ? undefined : dayNamesLong[ day ].substr(0,2);
}

function ymdToDay(year,month,day) {
	var currentDate = new Date(year,month,day, today.getHours(), today.getMinutes(), today.getSeconds());
	return Math.round( (currentDate - today) / (24 * 60 * 60 * 1000) )
}

function dayToYMD(day) {
	if (day == undefined)
		return '';
	var currentDate = new Date(today.getFullYear(),today.getMonth(),today.getDate()+day);
	
	var currentDateStr = currentDate.getDate() + '.' + (currentDate.getMonth()+1) + '.' + currentDate.getFullYear();
	return currentDateStr;
}

function parseDate(str) {
	if (str.match(/(\d{2})(\d{2})(\d{2,4})/)) {
		var d = RegExp.$1;
		var m = RegExp.$2;
		var y = RegExp.$3;	
	} else if (str.match(/(\d{1,2})\W*(\w*)\W*(\d{1,4})/)) {
		var d = RegExp.$1;
		var m = RegExp.$2;
		var y = RegExp.$3;	
	} else {
		alert('Invalid date!');
		return undefined;
	}
	var m_num = parseInt(m);
	if (isNaN(parseInt(m))) {
		var e = new RegExp(m, "i");	
		var found = false;
		for (i = 0; i < 12; i++) {
			var ar = e.exec(monthNamesLong[i]);
			if (ar != undefined) {
				m = i;
				found = true;
				break;
			}
		}
		if (!found) {
			alert('Invalid date!');
			return undefined;
		}
	} else {
		m--;
	}
	if (y < 20)
		y = parseInt(y) + 2000;
	var day = ymdToDay(y,m,d);
	if (day < 0) {
		alert('Date in the past!');
		return undefined;
	}
	if (day > lastDay) {
		alert('Date too far in the future!');
		return undefined;
	}
	return day;
}

function highlightSelected() {	
	for ( i = 0; i <= lastDay; i++ )
		if (document.getElementById(i)) {
		  document.getElementById(i).className = lock[ i ] && showLocked ? '' : '';
    }
	for ( i = arrivalDay; i <= departureDay; i++ )
		if (document.getElementById(i))
			document.getElementById(i).className = 'selected';

	if (arrivalDay != undefined) {
		document.getElementById('arrival').value = dayToYMD(arrivalDay);
		document.getElementById('departure').value = dayToYMD(departureDay);
		document.getElementById('total_nights').value = departureDay - arrivalDay;
	}
}	

function nbCalendarMonth(month,year) {

	var first = new Date(year,month,1);
	var monthOffset = first.getDay() - 1;
	if ( monthOffset == -1 ) monthOffset = 6;
	var last = new Date(year,month+1,0);
	var daysInMonth = last.getDate();
	
	var monthLine = "<tr><td colspan=7 class=nbTdHead>" + monthToString(month) + " " + year + "</tr>";

	var dowLine = "<tr>";
	for ( dow = 1; dow <= 7; dow++ )
		dowLine += "<td class=nbTdHead2>" + dayToString(dow);
	dowLine += "</tr>";

	var womLines = "";
	for ( wom = 0; wom <= 5; wom++ ) {
		var womLine = "";
		for ( dow = 1; dow <= 7; dow++ ) {
			var day = 7 * wom + dow - monthOffset;
			if (1 <= day && day <= daysInMonth) {
				var dd = ymdToDay(year,month,day);
				if (dd < 0) {
					womLine += "<td class=" + (dd < 0 ? "past" : "noprice") + ">" + day;
				} 
        else {
					if (day < 10)
						day = '&nbsp;' + day;
					womLine += "<td id=" + dd + ">" + "<a class=nbCalDay  href='#'  onClick='nbCalClick(event); return false;'>" + day + "</a>";
				}
			} else {
				womLine += "<td>&nbsp;";
			} 
		}
		womLines += "<tr>" + womLine + "</tr>";
	}

	return "<table class=nbCalMonth>" + monthLine + dowLine + womLines + "</table>";
}


function nbCalendar(offset) {
	var y	= today.getFullYear();
	var m	= today.getMonth();
	var m0	= new Date(y, m + offset + 0, 1);
	var m1	= new Date(y, m + offset + 1, 1);
	var m2	= new Date(y, m + offset + 2, 1);

	document.getElementById('nbCalDiv').innerHTML = "<table cellpadding=0><tr>" 
		+ "<td class=nbCalNav><a class=nbCalNav  href='#'  onClick='nbCalendar(" + (offset - 3) + "); return false;'>«</a>"
		+ "<td class=nbCalMonth>" + nbCalendarMonth(m0.getMonth(), m0.getFullYear())
		+ "<td class=nbCalMonth>" + nbCalendarMonth(m1.getMonth(), m1.getFullYear())
		+ "<td class=nbCalMonth>" + nbCalendarMonth(m2.getMonth(), m2.getFullYear())
  	+ "<td class=nbCalNav><a class=nbCalNav  href='#'  onClick='nbCalendar(" + (offset + 3) + "); return false;'>»</a></td>"
		+ "</tr></table>";

	highlightSelected();
}


function nbAvailableDays(arrival, departure) {
	for ( i = arrival; i < departure; i++ ) 	// should NOT test i == departure
		if (lock[ i ])
			return false;
	return true;
}
	

function nbCalClick(e) {
	var srcEl = document.all ? event.srcElement : e.target;
	var tdEl = document.all ? srcEl.parentNode : srcEl.parentNode;
	nbCalUpdate(parseInt(tdEl.id));
}	

function nbCalUpdate(d) {

	if ( lock[ d ] && arrivalDay != undefined && arrivalDay < d && nbAvailableDays(arrivalDay, d) ) {
		departureDay = d;
		highlightSelected();
		firstClick = false;
		return;
	}
	if ( lock[ d ] ) {
		if (!showLocked) {
			showLocked = confirm('We are sorry. Selected date is closed!' + ' ' + 'Do you want to highlight unavailable dates?');
		} else {
			alert('We are sorry. Selected date is closed!');
		}
		highlightSelected();
		return;
	}
	if ( arrivalDay == undefined || firstClick ) {
		arrivalDay = d;
		departureDay = d + nights;
		highlightSelected();
		if (firstClick)
			firstClick = false;
		return;
	} 
	if ( Math.abs(arrivalDay - d) <= Math.abs(departureDay - d) ) {
		if (nbAvailableDays(d, departureDay)) {
			arrivalDay = d;
		} else {
			if (!showLocked) {
				showLocked = confirm('We are sorry. Selected date is closed!' + ' ' + 'Do you want to highlight unavailable dates?');
			} else {
				alert('We are sorry. Selected date is closed!');
			}
			arrivalDay = d;
			departureDay = d + 1;
			highlightSelected();
		}
	} else {
		if (nbAvailableDays(departureDay,d)) {
			departureDay = d;
		} else {
			if (!showLocked) {
				showLocked = confirm('We are sorry. Selected date is closed!' + ' ' + 'Do you want to highlight unavailable dates?');
			} else {
				alert('We are sorry. Selected date is closed!');
			}
			arrivalDay = d;
			departureDay = d + 1;
			highlightSelected();
		}
	}	
	highlightSelected();
}


function updateArr() {
	var d = parseDate(document.getElementById('arrival').value);
	var nights = parseInt(document.getElementById('total_nights').value);
	if (isNaN(nights) || nights == 0)
		nights = 1;
	if (nbAvailableDays(d, d+nights)) {
		arrivalDay = d;
		departureDay = d + nights;
		highlightSelected();
	} else {
		alert('We are sorry. Selected date is closed!');
	}
}


function updateDep() {
	var d = parseDate(document.getElementById('departure').value);
	if (nbAvailableDays(arrivalDay, d)) {
		departureDay = d;
		document.getElementById('total_nights').value = d - arrivalDay;
		highlightSelected();
	} else {
		alert('We are sorry. Selected date is closed!');
	}
}


function updateNights() {
	var nights = parseInt(document.getElementById('total_nights').value);
	if (isNaN(nights) || nights == 0)
		nights = 1;
	if (nbAvailableDays(arrivalDay, arrivalDay+nights)) {
		departureDay = arrivalDay + nights;
		highlightSelected();
	} else {
		alert('We are sorry. Selected date is closed!');
	}
	document.getElementById('departure').value = dayToYMD(departureDay);
}


function nbResetForm() {
/*
	arrivalDay = undefined;
	departureDay = undefined;
	nights = 1;
	document.getElementById('arrival').value = '';
	document.getElementById('departure').value = '';
	document.getElementById('total_nights').value = '1';
	*/
	firstClick = true;
	arrivalDay = st_arrivalDay;
  departureDay = st_departureDay;
  nights = st_nights;
	document.getElementById('arrival').value = dayToYMD(arrivalDay);
	document.getElementById('departure').value = dayToYMD(departureDay);
	document.getElementById('total_nights').value = nights;
	nbCalendar(0);
	highlightSelected();
}

function nbShowLocked() {
	showLocked = 1;
	highlightSelected();
}

function nbInitCal() {
	document.getElementById('arrival').value = dayToYMD(arrivalDay);
	document.getElementById('departure').value = dayToYMD(departureDay);
	document.getElementById('total_nights').value = nights;
	nbCalendar(0);
	highlightSelected();
	//showErrorFields();	
}


