var totalTime = 200;
var timeout = 20;
var execTime = 0;
var date1;
var date2;
var milliseconds1;
var milliseconds2;
var scrolled = 0;
var initialized = 0;


var cals = [];
var currentlyScrolling = 0;
var calendarShown = 0;
var calendar_src = "/images/calendar.gif";

function initialize_calendar(what, otherwhat) {
	var xmlhttp = openAjax();
	if (typeof xmlhttp == 'object' && initialized == 0) {
		xmlhttp.open("GET", calendar_src, true);
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				if(xmlhttp.status != 200) {
					calendar_src = "images/calendar.gif";
				}
				initialized = 1;
				document.getElementById(what+"calendaricon").innerHTML = '<img src="'+calendar_src+'" onclick="toggle_calendar(\''+what+'\', \''+otherwhat+'\')" />';
			}
		}
		xmlhttp.send(null)
	}
	else {
		document.getElementById(what+"calendaricon").innerHTML = '<img src="'+calendar_src+'" onclick="toggle_calendar(\''+what+'\', \''+otherwhat+'\')" />';
	}
}

var cal_left = 0;
var cal_top = 0;
var cur_calendar;
var other_calendar;
var prev_calendar;
var forcehide = 0;


// Prevents the stupid Opera double click pop up when the calendar is shown
if (typeof document.onselectstart!="undefined") document.onselectstart= disableselect;
else document.onmousedown=disableselect;
function disableselect(e) {
	if (calendarShown == 1) return false;
}



function toggle_calendar(what, otherwhat) {

	if (calendarShown == 1) {
		var elem = document.getElementById("container");
		if (!forcehide && (mousex > cal_left && mousex < cal_left+elem.clientWidth) && (mousey > cal_top && mousey < cal_top+elem.clientHeight)) {
			return;
		}
		else {
			prev_calendar = cur_calendar;
			calendarShown = 0;
			cur_calendar = null;
			other_calendar = null;
			hide_calendar();
			forcehide = 0;
		}
	}
	else {
		calendarShown = 1;
		cur_calendar = what;
		other_calendar = otherwhat;
		show_calendar();

		var elem = document.getElementById("container");
		var pos = findPos(elem);
		cal_left = pos.left;
		cal_top = pos.top;
	}
}
function show_calendar () {
    if (!document.getElementById(cur_calendar+"month")) alert(cur_calendar);
    
	firstmonth = document.getElementById(cur_calendar+"month").value;
	firstyear = document.getElementById(cur_calendar+"year").value;

	if (firstyear == 0 && firstmonth == 0 && document.getElementById(other_calendar+"month")) {
		firstmonth = document.getElementById(other_calendar+"month").value;
		firstyear = document.getElementById(other_calendar+"year").value;
	}
	if (firstyear == 0 && firstmonth == 0 && prev_calendar) {
		firstmonth = document.getElementById(prev_calendar+"month").value;
		firstyear = document.getElementById(prev_calendar+"year").value;
	}
	if (firstyear == 0) {
		var date = new Date();
		if (firstmonth == 0) {
			firstmonth = date.getMonth()+1;
		}
		firstyear = date.getFullYear();
	}
	else if (firstmonth == 0) {
		var date = new Date();
		firstmonth = date.getMonth()+1;
	}

	cals[0] = [firstyear, firstmonth];
	cals[1] = getMonth(firstyear, firstmonth, +1);

	var elem = document.getElementById("calendar_main_container");
	elem.innerHTML = '<div id="button_left" onclick="scrollBackward()"></div>';
	elem.innerHTML += '<div id="button_right" onclick="scrollForward()"></div>';
	elem.innerHTML += '<div id="container"><div id="calendardiv"></div></div>';


	for (var i=0; i<cals.length; i++) {
		document.getElementById("calendardiv").innerHTML += buildCal(cals[i][1] ,cals[i][0], "main", "month", "daysofweek", "days", 0);
	}
	document.getElementById('container').style.width = document.getElementById('cal_'+cals[0][0]+'_'+cals[0][1]).offsetWidth * 2 + 'px';
	document.getElementById('button_right').style.left = document.getElementById('container').style.width;
	document.getElementById('container').style.height = document.getElementById('cal_'+cals[0][0]+'_'+cals[0][1]).offsetHeight + 'px';

	var pos = findPos(document.getElementById(cur_calendar+"calendaricon"));
	var topPos = pos.top + 25;
	document.getElementById("container").style.top = topPos + 'px';
	document.getElementById("button_left").style.top = topPos + 'px';
	document.getElementById("button_right").style.top = topPos + 'px';

	var leftPos = pos.left - 100;
	document.getElementById("container").style.left = leftPos + 'px';
	document.getElementById("button_left").style.left = leftPos + 'px';
	document.getElementById("button_right").style.left = Number(document.getElementById("button_right").style.left.replace('px','')) + leftPos + 'px';

// 	document.onclick = toggle_calendar; // For some reason hide_calendar is executed right away. Why is that????
	setTimeout("hide_calendar_set()",1);

}

function hide_calendar_set() {
	document.onclick = function() {toggle_calendar()};
}


function hide_calendar() {
	document.onclick = null;
	document.getElementById("calendar_main_container").innerHTML = "";
}


function findPos(obj) {
	var obj2 = obj;
	var curtop = 0;
	var curleft = 0;
	if (document.getElementById || document.all) {
		do  {
			curleft += obj.offsetLeft-obj.scrollLeft;
			curtop += obj.offsetTop-obj.scrollTop;
			obj = obj.offsetParent;
			obj2 = obj2.parentNode;
			while (obj2!=obj) {
				curleft -= obj2.scrollLeft;
				curtop -= obj2.scrollTop;
				obj2 = obj2.parentNode;
			}
		} while (obj.offsetParent)
	}
	else if (document.layers) {
		curtop += obj.y;
		curleft += obj.x;
	}
	return { top: curtop, left: curleft };
}   // end of findPos()

function buildCal(m, y, cM, cH, cDW, cD, brdr) {

	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 oD = new Date(y, m-1, 1); //DD replaced line to fix date bug when current day is 31st
	oD.od=oD.getDay()+1; //DD replaced line to fix date bug when current day is 31st

	var todaydate=new Date() //DD added
	var scanfortoday=(y==todaydate.getFullYear() && m==todaydate.getMonth()+1)? todaydate.getDate() : 0 //DD added

	dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
	var t='<div class="'+cM+'"><table id="cal_'+y+'_'+m+'" class="'+cM+'" cols="7" cellpadding="0" border="'+brdr+'" cellspacing="0"><tr align="center">';
	t+='<td colspan="7" align="center" class="'+cH+'">'+mn[m-1]+' '+y+'</td></tr><tr align="center">';

	for(s=0;s<7;s++) {
		borderright = (s==6) ? ' borderright' : '';
		borderleft = (s==0) ? ' borderleft' : '';
		t+='<td class="'+cDW+borderleft+borderright+'">'+"SMTWTFS".substr(s,1)+'</td>';

	}
	t+='</tr><tr align="center">';

	for(var i=1;i<=42;i++){
		if ((i-oD.od>=0)&&(i-oD.od<dim[m-1])) {
			x=i-oD.od+1;
			var x_onclick = ' onclick="setDate('+y+','+m+','+x+')"';
			var day_selected = "";
			if (document.getElementById(cur_calendar+"month").value == m && document.getElementById(cur_calendar+"year").value == y && document.getElementById(cur_calendar+"day").value == x) day_selected = " day_selected";
			else if (document.getElementById(other_calendar+"month") && document.getElementById(other_calendar+"month").value == m && document.getElementById(other_calendar+"year").value == y && document.getElementById(other_calendar+"day").value == x) day_selected = " day_selected";
		}
		else {
			day_selected = '';
			var x='&nbsp;';
			var x_onclick = '';
		}

		var curdate = new Date();
		curdate.setFullYear(y, m-1, x);
		if (curdate < todaydate) {
			expired =  ' expired';
			x_onclick = '';
		}
		else {
			expired = ' current';
		}
		if (x == '&nbsp;') expired = '';
		var today = (x==scanfortoday) ? ' today' : '';

		borderright = ((i)%7==0) ? ' borderright' : '';
		borderleft = ((i)%7==1) ? ' borderleft' : '';
		t+='<td class="'+cD+borderleft+borderright+expired+day_selected+today+'"'+x_onclick+'>'+x+'</td>';
		if(((i)%7==0)&&(i<36)) t+='</tr><tr align="center">';
	}
	t+='</tr></table></div>';
	return t;
}

function setDate(y,m,d) {
	var year_elem = document.getElementById(cur_calendar+'year');
	for (var i = 0; i < year_elem.options.length; i++) {
		if (year_elem.options[i].value == y) {
			year_elem.options[i].selected = true;
			break;
		}
	}

	var month_elem = document.getElementById(cur_calendar+'month');
	for (var i = 0; i < month_elem.options.length; i++) {
		if (month_elem.options[i].value == m) {
			month_elem.options[i].selected = true;
			break;
		}
	}

	var day_elem = document.getElementById(cur_calendar+'day');
	for (var i = 0; i < day_elem.options.length; i++) {
		if (day_elem.options[i].value == d) {
			day_elem.options[i].selected = true;
			break;
		}
	}

	/*######### Functions to execute on a successful date select ######## */
	if(cur_calendar == 'in_') { // add reservations
		change_check_out();
	}
	else if (cur_calendar == 'out_') { // add reservations
		disable_date_change();
	}
	else if (cur_calendar == 'start_') { // view all reservations
		change_last_date();
	}
	else if (document.getElementById("price")) { // car rentals
		updateprice();
	}
	else if (document.getElementById(cur_calendar+"reserve")) { // tour reserve
		document.getElementById(cur_calendar+"reserve").checked = true;
		enableDate(cur_calendar,document.getElementById(cur_calendar+"tourname").value);

	}
	/*################################################################### */

	forcehide = 1;
	toggle_calendar();
	if (calendar_hide_function) eval(calendar_hide_function + '()');
}
function getMonth(y,m,offset) {
	var oldmonth = new Date(y,m-1,1);
	var newmonth = new Date();
	newmonth.setFullYear(oldmonth.getFullYear(), oldmonth.getMonth()+offset, 1);
	var ret = [newmonth.getFullYear(), newmonth.getMonth()+1];
	return ret;
}


function scrollForward() {
	if (currentlyScrolling == 1) return false;
	currentlyScrolling = 1;
	// Add new calendar
	var newdate = getMonth(cals[1][0],cals[1][1],+1);
	var month = newdate[1]+1;

	var newcontent = document.getElementById("calendardiv").innerHTML.replace(/(\r\n|\n|\r)/gm,"") + buildCal(newdate[1], newdate[0], "main", "month", "daysofweek", "days", 0);
	document.getElementById("calendardiv").innerHTML = newcontent;

	// Scroll calendars
	var scroll = document.getElementById('cal_'+newdate[0]+'_'+newdate[1]).offsetWidth * -1;
	firstCal = document.getElementById('cal_'+cals[0][0]+'_'+cals[0][1]);

	var toBeRemoved = firstCal;
	doScroll('cal_'+cals[0][0]+'_'+cals[0][1], scroll, toBeRemoved);

	// Set cals variable with currently displayed calendars
	cals[0] = cals[1];
	cals[1] = newdate;
}

function scrollBackward() {
	if (currentlyScrolling == 1) return false;
	currentlyScrolling = 1;
	// Add new calendar
	var newdate = getMonth(cals[0][0],cals[0][1],-1);
	var month = newdate[1]+1;

	var newcontent = buildCal(newdate[1], newdate[0], "main", "month", "daysofweek", "days", 0) + document.getElementById("calendardiv").innerHTML.replace(/(\r\n|\n|\r)/gm,"");
	document.getElementById("calendardiv").innerHTML = newcontent;

	// Scroll calendars
	var scroll = document.getElementById('cal_'+newdate[0]+'_'+newdate[1]).offsetWidth;
	firstCal = document.getElementById('cal_'+cals[0][0]+'_'+cals[0][1]);

	var toBeRemoved = document.getElementById('cal_'+cals[1][0]+'_'+cals[1][1]);
	doScroll('cal_'+newdate[0]+'_'+newdate[1], scroll, toBeRemoved);

	// Set cals variable with currently displayed calendars
	cals[1] = cals[0];
	cals[0] = newdate;
}

function doScroll(elemName, scrollAmount, toBeRemoved) {
	if (!execTime) {
		date1 = new Date();
		milliseconds1 = date1.getTime();
		execTime = 1;

		if (scrollAmount > 0) scrolled = -scrollAmount;
	}

	elem = document.getElementById(elemName);
	diff = Math.round(scrollAmount / (totalTime / timeout));

	if (scrollAmount > 0 && scrolled + diff >= 0 || scrollAmount < 0 && scrolled + diff <= scrollAmount) {
		currentlyScrolling = 0;
		toBeRemoved.parentNode.parentNode.removeChild(toBeRemoved.parentNode);
		document.getElementById('container').scrollLeft = 0;
		scrolled = 0;

		date1 = 0;
		date2 = 0;
		milliseconds1 = 0;
		milliseconds2 = 0;
		difference = 0;
		execTime = 0;

// 		document.getElementById('button_left').style.left = 0;
// 		document.getElementById('button_right').style.marginLeft = -23;
	}

	else {
		scrolled += diff;
		document.getElementById('container').scrollLeft = -scrolled;
		setTimeout(function(){doScroll(elemName, scrollAmount, toBeRemoved)},timeout);
	}
}
