/* Custom calendar plugin */
(function($){
	function counter(){
		if (typeof counter.index == 'undefined'){counter.index = 0;}
		return counter.index++;
	};
	
	// plugin definition
	$.fn.CustomCalendar = function (options){
		if (typeof options == 'string'){
			switch (options){
				// get calendar instance
				case 'get':
					return $(this).data('CustomCalendar');
				break;
				case 'show':
					$(this).data('CustomCalendar').show();
				break;
				default:
					trow('CustomCalendar - unkwnown option');
				break;
			}
			return;
		}
		
		var options = $.extend({}, $.fn.CustomCalendar.defaults, options);
		return this.each(function (){
			$(this).data('CustomCalendar', new CustomCalendar(options, this));
		});
		
		function CustomCalendar(options, el){
			// console.log('CustomCalendar', arguments);
			var
				uid = 'CustomCalendar-'+counter(),
				date = new Date(), // parsed date
				today = new Date(), // today
				element = $(el), // binding element
				last_href = '', // last loaded data
				
				container = null,
				// special_days = {}, // days with fixed travel nights
				return_days = {}, // return days on selected day
				nights_content = '', // nights select
				nights = '', // nights selected
				hotel_only = true; // nights selected
			
			this.render = function (){
				if (options.href){
					var href = '';
					if (typeof options.href != 'string'){
						href = options.href.call();
					}
					if (href){
						// add days
						href += '&month='+(date.getMonth()+1);
						href += '&year='+date.getFullYear();
						href += '&min_nights='+options.min_nights;
						href += '&max_nights='+options.max_nights;
						var pos = element.offset();
						pos.top += element.outerHeight();
						container.css(pos);
						// if changed
						if (href != last_href){
							$('tbody', container).html('<tr><td colspan="7">Loading ...</td></tr>');
							// set title
							$('.ui-custom-calendar-title', container).html(options.months[date.getMonth()]+' '+date.getFullYear());
							$.getJSON(href, function (data){
								renderDays(data);
								last_href = href;
							});
						}
					}
				}
			};
			
			this.show = function (){
				container.show();
			}
			
			var renderDays = function (days){
				var html = '', sel_date = $.trim(element.val()), sel_date_found = false;
				// special_days = {};
				if (options.nights && options.nights.val()){
					nights = options.nights.val();
				}
				for (i=0;i<days.length;i++){
					if (i % 7 == 0){html += '<tr>';}
					if (days[i].out){
						html += '<td class="ui-state-disabled">'+days[i].day+'</td>';
					}
					else if (days[i].enabled){
						return_days[days[i].day] = false;
						hotel_only = typeof(days[i].return_days) == 'undefined';
						var cls = 'ui-state-default ui-custom-calendar-enabled';
						if (sel_date == days[i].date){cls += ' ui-state-active'; sel_date_found = days[i].day;}
						if (days[i].special){cls += ' ui-custom-calendar-special';}
						if (typeof(days[i].return_days) !== 'undefined'){
							if (days[i].return_days){
								return_days[days[i].day] = '';
								for (j=0;j<days[i].return_days.length;j++){
									return_days[days[i].day] += '<option value="'+days[i].return_days[j]+'">'+days[i].return_days[j]+'</option>';
								}
							}
						}
						html += '<td><span class="'+cls+'">'+days[i].day+'</span></td>';
					}
					else{
						html += '<td class="ui-state-disabled"><span class="ui-state-default">'+days[i].day+'</span></td>';
					}
					if (i % 7 == 6){html += '</tr>';}
				}
				$('tbody', container).html(html);
				// hover
				$('tbody .ui-custom-calendar-enabled', container).hover(
					function (){$(this).addClass('ui-state-hover');},
					function (){$(this).removeClass('ui-state-hover');}
				);
				// special hover
				if ($.fn.qtip){
					$('.ui-custom-calendar-special').qtip({
						content: {text: 'This is a special offer', prerender: true}
						, show: { delay: 10 }
					});
				}
				// console.log(hotel_only);
				if (hotel_only){
					options.nights.html(nights_content).val(nights);
				}
				else{
					if (!sel_date_found){
						element.val('');
						if (options.nights){options.nights.html('');}
					}
					else{
						if (options.nights){options.nights.html(return_days[sel_date_found]).val(nights);}
					}
				}
			};
			
			this.init = function (){
				// date
				if ($.trim(element.val()) != ''){
					var d = $.trim(element.val()).split('.');
					date.setFullYear(parseInt(d[2], 10), parseInt(d[1], 10)-1, parseInt(d[0], 10));
				}
				// build container
				var html = '<div id="'+uid+'" class="ui-widget ui-widget-content ui-corner-all ui-custom-calendar" unselectable="on">';
				html += '<div class="ui-widget-header ui-corner-top ui-custom-calendar-header">';
				html += '<span class="ui-icon ui-icon-circle-triangle-w">Prev</span>';
				html += '<span class="ui-icon ui-icon-circle-triangle-e">Next</span>';
				html += '<span class="ui-custom-calendar-title">'+options.months[date.getMonth()]+' '+date.getFullYear()+'</span>';
				html += '</div>'; // end header
				// body
				html += '<table cellspacing="0" cellpadding="0" class="ui-custom-calendar-body">';
				html += '<thead><tr><th width="14%">'+options.daysofweek.join('</th><th width="14%">')+'</th></tr></thead>';
				html += '<tbody></tbody>';
				html += '</table>';
				html += '</div>'; // end container
				$('body').append(html);
				container = $('#'+uid);
				if ($.browser.msie && (parseFloat($.browser.version) < 7)){
					container.bgiframe();
				}
				// events
				var self = this;
				if (options.nights){
					nights_content = options.nights.html();
					nights = options.nights.val();
					options.min_nights || (options.min_nights = parseInt($('option:first', options.nights).val()), 10);
					options.max_nights || (options.max_nights = parseInt($('option:last', options.nights).val(), 10));
				}
				$('tbody', container).click(function (e){
					if ($(e.target).is('.ui-custom-calendar-enabled')){
						var day = parseInt($(e.target).html());
						element.val([day, date.getMonth()+1, date.getFullYear()].join('.'));
						container.hide();
						$('.ui-state-active', this).removeClass('ui-state-active');
						$(e.target).addClass('ui-state-active');
						if (options.nights){
							if (hotel_only){
								options.nights.html(nights_content);
								options.nights.val(nights);
							}
							else{
								options.nights.html(return_days[day]);
								// options.nights.val(nights);
								try{
									options.nights.val(nights);
								} catch (err){
									setTimeout(function (){options.nights.val(nights);}, 1);
								}
							}
						}
					}
				});
				// prev
				$('.ui-icon-circle-triangle-w', container).click(function (e){
					date.setFullYear(date.getFullYear(), date.getMonth()-1, 1);
					self.render();
					return false;
				});
				// next
				$('.ui-icon-circle-triangle-e', container).click(function (e){
					date.setFullYear(date.getFullYear(), date.getMonth()+1, 1);
					self.render();
					return false;
				});
				// element.bind('blur', function (){container.hide();});
				element.bind('click', function (e){container.show(); return false;});
				container.click(function (){return false;});
				$(document).click(function (){container.hide();});
				// fill in days
				this.render();
			}
			this.init();
		};
	};
	// plugin defaults
	$.fn.CustomCalendar.defaults = {
		href: false
		, months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
		, daysofweek: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
		, nights: false
		, min_nights: false
		, max_nights: false
	};
})(jQuery);
