/*********************************************************************************************/
/********************************      PLUGIN NOSELECT       *********************************/
/*********************************************************************************************/

(function($){
	$.fn.noSelect = function(n) {
		
		this.find("a").click(function() {
			var link = $(this);
			var href = link.attr("href");
			if (href) {
				window.location.href = href;
			}
		});
		
		return this.bind("selectstart click mousedown", function() {
				return false;
		});
	};
})( jQuery );

/*********************************************************************************************/
/******************************      PLUGIN HASAJAXKEY       *********************************/
/*********************************************************************************************/

(function($){
	$.fn.hasAjaxKey = function() {	
		return this.filter(function() {
			var a = $(this);
			return a.attr("data-ajaxKey") && !a.parents(".blocked").length && !a.hasClass(".blocked") && (!a.is("option") || a.is("option:selected"));	
		});
	};
})( jQuery );

/*********************************************************************************************/
/******************************      PLUGIN HASAJAXVALUE       *******************************/
/*********************************************************************************************/

(function($){
	$.fn.hasAjaxValue = function() {	
		return this.filter(function() {
			var a = $(this);
			return a.is("input, textarea, option") || a.attr("data-ajaxValue");	
		});
	};
})( jQuery );

/*********************************************************************************************/
/******************************      PLUGIN GETAJAXVALUE       *******************************/
/*********************************************************************************************/

(function($){
	$.fn.getAjaxValue = function() {
		var a = this;
		if (a.is(":checkbox")) {
			return a.is(":checked");
		}
		else if (a.attr("data-ajaxValue")){
			return a.attr("data-ajaxValue");
		}
		else {
			return a.val();
		}
	};
})( jQuery );

/*********************************************************************************************/
/******************************      PLUGIN NOTCHILDREN       ********************************/
/*********************************************************************************************/

(function($){
	$.fn.notChildren = function() {	
		var r = this;
		this.each(function() {
			r = r.not($(this).find("*"));	
		});
		return r;
	};
})( jQuery );

/*********************************************************************************************/
/*********************************      PLUGIN JSONIZE       *********************************/
/*********************************************************************************************/

(function($){
	$.fn.jsonize = function() {  
		var obj1 = this;
		var data1 = {};
	
		////////////////
		//// TIER 1 ////
		////////////////
		
		// all relevant nodes
		var n1 = obj1.find("*").add(obj1).hasAjaxKey();
		
		// parents only
		var p1 = n1.notChildren();

		// with an ajaxValue
		var q1 = p1.hasAjaxValue();
		q1.each(function() {	
			var a1 = $(this);
			data1[a1.attr("data-ajaxKey")] = a1.getAjaxValue();
		});
		
		// with no ajaxValue
		var r1 = p1.not(q1);
		r1.each(function() {
			var obj2 = $(this);
			var data2 = {};
			data1[obj2.attr("data-ajaxKey")] = data2;
			
			////////////////
			//// TIER 2 ////
			////////////////
			
			// all relevant nodes
			var n2 = $(this).find(n1);
			
			// parents only
			var p2 = n2.notChildren();
	
			// with an ajaxValue
			var q2 = p2.hasAjaxValue();
			q2.each(function() {
				var a2 = $(this);
				data2[a2.attr("data-ajaxKey")] = a2.getAjaxValue();
			});			

			// with no ajaxValue
			var r2 = p2.not(q2);
			r2.each(function() {
				var obj3 = $(this);
				var data3 = {};
				data2[obj3.attr("data-ajaxKey")] = data3;
				
				////////////////
				//// TIER 3 ////
				////////////////
				
				// all relevant nodes
				var n3 = $(this).find(n2);
				
				// parents only
				var p3 = n3.notChildren();
		
				// with an ajaxValue
				var q3 = p3.hasAjaxValue();
				q3.each(function() {
					var a3 = $(this);
					data3[a3.attr("data-ajaxKey")] = a3.getAjaxValue();
				});	
			
			});

		});	

		return data1;
	};
})( jQuery );

/*********************************************************************************************/
/*********************************      PLUGIN AJAXIFY       *********************************/
/*********************************************************************************************/

(function($){
	$.fn.ajaxify = function(options) {
		var buttons = this;
				
		var settings = {
			type:		"POST",
			dataType:	"json",	
			beforeSend:	function() {},
			error:		function(jqXHR, textStatus, errorThrown) {},
			success:	function(data, textStatus) {
							if (data.success) {
								if (data.pageReload) {
									window.location.replace(window.location);
									
								}
								else if (data.redirectUrl) {
									window.location.href = data.redirectUrl;	
								}						
							}
							else {
							}		
						},
			complete:	function() {
							buttons.removeClass("disabled");
						}			
		};
		
		if (options) { 
			$.extend(settings, options);
		}
			
		return this.each(function() {
			var button = $(this);
			
			// on button click
			button.click(function() {
			
				// if not disabled
				if (!button.hasClass("disabled")) {
					button.addClass("disabled");
					
					// jsonize the form
					var json = button.hasClass("form") ? button.jsonize(): button.closest(".form").jsonize();

					// launch an ajax request
					$.ajax({
						type:		settings.type,
						dataType: 	settings.dataType,
						beforeSend:	settings.beforeSend,
						error:		settings.error,
						success: 	settings.success,
						complete: 	settings.complete,
						data: 		{
										ajaxId:		button.attr("data-ajaxRequest"),
										ajaxToken:	button.attr("data-ajaxToken"), 
										ajaxData:	json
									}			
					});	
				}
			});
		});
	};
})( jQuery );

/*********************************************************************************************/
/*********************************      EMAIL SPAM BLOCK      ********************************/
/*********************************************************************************************/

(function($) {		
	$(function() {
 		$("a.email").each(function(index, element) {
 			var href = $(this).html().match(/./gi).reverse().join("");
			$(this).attr("href", "mailto:" + href);
			$(this).html(href);
		});
	});
})(jQuery);

/*********************************************************************************************/
/************************************      FORMS       ***************************************/
/*********************************************************************************************/

(function($) {	
	$(function() {
		
		if ($(".form").length) {
		
			// name validation
			function checkname() {
				var a = $("#nameInput");
				var b = a.val();
				if (b != a.attr("data-inputDefault")) {
					var c = $.trim(b);
					var regex = /^[a-z\. \-\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}$/i;
					if (regex.test(c)) {
						return true;
					}
				}
				$("#nameError").removeClass("hidden");
				return false;
			}
			
			// email validation
			function checkemail() {
				var a = $("#emailInput");
				var b = a.val();
				if (b != a.attr("data-inputDefault")) {
					var c = $.trim(b);
					var regex = /^[a-z0-9_\.\-]+@[a-z0-9_\-]+\.[a-z0-9_\.\-]+$/i;
					if (regex.test(c)) {
						return true;
					}
				}
				$("#emailError").removeClass("hidden");
				return false;
			}
			
			// phone validation
			function checkphone() {
				var a = $("#phoneInput");
				var b = a.val();
				if (b != a.attr("data-inputDefault")) {	
					var c = $.trim(b);
					var regex = /^[0-9 +\(\)\.\-]+$/i;
					var array = c.match(/\d/gi);
					if (array) {
						if ((array.length > 7) && regex.test(c)) {
							return true;
						}
					}
				}
				$("#phoneError").removeClass("hidden");
				return false;
			}					
	
			// time validation
			function checktime() {
				if ($("#timeSelect").val() != "Please Select") {
					return true;
				}
				$("#timeError").removeClass("hidden");
				return false;
			}	
			
			// people validation
			function checkpeople() {
				if ($("#peopleSelect").val() != "Please Select") {
					return true;
				}	
				$("#peopleError").removeClass("hidden");
				return false;
			}
			
			// date validation
			function checkdate() {
				if ($("#dateSelect").val() != "Please Select") {
					return true;
				}	
				$("#dateError").removeClass("hidden");
				return false;
			}			
			
			
			// message validation
			function checkmessage() {
				if ($("#messageInput").val() != "") {
					return true;
				}
				$("#messageError").removeClass("hidden");
				return false;
			}				
					
			// helper function to setup datepicker
			function padNumber(number, padding) {
				var zero = padding - number.toString().length + 1;
				return Array(+(zero > 0 && zero)).join("0") + number;
			}	
		
			// blur and deblur inputs on focus
			 $(".form input").focus(function() {
			 	var input = $(this);
				if (input.hasClass("empty")) {
					input.val("").removeClass("empty");
				}
	 		}).blur(function() {
	 			var input = $(this);
	 			if (input.val() == "") {
	 				input.val(input.attr("data-inputDefault")).addClass("empty");
	 			}
	 		});			
	
		/*************************************************************/
		/************************   BOOKING   ************************/
		/*************************************************************/
	
			var button1 = $("#sendBooking");
			if (button1.length) {
	
				// specific days to block bookings
				var blockedDays = ["2011.12.18", "2011.12.25", "2011.12.26", "2012.01.01", "2012.01.02", "2012.02.14"];
				
				// setup datepicker
				$("#datepicker").datepicker({
					altField: "#booking_date", 
					altFormat: "DD, dd MM yy",
					firstDay: 1,
					minDate:0,
					dateFormat: "yy.mm.dd",
					beforeShowDay : function(date) {
						var year = date.getFullYear();
						var month = padNumber(date.getMonth() + 1, 2);
						var day = padNumber(date.getDate(), 2);
						var date = [year, month, day].join(".");
						return ($.inArray(date, blockedDays) > -1) ? [false] : [true];
					}
				});
				
		 		// ajaxify
				button1.noSelect().ajaxify({
					beforeSend:	function() {
									//hide all error fields
									$("#booking_form span.error").addClass("hidden");
									// if fields are validated
									if (checkname() && checkemail() && checkphone() && checktime() && checkpeople()) {
										return true;
									}
									else {
										$("#booking_info p").html("Oops ! It seems some details were missing. Please double-check the form below and submit your information again.").addClass("error");
										$("#booking_info img").addClass("none").eq(2).removeClass("none");
										button1.removeClass("disabled");
										return false;
									}
								},
								
					error: 		function(jqXHR, textStatus, errorThrown) {
									$("#booking_info p").html("Oops ! It seems we were unable to send the booking. Please try to submit your information again.").addClass("error");
									$("#booking_info img").addClass("none").eq(2).removeClass("none");
								},
								
					success: 	function(data) {
									// booking is accepted
									if (data) {
										$("#booking_info p").html("Your booking has been sent. You should receive a confirmation email very soon. We're looking forward to welcoming you at <span class='labrasserie'>La Brasserie</span> !").removeClass("error");
										$("#booking_info img").addClass("none").eq(1).removeClass("none");
										$("#booking_form").addClass("hidden");													
									}
									// booking is denied
									else {
										$("#booking_info p").html("Oops ! It seems we were unable to send the booking. Please try to submit your information again.").addClass("error");
										$("#booking_info img").addClass("none").eq(2).removeClass("none");								
									}		
								},
								
					complete:	function() {
									$("html, body").animate({scrollTop:0}, 200);
									button1.removeClass("disabled");
								}												
				});
			}
			
		/*************************************************************/
		/************************   CONTACT   ************************/
		/*************************************************************/
	
			var button2 = $("#sendContact");
			if (button2.length) {
				
		 		// ajaxify
				button2.noSelect().ajaxify({
					beforeSend:	function() {
									//hide all error fields
									$("#contact_form span.error").addClass("hidden");
									// if fields are validated
									if (checkname() && checkemail() && checkphone() && checkmessage()) {
										return true;
									}
									else {
										$("#contact_info p").html("Oops ! It seems some details were missing. Please double-check the form below and submit your information again.").addClass("error");
										$("#contact_info img").addClass("none").eq(2).removeClass("none");
										button2.removeClass("disabled");
										return false;
									}
								},
								
					error: 		function(jqXHR, textStatus, errorThrown) {
									$("#contact_info p").html("Oops ! It seems we were unable to send the message. Please try to submit your information again.").addClass("error");
									$("#contact_info img").addClass("none").eq(2).removeClass("none");
								},
								
					success: 	function(data) {
									// message is accepted
									if (data) {
										$("#contact_info p").html("Your message has been sent. We will get back to you as soon as possible !").removeClass("error");
										$("#contact_info img").addClass("none").eq(1).removeClass("none");
										$("#contact_form").addClass("hidden");														
									}
									// message is denied
									else {
										$("#contact_info p").html("Oops ! It seems we were unable to send the message. Please try to submit your information again.").addClass("error");
										$("#contact_info img").addClass("none").eq(2).removeClass("none");									
									}		
								},
								
					complete:	function() {
									$("html, body").animate({scrollTop:0}, 200);
									button2.removeClass("disabled");
								}												
				});
			}			

		/*************************************************************/
		/***********************   NEWSLETTER   **********************/
		/*************************************************************/
		
			var button3 = $("#sendNewsletter");
			if (button3.length) {
		 		// ajaxify
				button3.noSelect().ajaxify({
					beforeSend:	function() {
									//hide all error fields
									$("#newsletter_form span.error").addClass("hidden");
									// if fields are validated
									if (checkname() && checkemail()) {
										return true;
									}
									else {
										$("#newsletter_info p").html("Oops ! It seems some details were missing. Please double-check the form below and submit your information again.").addClass("error");
										$("#newsletter_info img").addClass("none").eq(2).removeClass("none");
										button3.removeClass("disabled");
										return false;
									}
								},
								
					error: 		function(jqXHR, textStatus, errorThrown) {
									$("#newsletter_info p").html("Oops ! It seems we were unable to send the message. Please try to submit your information again.").addClass("error");
									$("#newsletter_info img").addClass("none").eq(2).removeClass("none");

								},
								
					success: 	function(data) {
									// message is accepted
									if (data) {
										$("#newsletter_info p").html("Your subscription status was changed successfully.").removeClass("error");
										$("#newsletter_info img").addClass("none").eq(1).removeClass("none");
										$("#newsletter_form").addClass("hidden");												
									}
									// message is denied
									else {
										$("#newsletter_info p").html("Oops ! It seems we were unable to send the message. Please try to submit your information again.").addClass("error");
										$("#newsletter_info img").addClass("none").eq(2).removeClass("none");								
									}		
								},
								
					complete:	function() {
									$("html, body").animate({scrollTop:0}, 200);
									button3.removeClass("disabled");
								}												
				});			
			}
			
		}							
	});
})(jQuery);

/*********************************************************************************************/
/***********************************      GALLERY       **************************************/
/*********************************************************************************************/

(function($) {		
	$(function() {
		$("a.gallery").fancybox({overlayColor:"#000", overlayOpacity:0.5, cyclic:true});
		$("#last_tango").fancybox({overlayColor:"#000", overlayOpacity:0.5, autoScale:false});
	});
})(jQuery);

/*********************************************************************************************/
/***********************************      SLIDESHOW       ************************************/
/*********************************************************************************************/

(function($) {
	$(window).load(function() {
		$("div.slideshow").cycle();
	});	
})(jQuery);
