﻿/// <reference path="../Scripts/jquery-latest.min-vsdoc.js" />
(function($) {
	
	$.validator.setDefaults({
		invalidHandler : function(form, validator) {
			numErrors = validator.numberOfInvalids();
			
			var title = numErrors == 1 ? "1 field is incorrect" : numErrors + " fields are incorrect";
			
			var html = '<div><strong>' + title + '</strong><br /><br /><a href="javascript:;" class="simplemodal-close">Ok</a></div>';
			$(html).modal({
				zIndex:3000,
				minHeight:80,
				onClose : function(dialog) {
					// re-focus the first error
					var firstId = $(".field-validation-error:visible:first").attr("htmlfor");
					$.modal.close();
					$("#" + firstId).focus();
				}
			});
		},
		errorElement : "span",
		errorClass : "invalid",
		highlight : function(element) {
			$('label[for=' + element.id + ']').addClass("label-invalid");
		},
		unhighlight : function(element) {
			$('label[for=' + element.id + ']').removeClass("label-invalid");
		},
		errorPlacement : function(error, element) {
			var placeBefore = element.hasClass("validation-error-before");
			
			if(placeBefore) {
				// place before .bg-image
				var bgimage = element.prev(".bg-image");
				if(bgimage.length > 0) {
					error.insertBefore(bgimage);
				} else {
					error.insertBefore(element);
				}
			} else {
				// place after .field-desc (added by jquery.numbox.js)
				var fielddesc = element.next(".field-desc");
				if(fielddesc.length > 0) {
					error.insertAfter(fielddesc);
				} else {
					if(element.attr("type") == "checkbox") {
						// if checkbox, place after label
						var label = $('label[for=' + element.attr("id") + ']');
						error.insertAfter(label);
					} else {
						error.insertAfter(element);
					}
				}
			}
			
			if(element.hasClass("inline-icon")) {
				error.addClass("inline-icon");
			}
		}
	});
	
	$.validator.addMethod("notBeforeToday", function(value, element) {
		var date = parseDate(value);
		var now = new Date();
		var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
		
		return date >= today;
		
	}, "Date must not be before today");
	
	$.validator.addMethod("xdate", function(value, element) {
		if(!/Invalid|NaN/.test(new Date(value))) return true;
		
		var date = parseDate(value);
		return date != null;
		
	}, "Please enter a valid date");
	
	$.validator.addMethod("mustContainNumber", function(value, element) {
		return /\d/.test(value);
	}, "Please include a number");

	$.validator.addMethod("fullName", function(value, element) {
		return /\w+\s+\w+/.test(value);
	}, "Please enter your first and last names");

	$.validator.addMethod("maxBondTimesRent", function(value, element, limit) {
		var bond = parseInt(value);
		
		if(isNaN(bond)) return true;

		var rent = parseInt($("#Listing_Rent").val());
		if(isNaN(rent)) return true;

		var rent_period = $("#Listing_RentPeriod").val();
		
		var maxBond = 0;

		switch(limit.unitOfTime) {
			case "week":
				maxBond = weeklyRent(rent, rent_period) * limit.timesRent;
				break;
			case "month":
				maxBond = monthlyRent(rent, rent_period) * limit.timesRent;
				break;
			default:
				throw "Unexpected rental period: '" + limit.unitOfTime + "'";
		}

		return (bond <= maxBond);

	}, "Bond is too high");

	function weeklyRent(rent, period) {
		switch(period.toLowerCase()) {
			case "month":
				return Math.round(rent * 12.0 / 52);
			case "week":
				return rent;
			case "night":
				return rent * 7;
			default:
				throw "Unexpected period: " + period;
		}
	}

	function monthlyRent(rent, period) {
		switch(period.toLowerCase()) {
			case "month":
				return rent;
			case "week":
				return Math.round(rent * 52.0 / 12);
			case "night":
				return Math.round(rent * 365.0 / 12);
			default:
				throw "Unexpected period: " + period;
		}
	}
	
	function parseDate(value) {
		var date = new Date(value);
		if(!/Invalid|NaN/.test(date)) return date;
		
		// try d-MMM-yyyy format for Firefox
		var result = /^\s*(\d{1,2})-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-(\d{2}(?:\d{2})?)\s*$/i.exec(value);
		if(result == null) return null;
		
		var months = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];
		
		var day = parseInt(result[1]);
		var month = $.inArray(result[2].toLowerCase(), months);
		var year = parseInt(result[3]);
		
		return new Date(year, month, day);
	}
})(jQuery);
