// wrap plugin in a closure
(function($) {
	// metadatapopup plugin definition
	$.fn.metadatapopup =
		function(options) {
			// extend default options with those provided
			var opts = $.extend({}, $.fn.metadatapopup.defaults, options);

			return this.each(function() {
				var $this = $(this);

				// build element specific options
				var o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts;

				// plugin functionality starts here
				$this.bind('click', function(event) {
					var options = '';
					$.each(o, function(property, value) {
						options += property + '=' + value + ',';
					});
					options += 'dummy=dummy';
					window.open($this.attr('href'),'PopupWindow',options);
					return false;
				});
			});
		};

	// metadatapopup plugin default options
	$.fn.metadatapopup.defaults =
		{
			height: 768,
			width: 1024,
			scrollbars: 1
		};
})(jQuery);

// wrap plugin in a closure
(function($) {
	// fancycheckbox plugin definition
	$.fn.fancycheckbox =
		function(options) {
			// extend default options with those provided
			var opts = $.extend({}, $.fn.fancycheckbox.defaults, options);

			return this.each(function() {
				var $this = $(this);

				// build element specific options
				var o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts;

				// plugin functionality starts here
				$this.addClass('fancycheckbox hidden');
				var replacement =
					$('<div class="fancycheckbox" />')
						.data('associatedCheckbox', $this)
						.data('options', o);
				if ($this.is(':checked')) {
					$this.after(
						replacement
							.addClass(o.checkedClass)
							.text(o.checkedText)
					);
				} else {
					$this.after(
						replacement
							.addClass(o.uncheckedClass)
							.text(o.uncheckedText)
					);
				}
				replacement.bind('click', clickHandler);
			});
		};

	var clickHandler =
		function(event) {
			var $this = $(this);
			var checkbox = $this.data('associatedCheckbox');
			var o = $this.data('options');
			if ($this.hasClass(o.checkedClass)) {
				$this
					.removeClass(o.checkedClass)
					.addClass(o.uncheckedClass)
					.text(o.uncheckedText);
				checkbox.attr('checked', false);
			} else {
				$this
					.removeClass(o.uncheckedClass)
					.addClass(o.checkedClass)
					.text(o.checkedText);
				checkbox.attr('checked', true);
			}
		};

	// fancycheckbox plugin default options
	$.fn.fancycheckbox.defaults =
		{
			checkedClass	: 'fancychecked',
			uncheckedClass	: 'fancyunchecked',
			checkedText		: '',
			uncheckedText	: 'SELECT'
		};
})(jQuery);


// wrap plugin in a closure
(function($) {
	// multitoggler plugin definition
	$.fn.multitoggler =
		function(options) {
			// extend default options with those provided
			var opts = $.extend({}, $.fn.multitoggler.defaults, options);

			return this.each(function() {
				var $this = $(this);

				// build element specific options
				var o = $.metadata ? $.extend({}, opts, $this.metadata()) : opts;

				// plugin functionality starts here
				var triggers = $('.' + o.triggerClass, $this);
				var contents = $('.' + o.contentClass, $this);
				var $expand = $('.' + o.triggerClass + '-expand', $this);
				var $collapse = $('.' + o.triggerClass + '-collapse', $this);
				if (o.hide) {
					contents.hide();
					if ($expand.length) {
						$expand.removeClass('hidden');
					}
					if ($collapse.length) {
						$collapse.addClass('hidden');
					}
				} else {
					if ($expand.length) {
						$expand.addClass('hidden');
					}
					if ($collapse.length) {
						$collapse.removeClass('hidden');
					}
				}
				triggers.each(function(i, trigger) {
					var $trigger = $(trigger);
					if (o.ajax && 'a' == trigger.tagName.toLowerCase()) {
						if (contents[i]) {
							var $content = $(contents[i])
							var ajaxOptions =
								{
									cache: false,
									dataType: 'html',
									success:
										function(data, textStatus) {
											$content
												.html(data)
												.show('normal');
											$trigger.removeClass(o.loadingClass);
										},
									url: $trigger.attr('href')
								};

							$trigger.bind('click', function(e) {
								if ($content.height() > 20) {
									$content.hide('normal', function() { $(this).empty(); });
								} else {
									$.ajax(ajaxOptions);
									$trigger.addClass(o.loadingClass);
								}
								return false;
							});
						}
					} else {
						$trigger.bind('click', function(e) {
							if (contents[i]) {
								if ($(contents[i]).is(':visible')) {
									if ($expand[i]) {
										$expand.removeClass('hidden');
									}
									if ($collapse[i]) {
										$collapse.addClass('hidden');
									}
									$(contents[i]).hide('normal');
								} else {
									if ($expand[i]) {
										$expand.addClass('hidden');
									}
									if ($collapse[i]) {
										$collapse.removeClass('hidden');
									}
									$(contents[i]).show('normal');
								}
							}
						});
					}
				});
			});
		};

	// multitoggler plugin default options
	$.fn.multitoggler.defaults =
		{
			ajax: false,
			contentClass: 'multitoggler-content',
			loadingClass: 'loading',
			triggerClass: 'multitoggler-trigger',
			hide: true
		};
})(jQuery);

jQuery(function($) {
	// set loading class on all form buttons on submit
	$('form:has(input[type=submit])')
		.bind(
			'submit',
			function() {
				$('input[type=submit]', this)
					.addClass('loading');
			}
		);

	// activate ajax handling for rate details
	$('div#step_3')
		.multitoggler(
			{
				ajax: true,
				contentClass: 'rate_details'
			}
		);

	// activate ajax handling for rate details
	$('form#step_3')
		.multitoggler(
			{
				ajax: true,
				contentClass: 'rate_details'
			}
		);

	// activate poup behavior for all links with rel="popup"
	$('a[rel=popup]').metadatapopup();

	// activate fancy checkboxes
	$('input[type=checkbox].add-on-checkbox').fancycheckbox();

	// handle inactive links
	$('.navigation a.inactive')
		.bind(
			'click',
			function() {
				var id = $(this).attr('id');
				var matches = id.match(/([^_]+_)link/);
				var $noticeElement = $('#' + matches[1] + 'notice');
				$noticeElement.toggleClass('hidden');
				return false;
			}
		);
	
	// calendar definitions for step 1 packages booking
	
	if($$('#start_date_packages')!="")
	{
		var daysSelectBoxPackages = new MavSelectBox('daysPackages');
		var eDateMaxAllowed = _edate_max_allowed.split(".");
		var sDateVal;
		var sDateCal = new Calendar(
				{
					start_date_packages: 'd.m.Y'
				},
				{
					classes: ['dashboard'],	// use alternate style classes
					direction: 0.5,			// future-only dates, including today
					offset: 1,				// week starts with monday
					tweak: { x: -26 },		// move calendar 26px to the left
					//blocked: _msg_interval_invalid_packages_sdate, // days not allowed
					bounds: {start:_sdate_bound_start , end:_sdate_bound_end},
					months: _msg_months	// month names in $lang
				}
			);
		var eDateCal = new Calendar(
				{
					end_date_packages: 'd.m.Y'
				},
				{
					classes: ['dashboard'],	// use alternate style classes
					direction: 0.5,			// future-only dates, including today
					offset: 1,				// week starts with monday
					tweak: { x: -26 },		// move calendar 26px to the left
					//blocked: _msg_interval_invalid_packages_edate, // days not allowed
					bounds: {start:_edate_bound_start , end:_edate_bound_end},
					months: _msg_months     // month names in $lang
				}
			);
		sDateCal.addEvent('valueChange',function(){
			//startDate selected from calendar
			var startDate = sDateCal.calendars[0].val;
			//endDate calendar
			var endDateCalendar = eDateCal.calendars[0];
			//maximum endDate allowed;
			var eDate = new Date();
			eDate.setFullYear(parseInt(eDateMaxAllowed[2],10),parseInt(eDateMaxAllowed[1],10)-1,parseInt(eDateMaxAllowed[0],10));
			eDate.setSeconds(0,0);
			//number of selected days
			var selectedDays = $$('#daysPackages').get('value') * 86400000;
			
			//the new EndDate;
			var newEndDate = startDate.valueOf() + selectedDays;

			var eDateAux = eDate.getTime();
			
			var differenceDays = parseInt((endDateCalendar.val.getTime() - startDate)/86400000,10);
			
			if(differenceDays>=_nr_of_days)
			{			
				daysSelectBoxPackages.search(differenceDays);
				daysSelectBoxPackages.textSearch = '';
			}
			else
			{
				endDateCalendar.val = new Date(newEndDate);
				eDateCal.write(endDateCalendar);
				daysSelectBoxPackages.search(_nr_of_days);
				daysSelectBoxPackages.textSearch = '';
			}
			
			//get the sdate value in dd.mm.yyyy format.
			sDateVal = $$('#start_date_packages').get('value').toString().split(".");
			
			$$("li[id^=daysPackages]").each(function(listItemElement) {
				//store the day value in the select
				var day = listItemElement.getElement('span').get('text');
				//temp date variable
				var sDate = new Date();
				//nr of days
				day = parseInt(sDateVal[0],10)+parseInt(day,10);
				//set the possible endDate
				sDate.setFullYear(parseInt(sDateVal[2],10),parseInt(sDateVal[1],10)-1,day);
				sDate.setSeconds(0,0);
				//if the possible endDate is grater than the maximumAllowed endDate then remove the option from select
				if(Math.ceil(sDate-eDate)>0)
				{
					listItemElement.style.display="none";
				}
				else if(Math.ceil(sDate-eDate)<0)//if lower then make visible again
				{
					listItemElement.style.display="";
				}
				else//if equal make visible
				{
					listItemElement.style.display="";
				}
			});
		});
		
		eDateCal.addEvent('valueChange',function(){
			var startDate = sDateCal.calendars[0].val;
			var startDateCalendar = sDateCal.calendars[0];
			startDate.setSeconds(0);
			startDate.setMinutes(0);
			startDate.setHours(0);
			//endDate calendar
			var endDateCalendar = eDateCal.calendars[0];
			//maximum endDate allowed;
			var eDate = new Date();
			eDate.setFullYear(parseInt(eDateMaxAllowed[2],10),parseInt(eDateMaxAllowed[1],10)-1,parseInt(eDateMaxAllowed[0],10));
			eDate.setSeconds(0,0);
			//get the edate value in dd.mm.yyyy format.
			eDateVal = $$('#end_date_packages').get('value').toString().split(".");
			var auxDate = endDateCalendar.val;
								
			var differenceDays = parseInt((auxDate - startDate)/86400000,10);
			if(differenceDays>=_nr_of_days)
			{			
				daysSelectBoxPackages.search(differenceDays);
				daysSelectBoxPackages.textSearch = '';
			}
			else
			{
				var newEndDate = startDate.valueOf() + _nr_of_days* 86400000;
				endDateCalendar.val = new Date(newEndDate);
				eDateCal.write(endDateCalendar);
				daysSelectBoxPackages.search(_nr_of_days);
				daysSelectBoxPackages.textSearch = '';
			}
			
		});
		
		daysSelectBoxPackages.addEvent('select', function(selectElement) {
			var startDate = sDateCal.calendars[0].val;
			var endDateCalendar = eDateCal.calendars[0];
			var endDate = endDateCalendar.val;
			
			var selectedDays = selectElement.get('text').toInt() * 86400000;
			var differenceDays = (endDate - startDate);

			if (selectedDays != differenceDays) {
				var newEndDate = startDate.valueOf() + selectedDays;
				endDateCalendar.val = new Date(newEndDate);
				eDateCal.write(endDateCalendar);
			}
		});
		
		/*
		
		eDateCal.addEvent('valueChange',function(){
			var startDate = sDateCal.calendars[0].val;
			var startDateCalendar = sDateCal.calendars[0];
			startDate.setSeconds(0);
			startDate.setMinutes(0);
			startDate.setHours(0);
			//endDate calendar
			var endDateCalendar = eDateCal.calendars[0];
			//maximum endDate allowed;
			var eDate = new Date();
			eDate.setFullYear(parseInt(eDateMaxAllowed[2],10),parseInt(eDateMaxAllowed[1],10)-1,parseInt(eDateMaxAllowed[0],10));
			eDate.setSeconds(0,0);
			//get the edate value in dd.mm.yyyy format.
			eDateVal = $$('#end_date_packages').get('value').toString().split(".");
			var auxDate = new Date();
			auxDate.setFullYear(parseInt(eDateVal[2],10),parseInt(eDateVal[1],10)-1,eDateVal[0]);
			auxDate.setSeconds(0);
			auxDate.setMinutes(0);
			auxDate.setHours(0);
			//alert(Math.ceil((auxDate-eDate));
			
			var differenceDays = parseInt((auxDate - startDate)/86400000,10);
			if(differenceDays>=_nr_of_days)
			{			
				//if the new date is smaller than max value
				if(Math.ceil((auxDate-eDate))>0)
				{
					//select the corresponding nr of days
					daysSelectBoxPackages.search(_nr_of_days+Math.ceil((auxDate-eDate)/86400000));
				}
				else if (Math.ceil((auxDate-eDate)/86400000)<0)//if the new date is grater than max value
				{
					//select the corresponding nr of days
					daysSelectBoxPackages.search(parseInt((auxDate-startDate.getTime())/86400000,10));
				}
				else //else if the new date is equal to the max value
				{
					//calculate the nr of days available
					daysSelectBoxPackages.search(differenceDays);
				}
			}
			else
			{
				var selectedDays = _nr_of_days.toInt() * 86400000;
				var newSDate = auxDate - selectedDays;
				startDateCalendar.val = new Date(newSDate);
				eDateCal.write(startDateCalendar);
				daysSelectBoxPackages.search(_nr_of_days);
			}
		});
		
		*/
		
		
	}
});
