jQuery.noConflict();
jQuery(document).ready(function(){
	if($$('.datepicker')){
		jQuery('.datepicker').datepicker({
			'dateFormat'		: 	'dd-mm-yy',
			'changeMonth'		: 	true,
			'changeYear'		: 	true,
			'yearRange'			:	'1900:2020',
			'dayNames'			: 	['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'],
			'dayNamesMin'		:	['Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'],
			'dayNamesShort'		:	['Zon', 'Maa', 'Din', 'Woe', 'Don', 'Vri', 'Zat'],
			'monthNames'		:	['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
			'monthNamesShort' 	:	['Jan', 'Feb', 'Maa', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']
		});
	}
	
	// Datepickers
	var dpp = new DatePickerProxy('#calendar .calendar-ui-wrap', '/calendars/homepage');
});

/**
 * 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 = jQuery(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();
			
			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.availableDates = self.getAvailableDates(year, month);
				setTimeout(function() {
					self.initTooltip();
				}, 500);
			},
			onSelect :  function(event, ui) {
				var datestring =  ui.currentYear + '-' + ((""+ui.currentMonth) < 9 ? '0' + (ui.currentMonth+1) : (ui.currentMonth+1)) + '-' + ((""+ui.currentDay).length < 2 ? '0' + (ui.currentDay) : (ui.currentDay));
				var urls = self.findUrl(datestring);
				
				if(urls.length > 0){
					window.location = urls[urls.length-1];
				}
			},			
			dayNames		: 	['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'],
			dayNamesMin		:	['Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'],
			dayNamesShort	:	['Zon', 'Maa', 'Din', 'Woe', 'Don', 'Vri', 'Zat'],
			monthNames		:	['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
			monthNamesShort :	['Jan', 'Feb', 'Maa', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']
		});
		self.initTooltip();
	},
	
	initTooltip: function(){
		jQuery('.ui-datepicker-unavailable').tooltip({ 
		    delay: 20, 
		    showURL: false, 
		    bodyHandler: function() {
			 	var text = jQuery(this).context.tooltipText;
			 	text = text.split(' % - % ');
			 	var date = text[0];
			 	var title = text[1];
			 	text = text[2];
			 	
			 	var html =
			 		'<span class="date">' + date + '</span>' +
			 		'<h4 title="title">' + title + '</h4>' +
			 		'<p>' + text + '</p>';
		        return html;
		    } 
		});		
	},
	
	/**
	 * Checks a single date for availability
	 * 
	 * @param {Object} date The date to check
	 * @return {Array} propArr Date properties
	 */
	checkDate: function(date) {
		var strclass = 'ui-state-disabled';
		var dateString = jQuery.datepicker.formatDate('yy-mm-dd', date);
		var title = '';
		
		if(this.availableDates == null) {
			var today = new Date();
			this.availableDates = this.getAvailableDates(today.getFullYear(), today.getMonth()+1);			
		}
		
		if(this.availableDates && this.availableDates.dates) {
			for(var i = 0; i < this.availableDates.dates.length; i++) {
				if(dateString == this.availableDates.dates[i].date) {
					if(this.availableDates.dates[i].available) {
						strclass = 'ui-datepicker-unavailable';
						title = this.availableDates.dates[i].title;
					}
				}
			}
		}
		return [true, strclass, title];
	},
	
	/**
	 * 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;
		var result = null;
		
		jQuery.ajax({
			async: false,
			type: 'POST',
			url: self.availabilityUrl,
			data: '&year=' + year + '&month=' + month,
			dataType: 'json',
			success: function(json) {
				result = json;
			},
			error: function() {
				result = {};
			}
		});
		
		return result;
	},
	/**
	 * Gets the id from the availableDates
	 * @param {String} the date string
	 * @return {int} id
	 */
	findUrl : function(dateString) {
		var urls = new Array();
		if(this.availableDates && this.availableDates.dates) {
			for(var i = 0; i < this.availableDates.dates.length; i++) {
				if(dateString == this.availableDates.dates[i].date) {
					 urls.push(this.availableDates.dates[i].url);
				}
			}
		}
		return urls;
	}
};
