jQuery(function()
{
	
	var variable_delimiter = /\s/;
	var attribute_expression = /([\w]+)\[([\w=]+)\]/;
	var equals = /=/;
	
	var switch_forms = function(val, params) {
		jQuery("FORM.enquiry-form.addendum").hide();
		if (params[0]) {
			jQuery("#" + params[0]).show();
			jQuery("#" + params[0]).find("INPUT[name='enquirey_type']").val(val);			
		}
		attrs = attribute_expression.exec(params[1]);
		if (params[1] && attrs) {
			attribute = attrs[2].split(equals);
			name = attrs[1];
			element = "FORM#" + params[0] + " *[name=" + name + "]"
			jQuery(element).prop(attribute[0], eval(attribute[1])).change();
		}
	}
	
	jQuery("FORM.enquiry-form SELECT[name='enquiry_type']").change(function() {
		var selected_option = jQuery(this).find("OPTION:selected");
		var val = selected_option.val();
		if(selected_option.attr("rel")) {
			params = selected_option.attr("rel").split(variable_delimiter);
			switch_forms(val, params);
		} else {
			switch_forms(val, false);
		}
		update_validation_statuses(this);
	})
	
	var update_validation_statuses = function(select_el) {
		selected_option = jQuery(select_el).find("OPTION:selected");
		if (selected_option.val() == "cancel_reservation" || selected_option.val() == "amend_reservation") {
			jQuery("LABEL.reservation").removeClass("valid-off");
		} else {
			jQuery("LABEL.reservation").addClass("valid-off");
		}
	}
	
	jQuery("FORM.enquiry-form INPUT[name='enquiry_type']").change(function() {
		val = jQuery(this).val();
		params = jQuery(this).attr("rel").split(variable_delimiter);
		switch_forms(val, params);
	});
	
	jQuery("FORM.enquiry-form INPUT[name='used_before']").change(function() {
		params = jQuery(this).attr("rel");
		jQuery("FORM.enquiry-form #" + params).toggle();
	});
	
	jQuery("FORM.enquiry-form INPUT[name='stay_the_night']").change(function() {
		if (jQuery(this).prop("checked")) {
			jQuery("FORM.enquiry-form SELECT[name='number_of_nights']")
				.prop("disabled", false)
				.addClass("required");
		} else {
			jQuery("FORM.enquiry-form SELECT[name='number_of_nights']")
				.prop("disabled", true)
				.removeClass("required");
		}
	})
	
	
	var add_button = jQuery("<a class='btn' href='#'><span>+ Add</span></a>")
						.click(function() {
							jQuery("DIV.location_wrapper:hidden:first").show();
							if (!jQuery("DIV.location_wrapper:hidden").length) jQuery(this).hide()
							return false;
						})
	
	var remove_button = jQuery("<a class='btn remove' href='#'><span>-</span></a>")
						.click(function() {
							jQuery(this).parent().hide();
							jQuery(this).next("SELECT").val(0);
							add_button.show();
							return false;
						})	
	
	jQuery("FORM.enquiry-form FIELDSET.locations SELECT:last").after(add_button);
	
	jQuery("FORM.enquiry-form FIELDSET.locations SELECT:gt(0)").wrap(function() {
		return "<div class='location_wrapper' />";
	}).before(remove_button);
	
	jQuery("DIV.location_wrapper").hide();
	
	jQuery("INPUT.date, INPUT.dateUK").datepicker({
		buttonImage: calendarIcon,
		showOn: 'both',
		buttonImageOnly: true,
		minDate: 0,
		dateFormat: "dd/mm/yy"
	});
	
	function limitChars(textarea, limit, count) {
		var text = textarea.val(); 
		var textlength = text.length;
		count.html((limit - textlength) + " characters left");
		if(textlength > limit) {
			textarea.val(text.substr(0,limit));
			return false;
		} else {
			return true;
		}
	}
		
	jQuery("TEXTAREA.comments").keyup(function() {
		limitChars(jQuery(this), 255, jQuery(this).next("P"));
	}).trigger("keyup");
	
	var details_toggle = jQuery("<a href='#'>Show all details</a>")
							.toggle(function() {
								jQuery(this).html("Hide details").prev().toggle();
								return false;
							}, function() {
								jQuery(this).html("Show all details").prev().toggle();
								return false;
							})
	
	jQuery("FIELDSET.contact_details .extra")
		.hide()
		.after(details_toggle);
	
	jQuery("FIELDSET.contact_list SELECT")
		.change(function() {
			uid = jQuery(this).val();
			jQuery("FIELDSET.contact_list LI").hide();
			jQuery("FIELDSET.contact_list LI[rel='" + uid + "']").show();
		})
		.show();
	jQuery("FIELDSET.contact_list LI").hide();
	
	
	jQuery.validator.addMethod("phone", function(phone_number, element) {
		return this.optional(element) || phone_number.length >= 7 && phone_number.length <= 40 &&
			phone_number.match(/^[\d\s\(\)-]+$/);
	}, "Please enter a valid phone number");
	
	jQuery.validator.addMethod("futureDate", function(value, element, params) {
		date_array = value.split('/');
		var selected_date = new Date(date_array[2], date_array[1]-1, date_array[0]);
		var today_date = new Date().setHours(0,0,0,0);
		return selected_date >= today_date;
    },'Please enter a date in the future.');
	
	jQuery("FORM.enquiry-form").each(function() {
		jQuery(this).validate({
			debug: false,
			errorElement: 'p',
			errorPlacement: function(error, element) {
				element.before( error );
			},
			rules: {
				telephone: {
					required: true,
					phone: true
				},
				postcode: {
					required: {
						depends: function(element) {
							country = jQuery(this).closest("form").find("select[name='country']");
							return country.val() == "united-kingdom" || country.val() == "united-states";
						}
					}
				},
				reservation_number: {
					required: {
						depends: function(element) {
							enquiry_type = jQuery(this).closest("form").find("select[name='enquiry_type']");
							return enquiry_type.val() == "cancel_reservation" || enquiry_type.val() == "amend_reservation";
						}
					}
				},
				preferred_date: {
					futureDate: true
				},
				arrival_event_date: {
					required: {
						depends: function(element) {
							enquiry_type = jQuery(this).closest("form").find("select[name='enquiry_type']");
							return enquiry_type.val() == "cancel_reservation" || enquiry_type.val() == "amend_reservation";
						}
					}
				}
				
			}
		});
	})
	
	jQuery("FORM#signupForLatestOffers").each(function() {
		jQuery(this).validate({
			errorPlacement: function(error, element) {
				element.before(error);
			}
		});
	});

	jQuery("FORM#email-signup").each(function() {
		jQuery(this).validate({
			errorPlacement: function(error, element) {
				element.before(error);
			}
		});
	});
	
});






























