/*
 * calendar.php ersatz
 *
 */
var HICalendar = {
    createMonth: function (month, year, selectedDate, dayField, monthYearField, weekDayField, inactiveBefore){
        if(inactiveBefore>"") {
            inactiveBeforeDate = new Date(parseInt(inactiveBefore.substr(4)), parseInt(inactiveBefore.substr(2, 2),"10"), parseInt(inactiveBefore.substr(0,2),"10"));
        } else {
            inactiveBeforeDate = new Date();
            inactiveBeforeDate.setDate(inactiveBeforeDate.getDate()-1);
        }
        var firstDayDate = new Date(year,month-1,1);
        var lastDayDate = new Date(year,month,0);
        var numDays = lastDayDate.getDate();

        dayCounter = 0;

        var out = '';
        out += '<table cellpadding="0" cellspacing="1" border="0" class="calendar">';
        out += '<thead>';
        out += '<tr><th colspan="7">'+$c_mo[firstDayDate.getMonth()]+' '+year+'</th></tr>';
        out += '</thead>';
        out += '<tbody>';
        out += '<tr>';
        for(var i=1; i<8; i++) {
            key = i%7;
            out += '<th>'+dow[key]+'</th>';
        }
        out += '</tr>';

        while(dayCounter<numDays) {
            out += '<tr>';
            for(i=1; i<8; i++) {
                var tdclass = (i%7==6 || i%7==0) ? ' class="wknd"' : '';
                if((dayCounter==0 && i%7!=firstDayDate.getDay()) || dayCounter==numDays) {
                        out += '<td'+tdclass+'>&nbsp;</td>';
                } else {
                    dayCounter++;
                    var curDate = new Date(year,month-1, dayCounter);
                    if(curDate<=inactiveBeforeDate) {
                        out += '<td'+tdclass+'><span class="inactive">'+dayCounter+'</span></td>';
                    } else {
                        aclass = (selectedDate.valueOf()==curDate.valueOf()) ? ' class="sel"' : '';
                        weekDay = curDate.getDay();
                        out += '<td'+tdclass+'><a'+aclass+' href="javascript:selectDate(\''+dayCounter+'\',\''+(month-1)+year+'\',\''+dayField+'\',\''+monthYearField+'\','+weekDay+',\''+weekDayField+'\');" onfocus="if(this.blur)this.blur()">'+dayCounter+'</a></td>';
                    }
                }
            }
            out += '</tr>';
        }
        out += '</tbody>';

        out += '</table>';

        return out;

    },
    createCalendar: function(lang, calendarId, iconId, curDate, selDate, dayfield, monthyearfield, weekdayfield, inactiveBefore, useSmallCalendar){
        var nMonths;
        var nextLink2 = '',nextLink = '',prevLink = '';
        if(!useSmallCalendar){
            nMonths = 3;
        }else{
            nMonths = 1;
        }
        var firstYear = new Date().getFullYear();
        var firstMonth = new Date().getMonth();
        var firstDate = new Date(firstYear,firstMonth);
        var lastDate = new Date($lastYear,$lastMonth-1);

        var selectedDate = new Date(parseInt(selDate.substr(4)),parseInt(selDate.substr(2, 2), "10"),parseInt(selDate.substr(0,2),"10"));
        var viewDate = new Date(parseInt(curDate.substr(2)),parseInt(curDate.substr(0, 2), "10"));
        var drawDate = new Date(viewDate.getFullYear(),viewDate.getMonth()-(nMonths-1)/2);

        var headHTML = "";
        var navHTML = "";
        var calHTML = "";

        calHTML += '<tr>';
        var i = nMonths;
        while(i>0 && drawDate<=lastDate){
            if(drawDate<firstDate){
                drawDate = new Date(firstDate.getFullYear(),firstDate.getMonth());
                viewDate = new Date(firstDate.getFullYear(),firstDate.getMonth() + (nMonths-1)/2);
            }

            if(i==nMonths){
                if(drawDate>firstDate){
                    var prevViewDate = String(viewDate.getMonth()-1)+String(viewDate.getFullYear());
                    var prevMonth = drawDate.getMonth()-1;
                    if(prevMonth<0)prevMonth += 12;
                    if(prevViewDate.length<6) prevViewDate="0"+prevViewDate;
                    prevLink = '<a href="javascript:loadCalendar(\''+lang+'\', \''+calendarId+'\', \''+iconId+'\', \''+prevViewDate+'\', \''+selDate+'\', ';
                    prevLink+= '\''+dayfield+'\', \''+monthyearfield+'\', \''+weekdayfield+'\', \''+inactiveBefore+'\', \''+useSmallCalendar+'\');"';
                    prevLink+= ' class="calprev" onfocus="if(this.blur)this.blur()">'+$c_mo[prevMonth]+'</a>';
                }else{
                    prevLink = '&nbsp;';
                }
            }
            if(i==1){
                if(drawDate<lastDate){
                    var nextViewDate = String(viewDate.getMonth()+1)+String(viewDate.getFullYear());
                    var nextMonth = drawDate.getMonth()+1;
                    if(nextMonth>11)nextMonth -= 12;
                    if(nextViewDate.length<6) nextViewDate="0"+nextViewDate;
                    nextLink = '<a href="javascript:loadCalendar(\''+lang+'\', \''+calendarId+'\', \''+iconId+'\', \''+nextViewDate+'\', \''+selDate+'\', ';
                    nextLink+= '\''+dayfield+'\', \''+monthyearfield+'\', \''+weekdayfield+'\', \''+inactiveBefore+'\', \''+useSmallCalendar+'\');"';
                    nextLink+= ' class="calnext" onfocus="if(this.blur)this.blur()">'+$c_mo[nextMonth]+'</a>';
                    nextLink2 = '<a href="javascript:loadCalendar(\''+lang+'\', \''+calendarId+'\', \''+iconId+'\', \''+nextViewDate+'\', \''+selDate+'\', ';
                    nextLink2+= '\''+dayfield+'\', \''+monthyearfield+'\', \''+weekdayfield+'\', \''+inactiveBefore+'\', \''+useSmallCalendar+'\');"';
                    nextLink2+= ' class="calnext" onfocus="if(this.blur)this.blur()">&nbsp;</a>';
                }else{
                    nextLink = '&nbsp;';
                    nextLink2 = '';
                }
            }


            if(i<nMonths && i>1){
                navHTML += '<td class="calspacer">&nbsp;</td>';
            }

            calHTML += '<td class="cal"'+((nMonths==1)?' colspan="3"':'')+'>';
            calHTML += this.createMonth(drawDate.getMonth()+1,drawDate.getFullYear(),selectedDate,dayfield, monthyearfield, weekdayfield,inactiveBefore);
            calHTML += '</td>';

            i--;
            drawDate.setMonth(drawDate.getMonth()+1);

        }
        calHTML += '</tr>';

        if(nMonths>1){
            headHTML += '<tr><td class="calclose2">';
            headHTML += '<a onfocus="if(this.blur)this.blur()" href="javascript:hideCalendar(\''+calendarId+'\');" class="close2">'+$c_picclose+'</a>';
            headHTML += '</td><td colspan="'+(nMonths-1)+'" class="calclose">';
            headHTML += '<a onfocus="if(this.blur)this.blur()" href="javascript:hideCalendar(\''+calendarId+'\');" class="close">&nbsp;</a>';
            headHTML += '</td></tr>';
            navHTML = '<tr><td class="calprev">'+nextLink2+prevLink+'</td>'+navHTML+'<td class="calnext">'+nextLink+'</td></tr>';
        }else{
            headHTML += '<tr>';
            headHTML += '<td class="calprev">'+prevLink+'</td>';
            headHTML += '<td class="calnext">'+nextLink+'</td>';
            headHTML += '<td class="calclose">';
            headHTML += '<a onfocus="if(this.blur)this.blur()" href="javascript:hideCalendar(\''+calendarId+'\');" class="close">&nbsp;</a>';
            headHTML += '</td>';
            headHTML += '</tr>';
            navHTML = "";
        }
        var out = "";
        out = '<div class="calendar"><table cellpadding="0" cellspacing="0" border="0" class="calendarwrap">';
        out += headHTML;
        out += navHTML;
        out += calHTML;
        out += '</table></div>';
        return out;
    }
}



/*
 * Prototype ersatz
 */
var iefixiframe = "null";
var iefixiframeparent = "null";
function $ersatz(element){
    element = document.getElementById(element);
    return element;
}
function observe(element,eventName,handler){
    if (element.addEventListener)
        element.addEventListener(eventName, handler,false);
    else if(element.attachEvent){
        element.attachEvent('on' + eventName, handler);
    }
}
function findPosition(element){

    var curleft = curtop = 0;
        do {
                curleft += element.offsetLeft;
                curtop += element.offsetTop;
           } while (element = element.offsetParent);
        return [curleft,curtop];
}
function getOffsetParent(element){
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
}
function clonePosition(element,source){

    element.style.position = "absolute";
    var sourcePosition = findPosition(source);
    var parentPosition = findPosition(getOffsetParent(element));
    element.style.left = sourcePosition[0] - parentPosition[0] + "px";
    element.style.top = sourcePosition[1] - parentPosition[1] + "px";
    if(iefixiframe=="null"){
        iefixiframe = document.createElement('iframe');
        iefixiframeparent = getOffsetParent(source);
        iefixiframe.style.display = "none";
        iefixiframeparent.appendChild(iefixiframe);
    }
    iefixiframe.setAttribute('id',"iefixiframe");
    iefixiframe.setAttribute('src',"javascript:'<html></html>'");
    iefixiframe.setAttribute('scrolling',"no");
    iefixiframe.setAttribute('frameborder',"0");
    iefixiframe.style.position = "absolute";
    iefixiframe.style.left = sourcePosition[0] - parentPosition[0] + "px";
    iefixiframe.style.top = sourcePosition[1] - parentPosition[1] + "px";
    iefixiframe.style.height = getElementDimensions(element).height+"px";
    iefixiframe.style.width = getElementDimensions(element).width+"px";
    iefixiframe.style.display = "";


}
function getElementDimensions(element) {
    var display = element.style.display;
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
}



// AJAX
var XMLHttpFactories = [
    function () {return new XMLHttpRequest()},
    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
  ];
  function createXMLHTTPObject() {
    var xmlhttp = false;
    for (var i=0;i<XMLHttpFactories.length;i++) {
      try {
	xmlhttp = XMLHttpFactories[i]();
      }
      catch (e) {
	continue;
      }
      break;
    }
    return xmlhttp;
  }

  var XMLHTTPObject = createXMLHTTPObject();
  function sendRequest(url,callback,postData) {
    if (!XMLHTTPObject) XMLHTTPObject = createXMLHTTPObject();
    if (!XMLHTTPObject) return;
    var method = (postData) ? "POST" : "GET";
    XMLHTTPObject.open(method,url,true);
    XMLHTTPObject.setRequestHeader('User-Agent','XMLHTTP/1.0');
    if (postData)
      XMLHTTPObject.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    XMLHTTPObject.onreadystatechange = function () {

      if (XMLHTTPObject.readyState != 4) {
	return;
      }
      if (XMLHTTPObject.status != 200 && req.status != 304) {
	return;
      }
      callback(XMLHTTPObject);

    }
    if (XMLHTTPObject.readyState == 4) {
      return;
    }
    XMLHTTPObject.send(postData);
  }


/*
 * End prototype ersatz
 */



/* fill date field with dd/mm/YYYY date
 */
function selectDate(day, monthyear, dayfield, monthyearfield, weekday, weekdayfield) {
	if(day.length==1) day = '0'+day;
	if(monthyear.length==5) monthyear = '0'+monthyear;
	//alert('set date ('+dayfield+', '+monthyearfield+') to '+day+'.'+monthyear);
        var item;
	if($ersatz(dayfield)) {
                for(var i=0;i<$ersatz(dayfield).childNodes.length;i++){
                        item = $ersatz(dayfield).childNodes[i];
                        if(typeof(item.value)=="undefined") continue;
                        if(item.value==day) item.selected = true;
                        else item.selected = false;
		};
	}
	if($ersatz(monthyearfield)) {
                for(var i=0;i<$ersatz(monthyearfield).childNodes.length;i++){
                        item = $ersatz(monthyearfield).childNodes[i];
                        if(typeof(item.value)=="undefined") continue;
			if(item.value==monthyear) item.selected = true;
			else item.selected = false;
		};
	}
	if($ersatz(weekdayfield)) {
		$ersatz(weekdayfield).value = dow[weekday];
	}
	if(curCal) {
		hideCalendar(curCal);
		if(monthyearfield.match(/arrival/)) {
			moveStay();
		} else {
			arrival = new Date(parseInt($ersatz('monthyeararrival').value.substr(2)),parseInt($ersatz('monthyeararrival').value.substr(0, 2), "10"),parseInt($ersatz('dayarrival').value, "10"));
			depart  = new Date(parseInt($ersatz('monthyeardeparture').value.substr(2)),parseInt($ersatz('monthyeardeparture').value.substr(0, 2), "10"),parseInt($ersatz('daydeparture').value, "10"));
			changeDate();
		}
	}
}

var curCal = '';

/* send XMLHTTP Request for new calendar
*/
function loadCalendar(lang, calendarId, iconId, curDate, selDate, dayfield, monthyearfield, weekdayfield, inactiveBefore, useSmallCalendar) {

        if(calendarId=='') return;
	if(curCal!='' && curCal!=calendarId) hideCalendar(curCal);
	$ersatz(calendarId).style.display = '';
	if(useSmallCalendar!='') {
            clonePosition($ersatz(calendarId),$ersatz('booknow'));
	} else {
            clonePosition($ersatz(calendarId),$ersatz(iconId));
	}
	curCal = calendarId;
	if(curDate=='') curDate = $ersatz(field).value;
	//if(selDate=='') selDate = curDate;
	var postData = 'lang='+lang+'&calendarId='+curCal+'&iconId='+iconId+'&date='+curDate+'&selDate='+selDate;
	postData += '&dayField='+dayfield+'&monthYearField='+monthyearfield;
	postData += '&weekDayField='+weekdayfield+'&inactiveBefore='+inactiveBefore+'&useSmallCalendar='+useSmallCalendar;
	var margin = useSmallCalendar!='' ? '60px' : '257px';
        $ersatz(curCal).innerHTML = HICalendar.createCalendar(lang, calendarId, iconId, curDate, selDate, dayfield, monthyearfield, weekdayfield, inactiveBefore, useSmallCalendar);

}


function hideCalendar(calendarId) {
	if(calendarId=='') return;
        try{
            iefixiframeparent.removeChild(iefixiframe);
            iefixiframe = "null";
        }catch(e){
            iefixiframe.style.display="none";
        }
	$ersatz(calendarId).innerHTML = '';
	$ersatz(calendarId).style.display = 'none';
	curCal = '';
}

/* when arrival is changed, move stay dates depending on nights */
function moveStay() {
	arrival = new Date(parseInt($ersatz('monthyeararrival').value.substr(2)),parseInt($ersatz('monthyeararrival').value.substr(0, 2), "10"),parseInt($ersatz('dayarrival').value, "10"));
	depart  = new Date(parseInt($ersatz('monthyeardeparture').value.substr(2)),parseInt($ersatz('monthyeardeparture').value.substr(0, 2), "10"),parseInt($ersatz('daydeparture').value, "10"));
	depart.setTime(arrival.getTime()+(parseInt($ersatz('numnights').value)*24 * 60 * 60 * 1000));
	changeDate();
}

/* move departure date and recalculate nights */
function changeDeparture(setNights) {
	arrival = new Date(parseInt($ersatz('monthyeararrival').value.substr(2)),parseInt($ersatz('monthyeararrival').value.substr(0, 2), "10"),parseInt($ersatz('dayarrival').value, "10"));
	depart  = new Date(parseInt($ersatz('monthyeardeparture').value.substr(2)),parseInt($ersatz('monthyeardeparture').value.substr(0, 2), "10"),parseInt($ersatz('daydeparture').value, "10"));
	if(setNights) {
		depart.setTime(arrival.getTime()+(parseInt($ersatz('numnights').value)*24 * 60 * 60 * 1000));
	}
	changeDate();
}

/* set arrival and departure */
function changeDate(){
	var minDate = new Date(parseInt($ersatz('monthyeararrival').options[0].text.substr(2)),0,1);
	var maxDate = new Date(parseInt($ersatz('monthyeararrival').options[$ersatz('monthyeararrival').length-1].value.substr(2)),11,31);
	if(arrival<minDate) arrival=minDate;
	else if(arrival>=maxDate) arrival.setTime(maxDate.getTime()+(24*60*60*-1000));
	if(depart<minDate) depart=minDate;
	else if(depart>maxDate) depart=maxDate;
	if(depart<arrival) depart.setTime(arrival.getTime()+(24*60*60*1000));

	var monthyear = String(arrival.getMonth())+String(arrival.getFullYear());
	selectDate(String(arrival.getDate()), monthyear, 'dayarrival', 'monthyeararrival', arrival.getDay(), 'dowarrival');

	monthyear = String(depart.getMonth())+String(depart.getFullYear());
	selectDate(String(depart.getDate()), monthyear, 'daydeparture', 'monthyeardeparture', depart.getDay(), 'dowdeparture');

	calculateNights();
}

/* set the correct number of nights after the date has been set with the calendar */
function calculateNights() {
	if(!arrival) arrival = new Date(parseInt($ersatz('monthyeararrival').value.substr(2)),parseInt($ersatz('monthyeararrival').value.substr(0, 2), "10"),parseInt($ersatz('dayarrival').value, "10"));
	if(!depart)  depart  = new Date(parseInt($ersatz('monthyeardeparture').value.substr(2)),parseInt($ersatz('monthyeardeparture').value.substr(0, 2), "10"),parseInt($ersatz('daydeparture').value, "10"));
	$ersatz('numnights').value = Math.round((depart-arrival)/86400000);
}