/*******************************************************************************
 * Copyright 16th Street Ventures, LLC
 * ============================================= Last edited by: $$Author:
 * mqumhieh $$ on: $$Date: 2012-02-02 15:59:00 $$ Filename: $$RCSfile:
 * ihjez.js,v $$ Revision: $$Revision: 1.31 $$
 * 
 */
/*
 * EXTENDING METHODS FOR IE
 */
if (typeof String.prototype.trim !== 'function') {
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g, '');
	}
}

$(function() {
	/*
	 * select events
	 * -----------------------------------------------------------------------------------------------------------------
	 */
	// on select change event, this will change span text
	$(".ihjez-select").live(
			"change",
			function() {
				$(this).siblings("span.value").html(
						$(this).children("option:selected").text());
			});
	// while select using tab key
	$(".ihjez-select").live("keyup", function() {
		$(this).trigger("change");
	});
	// focus | blur on select widget
	$(".ihjez-select")
			.live(
					"focus",
					function() {
						$(this)
								.parent("div.select-background")
								.css("background",
										"url(\"" + contextPath + "/include/images/select.png\") no-repeat scroll right -34px transparent");
					});
	$(".ihjez-select")
			.live(
					"blur",
					function() {
						$(this)
								.parent("div.select-background")
								.css("background",
										"url(\"" + contextPath + "/include/images/select.png\") no-repeat scroll right -4px transparent");
					});
	
	/*
	 * radio events
	 * -----------------------------------------------------------------------------------------------------------------
	 */
	$(".ihjez-radio > div").click(function(){
		if (!$(this).hasClass("selected")){
			$(this).parent(".ihjez-radio").children(".selected").removeClass("selected");
			$(this).addClass("selected");
			$(this).children("input[type=radio]").prop("checked", true)
		} else {
			$(this).parent(".ihjez-radio").children(".selected").removeClass("selected");
			$(this).children("input[type=radio]").prop("checked", false)
		}
	});
	
	
	/*
	 * autocomplete
	 * -----------------------------------------------------------------------------------------------------------------
	 */
	if ($(".ihjez-autocomplete").length != 0) {
		$(".ihjez-autocomplete").autocomplete(
				{
					minLength : 2,
					source : function(request, response) {
						$("#autocomplete-loading").show();
						$.getJSON(contextPath + "/search/auto_complete?text="
								+ request.term, function(data, textStatus) {
							var temp = [];
							for ( var i in data.result) {
								temp.push({
									"header" : data.result[i].header,
									"criteria" : data.result[i].criteria
								});
							}
							response(temp);
							$("#autocomplete-loading").hide();
						});
					},
					delay : 500,
					focus : function(event, ui) {
						$(this).val(ui.item.header);
						return false;
					},
					select : function(event, ui) {
						// filling hidden inputs
						$(this).siblings("input[type=hidden]").val("all");
						if (ui.item.criteria == "Restaurant") {
							$(this).siblings("input[name=rn]").val(
									$.trim(ui.item.header));
						} else if (ui.item.criteria == "Cuisine") {
							$(this).siblings("input[name=c]").val(
									$.trim(ui.item.header));
						} else {
							$(this).siblings("input[name=n]").val(
									$.trim(ui.item.header));
						}
						$(this).val(ui.item.header);
						return false;
					}
				}).data("autocomplete")._renderItem = function(ul, item) {
			return $("<li></li>").data("item.autocomplete", item).append(
					"<a>" + item.header + "<span class=\"search-type\">( "
							+ item.criteria + " )</span></a>").appendTo(ul);
		};
	}

	/*
	 * show check availability & modify reservation container
	 * -----------------------------------------------------------------------------------------------------------------
	 */
	// show check availability container
	$(".show-check-availability").live("click",function() {
		// get the requested venueId
		var venueId = $(this).siblings("input[name=vi]").val();
		var name = $(this).siblings("input[name=name]").val();
		// Show containers
		$("#loading-div").fadeIn(500, function() {
			$("#check-availability-wrapper").show();
		});
		// check if check availability container already loaded
		if ($("#check-availability-container").length > 0) {
			// Reset check availability container data
			$("#check-availability-container .error").hide();
			$("#check-availability-container .check-availability-header div").html(name);
			$("#check-availability-body input[name=vi]").val(venueId);
			$("#check-availability-body input[name=ri]").val("");
			$("#check-availability-body button[type=submit]").html("Check Availability");
		} else {
			$("#check-availability-wrapper").load(contextPath +  "/checkavailability.jsp",function() {
				// Reset check availability
				// container data
				$("#check-availability-container .check-availability-header div").html(name);
				$("#check-availability-body input[name=vi]").val(venueId);
				$("#check-availability-body input[name=ri]").val("");
				$("#check-availability-body button[type=submit]").html("Check Availability");
			});
		}
	});

	// show check availability container
	$(".show-modify-reservation").click(function(){
		// get the requested reservationId
		var reservationId = $(this).siblings("input[name=ri]").val();
		// Show containers
		$("#loading-div").fadeIn(500, function() {
			$("#check-availability-wrapper").show();
		});
		// check if check availability container already loaded
		if ($("#check-availability-container").length > 0) {
			// Reset check availability container data
			$("#check-availability-container .error").hide();
			$("#check-availability-container .check-availability-header div").html(upcomingReservationsCacheList[reservationId].venueName);
			$("#check-availability-body input[name=vi]").val(upcomingReservationsCacheList[reservationId].venueId);
			if (reservationId != 0 && reservationId != "") {
				$("#check-availability-body input[name=ri]").val(reservationId);
			}
			$("#check-availability-body .animate-title").hide();
			$("#check-availability-body input[name=d]").val(
					upcomingReservationsCacheList[reservationId].date);
			$("#check-availability-body .ca-time").val(getFormatedTime(
					upcomingReservationsCacheList[reservationId].hour,upcomingReservationsCacheList[reservationId].minute
			)).trigger("change");
			$("#check-availability-body select[name=ps]").val(
					upcomingReservationsCacheList[reservationId].partySize).trigger("change");
			$("#check-availability-body input[name=wl]").val(
					upcomingReservationsCacheList[reservationId].waitingList);
			$("#check-availability-body button[type=submit]").html("Modify");
		} else {
			$("#check-availability-wrapper").load(contextPath + "/checkavailability.jsp",function() {
					// Reset check availability
					// container data
					$("#check-availability-container .check-availability-header div").html(
								upcomingReservationsCacheList[reservationId].venueName);
					$("#check-availability-body input[name=vi]").val(
								upcomingReservationsCacheList[reservationId].venueId);
					$("#check-availability-body input[name=ri]").val(reservationId);
					$("#check-availability-body .animate-title").hide();
					$("#check-availability-body input[name=d]").val(
								upcomingReservationsCacheList[reservationId].date);
					$("#check-availability-body .ca-time").val(getFormatedTime(
							upcomingReservationsCacheList[reservationId].hour,upcomingReservationsCacheList[reservationId].minute
					)).trigger("change");
					$("#check-availability-body select[name=ps]").val(
								upcomingReservationsCacheList[reservationId].partySize).trigger("change");
					$("#check-availability-body input[name=wl]").val(
								upcomingReservationsCacheList[reservationId].waitingList);
					$("#check-availability-body button[type=submit]").html("Modify");
				});
		}
	});
});

/*
 * show check availability container
 * ---------------------------------------------------------------------------------------------------------------------
 */
// Email address validation
function isValidEmailAddress(emailAddress) {
	var pattern = new RegExp(
			/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/);
	return pattern.test(emailAddress);
}
// Phone number validation
function isValidPhoneNumber(phoneNumber) {
	var pattern = new RegExp("^[0-9]+$");
	return pattern.test(phoneNumber);
}
// Get url attributes
function getURLParameter(name) {
	return unescape((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) || [
			, null ])[1]);
}

// Focus on any text box in sign up container, if it has validation css it
// will remove it
$("input[class=invalid-box]").live('focus', function() {
	$(this).removeClass("invalid-box");
});

// get date object
function getTimeObj(time){
	var hour = time.substring(0,time.indexOf(":")),
	    minute = time.substring(time.indexOf(":") + 1,time.indexOf(":") + 3),
	    ampm = time.substring(time.length - 2);
	if (ampm == "AM" && hour == 12) {
		hour = 0;
	} else if (ampm == "PM" && hour != 12) {
		hour = parseInt(hour) + 12;
	}
	
	var timeObj = {};
		timeObj.hour = hour;
		timeObj.minute = parseInt(minute);
	
	return timeObj;
}

//format time (hour, minute)
function getFormatedTime(hour, minute){
	if (minute == 0) {
		minute = "00";
	}
	if (parseInt(hour) < 11) {
		return parseInt(hour) + ":" + minute + " AM";
	} else if (parseInt(hour) == 12) {
		return "12:" + minute + " PM";
	} else {
		return parseInt(hour) - 12 + ":" + minute + " PM";
	}
}

/*
 * show check availability container
 * ---------------------------------------------------------------------------------------------------------------------
 */
var dateFormat = function() {
	var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function(
			val, len) {
		val = String(val);
		len = len || 2;
		while (val.length < len)
			val = "0" + val;
		return val;
	};

	// Regexes and supporting functions are cached through closure
	return function(date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask
		// prefix)
		if (arguments.length == 1
				&& Object.prototype.toString.call(date) == "[object String]"
				&& !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date;
		if (isNaN(date))
			throw SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var _ = utc ? "getUTC" : "get", d = date[_ + "Date"](), D = date[_
				+ "Day"](), m = date[_ + "Month"](), y = date[_ + "FullYear"](), H = date[_
				+ "Hours"](), M = date[_ + "Minutes"](), s = date[_ + "Seconds"]
				(), L = date[_ + "Milliseconds"](), o = utc ? 0 : date
				.getTimezoneOffset(), flags = {
			d : d,
			dd : pad(d),
			ddd : dF.i18n.dayNames[D],
			dddd : dF.i18n.dayNames[D + 7],
			m : m + 1,
			mm : pad(m + 1),
			mmm : dF.i18n.monthNames[m],
			mmmm : dF.i18n.monthNames[m + 12],
			yy : String(y).slice(2),
			yyyy : y,
			h : H % 12 || 12,
			hh : pad(H % 12 || 12),
			H : H,
			HH : pad(H),
			M : M,
			MM : pad(M),
			s : s,
			ss : pad(s),
			l : pad(L, 3),
			L : pad(L > 99 ? Math.round(L / 10) : L),
			t : H < 12 ? "a" : "p",
			tt : H < 12 ? "am" : "pm",
			T : H < 12 ? "A" : "P",
			TT : H < 12 ? "AM" : "PM",
			Z : utc ? "UTC" : (String(date).match(timezone) || [ "" ]).pop()
					.replace(timezoneClip, ""),
			o : (o > 0 ? "-" : "+")
					+ pad(
							Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o)
									% 60, 4),
			S : [ "th", "st", "nd", "rd" ][d % 10 > 3 ? 0
					: (d % 100 - d % 10 != 10) * d % 10]
		};

		return mask.replace(token, function($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default" : "ddd mmm dd yyyy HH:MM:ss",
	shortDate : "m/d/yy",
	mediumDate : "mmm d, yyyy",
	longDate : "mmmm d, yyyy",
	fullDate : "dddd, mmmm d, yyyy",
	shortTime : "h:MM TT",
	mediumTime : "h:MM:ss TT",
	longTime : "h:MM:ss TT Z",
	isoDate : "yyyy-mm-dd",
	isoTime : "HH:MM:ss",
	isoDateTime : "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime : "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames : [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday",
			"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
	monthNames : [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
			"Sep", "Oct", "Nov", "Dec", "January", "February", "March",
			"April", "May", "June", "July", "August", "September", "October",
			"November", "December" ]
};

// For convenience...
Date.prototype.format = function(mask, utc) {
	return dateFormat(this, mask, utc);
};

