Array.prototype.has=function(v) {
	for (i = 0; i < this.length; i++) {
		if(this[i]==v) {
			return true;
		}
	}

	return false;
}

function get_prices(myDate, capita_id, Acm_id) {

	var now = new Date(myDate);
	var curr_day = now.getDay();
	var price = 0;
	var week_price = 0;
	var weekend_price = 0;
	var startDateArray;
	var endDateArray;
	var special = false;
	var return_data = new Array();
	var season_pricing = false;

	for (var season_key in Acm[Acm_id]['seasons']) {

		if(typeof Acm[Acm_id]['seasons'][season_key]['from_date'] == 'undefined' || Acm[Acm_id]['seasons'][season_key]['from_date'] == '') continue;
		startDateArray = Acm[Acm_id]['seasons'][season_key]['from_date'].split("-");
		endDateArray = Acm[Acm_id]['seasons'][season_key]['to_date'].split("-");
		var startDateCheck = new Date(startDateArray[0], startDateArray[1]-1, startDateArray[2]);
		var endDateCheck = new Date(endDateArray[0], endDateArray[1]-1, endDateArray[2]);
		if(dateWithin(startDateCheck, endDateCheck, myDate)) {
			week_price = Acm[Acm_id]['seasons'][season_key][capita_id]['amount'];
			weekend_price = Acm[Acm_id]['seasons'][season_key][capita_id]['amount_weekend'];
			special = Acm[Acm_id]['seasons'][season_key]['is_special'];
			season_pricing = true;
			if(special == 1)
				break;
		}
	}
	if(season_pricing == false) {
		week_price = Acm[Acm_id]['seasons'][0][capita_id]['amount'];
		weekend_price = Acm[Acm_id]['seasons'][0][capita_id]['amount_weekend'];
	}
	if(curr_day == 6 || curr_day == 5) {
		price = weekend_price;
	} else {
		price = week_price;
	}
	return_data['price'] = price;
	return_data['special'] = special;

	return return_data;
}

function format_date(myDate, format) {

	var m_names = new Array("Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	var now = new Date(myDate);
	var curr_date = now.getDate();
	var curr_month = now.getMonth();
	var curr_year = now.getFullYear();
	var curr_day = now.getDay();

	if(format == 'friendly') {

		nowStr = '<span class="date">'+curr_date + ' ' + m_names[curr_month] + ' ' + curr_year+'</span>';

		for (var holiday_key in Holidays) {
			if(Holidays[holiday_key]['date'] == curr_year+'-'+(curr_month+1)+'-'+curr_date) {
				nowStr += ' <span class="holiday red" title="'+Holidays[holiday_key]['name']+'">*</span>';
			}
		}

		nowStr += '<br /><strong><span class="cur"><span class="symbol"></span> <span class="money"></span><span style="display: none;" class="money-hidden"></span></span></strong>';
	} else if(format == 'human') {
		nowStr = curr_date + ' ' + m_names[curr_month] + ' ' + curr_year;
	} else {
		nowStr = curr_year+'-'+(curr_month+1)+'-'+curr_date;
	}
	return nowStr;
}

function setCal() {

	var date1 = $('#arrival').val();
	var date2 = $('#departure').val();

	date1array = date1.split("-");
	date2array = date2.split("-");

	var sDate = new Date(date1array[0], date1array[1]-1, date1array[2]);
	var eDate = new Date(date2array[0], date2array[1]-1, date2array[2]-1);
	var daysApart = Math.abs(Math.round((sDate-eDate)/86400000));

	var realsDate = new Date(date1array[0], date1array[1]-1, date1array[2]);
	var realeDate = new Date(date2array[0], date2array[1]-1, date2array[2]-1);

	$(".display-dates").html(format_date(realsDate, 'human')+" - "+format_date(realeDate, 'human'));

	// WE NEED TO FILL THE CALENDAR WITH 35 DATES
	var daysToFill = (35-(daysApart));
	var daysToFillSides = Math.floor(daysToFill / 2);

	var totalDays = daysToFill+daysApart;
	var daysToFillSidesEnd = 0;
	if(totalDays != 35) {
		daysToFillSidesEnd = 1;
	}

	sDate.setDate(sDate.getDate()-daysToFillSides);
	eDate.setDate(eDate.getDate()+daysToFillSides+daysToFillSidesEnd);

	daysApart = Math.abs(Math.round((sDate-eDate)/86400000));

	date1 = format_date(sDate);
	date2 = format_date(eDate);

	var firstDay = (sDate.getDay());
	firstDayInstance = null;

	// DRAW THE CALENDAR
	drawCal(firstDay, daysApart, date1, date2, realsDate, realeDate);

}

function drawCal(firstDay, daysApart, date1, date2, realsDate, realeDate) {

	date1array = date1.split("-");
	date2array = date2.split("-");

	var startDate = new Date(date1array[0], date1array[1]-1, date1array[2]);
	var endDate = new Date(date2array[0], date2array[1]-1, date2array[2]);

	// create basic table structure
	var calendar_html = "";
	calendar_html += '<TABLE  width="100%" border="0" cellspacing="2" cellpadding="0">';
	
	// variables to hold constant settings
	var openCol = '<TD class="selected"><div>';
	var closeCol = '</div></TD>';
	
	// create array of abbreviated day names
	var weekDay = new Array("Man", "Dins", "Woe", "Don", "Vry", "Sat", "Son");

	// create first row of table to set column width and specify week day
	calendar_html += '<TR class="headings">';
	for (var dayNum = 0; dayNum < 7; ++dayNum) {
		calendar_html += '<th>' + weekDay[dayNum] + '</th>';
	}
	calendar_html += '</TR>';

	// declaration and initialization of two variables to help with tables
	var digit = 0;
	var negative_digit = (firstDay*-1)+1;
	var curCell = 1;
	var days_to_add = startDate.getDay();
	var all_days_added = false;

	for (var row = 1; row <= Math.ceil((daysApart+days_to_add) / 7); ++row) {
			calendar_html += '<TR>';
			for (var col = 1; col <= 7; ++col) {
				
				if (curCell > firstDay && digit <= daysApart) {
					digit++;
					var calDays = new Date(date1array[0], date1array[1]-1, date1array[2]);
					calDays.setDate(calDays.getDate()+digit);


					if(dateWithin(realsDate, realeDate, calDays)) {
						calendar_html += '<TD class="selected"><div title="Beskikbaar">';
						all_days_added = true;
					} else {
						// TRY AND GET DEPRATURE DATE
						if(all_days_added == true) {
							all_days_added = false;
							calendar_html += '<TD class="departure-date"><div title="Hierdie is jou datum van vertrek">';
						} else {
							calendar_html += '<TD><div>';
						}
					}
					calendar_html += format_date(calDays, 'friendly');


				} else if(curCell <= firstDay) {

					var calDays = new Date(date1array[0], date1array[1]-1, date1array[2]);
					calDays.setDate(calDays.getDate()+negative_digit++);

					calendar_html += '<TD><div>';
					calendar_html += format_date(calDays, 'friendly');
					curCell++;

				} else if(digit > daysApart) {

					digit++;
					var calDays = new Date(date1array[0], date1array[1]-1, date1array[2]);
					calDays.setDate(calDays.getDate()+digit);

					calendar_html += '<TD><div>';
					calendar_html += format_date(calDays, 'friendly');
					curCell++;

				}
				calendar_html += '</div></TD>';
			}
			calendar_html += '</TR>';
		calendar_html += '</TR>';
	}
	// close all basic table tags
	calendar_html += '</TABLE>';
	// print accumulative HTML string

	$('.calendar').html(calendar_html);
	$('.calendar').data('calendarIndex', 0);
	// return calendar_html;
}

function dateWithin(beginDate,endDate,checkDate) {

	var b,e,c;
	b = Date.parse(beginDate);
	e = Date.parse(endDate);
	c = Date.parse(checkDate);

	if((c <= e && c >= b)) {
		return true;
	}
	return false;
}

function addAllPrices(parent_fieldset) {

	// console.time('addAllPrices');

	var Acm_id = $('#room-type-select', parent_fieldset).val();
	var number_of_adults = $('#no-of-adults', parent_fieldset).val();
	var number_of_children = $('#no-of-children', parent_fieldset).val();
	var currency = $('.currency-select').val();

	var i = 0;

	// GET THE ROOM
	$('.calendar > table > tbody > tr > td', parent_fieldset).each(function() {

		// console.time('Pricing Loop');

		// SET SOME VARIABLES
		var current_date = $(this).find('.date').html();
		var current_price = '0';
		var new_price = '0';
		var new_price_array = false;

		/**********************************/
		/* ADD THE BASE PRICE FOR THE DAY */
		/**********************************/
		// GET THE BASE PRICE FOR THIS DAY
		new_price_array = get_prices(current_date, 1, Acm_id);
		// ADD THE BASE PRICE TO THE TOTAL
		if(new_price_array['price'] > 0) {
			new_price = parseFloat(current_price)+parseFloat(new_price_array['price']);
		}

		/**********************************/
		/*      ADD THE ADULT PRICE       */
		/**********************************/
		if(number_of_adults == '1') {
			new_price_array = get_prices(current_date, 4, Acm_id);
		} else {
			new_price_array = get_prices(current_date, 2, Acm_id);
		}
		new_price = parseFloat(new_price)+parseFloat(new_price_array['price']*number_of_adults);

		/**********************************/
		/*    ADD THE CHILDREN PRICE      */
		/**********************************/
		if(number_of_children > 0) {
			new_price_array = get_prices(current_date, 3, Acm_id);
			new_price = parseFloat(new_price)+parseFloat(new_price_array['price']*number_of_children);
		}

		/**********************************/
		/*    ADD THE NUMBER OF ROOMS     */
		/**********************************/
		/* THIS IS NOT USED ANYMORE
		if(number_of_rooms > 1) {
			var new_price = parseFloat(new_price*number_of_rooms);
		}
		*/


		// UPDATE THE PRICING
		var currency_data = convertCurrency(new_price, currency);

		$(this).find('.symbol').html(currency_data['symbol']);
		$(this).find('.money').html(currency_data['value']);
		$(this).find('.money-hidden').html(new_price);

		flagFullyBooked(this, Acm_id);
		
		if(new_price_array['special'] == '1') {
			if($(this).find('.money').parent().find('.special').length < 1) {
				$(this).find('.money').parent().append('<span title="Spesiale tariewe" class="special"></span>');
			}
		}

		// console.timeEnd('Pricing Loop');

	});

	// console.timeEnd('addAllPrices');

	return true;
}

/**
 * Receives a set of table cells, and iterates through them, executing
 * flagFullyBooked() on each one.
 */
function flagFullyBookedBulk(tableCells, Acm_id) {
	$(tableCells).each(function() {
		flagFullyBooked(this, Acm_id);
	});
}

/**
 * Checks whether the supplied table cell should be flagged as fully booked for
 * the supplied accommodation id. this is done by checked whether the cell's
 * date exists in the Acm array's list of unavailable dates. if it does exist,
 * the full-booked div is prepended to the cell.
 */
function flagFullyBooked(tableCell, Acm_id) {
	// The numbered instance of the calendar. If there is 1 calendar, this will be
	// 0. 2 calendars = 1; 3 calendars = 2; etc.
	var current_fieldset_iteration = $(tableCell).parent().parent().parent().parent().data('calendarIndex');

	// remove fully-booked flag if it is there.
	$('div.fully-booked', tableCell).remove();

	// get the current cell's date and format it.
	compare_date = formatDate($(tableCell).find('span.date:eq(0)').html());

	// check whether the current iteration exists. if not, create it.
	if(typeof Acm['unavailabilities']['calendar'][current_fieldset_iteration] == 'undefined') {
		Acm['unavailabilities']['calendar'][current_fieldset_iteration] = [];
	}

	// check whether the current accommodation id exists in the current iteration. if not, create it.
	if(typeof Acm['unavailabilities']['calendar'][current_fieldset_iteration][Acm_id] == 'undefined') {
		Acm['unavailabilities']['calendar'][current_fieldset_iteration][Acm_id] = [];
	}

	// check whether the current iteration's accommodation contains the current cell's date.
	// if it does, added the fully-booked flag.
	var update = (
		Acm['unavailabilities']['calendar'][current_fieldset_iteration][Acm_id].has(compare_date)
		||
		(typeof Acm['unavailabilities']['global'][Acm_id] != 'undefined' && Acm['unavailabilities']['global'][Acm_id].has(compare_date))
	);
		
//	console.log("update Acm['unavailabilities']['calendar'][" + current_fieldset_iteration + "][" + Acm_id + "][" + compare_date + "]: " + update);
	if(update) {
		$('div:eq(0)', tableCell).append('<div class="fully-booked-afr" title="Onbeskikbaar"></div>');
	}
}

function totalRoomPrice(parent_fieldset) {
	// console.time('Update Total Price');

	var total_price = 0;
	var currency = $('.currency-select').val();
	$('div.calendar > table > tbody > tr > td.selected', parent_fieldset).each(function() {
		total_price = parseFloat($(this).find('.money-hidden').html()) + total_price;
	});

	// UPDATE THE PRICING
	var currency_data = convertCurrency(total_price, currency);

	$('.total-room-cost', parent_fieldset).find('.symbol').html(currency_data['symbol']);
	$('.total-room-cost', parent_fieldset).find('.money').html(currency_data['value']);
	$('.total-room-cost', parent_fieldset).find('.money_hidden').html(total_price);

	// console.timeEnd('Update Total Price');
	return true;
}

function totalRoomPriceValue(parent_fieldset) {
	// console.time('Update Total Price');

	var total_price = 0;
	var currency = $('.currency-select').val();
	$('div.calendar > table > tbody > tr > td.selected', parent_fieldset).each(function() {
		total_price = parseFloat($(this).find('.money-hidden').html()) + total_price;
	});

	// UPDATE THE PRICING
	var currency_data = convertCurrency(total_price, currency);

	$('.total-room-cost', parent_fieldset).find('.symbol').html(currency_data['symbol']);
	$('.total-room-cost', parent_fieldset).find('.money').html(currency_data['value']);
	$('.total-room-cost', parent_fieldset).find('.money_hidden').html(total_price);

	return "<span class='cur'><span class='symbol'>"+currency_data['symbol']+"</span><span class='money'>"+currency_data['value']+"</span><span class='money-hidden' style='display:none'>"+total_price+"</span></span>";

}


function addPrices(parent_fieldset) {

	$('div.calendar:eq(0)', parent_fieldset).append(loading);
	setTimeout(function() {
		addAllPrices(parent_fieldset);
		// totalRoomPrice(parent_fieldset);
		addSummary(parent_fieldset);
		$('#loading_div', parent_fieldset).remove();
	}, 100);
	return true;

}

function addSummary() {

	var room_summary_names = '';
	var room_summary_costs = '';
	var room_summary_total = 0;
	var summary = 0;
	var summary_text = '';
	var currency = $('.currency-select').val();

	$('.calendar_fieldset').each(function() {

		var adults = $(this).find('.no-of-adults').val();
		var children = $(this).find('.no-of-children').val();
		var room_id = $(this).find('.room-type-select').val();

		room_summary_names = Acm[room_id]['name'] + '<br /> <span>Volwassenes: '+adults+', Kinders: '+children +'</span>';
		room_summary_costs = totalRoomPriceValue($(this));

		summary_text += '<tr class="room">';
		summary_text += '<td class="room-summary-names">'+room_summary_names+'</td>';
		summary_text += '<td align="right" valign="top" colspan="2">'+room_summary_costs+'</td>';
		summary_text += '</tr>';

	});

	$('.summary-data').html(summary_text);
	$('.summary-data').find('.money-hidden').each(function() {
		room_summary_total = parseFloat($(this).html()) + room_summary_total;
	});

	// console.log(room_summary_total);

	var currency_data = convertCurrency(room_summary_total, currency);

	$('.room-summary-total').html('<span class="cur"><span class="symbol">'+currency_data['symbol']+'</span> <span class="money total_room_cost">'+currency_data['value']+'</span><span style="display: none;" class="money_hidden total_room_cost">'+room_summary_total+'</span></span>');

	// console.timeEnd('addSummary');
	return true;
}

function daysApart() {

	var date1 = $('#arrival').val();
	var date2 = $('#departure').val();

	date1array = date1.split("-");
	date2array = date2.split("-");

	var sDate = new Date(date1array[0], date1array[1]-1, date1array[2]);
	var eDate = new Date(date2array[0], date2array[1]-1, date2array[2]);
	var daysApart = Math.abs(Math.round((sDate-eDate)/86400000));
	return daysApart;
}

function startDateBigger() {

	var date1 = $('#arrival').val();
	var date2 = $('#departure').val();

	date1array = date1.split("-");
	date2array = date2.split("-");

	var sDate = new Date(date1array[0], date1array[1]-1, date1array[2]);
	var eDate = new Date(date2array[0], date2array[1]-1, date2array[2]);

	if(sDate.getTime() >= eDate.getTime()) {
		return false;
	} else {
		return true;
	}

}

function unhide() {
	var hideMes = $('.hide_me');
	
	if($(hideMes).length > 0) {
		$(hideMes).each(function() {
			$(this).removeClass('hide_me');
		});
	}
	
}