/* Idium As RangeCalender C 2009   by Espen  */
function gid(id){return document.getElementById(id)}

var selectPastDates = false;
var calenderData = {};
var days = ['m', 't', 'o', 't', 'f', 'l', 's'];
var months = [month['1'], month['2'], month['3'], month['4'], month['5'], month['6'], month['7'], month['8'], month['9'], month['10'], month['11'], month['12']]
var days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function getDays_in_month(year, month) {
	var dim = days_in_month[month];
	if (month == 1) { // February leap year
		if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
			return 29;
		}
	}
	return dim;
}

function makeCalender(year, month, from) {
  var cal = calenderData[year+':'+month]
  var firstDay = new Date(year, month, 0);
  var startingDay = firstDay.getDay();
  var monthLength = getDays_in_month(year, month);
  var html = '<table class="calendar-table"><tr>';
  html += '<th><div onClick="calBack('+from+')" class="lastMonth"><img src="./filestore/dev/GFX/arrow_left.gif" alt="previous"/></div></th>';

  var selectmonth = "<select class=\"bookingMonth\">"
  var today = new Date();
  var currentMonth = today.getMonth();
  var currentYear = today.getFullYear();
/*
  var i = 1;
  var v = 1;
  var b = 25;
  if(selectPastDates) {
    currentYear = currentYear - 2;
    v = 49;
    b = 50;
  }
  while(i < b) {
    var selectedMonth = "";
    if(currentMonth == month && currentYear == year) {
      selectedMonth = "selected=\"selected\" ";
    }
    selectmonth += "<option " + selectedMonth + "value=" + v + ">" + months[currentMonth] + " " + currentYear + "</option>";
    if(currentMonth < 11) {
      currentMonth++ 
    } else {
      currentMonth = 0;
      currentYear++; 
    }
    i++
    if(selectPastDates) {
      v--;
    } else {
      v++;
    }
  }
  selectmonth += "</select>";
*/
  selectmonth = "";
  html +='<th colspan="5">' + months[month]+ ' ' + year + '</th>';
  html += '<th><div onClick="calNext('+from+')" class="lastMonth"><img src="./filestore/dev/GFX/arrow_right.gif" alt="next"/></div></th>';
  html += '</tr><tr class="calendar-header">';
  for(var i = 0; i <= 6; i++ ){
    html += '<td class="calendar-header-day">' + days[i] + '</td>';
  }
  html += '</tr><tr>';
  // fill in the days
  var day = 1;
  var state = '';
  if(from) {
    allowNextFrom=false;
	allowBackFrom=false;
	state = 'selectable';
	if((year*100)+month > (selectedFrom[0]*100)+selectedFrom[1] && (year*100)+month <= (selectedTo[0]*100)+selectedTo[1]) state = 'selected';
	if((year*100)+month > (d.getFullYear()*100)+d.getMonth()) allowBackFrom=true;
  }
  else {
	allowNextTo=false;
	allowBackTo=false;
	if((year*100)+month > (selectedFrom[0]*100)+selectedFrom[1]) {
		allowBackTo = true;
		state = 'selectable';
		if((year*100)+month <= (selectedTo[0]*100)+selectedTo[1]) state = 'selected';//????
	}

  }
  // this loop is for is weeks (rows)
  for (var i = 0; i < 9; i++) {
    // this loop is for weekdays (cells)
    for (var j = 0; j <= 6; j++) {
      var theclass = '';
	  theclass=cal[day-1];  //  AVAILABLE    CHECKIN   UNAVAILABLE    CHECKOUT
	  var clickable = true;
	  if(from && (theclass=='UNAVAILABLE' || theclass=='CHECKIN')) clickable = false;
	  else if(!from && (theclass=='UNAVAILABLE' || theclass=='CHECKOUT')) clickable = false;
	  if(year==selectedFrom[0] && month==selectedFrom[1] && day==selectedFrom[2]) state='selected';
          if(selectedTo[0] == 3000 && selectedFrom[0] != 3000 && theclass=='AVAILABLE' && day > selectedFrom[2]) state='selectable';

      if((day <= monthLength) && (i > 0 || (j >= startingDay))) {
        html += '<td class="'+state+' '+theclass+'">';
if(selectPastDates !== true) {

		if(clickable && (state=='selectable' || state=='selected')) clickable = true; 
		else clickable = false;


		if(from && year==selectedTo[0] && month==selectedTo[1] && day==selectedTo[2]) clickable = false;

		else if(!from && year==selectedFrom[0] && month==selectedFrom[1] && day==selectedFrom[2]) clickable = false;

		else if(from && (year*10000)+(month*100)+day < (d.getFullYear()*10000)+(d.getMonth()*100)+d.getDate()) clickable = false;

}
		if(clickable) html += '<a href="javascript:void(0)" onClick="'+((from)?'fromDate':'toDate')+'('+year+','+month+','+day+')">'+day+'</a>';
		else html += '<span>'+day+'</span>';
        day++;
      } else html += '<td class="empty">';
      html += '</td>';
	  if(state=='selected' && theclass=='CHECKIN') selectedTo = [year, month, day-1]; 
	  if(year==selectedTo[0] && month==selectedTo[1] && day-1==selectedTo[2]) state = 'selectable';
	  if(!from && theclass=='CHECKIN') state = '';
    }

    // stop making rows if we've run out of days
    if (day > monthLength)  break;
	else html += '</tr><tr>';
   }
	if((state=='selected' || state=='selectable')) {
		if(from) allowNextFrom=true;
		else allowNextTo=true;
	}

  return html + '</tr></table>';
}
function calBack(from) {
	if(from) { if(!allowBackFrom) return; }
	else if(!allowBackTo) return;
	var cal = from?calFrom:calTo;
	cal[1]--;
	if(cal[1]<0) {
		cal[1]=11;
		cal[0]--;
	}
	renderCalenders();
}
function calNext(from) {
	if(from) { if(!allowNextFrom) return; }
	else if(!allowNextTo) return;
	var cal = from?calFrom:calTo;
	cal[1]++;
	if(cal[1]>11) {
		cal[1]=0;
		cal[0]++;
	}
	renderCalenders();
}

var d = new Date();
var calFrom = [d.getFullYear(), d.getMonth()];
var calTo  =  [calFrom[0], calFrom[1]];

var baceurl = '';
var blankCalender = true;
function getAvailabillety(year, month) {
	if(blankCalender) {
		var cal = [];
		var mnr = getDays_in_month(year, month);
		for(var a=0;a<mnr;a++) cal[a] = 'AVAILABLE';
		calenderData[year+':'+month] = cal;
		renderCalenders();
	}
	else {
		ajax(
			baceurl+'year='+year+';month='+ (1 + month),
			function(text, html){
				var cal = text.match(/<DAY><DATE>\d+<\/DATE><STATE>[^<]+</ig);
				for(var a=0;a<cal.length;a++) cal[a] = cal[a].replace(/<DAY><DATE>\d+<\/DATE><STATE>([^<]+)</ig, '$1');
				calenderData[year+':'+month] = cal;
				renderCalenders();
			},
			function(text, status){
				//alert('Failed to get booking SOAP:XML');
			}
		);
	}
}
function ajax(url, resp, fail) {
  var xmlHttp;
  try {xmlHttp = new XMLHttpRequest;}
    catch (e) {try {xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");}
      catch (e) {try {xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");}
        catch (e) {alert("Your browser does not support AJAX");}}}
  xmlHttp.onreadystatechange = function () {
  if (xmlHttp.readyState == 4){
      if (xmlHttp.status != 200 && xmlHttp.status != 0) fail(xmlHttp.responseText, xmlHttp.status);
      else resp(xmlHttp.responseText, xmlHttp.responseHTML);
  }};
  xmlHttp.open('GET', url);
  xmlHttp.send(null);
}

function renderCalenders() {
	if(calenderData[calFrom[0]+':'+calFrom[1]]==null) return getAvailabillety(calFrom[0], calFrom[1]);
	if(calenderData[calTo[0]+':'+calTo[1]]==null) return getAvailabillety(calTo[0], calTo[1]);
	gid('cal_from').innerHTML = makeCalender(calFrom[0],calFrom[1], true);
	gid('cal_to').innerHTML = makeCalender(calTo[0],calTo[1], false);
}

// if the To table can be navigated to the next month
var allowNextTo = false;
var allowBackTo = false;

var selectingFrom = true;
var selectedFrom = [3000,0,0];
var selectedTo = [3000,0,0];

function fromDate(y,m,d) {
	selectedFrom = [y,m,d];
	calTo = [y,m];
	if((y*10000)+(m*100)+d > (selectedTo[0]*10000)+(selectedTo[1]*100)+selectedTo[2]) selectedTo = [3000,0,0]
	gid('cal_to').style.display='block';
	m++;
	var arrivalValue = y +'-'+ ((m<10)?'0'+m:m) +'-'+ ((d<10)?'0'+d:d) +'T00:00:00';
	gid('date_from').value = arrivalValue;
	renderCalenders();
//        toDate(y,m,d);
	jQuery.bbq.pushState({"arrival":arrivalValue});
}
function toDate(y,m,d) {
	selectedTo = [y,m,d];
	m++;
	var departureValue = y +'-'+ ((m<10)?'0'+m:m) +'-'+ ((d<10)?'0'+d:d) +'T00:00:00';
	gid('date_to').value = departureValue;
	renderCalenders();
	jQuery.bbq.pushState({"departure":departureValue});	
}