/**
 * Datepicker.proxy.js - Proxy for date pickers
 * 
 * @author Webstores <info at webstores dot nl>
 *         Copyright (c) Webstores internet totaalbureau <http://www.webstores.nl/>
 */
function DatePickerProxy(selector, url) {
	this.now = null;
	this.datepicker = $(selector);
	this.availabilityUrl = url;
	this.availableDates = null;
	this.departureDateSelected = false;
	this.construct();
};

DatePickerProxy.prototype = {
	/**
	 * @constructor
	 */
	construct: function() {
		if(this.datepicker.length) {
			this.now = new Date();
			
			if(this.datepicker.length > 1 && this.datepicker.length < 3) {
				this.createDatePickerPair();
			}
			else {
				this.createDatePicker();
			}
		}
	},
	
	/**
	 * Create a single date picker
	 */
	createDatePicker: function() {
		var self = this;
		
		this.datepicker.datepicker({
			minDate: self.now,
			showOtherMonths: true,
			beforeShowDay: function(date) {
				return self.checkDate(date);
			},
			onChangeMonthYear: function(year, month, picker) {
				self.getAvailableDates(year, month);
			}
		});
	},
	
	/**
	 * Create a date picker pair
	 */
	createDatePickerPair: function() {
		var self = this;
		
		this.datepicker.datepicker({
			minDate: self.now,
			showOn: 'button',
			buttonImage: '/img/calendar.gif',
			buttonImageOnly: true,
			buttonText: 'Kies een datum',
			showOtherMonths: true,
			onSelect: function(dateText, picker) {
				self.onDatePickerSelect(dateText, picker);
			}
		});
	},
	
	/**
	 * Checks a single date for availability
	 * 
	 * @param {Object} date The date to check
	 * @return {Array} propArr Date properties
	 */
	checkDate: function(date) {
		var propArr = [];
		var dateString = $.datepicker.formatDate('yy-mm-dd', date);
		
		if(this.availableDates == null) {
			this.availableDates = this.getAvailableDates();
		}
		
		if(this.availableDates && this.availableDates.dates) {
			for(var i = 0; i < this.availableDates.dates.length; i++) {
				if(dateString == this.availableDates.dates[i].date) {
					propArr.push(this.availableDates.dates[i].available);
					
					if(!this.availableDates.dates[i].available) {
						propArr.push('ui-datepicker-unavailable');
					}
				}
			}
		}
		else {
			propArr.push(true);
		}
		
		return propArr;
	},
	
	/**
	 * When a date picker fires onSelect
	 * 
	 * @param {String} dateText The date picker's date (DD-MM-YYYY)
	 * @param {Object} picker The date picker instance
	 */
	onDatePickerSelect: function(dateText, picker) {
		var idPrefix = picker.input[0].id.split('-')[0];
		var dateSegments = dateText.split('-');
		
		var selectedDate = new Date(dateSegments[2] + '-' + dateSegments[1] + '-' + dateSegments[0]);
		var tomorrow = new Date(selectedDate);
		tomorrow.setDate(tomorrow.getDate() + 1);
		
		this.setDate(idPrefix, selectedDate);
		
		switch(idPrefix) {
			case 'arrival':
				$('#departure-date').datepicker('option', 'minDate', tomorrow);
				$('#departure-date').datepicker('refresh');
				if(!this.departureDateSelected) {
					this.setDate('departure', tomorrow, true);
				}
				break;
			case 'departure':
				$('#arrival-date').datepicker('option', 'maxDate', dateText);
				$('#arrival-date').datepicker('refresh');
				this.departureDateSelected = true;
				break;
		}
	},
	
	/**
	 * Sets the date of a group of HTMLSelectElements and/or the related date picker
	 * 
	 * @param {String} idPrefix Select ID prefix
	 * @param {Date} date The date object
	 * @param {Boolean} setDatePicker Whether to set the date picker's dat or not
	 */
	setDate: function(idPrefix, date, setDatePicker) {
		$('#' + idPrefix + '-day option[value=' + date.getDate() + ']').attr('selected', true);
		$('#' + idPrefix + '-month option[value=' + (date.getMonth() + 1) + ']').attr('selected', true);
		$('#' + idPrefix + '-year option[value=' + date.getFullYear() + ']').attr('selected', true);
		
		if(setDatePicker) {
			$('#' + idPrefix + '-date').datepicker('setDate', date);
		}
	},
	
	/**
	 * Gets the available dates via HTTP Request
	 * 
	 * @param {String} year The year (YYYY)
	 * @param {String} year The month ([M]M)
	 * @return {Object} Available dates as JSON
	 */
	getAvailableDates: function(year, month) {
		var self = this;
		
		/*
		 * JSON
		 *
			{
				dates: [
					{
						date: 'YYYY-MM-DD',
						available: true
					},
					{
						date: 'YYYY-MM-DD',
						available: false
					},
					...
				]
			}
		*/
		
		$.ajax({
			type: 'POST',
			url: self.availabilityUrl,
			data: 'packageId=' + $('#booking-package-id').val() + '&year=' + year + '&month=' + month,
			dataType: 'json',
			success: function(json) {
				return json;
			},
			error: function() {
				return {};
			}
		});
	}
};

