jQuery(document).ready(function() {
	
	jQuery('#date_exit_holder input#date_exit').fieldhint({callBack: HandleHint});
	jQuery('#date_return_holder input#date_return').fieldhint({callBack: HandleHint});
	jQuery('#tilbudskode-input input').fieldhint();
	
	
	jQuery.validator.addMethod('danishdate', checkDanishDatestring, '');
    jQuery.validator.addMethod('notzero', function (str, element) {return (str != '0');}, '');
    jQuery.validator.addMethod('discount', checkDiscount, '');
	jQuery.validator.addMethod('persons_advanced', checkPersondAdvanced, '');
	
	
	validatorOptions.rules = {};
	validatorOptions.rules['QB_return'] = {required: true};
	validatorOptions.rules['displayed_date_exit'] = {danishdate: true, required: true};
	validatorOptions.rules['displayed_date_return'] = {danishdate: true, required: 'input[name=displayed_date_return]:visible'};
	validatorOptions.rules['QB_place_exit'] = {notzero: true};
	validatorOptions.rules['QB_persons_out'] = {notzero: true};
	validatorOptions.rules['QB_car_out'] = {notzero: true};
	validatorOptions.rules['QB_trailer_out'] = {notzero: true};
	validatorOptions.rules['QB_persons_out'] = {persons_advanced: true};
	validatorOptions.rules['QB_adults_out'] = {persons_advanced: true};
	validatorOptions.rules['QB_kids_out'] = {persons_advanced: true};
	validatorOptions.rules['QB_smallkids_out'] = {persons_advanced: true};
	validatorOptions.rules['QB_tilbudskode'] = {discount: true};
	validatorOptions.rules['tilbudskode'] = {remote: 'discount.plex'};
	addValidation();
	
});

function initQuickbookingForm() {
	
	for (var i = 0; i < autooptions.length; i++) {
		var attrSelected = '';
		if (autooptions[i].selected == '1') {
			attrSelected = ' selected="selected"';
		}
		jQuery('form#quickbooking select#car_out').append('<option value="' + autooptions[i].value + '"' + attrSelected + '>' + autooptions[i].text + '</option>');
	}
	for (var i = 0; i < traileroptions.length; i++) {
		var attrSelected = '';
		if (traileroptions[i].selected == '1') {
			attrSelected = ' selected="selected"';
		}
		jQuery('form#quickbooking select#trailer').append('<option value="' + traileroptions[i].value + '"' + attrSelected + '>' + traileroptions[i].text + '</option>');
	}
	for (var i = 0; i < landsdeloptions.length; i++) {
		var attrSelected = '';
		if (landsdeloptions[i].selected == '1') {
			attrSelected = ' selected="selected"';
		}
		jQuery('form#quickbooking select#place_exit').append('<option value="' + landsdeloptions[i].value + '"' + attrSelected + '>' + landsdeloptions[i].text + '</option>');
	}
	handleQuickbookingForm();
	fixSelectboxes();
	applyDatepickers();
	do_low_price_eval();
}

function applyDatepickers () {
	jQuery('input#date_exit, input#date_return').each(function() {
		jQuery(this).val(jQuery.datepicker.formatDate('dd.mm.y', new Date()));
		jQuery(this).datepicker({
			onSelect: function(dateText, inst) {
				DateChange(jQuery(this));
				HandleSelectDateConstraints();
				jQuery.hideHints = false;
			},
			beforeShow: function () {jQuery.hideHints = true;},
			onClose: function () {jQuery.hideHints = false;},
			minDate: '0',
			disabled: true,
			dateFormat: 'dd.mm.y',
			maxDate: GetMaxdate(jQuery(this))
		});
		DateChange(jQuery(this));
		jQuery(this).change(
			function () {
				DateChange(jQuery(this));
			}
		);
	});
	jQuery('#fp_bigImg #fp_quickBooking .dateholder')
		.unbind('click')
		.bind('click',
			function(){
				jQuery(this).find('input.datefield').datepicker('show');
			}
	);
}

function fixSelectboxes (str) {
	var basicselector;
	if (str) {
		basicselector = '#fp_bigImg #fp_quickBooking ' + str;
	} else {
		basicselector = '#fp_bigImg #fp_quickBooking';
	}
	jQuery(basicselector).find('select').each(function() {
		jQuery(this).DGselectbox({
			buttonWidth: 21,
			innerHeight: 15,
			outerHeight: 19,
			selectCallback: selectboxCallback
		});
		
	});
	jQuery('div.DGselectbox-fieldwrapper').show().each(function(){
		var inputwrapper = jQuery(this).find('div.DGselectbox-inputwrapper');
		jQuery(this)
			.unbind('click.DGselectbox')
			.bind('click.DGselectbox', function (event) {
				event.stopPropagation();
				inputwrapper.trigger('click.DGselectbox');
			});
				
		jQuery(this)
			.parent().find('img.errorimage')
			.unbind('click.DGselectbox')
			.bind('click.DGselectbox', function (event) {
				event.stopPropagation();
				inputwrapper.trigger('click.DGselectbox');
			});
				
	});
}

function selectboxCallback (o) {
	jQuery('form#quickbooking').validate().element(o)
}


var validatorOptions = {};

function GetMaxdate (inputField) {
	var re = /(\d{4})(\d{2})(\d{2})/;
	var match = re.exec(enddate);
	var date = null;
	if (match && match.length >= 4) {
		date = danishDatestringToDate(match[3] + '-' + match[2] + '-' + match[1]);
	}
	return date;
}

function checkDiscount(str) {
	var valid = false;
	jQuery.ajax({
		url: 'discount.plex',
		data: {code: str},
		async: false,
		success: function(data, status, req) {
			if (data == 'true') {
				valid = true;
			}
		}
	});
	return valid;
}

function checkPersondAdvanced (str, element) {
	var f = jQuery('form#quickbooking');
	if (jQuery('#persons_advanced:visible').size()) {
		var valid = false;
		var adults = f.find('select#adults');
		var children = f.find('select#children');
		var infants = f.find('select#infants');
		
		var i_adults = parseInt(adults.val(), 10);
		var i_children = parseInt(children.val(), 10);
		var i_infants = parseInt(infants.val(), 10);
		
		if (i_adults + i_children + i_infants > 0) {
			valid = true;
			adults.removeClass('error');
			children.removeClass('error');
			infants.removeClass('error');
		} else {
			adults.addClass('error');
			children.addClass('error');
			infants.addClass('error');
		}
		return valid;
	} else if (jQuery('#persons_trailer:visible').size()) {
		var valid = false;
		var persons = f.find('select#persons');
		var i_persons = parseInt(persons.val(), 10);
		if (i_persons > 0) {
			valid = true;
			persons.removeClass('error');
		} else {
			persons.addClass('error');
		}
		return valid;
	} else {
		return true;
	}
	
	
}

function handleQuickbookingForm() {
	jQuery('form#quickbooking select#car_out').change(function () {
		var val = jQuery(this).val();
		var is_G = false;
		jQuery('form#quickbooking select#trailer option').remove();
		var found_trailerids = {};
		for (var i = 0; i < autos.length; i++) {
			//alert(autos[i].tickettype_trailer);
			if (autos[i].tickettype_car == val) {
				is_G = (autos[i].type == 'G');
				if (!found_trailerids['id_' + autos[i].tickettype_trailer]) {
					found_trailerids['id_' + autos[i].tickettype_trailer] = true;
					var option_text;
					if (autos[i].text_trailer) {
						option_text = autos[i].text_trailer;
					} else {
						option_text = '&nbsp;';
					}
					jQuery('form#quickbooking select#trailer').append('<option value="' + autos[i].tickettype_trailer + '">' + option_text + '</option>');
				}
			}
		}
		DisplaySecondaryOptions(is_G);
	});
	
	jQuery('form#quickbooking input[name=QB_return]').change(function () {
		var val = jQuery(this).val();
		if (val == 'yes') {
			jQuery('#fp_quickBooking #date_return_holder').show();
			jQuery('#fp_quickBooking img#date_return_disabled').hide();
		} else {
			jQuery('#fp_quickBooking #date_return_holder').hide();
			jQuery('#fp_quickBooking img#date_return_disabled').show();
		}
	});
	jQuery('form#quickbooking input[name=QB_return]').click(function () {
		jQuery(this).trigger('change');
	});
	
	jQuery('form#quickbooking button').click(function(){jQuery(this).trigger('blur')});
}

function ShowElement(element, holder, disabledelement) {
	holder.append(element);
	if (disabledelement) {
		disabledelement.hide();
	}
	
}

function HideElement(element, disabledelement) {
	jQuery('#fp_quickBooking #hidden_quickbooking_elements').append(element);
	if (disabledelement) {
		disabledelement.show();
	}
}

function DisplaySecondaryOptions(is_G) {
	if (is_G) {
		jQuery('#fp_quickBooking #persons_trailer').hide();
		jQuery('#fp_quickBooking #persons_advanced').show();
		fixSelectboxes('#persons_advanced');
		jQuery('#fp_bigImg #fp_quickBooking').css('background-image', 'url(grafik/forside/bg_quickbooking_gaa.png)');
	} else {
		jQuery('#fp_quickBooking #persons_trailer').show();
		fixSelectboxes('#persons_trailer');
		jQuery('#fp_quickBooking #persons_advanced').hide();
		jQuery('#fp_bigImg #fp_quickBooking').css('background-image', 'url(grafik/forside/bg_quickbooking.png)');
	}
}
function HandleHint(show, o) {
	if (show && jQuery.hideHints) {
		o.parent().find('label.hint').hide();
	}
}

function DateChange (inputField) {
	var datestring = inputField.val();
	var shadowField = jQuery('input#QB_' + inputField.attr('id'));
	if (datestring) {
		var selectedDateString = datestring.split('.')[0];
		var datedisplay = inputField.parents('.dateholder').find('.datedisplay');
		datedisplay.text(selectedDateString);
		
		var selectedDate = danishDatestringToDate(datestring);
		shadowField.val(jQuery.datepicker.formatDate('dd-mm-yy', selectedDate));
	
		inputField.parent().find('.hint').hide();
		if (jQuery('form#quickbooking').find(inputField).size()) {
			jQuery('form#quickbooking').validate().element(inputField);
		}
	} else {
		shadowField.val('');
		inputField.parents('.dateholder').find('.datedisplay').text('');
	}
}

function HandleSelectDateConstraints() {
	var date_exit, date_exit_obj;
	var date_return, date_return_obj, date_return_input;
	
	jQuery(' input#date_exit, input#date_return').each(
		function () {
			var inputField = jQuery(this);
			var currentDate = danishDatestringToDate(inputField.val());
			var name = inputField.attr('name');
			if (name == 'displayed_date_exit') {
				date_exit = currentDate;
				date_exit_obj = inputField;
			} else if (name == 'displayed_date_return') {
				date_return = currentDate;
				date_return_obj = inputField;
				date_return_input = inputField;
			}
		}
	);
	if (date_exit && date_return_obj && date_return_input) {
		var afterDateExit = new Date(date_exit.getTime());
		date_return_obj.datepicker('option', 'minDate', afterDateExit);	
		DateChange (date_return_input);
	}
}

function checkDanishDatestring (str) {
    var valid;
    if (!str || danishDatestringToDate(str)) {
        valid = true;
    } else {
        valid = false;
    }
    return valid;
}

function danishDatestringToDate (value) {
	var arrDate;
	if (value.indexOf('-') > 0) {
		arrDate = value.split('-');
	} else {
		arrDate = value.split('.');
	}
	
    var date = parseInt(arrDate[0], 10);
    var month = parseInt(arrDate[1], 10);
    var year = parseInt(arrDate[2], 10);
	if (year < 100) {
		if (year > 50) {
			year += 1900;
		} else {
			year += 2000;
		}
	}
	
    var testDate;
    if (date && month && year) {
        testDate = new Date(year, month - 1, date);
        if (isNaN(testDate)) {
            return false;
        } else if (date != testDate.getDate()) {
            return false;
        } else if (month != testDate.getMonth() + 1) {
            return false;
        } else if (year != testDate.getFullYear()) {
            return false;
        }
    } else {
        return false;
    }
    return testDate;
}

function checkLaterThan(value, element, param) {
    var f = element.form;
    var firstDate   = danishDatestringToDate(jQuery(f).find('input[name=' + param + ']').val());
    var lastDate    = danishDatestringToDate(value);
    return (firstDate < lastDate);
}


function addValidation() {
    validatorOptions.debug = false;
    validatorOptions.errorPlacement = function(error, element) {
    };
	validatorOptions.showErrors = showValidationResult;
	validatorOptions.onkeyup = false;
	validatorOptions.focusInvalid = false;
	
	jQuery('form#quickbooking').validate(validatorOptions);
	
	jQuery('form#quickbooking #findafgang button').click( function() {
		jQuery('form#quickbooking').attr( 'action', quickbooking_default_submit_url );
		jQuery('form#quickbooking').submit();	
	});
}

function showValidationResult (errorMap, errorList) {
	this.defaultShowErrors();
	jQuery('form#quickbooking img.errorimage').each(function() {
		jQuery(this).hide();
	});
	jQuery('form#quickbooking .error').each(function() {
		jQuery('#fp_quickBooking img#error_' + jQuery(this).attr('id')).show();
	});
}

function openQuickbookingWindow (f) {
	if (jQuery(f).valid()) {
		var trackingText = '';
		if (jQuery(f).attr('action') == quickbooking_default_submit_url) {
			trackingText = 'find_afgang';
		} else if (jQuery(f).attr('action') == low_price_cal_url) {
			trackingText = 'lavpriskalender';
		}
		if (jQuery.ButtonClicked) {
			trackingText = jQuery.ButtonClicked;
			jQuery.ButtonClicked = null;
		}
		if (trackingText) {
			trackEvent('quickbooking_forside', trackingText);
		}
		var bookingWin = openBookingStandardWin('', 'bookingWin');//window.open('', 'bookingWin', 'resizable=1,toolbar=0,location=0,menubar=0,status=0,scrollbars=1,directories=0,width=758,height=583');
		bookingWin.focus();
		return bookingWin;
	}
	jQuery.ButtonClicked = null;
	return false;
}

function openMyBookings (url) {
	myBookingsWin = openBookingStandardWin (url, 'myBookingsWin');
	myBookingsWin.focus();
}

function openBookingStandardWin (url, name) {
	return window.open(url, name, 'resizable=1,toolbar=0,location=0,menubar=0,status=0,scrollbars=1,directories=0,width=758,height=696');
}

function resetQuickbookingForm () {
	jQuery('form#quickbooking').get(0).reset();
	fixSelectboxes();
	DisplaySecondaryOptions();
	applyDatepickers();
	jQuery('form#quickbooking input[name=QB_return]').trigger('change');
}

function clickVoucherCodeButton() {
	jQuery.ButtonClicked = 'Find_afgang_tilbudskode';
	jQuery('form#quickbooking #findafgang button').click();
}

function submit_low_price() {
	jQuery('form#quickbooking').attr( 'action', low_price_cal_url ); // low_price_cal_url findes i context.pm
	jQuery('form#quickbooking').submit();	
}

function disable_submit_low_price() {
	alert( 'Denne kombination af transportmiddel og anh' + String.fromCharCode(230) + 'nger er ikke gyldig ved brug af lavpriskalenderen' );
}

function do_low_price_eval() {
	//alert('do_low_price_eval');
	var car_out_sel = jQuery('form#quickbooking select[name=QB_car_out]').val();
	var trailer_sel = jQuery('form#quickbooking select[name=QB_trailer_out]').val();
	
	
	var valid = false;
	if (window.autos) {
		jQuery.each( autos , function( i, item ){	
			if ( ( item.tickettype_car == car_out_sel ) && ( item.tickettype_trailer == trailer_sel ) && ( item.is_low_price_valid == 1 ) ) {
				valid = true;
				return false;
			}
		} );
	}
	jQuery('#lavpriskalender button').unbind( 'click' );
	if ( valid ) {
		jQuery('#lavpriskalender button').click( submit_low_price )
	} else {
		jQuery('#lavpriskalender button').click( disable_submit_low_price );
	}
}


