var months = new Array('Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember');
var days = new Array('man', 'tir', 'ons', 'tor', 'fre', 'lør', 'søn');
var redirectToRestech = false;

Array.prototype.find = function (s)
{
	for(var i=0;i<this.length;i++)
		if(this[i] == s) 
			return true;

	return false;
};

function str2date(text)
{
	var parts = text.split('-');
	if (parts.length == 3)
	{
		d = new Date();
		d.setHours(0, 0, 0, 0);
		d.setFullYear(parts[0], parts[1]-1, parts[2]);
		return d;
	}

	return false;
}

function getISOWeek(date){
	var year = date.getFullYear();
	var month = date.getMonth();
	var day = date.getDate();
    //lets calc weeknumber the cruel and hard way :D
    //Find JulianDay 
    month += 1; //use 1-12
    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + 
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                 Math.floor(y/400) - 32045;      // (gregorian calendar)
    //var jd = (day+1)+Math.Round(((153*m)+2)/5)+(365+y) + 
    //                 Math.round(y/4)-32083;    // (julian calendar)
    
    //now calc weeknumber according to JD
    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;        
}


function daysBetween(date1, date2) {

    // The number of milliseconds in one day
    var ONE_DAY = 1000 * 60 * 60 * 24

    // Convert both dates to milliseconds
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()

    // Calculate the difference in milliseconds
    var difference_ms = Math.abs(date1_ms - date2_ms)
    
    // Convert back to days and return
    return Math.round(difference_ms/ONE_DAY)

}

Array.prototype.in_array = function(search_term) {
  var i = this.length;
  if (i > 0) {
	 do {
		if (this[i] === search_term) {
		   return true;
		}
	 } while (i--);
  }
  return false;
}


Date.prototype.sameDay = function(date)
{
	return (this.getFullYear() == date.getFullYear() && this.getMonth() == date.getMonth() && this.getDate() == date.getDate());
}


Date.prototype.getWeekday = function()
{
	if (this.getDay() == 0)
		return 6;

	return this.getDay() - 1;
}


function calUpdate(calendarDivId)
{
		
	var div = document.getElementById(window.calCalendarDivId);
	var arrivalField = document.getElementById(window.calArrivalFieldId);
	
	var selDate = str2date(arrivalField.value);
	var today = str2date(calToday);

	var firstDate = str2date(calFirstDate);
	var lastDate = str2date(calLastDate);
	
	if(!window.calMonth || window.calMonth == 0)
	{
		window.calMonth = selDate.getMonth() + 1;
		window.calYear = selDate.getFullYear();
	}
	
	var date = new Date();
	date.setFullYear(calYear, calMonth - 1, 1);
	date.setHours(0);
	date.setMinutes(0);
	date.setSeconds(0);
	date.setMilliseconds(0);
	
	var nextMonth = calMonth + 1;
	var nextMonthYear = calYear;
	if (nextMonth == 13)
	{
		nextMonth = 1;
		nextMonthYear++;
	}

	var prevMonth = calMonth - 1;
	var prevMonthYear = calYear;
	if (prevMonth == 0)
	{
		prevMonth = 12;
		prevMonthYear--;
	}
	
	var prevMonthLink = (firstDate.getFullYear() < calYear || (firstDate.getFullYear() == calYear && firstDate.getMonth()+1 < calMonth)) ? '<a href="" onClick="calSetMonth(' + prevMonth + ', ' + prevMonthYear + ');return false;">&lt;</a>' : '';
	var nextMonthLink = (lastDate.getFullYear() > calYear || (lastDate.getFullYear() == calYear && lastDate.getMonth() >= calMonth)) ? '<a href="" onClick="calSetMonth(' + nextMonth + ', ' + nextMonthYear + ');return false;">&gt;</a>' : '';
				
	var html = 
		'<h2>Velg ankomstdato</h2>' +
		'<table>' + 
			'<tr class="month">' + 
				'<td>' + prevMonthLink + '</td>' + 
				'<td colspan="6">' + months[calMonth - 1] + ' ' + calYear + '</td>' + 
				'<td>' + nextMonthLink + '</td>' + 
			'</tr>' + 
			
			'<tr>' + 
				'<th>u</th>' + 
				'<th>M</th>' + 
				'<th>Ti</th>' + 
				'<th>O</th>' + 
				'<th>To</th>' + 
				'<th>F</th>' + 
				'<th>L</th>' + 
				'<th>S</th>' + 
			'</tr>';

	
	if(date.getWeekday() > 0)
	{
		var weekNo = getISOWeek(date);
		var arrivalDates = calGetArrivalDays(weekNo);

		html = html + 
			'<tr>' + 
			'<td class="week">' + weekNo + '</td>';
		
		while(date.getWeekday() > 0)
			date.setDate(date.getDate() - 1);

		while(date.getDate() > 1)
		{
			html = html + '<td class="diffmonth">' + date.getDate() + '</td>';
			date.setDate(date.getDate() + 1);
		}
		
	}
	
		
	while (date.getMonth() == calMonth - 1)
	{

		if (date.getWeekday() == 0)
		{
			var weekNo = getISOWeek(date);
			var arrivalDates = calGetArrivalDays(weekNo);
	
			html = html + 
				'<tr>' + 
				'<td class="week">' + weekNo + '</td>';
		}
			
		var day = date.getDate();
			
		// Dager siden idag
		var dayNo = date.getWeekday();
		
		var style = (date.sameDay(selDate)) ? 'class="selected"' : '';
		
		if (date >= firstDate && date <= lastDate && arrivalDates[dayNo])
			day = '<a ' + style + ' href="" onClick="calSelectDate(\'' + date + '\');return false;" >' + day + '</a>';			
			
		html = html + '<td>' + day + '</td>';
				
		if (date.getWeekday() == 6)
			html = html + '</tr>';

		date.setDate(date.getDate() + 1);
	
	}


	if(date.getWeekday() < 6)
	{
		date.setDate(date.getDate() - 1);
		
		while(date.getWeekday() < 6)
		{
			date.setDate(date.getDate() + 1);
			html = html + '<td class="diffmonth">' + date.getDate() + '</td>';
		}
		
		html = html + '</tr>';
		
	}

	html = html + '</table>';
	html = html + '<p style="font-size: 0.8em; color: #999;margin-top: 3px;">Ønskes opphold i andre perioder enn angitt i kalender, vennligst ta kontakt.</p>';
			
	div.innerHTML = html;
	
}


function calGetArrivalDays(week)
{
	var periods = calAvailablePeriods;
	periods = periods[week];
	
	var days = new Array(8);
	
	for (var n=0; n<periods.length; n++)
	{
		switch (periods[n])
		{
			case "X1":
			case "X2":
			case "X3":
				days[0] = days[1] = days[2] = days[3] = days[4] = days[6] = true;
				break;

			case "X4":
			case "X5":
				days[0] = days[1] = days[2] = days[3] = days[4] = days[5] = days[6] = true;
				break;

			case "M":
			case "U":
				days[6] = true;
				break;

			case "LW":
				days[3] = true;
				break;

			case "W":
				days[4] = true;
				break;
		}
	}
		
	return days;

}


function calGetPeriods(date)
{

	var week = getISOWeek(date);
	var day = date.getWeekday();
	var periods = calAvailablePeriods;
	periods = periods[week];
	
	availablePeriods = new Array(6);
	
	switch (day)
	{
	
		case 0:
		case 1:
		case 2:
		case 5:
			if (periods.in_array('X1'))
				availablePeriods[0] = 'X1';
			if (periods.in_array('X2'))
				availablePeriods[1] = 'X2';
			if (periods.in_array('X3'))
				availablePeriods[2] = 'X3';
			if (periods.in_array('X4'))
				availablePeriods[3] = 'X4';
			if (periods.in_array('X5'))
				availablePeriods[4] = 'X5';
			break;

		case 3:
			if (periods.in_array('X1'))
				availablePeriods[0] = 'X1';
			if (periods.in_array('X2'))
				availablePeriods[1] = 'X2';
			if (periods.in_array('LW'))
				availablePeriods[2] = 'LW';
			else if (periods.in_array('X3'))
				availablePeriods[2] = 'X3';
			if (periods.in_array('X4'))
				availablePeriods[3] = 'X4';
			if (periods.in_array('X5'))
				availablePeriods[4] = 'X5';
			break;

		case 4:
			if (periods.in_array('W'))
				availablePeriods[1] = 'W';
			if (periods.in_array('X3'))
				availablePeriods[2] = 'X3';
			if (periods.in_array('X4'))
				availablePeriods[3] = 'X4';
			if (periods.in_array('X5'))
				availablePeriods[4] = 'X5';
			break;

		case 6:
			if (periods.in_array('X1'))
				availablePeriods[1] = 'X1';
			if (periods.in_array('X2'))
				availablePeriods[1] = 'X2';
			if (periods.in_array('X3'))
				availablePeriods[2] = 'X3';
			if (periods.in_array('X4'))
				availablePeriods[3] = 'X4';
			if (periods.in_array('M'))
				availablePeriods[4] = 'M';
			else if (periods.in_array('X5'))
				availablePeriods[4] = 'X5';
			if (periods.in_array('U'))
				availablePeriods[5] = 'U';
			break;	
	}
	
	return availablePeriods;


}



function calUpdatePeriods()
{
	
	var div = document.getElementById(window.calPeriodsDivId);
	var arrivalField = document.getElementById(window.calArrivalFieldId);
	var periodField = document.getElementById(window.calPeriodFieldId);
	
	var selDate = str2date(arrivalField.value);
	var selPeriod = periodField.value;
	
	var availablePeriods = calGetPeriods(selDate);
	var dayNo = selDate.getWeekday();
	
	html = '<h2>Oppholdets lengde</h2>' +
			'<ul>';
	
	for (var n=0; n<availablePeriods.length; n++)
	{
		text = false;
		var period = availablePeriods[n];
		var nights = 0;
		
		if (period != '')
			switch (period)
			{
				case 'X1':
					text = '1 natt';
					nights = 1;
					break;

				case 'X2':
					text = '2 netter';
					nights = 2;
					break;

				case 'X3':
					text = '3 netter';
					nights = 3;
					break;

				case 'X4':
					text = '4 netter';
					nights = 4;
					break;

				case 'X5':
					text = '5 netter';
					nights = 5;
					break;

				case 'LW':
					text = 'Langweekend';
					nights = 3;
					break;

				case 'W':
					text = 'Weekend';
					nights = 2;
					break;						

				case 'U':
					text = 'Uke';
					nights = 7;
					break;						

				case 'M':
					text = 'Midtuke';
					nights = 5;
					break;
			}
			
			if (nights > 0)
			{
				
				var endDay = dayNo + nights;
				while (endDay > 6)
					endDay = endDay - 7;
					
				text = text + ' (' + days[dayNo] + '-' + days[endDay] + ')';
				var fieldtext = nights + ' (' + days[dayNo] + '-' + days[endDay] + ')';
				
				var style = (period == selPeriod) ? 'class="selected" ' : '';
				html = html + '<li><a href="" ' + style + 'onClick="calSelectPeriod(\'' + period + '\', \'' + fieldtext + '\');return false;">' + text + '</a></li>';
			}

	}
	
	
	html = html + '</ul>';
	
	div.innerHTML = html;	
	
}


function calUpdatePersons()
{

	var div = document.getElementById(window.calPersonsDivId);
	var noField = document.getElementById(window.calPersonsFieldId);
	
	var selNo = noField.value * 1;

	var html = '<h2>Antall personer</h2>';
	
	html = html + '<ul>';

	for (var n=1; n<=50; n++)
	{
		var aStyle = (n == selNo) ? 'class="selected" ' : '';
		var liStyle = (n < 11) ? ' class="large"' :'';
		html = html + '<li' + liStyle + '><a href="" ' + aStyle + 'onClick="calSelectPersons(' + n + ');return false;">' + n + '</a></li>';
	}
	
	html = html + '</ul>';
	
	div.innerHTML = html;

}

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

function createRestechUrl()
{
		var arrivalValue = document.getElementById('arr').value;
		var noPersValue = document.getElementById('no').value;
		var periodValue = document.getElementById('per').value;
		var restechUnitid = document.getElementById('restechUnitid').value;
		var restechPoolid = document.getElementById('restechPoolid').value;
		var nights = 0;
		var desc1 = "";
		
		switch (periodValue)
		{
			case 'X1':
				period = "";
				nights = 1;
				break;

			case 'X2':
				period = "";
				nights = 2;
				break;

			case 'X3':
				period = "";
				nights = 3;
				break;

			case 'X4':
				period = "";
				nights = 4;
				break;

			case 'X5':
				period = "";
				nights = 5;
				break;

			case 'LW':
				period = "&period=Langweekend";
				nights = 3;
				break;

			case 'W':
				period = "&period=Weekend";
				nights = 2;
				break;						

			case 'U':
				period = "&period=Uke";
				nights = 7;
				break;						

			case 'M':
				period = "&period=Midtuke";
				nights = 5;
				break;
		}
		
		if (restechUnitid.length > 0)
			desc1 = restechUnitid;
		else
			desc1 = restechPoolid;
			
			
		var date = new Date();
		date.setISO8601(arrivalValue);
		date.setDate(date.getDate()+nights);
		
		var depday = date.getDate();
		var depmonth = date.getMonth()+1;
		var depyear = date.getYear();
		if(depyear<1000)
			depyear+=1900;
		
		var depdate = depyear + '-' + depmonth + '-' + depday;
		
		return 'http://kvitfj.restech.se/r360/?site=kvitfj&lang=NO&resvtype=L&arrdate=' + arrivalValue + '&depdate=' + depdate + '&period=' + period + '&search_noc5=' + noPersValue + '&desc1=' + desc1 + '&advanced=T&search_execute=T';
}

function callRestech(url)
{		
	window.open(url,'restechSearch','width=950,height=650,resizable=1')
	return false;	
}

function calUpdateButton(visible)
{

	var div = document.getElementById(window.calButtonDivId);
	

	if (visible)
	{
		if (redirectToRestech)
			html = '<p class="input"><a class="button" href="" onClick="toggleCalendar(0);callRestech(createRestechUrl());return false;">Finn ledige enheter</a></p>';
		else
			html = '<p class="input"><a class="button" href="" onClick="toggleCalendar(0);showMessage(\'Online booking\', \'Vennligst vent, søker etter ledige enheter\');calSubmit();return false;">Finn ledige enheter</a></p>';
	}
	else
		html = '<p class="input">&nbsp;</p>';
	
	div.innerHTML = html;

}


function calSubmit()
{
	var form = document.getElementById('onlineBookingForm');
	form.submit();
}


function calSetMonth(newMonth, newYear)
{
	window.calMonth = newMonth;
	window.calYear = newYear;
	calUpdate();
}

function calResetMonth()
{
	window.calMonth = 0;
}


function calSelectDate(date)
{
	selDate = new Date();
	timestamp = Date.parse(date);
	selDate.setTime(timestamp);

	var arrivalField = document.getElementById(window.calArrivalFieldId);
	var arrivalSpan = document.getElementById(window.calArrivalFieldId + 'Span');
	
	arrivalField.value = selDate.getFullYear() + '-' + (selDate.getMonth() + 1) + '-' + selDate.getDate();
	
	var day = new String('' + selDate.getDate());
	if (day.length == 1)
		day = '0' + day;

	var month = new String('' + (selDate.getMonth() + 1));
	if (month.length == 1)
		month = '0' + month;
		
	arrivalField.value = selDate.getFullYear() + '-' + month + '-' + day;
	arrivalSpan.innerHTML = day + ' <span>/</span> ' + month + ' <span>/</span> ' + selDate.getFullYear();
	
	calSelectPeriod('', '&nbsp;');
	
	toggleCalendar(2);
}


function calSelectPersons(no)
{
	var noField = document.getElementById(window.calPersonsFieldId);
	var noSpan = document.getElementById(window.calPersonsFieldId + 'Span');
	
	noField.value = no;
			
	noSpan.innerHTML = no;
	
	toggleCalendar(4);
}


function calSelectPeriod(period, text)
{
	var periodField = document.getElementById(window.calPeriodFieldId);
	var periodSpan = document.getElementById(window.calPeriodFieldId + 'Span');
	
	periodField.value = period;
	periodSpan.innerHTML = text;
	
	if (period != '')
		toggleCalendar(3);
}

function toggleCalendar(step)
{
	toggleCalendar(step, false);
}

function toggleCalendar(step, redirect)
{
	var div = document.getElementById(window.calDivId);
	var obDiv = document.getElementById(window.calOBDivId);
	var contentDiv = document.getElementById('page');
	
	if (redirect)
		redirectToRestech = true;

	
	// Skjuler skiten
	if (step == 0)
	{
		div.innerHTML = '';
		setStyleById(window.calDivId, 'hidden', true);	
		hideCurtain();
		return;
	}
		
		
	else if (step == 1)
	{

		// oppretter div-tagger
		var html = 
			'<div class="border">' +
			'<div class="header">' +
			'<h1>Online booking</h1>' +
			'<p>Angi periode og antall personer slik at vi kan finne de overnattingsenhetene som passer best for deg.</p>' +
			'</div>' +
			
			'<div id="obCalendarCal" class="arrival">' +
			'</div>' +

			'<div id="obCalendarPeriod" class="periods">' +
			'<p>I vintersesongen (nov-apr) er kun periodene søn-søn, søn-fre og fre-søn tilgjengelige.</p>' +
			'</div>' +

			'<div id="obCalendarPersons" class="persons">' +
			'</div>' +

			'<div class="footer" id="obCalendarButton">' +
				'<p class="input"></p>' +
			'</div>' +

			'</div>';
			
		div.innerHTML = html;


		showCurtain();
		window.calMonth = 0;
		// div.style.width = 280 + 'px';
		setStyleById(window.calDivId, 'hidden', false);
		setStyleById(window.calPeriodsDivId, 'hidden', true);
		setStyleById(window.calPersonsDivId, 'hidden', true);
		
		div.style.left = (findPosX(contentDiv)) + 'px';
		calUpdate();
	}
		
	else if (step == 2)
	{
		calUpdate();
		calUpdatePeriods()
		calUpdateButton(false);
		setStyleById(window.calDivId, 'hidden', false);
		setStyleById(window.calPeriodsDivId, 'hidden', false);
		setStyleById(window.calPersonsDivId, 'hidden', true);
	}

	else if (step == 3)
	{
		calUpdate();
		calUpdatePersons();
		calUpdatePeriods();
		calUpdateButton(false);
		setStyleById(window.calDivId, 'hidden', false);
		setStyleById(window.calPeriodsDivId, 'hidden', false);
		setStyleById(window.calPersonsDivId, 'hidden', false);
	}

	else if (step == 4)
	{
		calUpdate();
		calUpdatePersons();
		calUpdatePeriods();
		calUpdateButton(true);
		setStyleById(window.calDivId, 'hidden', false);
		setStyleById(window.calPeriodsDivId, 'hidden', false);
		setStyleById(window.calPersonsDivId, 'hidden', false);
	}


	div.style.top = Math.floor((document.documentElement.clientHeight - div.offsetHeight) / 2) + 'px';
			
}


function findPosX(obj)
{
	var curleft = 0;
	if(obj.offsetParent)
		while(1)
		{
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
			break;
			obj = obj.offsetParent;
		}
	else if(obj.x)
		curleft += obj.x;
	
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
		while(1)
		{
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
			break;
			obj = obj.offsetParent;
		}

	else if(obj.y)
		curtop += obj.y;

	return curtop;
}


function obUpdateRowExtra(object, isSelect, price, rowNo)
{

	var oldPrice = obExtraValues[rowNo];
	
	// Finner felt
	var noField = document.getElementById('obExtraNo_' + rowNo);
	var priceField = document.getElementById('obExtraTotal_' + rowNo);
	var totalField = document.getElementById('obTotal');
	
	var no=0;
	
	if (isSelect)
		no = object.options[object.selectedIndex].value;
	else
		no = object.value;
		
	noField.innerHTML = no;
	priceField.innerHTML = (no * price);
	
	var diff = (no * price) - oldPrice;
	
	obExtraValues[rowNo] = (no * price);
		
	var total = totalField.innerHTML * 1;
	total += diff;

	totalField.innerHTML = total;
	
}