JJ.imgLoad("send", "reset");

JJ.validation = {
	"error" : "",

	"getKeyCode" : function(e) {
		try {
			return event.keyCode;
		}
		catch(err) {
			return e.which;
		}
	},

	"isValidKey" : function(e, re) {
		var kc = this.getKeyCode(e);
		var key = String.fromCharCode(kc);
		return (re.test(key) || kc == 0 || kc == 8 || kc == 9);
	},

	"isInInterval" : function(val, min, max) {
		val = parseInt(val, 10);
    if (isNaN(val) || val < min || val > max) {
			return false;
		}
		return true;
	},

 "addError" : function(str) {
		this.error += (this.error == "" ? "" : "\n") + str;
	},

	"text" : function (val, mChr, fldName) {
		if (val == "" && mChr > 0) {
			this.addError(fldName + " must be provided!");
			return false;
		}
		else if (val.length < mChr) {
			this.addError(fldName + " is not valid!");
			return false;
		}
		return true;
	},

	"isEmail" : function(str) {
		var i, re, eArr, uArr, dArr;
		eArr = str.split("@");
		if (eArr.length != 2) {
			return false;
		}
		uArr = eArr[0].split(".");
		re = /^[a-zA-Z0-9+\-=\^_{}~]+$/;
		for (i=0;i<uArr.length;i++) {
			if (!re.test(uArr[i])) {
				return false;
			}
		}
		dArr = eArr[1].split(".");
		if (dArr.length < 2) {
			return false;
		}
		re = /^[a-zA-z]{2,6}$/;
		if (!re.test(dArr[dArr.length - 1])) {
			return false;
		}
		re = /^([a-zA-Z0-9][a-zA-Z0-9\-]*)?[a-zA-Z0-9]$/;
		for (i=0;i<(dArr.length - 1);i++) {
			if (!re.test(dArr[i])) {
				return false;
			}
		}
		return true;
	},

	"isDate" : function(d, m, y) {
		d = parseInt(d, 10);
		m = parseInt(m, 10);
		y = parseInt(y, 10);
		if (isNaN(d) || isNaN(m) || isNaN(y)) return false;
		if (y < 2008 || y > 2100) {
			return false;
		}
		else if (d < 1 || d > 31) {
			return false;
		}
		else if (m < 1 || m > 12) {
			return false;
		}
		else if ((m == 4 || m== 6 || m == 9 || m == 11) && d > 30) {
			return false;
		}
		else if (m == 2 && (d > 29 || (((y % 4) != 0 || ((y % 100) == 0 && (y % 400) != 0)) && d > 28))) {
			return false;
		}
		return true;
	}

};

Date.prototype.getMonthName = function(date) {
	return ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][this.getMonth()];
}

Date.prototype.getDayName = function() {
	return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][this.getDay()];
}

JJ.addEvent([window], "load",
	function() {
		var f;
		init();
		JJ.date = new Date(parseInt(g("server-time").value, 10));

		JJ.addEvent(

			[
				g("adults"), g("toddlers"), g("children"), g("d-arr"), g("m-arr"), g("y-arr"), g("d-dep"),
				g("m-dep"), g("y-dep"), g("no-st-room"), g("no-suite"), g("no-family"), g("no-single")
			],

			"keypress",

			function(e) {
				if (!JJ.validation.isValidKey(e, /[\d]/)) {
					return JJ.cancelEvent(e);
				}
			}

		);

		JJ.addEvent([g("first-name"), g("surname")], "keypress",
			function(e) {
				if (!JJ.validation.isValidKey(e, /[^\d:%\\]/)) {
					return JJ.cancelEvent(e);
				}
			}
		);

		JJ.addEvent([g("quote-form"), g("message-form")], "click",
			function() {
				var quo = g("quote-form").checked;
				g("quote-request").style.display = (quo ? "block" : "none");
				g("msg-ast").style.visibility = (quo ? "hidden" : "visible");
			}
		);

		JJ.addEvent([g("d-arr"), g("m-arr"), g("y-arr"), g("d-dep"), g("m-dep"), g("y-dep")], "focus",
			function() {
				if (this.value == "dd" || this.value == "mm" || this.value == "yyyy") this.value = "";
				this.select();
			}
		);
		JJ.addEvent([g("d-arr"), g("d-dep")], "blur", function() { if (!JJ.validation.isInInterval(this.value, 1, 31)) this.value = "dd"; });
		JJ.addEvent([g("m-arr"), g("m-dep")], "blur", function() { if (!JJ.validation.isInInterval(this.value, 1, 12)) this.value = "mm"; });
		JJ.addEvent([g("y-arr"), g("y-dep")], "blur", function() { if (!JJ.validation.isInInterval(this.value, JJ.date.getFullYear(), 2100)) this.value = "yyyy"; });

		JJ.addEvent([g("st-room"), g("suite"), g("family"), g("single")], "click",
			function() {
				var id = this.id;
				var v = (this.checked ? "visible" : "hidden");
				g(id + "-lbl").style.visibility = v;
				g(id + "-fld").style.visibility = v;
			}
		);

		f = function() {
			var arr = this.src.split("/");
			this.src = '/images/buttons/' + arr[arr.length - 1].split("_")[0] + '_hover.jpg';
		}

		JJ.addEvent([g("send-button"), g("reset-button")], ["mouseover", "mousedown", "mouseup", "mouseout", "drag"], [

			f,

		  function(e) {
				var arr = this.src.split("/");
				this.src = '/images/buttons/' + arr[arr.length - 1].split("_")[0] + '_down.jpg';
			  try {
					e.preventDefault();
				}
				catch(err) {
					return false;
				}
			},

			f,

		  function() {
				var arr = this.src.split("/");
				this.src = '/images/buttons/' + arr[arr.length - 1].split("_")[0] + '_up.jpg';
			},

			JJ.cancelEvent

		]);

		f = function() {
			var i, val, aDate, dDate, arr, str;
			with (JJ.validation) {
				error = "";
				text(g("first-name").value, 2, "First Name(s)");
				text(g("surname").value, 2, "Surname");
				text(g("country").value, 2, "Country");
				val = g("email").value;
				if (text(val, 1, "Email Address")) {
					if (!isEmail(val)) addError("Email Address is not valid!");
				}
				if (g("quote-form").checked) {
					val = parseInt(g("adults").value, 10);
					if (isNaN(val) || val == 0) {
						addError("No. of Adults must be provided!");
					}
					if (isDate(g("d-arr").value, g("m-arr").value, g("y-arr").value)) {
						aDate = new Date(parseInt(g("y-arr").value, 10), parseInt(g("m-arr").value, 10) - 1, parseInt(g("d-arr").value, 10));
					}
					else {
						addError("Date of Arrival is not valid!");
					}
					if (isDate(g("d-dep").value, g("m-dep").value, g("y-dep").value)) {
						dDate = new Date(parseInt(g("y-dep").value, 10), parseInt(g("m-dep").value, 10) - 1, parseInt(g("d-dep").value, 10));
					}
					else {
						addError("Date of Departure is not valid!");
					}
					if (aDate && dDate) {
						if (aDate >= dDate) {
							addError("Date of Arrival must be earlier than Date of Departure!");
						}
						if (aDate <= JJ.date) {
							addError("Date of Arrival must be in the future!");
						}
					}
					arr = [g("st-room"), g("suite"), g("family"), g("single")];
					if (!arr[0].checked && !arr[1].checked && !arr[2].checked && !arr[3].checked) {
						addError("At least one room in the Accommodation Requirements section must be selected!");
					}
					else {
						for (i=0;i<arr.length;i++) {
							if (arr[i].checked) {
								val = parseInt(g("no-" + arr[i].id).value, 10);
								if (isNaN(val) || val == 0) {
									addError(g(arr[i].id + "-lbl").firstChild.innerHTML.split("*")[0] + " in the Accommodation Requirements section must be provided!");
								}
							}
						}
					}
				}
				else {
					text(g("message").value, 5, "Message");
				}
				if (error != "") {
					alert(error);
					return;
				}
			}

			g("ty").value = (g("quote-form").checked ? "quote" : "message");
			g("na").value = g("first-name").value + " " + g("surname").value;
			g("co").value = g("country").value;
			g("em").value = g("email").value;
			if (g("quote-form").checked) {
				val = g("adults").value
				g("vi").value = val + " adult" + (val == "1" ? "" : "s");
				val = parseInt(g("toddlers").value);
				g("vi").value += ((isNaN(val) || val == 0) ? "" : "\n" + val + " child" + (val == "1" ? "" : "ren") + " below two years");
		    val = parseInt(g("children").value);
				g("vi").value += ((isNaN(val) || val == 0) ? "" : "\n" + val + " child" + (val == "1" ? "" : "ren") + " above two years");
				g("ar").value = aDate.getDayName() + ", " + aDate.getMonthName() + " " + aDate.getDate() + ", " + aDate.getFullYear();
				g("de").value = dDate.getDayName() + ", " + dDate.getMonthName() + " " + dDate.getDate() + ", " + dDate.getFullYear();
				g("ac").value = (g("st-room").checked ? g("no-st-room").value + " Standard Room" + (g("no-st-room").value == "1" ? "" : "s") : "");
				g("ac").value += (g("suite").checked ? (g("ac").value != "" ? "\n" : "") + g("no-suite").value + " Suite" + (g("no-suite").value == "1" ? "" : "s") : "");
				g("ac").value += (g("family").checked ? (g("ac").value != "" ? "\n" : "") + "Family Cottage - " + g("no-family").value + " Person" + (g("no-family").value == "1" ? "" : "s") : "");
				g("ac").value += (g("single").checked ? (g("ac").value != "" ? "\n" : "") + g("no-single").value + " Single" + (g("no-single").value == "1" ? "" : "s") : "");
				g("to").value = (g("game-open").checked ? "Hluhluwe/Umfolozi - Open game drive vehicle" : "");
				g("to").value += (g("game-prado").checked ? (g("to").value != "" ? "\n" : "") + "Hluhluwe/Umfolozi - Prado" : "");
				g("to").value += (g("cape-vidal").checked ? (g("to").value != "" ? "\n" : "") + "Cape Vidal Aquatic Adventure & Game Drive" : "");
				g("to").value += (g("deep-sea").checked ? (g("to").value != "" ? "\n" : "") + "Deep-Sea Boat Charter" : "");
				g("to").value += (g("deep-sea-fishing").checked ? (g("to").value != "" ? "\n" : "") + "Deep-Sea Fishing" : "");
			}
			else {
				g("vi").value = g("ar").value = g("de").value = g("ac").value = g("to").value = "";
			}
			g("me").value = g("message").value;
			g("email-form").submit();
		}

		JJ.addEvent("send-button", "click", f);

		f = function() {
			var i, arr;
			g("first-name").value = g("surname").value = g("country").value = g("email").value = g("adults").value = g("toddlers").value = g("children").value = "";
			g("d-arr").value = g("d-dep").value = "dd";
			g("m-arr").value = g("m-dep").value = "mm";
			g("y-arr").value = g("y-dep").value = "yyyy";
			arr = ["st-room", "suite", "family", "single"];
			for (i=0;i<arr.length;i++) {
				g(arr[i]).checked = false;
				g("no-" + arr[i]).value = "";
				g(arr[i] + "-lbl").style.visibility = g(arr[i] + "-fld").style.visibility = "hidden";
			}
			g("game-open").checked = g("game-prado").checked = g("cape-vidal").checked = g("deep-sea").checked = g("deep-sea-fishing").checked = false;
			g("message").value = ""
			g("first-name").focus();
		}

		JJ.addEvent("reset-button", "click", f);

		f();
		g("quote-form").checked = true;
		g("quote-request").style.visibility = "visible";
	}
);
