
// SANTACAM specific 
var SantaCam = {
	baseURL:"",
	amazonURL:"http://santacam.s3.amazonaws.com/",

	initCufon: function() {
		Cufon.replace("h2, h3, #xmasStrapline");
		Cufon.now();
	},

	initHomepage: function() {
		$("a[rel=about]").fancybox({
			'titlePosition' : 'over',
			'width'				: 550,
			'height'			: 350,
			'autoScale'			: false,
			'type'				: "iframe",
			'transitionIn'		: 'none',
			'transitionOut'		: 'none',
			'overlayOpacity'	: 0.8
		});
		
		$("a[id=play],a[id=watch]").fancybox({
			'titleShow' 		: false,
			'width'				: 700,
			'height'			: 460,
			'autoScale'			: false,
			'transitionIn'		: 'none',
			'transitionOut'		: 'none',
			'type'				: 'iframe',
			'overlayOpacity'	: 0.8
		});
	}
};

(function($) {
		  
		  
		  
	jQuery.fn.extend({
		scrollTo : function(speed, easing) {
			return this.each(function() {
			var targetOffset = $(this).offset().top;
			$('html,body').animate({scrollTop: targetOffset}, speed, easing);
			});
		}
	}); //scrollTo

	if(typeof SantaCam.validateForm == "undefined") SantaCam.validateForm = {
		// standard regexp
		regExp : { 
			"textBox":"^.{1,300}$",
			"name":"^[A-Za-z\-]{1,50}$",
			"headline":"^.{1,45}",
			"textArea": "^.{1,3000}",
			"email": "^([\\da-zA-Z-_+][\\da-zA-Z-_+.\\w']*[\\da-zA-Z-_+]@[\\da-zA-Z]['-.\\w]*[\\da-zA-Z]\\.[a-zA-Z]{2,7})$",
			"postcode":"^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$",
			"phone":"^0[1237][\\d ]{5,18}$",
			"amount":"^\\d{1,10}\\.?\\d{0,2}$",
			"securityCode":"^[0-9]{3}$"
			},
		currentSection: 1,
		formID: "",
		formFieldPrefix: "",
		fieldsToCheck:[],

		init: function(params) {
			if (typeof params.formID != "undefined") {
				this.formID = params.formID;
			}

			if (typeof params.fields != "undefined") {
				this.fieldsToCheck = params.fields;
			}

			// generic all form elements bind
			$("#" + this.formID + " :visible :input").bind("blur change", function(evt) {
				SantaCam.validateForm.doInlineCheck($(this).attr("id"));
				evt.stopImmediatePropagation();
			});

			$("#" + this.formID).submit(function() {
				return SantaCam.validateForm.submitCheck(true);
			});

		},

		submitCheck:function(visibleOnly) {
			visible = visibleOnly === true ? ":visible" : "";
		
			// form submit - redo all checks
			$("#" + SantaCam.validateForm.formID + " " + visible + " :input").each(function() {
				SantaCam.validateForm.doInlineCheck($(this).attr("id"));
			});

			// Check for uncorrected errors 
			var errorList = $("#" + this.formID + " [id$='_reqMsg']" + visible);

			// navigate to section with error
			if (visibleOnly === false) {
				var errorsFound = false;
				$("div[id^='section']").each(function() {
					if (!errorsFound && $(this).find("[id$='_reqMsg']").length > 0) {
						errorsFound = true;
					}
				});
				if (!errorsFound) {
					return true;
				} else {
					return false;
				}
			} else {
				if (errorList.length > 0) {
					errorList.first().scrollTo(500);
					return false;
				} else {
					return true;
				}
			}
		}, // end submitCheck

		doInlineCheck: function(fieldID) {
			if (typeof this.fieldsToCheck[fieldID] != "undefined") {

				var fieldProperties = this.fieldsToCheck[fieldID];

				switch (fieldProperties.type) {
					case "text":
						this.checkField(fieldID, this.regExp[fieldProperties.regExp], fieldProperties.msg, fieldProperties.req);
						break;
					case "dropdown":
						this.checkDropDown(fieldID, fieldProperties.emptyValue, fieldProperties.msg, fieldProperties.req);
						break;
					case "radio":
						this.checkRadioSelect(fieldID, fieldProperties.msg);
						break;
					case "toEmail":
						if ($("#sendTo_other").attr("checked") == true) {
							this.checkField(fieldID, this.regExp[fieldProperties.regExp], fieldProperties.msg, fieldProperties.req);
						} else {
							this.displayMsg(fieldID, "#" + fieldID, "", false);
						}
						break;
					case "creditcard":
						this.checkCardNumberField(fieldID, fieldProperties.msg, fieldProperties.req);
						break;
				}
			}
		},  // end doInlineCheck

		displayMsg: function(field, fieldID, msg, show) {
			if (show) {
				$(fieldID).parent().removeClass("requiredOkay").addClass("requiredError");
				if ($("#" + field + "_reqMsg").length > 0) {
					$("#" + field + "_reqMsg").show();
				} else {
					var errorPlacement = typeof this.fieldsToCheck[field].errMsg != "undefined" ? this.fieldsToCheck[field].errMsg : "wrapper_" + field;
					$("#" + errorPlacement).prepend("<div id=\"" +  field + "_reqMsg\" class=\"error\"><span></span>" + msg + "</div>");
				}
			} else {
				$(fieldID).parent().removeClass("requiredError requiredOkay");
				$("#" + field + "_reqMsg").slideUp();
			}

		}, // end displayMsg

		//-- Checks for valid text input based on reg expression
		checkField: function (field, regExCheck, message, required) {
			var regExLine = new RegExp(regExCheck, "i");
			var fieldID = "#" + field;
			var fieldVal = jQuery.trim($(fieldID).val());
				

			if (fieldVal != $(fieldID).attr("placeholder") && regExLine.test(fieldVal)) {
				SantaCam.validateForm.displayMsg(field, fieldID, message, false);
			} else {
				if (fieldVal != "" || (fieldVal == "" && required == 1)) {
					SantaCam.validateForm.displayMsg(field, fieldID, message, true);
				} else {
					SantaCam.validateForm.displayMsg(field, fieldID, message, false);
				}
			}

			// replace value with whitespace trimmed version
			$(fieldID).val(fieldVal);
		}, // checkField

		//-- Check that at least one radio has been selected
		checkRadioSelect: function(fieldID, message) {
			var groupFieldID = fieldID.substr(0, fieldID.lastIndexOf("_"));
			var fieldName = groupFieldID;
			var field = $("#" + fieldID + "");

			var radioField = $("[name='" + fieldName + "']:checked");
			var errorMsg = $("#" + groupFieldID + "_reqMsg");

			if (radioField.length > 0) {
				SantaCam.validateForm.displayMsg(groupFieldID, "#" + fieldID, message, false);
			} else {
				SantaCam.validateForm.displayMsg(groupFieldID, "#" + fieldID, message, true);
			}
		}, // end checkRadioSelect

		//-- Check for a valid selection in a drop down
		checkDropDown: function (field, emptyValue, message, required) {
			var fieldID = "#" + field;
			var fieldVal = $(fieldID + " option:selected").val();

			if (fieldVal != emptyValue) {
				SantaCam.validateForm.displayMsg(field, fieldID, message, false);
			} else {
				if (fieldVal != "" || (fieldVal == "" && required == 1)) {
					SantaCam.validateForm.displayMsg(field, fieldID, message, true);
				}
			}
		}, // end checkDropDown

		//-- Basic credit card number check using Luhn algorithm 
		checkCardNumberField: function (field, message, required) {
			var fieldID = "#" + field;
			var fieldVal = jQuery.trim($(fieldID).val());

			fieldVal = fieldVal.replace(/\D/g, '');

			if (fieldVal.length <= 19) {
				var number_length = fieldVal.length;
				var parity = number_length % 2;
				var total=0;
				for (i=0; i < number_length; i++) {
					var digit = fieldVal.charAt(i);
					if (i % 2 == parity) {
						digit=digit * 2;
						if (digit > 9) {
							digit=digit - 9;
						}
					}
					total = total + parseInt(digit);
				}
			}

			// If the total mod 10 equals 0, the number is valid
			if (total % 10 == 0 && fieldVal.length >= 12 && fieldVal.length <= 19) {
				SantaCam.validateForm.displayMsg(field, fieldID, message, false);
			} else {
				if (fieldVal != "" || (fieldVal == "" && required == 1)) {
					SantaCam.validateForm.displayMsg(field, fieldID, message, true);
				}
			}

			$(fieldID).val(fieldVal);
		} // end checkCardNumberField

	} // SantaCam.validateForm

	/**
	 * Message screen
	 **/
	if(typeof SantaCam.createMessage == "undefined") SantaCam.createMessage = {

		init:function(sectionNo) {
			placeHolder.init();

			var fieldsToCheck = {};

			switch (sectionNo) {
				case 1:
					fieldsToCheck = {
						childsName: { type:"text", regExp:"name", msg:"Please enter your child's first name only", req:true, errMsg:"wrapper_childsName" },
						gender: { type:"radio", msg:"Please choose the child's gender", req:true, errMsg:"wrapper_gender" },
						gender_b: { type:"radio", msg:"Please choose the child's gender", req:true, errMsg:"wrapper_gender" },
						interests: { type:"radio", msg:"Please select the child's interests", req:true, errMsg:"wrapper_interests"},
						interests_1: { type:"radio", msg:"Please select the child's interests", req:true, errMsg:"wrapper_interests"}
					}
					SantaCam.nameLookup.init("childsName");
					break;
				case 2:
					fieldsToCheck = {
						intros: { type:"radio", msg:"Please choose an introduction for Santa", req:true, errMsg:"wrapper_intros" },
						intros_1: { type:"radio", msg:"Please choose an introduction for Santa", req:true, errMsg:"wrapper_intros" },
						intros_2: { type:"radio", msg:"Please choose an introduction for Santa", req:true, errMsg:"wrapper_intros" },
						intros_3: { type:"radio", msg:"Please choose an introduction for Santa", req:true, errMsg:"wrapper_intros" },
						headline: { type:"text", regExp:"headline", msg:"Please enter a headline for your child", req:true },
						emailFromName: { type:"text", regExp:"textBox", msg:"Please enter who Santa will receive an email from", req:true }
					}
					this.initDynamicHeadlines();
					this.initPreviewClips();
					break;
				case 3:
					fieldsToCheck = {
						firstName: { type:"text", regExp:"textBox", msg:"Please enter your first name", req:true, errMsg:"wrapper_name"},
						lastName: { type:"text", regExp:"textBox", msg:"Please enter your surname", req:true, errMsg:"wrapper_name" },
						fromEmailAddress: { type:"text", regExp:"email", msg:"Please check the email address for yourself", req:true },
						toEmailAddress: { type:"toEmail", regExp:"email", msg:"Please check the email address where the message will be sent", req:true }
					}
					$("[name='sendTo']").click(function() {
						if ($(this).val() == "same") {
							$("#toHolder").fadeOut();
							$("#toEmailAddress_reqMsg").remove();
							$("#toEmailAddress").val("");
						} else {
							$("#toHolder").fadeIn();
						}
					});
					break;
			}

			// add inline validation
			SantaCam.validateForm.init({
				formID:"createSantaCamMsg",
				fields: fieldsToCheck
			});
		},
	
		initDynamicHeadlines: function() {
			// headline
			$("#headline").keyup(function() {
				var headline = $(this).val();
				var remainingText = "charCount";
				var limit = 45;
				var linelength = headline.length;

				if (linelength > 45) {
					headline = headline.substr(0,45);
					$("#" + remainingText + " span").html("0");
					$("#" + remainingText).addClass("warning");
					$(".headline").val(headline);
				} else {
					$("#" + remainingText + " span").html(limit - linelength);
					$("#" + remainingText).removeClass("warning");
				}
				$("#dynamicHeadline span").html(headline);
			});
	
			// email from
			$("#emailFromName").keyup(function() {
				var emailFromName = $(this).val();
				$("#emailFrom span").html(emailFromName);
			});
	
		},
	
		initPreviewClips: function() {
			var attributes = { bgcolor:"#d5d08f" };
			swfobject.embedSWF(SantaCam.amazonURL + "video/preview_clips/preview_mincepies.swf", "introPreview_mince_pies", "160", "90", "9.0.0", false, {}, attributes);
			swfobject.embedSWF(SantaCam.amazonURL + "video/preview_clips/preview_old_sleigh.swf", "introPreview_old_sleigh", "160", "90", "9.0.0", false, {}, attributes);
			swfobject.embedSWF(SantaCam.amazonURL + "video/preview_clips/preview_sledge.swf", "introPreview_sledge", "160", "90", "9.0.0", false, {}, attributes);
		},
	
		initHashChange:function() {
			// use hash change bind to enable the back button to work
			$("[class^='gotoSection']").click(function(){
				var id = $(this).attr("id");
				var nextSect = id.substr(id.length - 1, id.length);
				var currLoc = window.location.href;
				var newLoc = currLoc.substr(0, currLoc.indexOf("#"));
				
				// validate form before allowing to move to another section
				if (SantaCam.validateForm.submitCheck(true)) {
					window.location.href = newLoc + "#section" + nextSect;
				}
			});
	
			$(window).bind('hashchange', function () {
				var id = window.location.hash || "#section1";
				var nextSect = parseInt(id.substr(id.length - 1,  id.length));
				var curSect = $("[id^=section]:visible:first");
				
				$(curSect).fadeOut("fast", function() {
					$("#section" + nextSect).fadeIn("fast");
					var steps = $("#stage li")
					steps.removeClass("current complete").eq(nextSect -1).addClass("current");
					steps.removeClass("current complete").eq(nextSect -1).addClass("current").prevAll().addClass("complete");

					//steps.prevAll(nextSect -1).addClass("complete");
				});
			});
	
			if (window.location.href.indexOf("#") > -1) {
				$(window).trigger("hashchange");
			}
		}
	}; // end SantaCam.createMessage


	if(typeof SantaCam.nameLookup == "undefined") SantaCam.nameLookup = {
		doingAjaxSearch:false, // global indicator of whether an search is going on
		searchTimeout:null,
		textBoxID: "",
		resultsID: "nameResults",
		nameSelected:false,
		searchDone:false,

		init:function(fieldName) {
			this.textBoxID = fieldName;

			$("#" + this.textBoxID).bind("keyup", function(evt) {
				if(this.searchTimeout != undefined) {
					clearTimeout(this.searchTimeout);
				}

				if (evt.keyCode != "40" && evt.keyCode != "38") {
					var searchTerm = $(this).val();

					SantaCam.nameLookup.searchTimeout = setTimeout(function() {
						SantaCam.nameLookup.searchTimeout = undefined;
							if (!SantaCam.nameLookup.doingAjaxSearch && searchTerm.length > 1) {
								SantaCam.nameLookup.ajaxSearch(searchTerm);
							} else {
								$("#" + SantaCam.nameLookup.resultsID).remove();
							}
						}, 200 // increase time to reduce the server load
					);
					SantaCam.nameLookup.searchDone = true;
				}
			}).blur(function() {
				SantaCam.nameLookup.tipDisplay();
			}).change(function() {
				SantaCam.nameLookup.nameSelected = false;
			});
		},

		//-- only if a lookup has been made
		tipDisplay:function() { 
			if (this.nameSelected === false && this.searchDone === true && $("#" + SantaCam.nameLookup.resultsID).length == 0) {
				$("#tipChildName").html($("#" + SantaCam.nameLookup.textBoxID).val());
				$("#tipChildsName").fadeIn("fast");
			} else {
				$("#tipChildsName").hide();
			}
		},

		onFail:function(json) { // do nothing
			$("#" + SantaCam.nameLookup.textBoxID).removeClass("loading");
			
			if (typeof console != "undefined") {
				console.log("Error - ajax name lookup");
			}
		},

		onSuccess:function(json) {
			var textBoxID = SantaCam.nameLookup.textBoxID;
			var resultsID = SantaCam.nameLookup.resultsID;
			var returnHTML = "";
			SantaCam.nameLookup.doingAjaxSearch = false;

			$("#" + SantaCam.nameLookup.textBoxID).removeClass("loading");
			
			$("#" + resultsID).unbind().remove();

			if (json != "0") {
				var i = 0;
				for (var i in json) {
					returnHTML += "<option id=\"name_" + json[i]["id"] + "\"><a href=\"#\">" + json[i]["name"] + "</a></option>\n";
					i++;
				}

				if ($("#" + resultsID).length > 0) {
					if (returnHTML != "") {
						$("#" + resultsID).html(returnHTML);
					} else {
						$("#" + resultsID).unbind().remove();
					}
				} else {
					if (returnHTML != "") {
						returnHTML = "<div id=\"namesHolder\"><select size=\"5\" id=\"" + resultsID +"\">" + returnHTML + "</select></div>";
						$("#" + textBoxID).after(returnHTML);
					} else {
						$("#" + resultsID).unbind().remove();
					}
				}

				// give focus to the results
				$("#" + textBoxID).live("keydown", function(evt) {
					if ($("#" + resultsID).length > 0) {
						var keyPressed = evt.keyCode;
						if (keyPressed == 40) { // focus on the select box
							$("#" + resultsID).focus();
						}
					}
				});

				// handle the results list
				$("#" + resultsID).bind("keyup", function(evt) {
					var keyPressed = evt.keyCode;
					var selectedLoc = $("#" + $(this).attr("id") + " option:selected");
					var searchBox = $("#" + textBoxID);
					
					switch(keyPressed) {
						case 13: // handle submit
							$("#" + resultsID).remove();
							SantaCam.nameLookup.nameSelected = true;
							// $("#searchSubmit").click();
							SantaCam.nameLookup.tipDisplay();
							break;
						case 40: // down key
							if (selectedLoc.text() != "") {
								searchBox.val(selectedLoc.text());
							}
							break;
						case 38: // up key
							if (selectedLoc.attr("id") == "loc_0" && $("#" + textBoxID).val() == selectedLoc.text()) {
								$("#" + resultsID).unbind().remove();
								SantaCam.nameLookup.nameSelected = true;
								$("#" + textBoxID).focus().val(searchTerm);
							} else {
								searchBox.val(selectedLoc.text());
							}
							// evt.stopPropagation();
							break;
					}
				}).blur(function () {
					$(this).unbind().remove();
				}).click(function() {
					// mouse select from the list
					// No click bind on options in IE
					var selectedName = $("#" + resultsID + " :selected").text();

					if (selectedName != "") {
						$("#" + SantaCam.nameLookup.textBoxID).val(selectedName);
						SantaCam.nameLookup.nameSelected = true;
						$(this).unbind().remove();
						SantaCam.nameLookup.tipDisplay();
					}
					return false;
				});
			} else { // display no box
			}
		},

		ajaxSearch:function(searchTerm) {
			SantaCam.nameLookup.doingAjaxSearch = true;
			searchTerm = jQuery.trim(searchTerm);

			// check the searchterm
			regExp = new RegExp("[^a-z\-]+", "i");

			if (searchTerm != "" && !regExp.test(searchTerm)) {
				$("#" + SantaCam.nameLookup.textBoxID).addClass("loading");
				$.ajax({
					type:"GET",
					url: SantaCam.baseURL + "/ajaxlookup/names/" + Url.encode(searchTerm),
					dataType: "json",
					success: this.onSuccess,
					fail: this.onFail
				});
			}
		}
	}; // end SantaCam.nameLookup

	if(typeof SantaCam.donation == "undefined") SantaCam.donation = {
		
		init:function() {
			var fieldsToCheck = {
				amount: { type:"text", regExp:"amount", msg:"Please enter a valid amount", req:true },
				email: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:true },
				address_1: { type:"text", regExp:"textBox", msg:"Please enter your address", req:true, errMsg:"wrapper_address" },
				town: { type:"text", regExp:"textBox", msg:"Please enter your town/city", req:true },
				postcode: { type:"text", regExp:"postcode", msg:"Please enter a valid postcode", req:true, errMsg:"wrapper_postcode"},
				title: { type:"dropdown", msg:"Please select a title", emptyValue:"", req:true, errMsg:"wrapper_title"},
				cardName: { type:"text", regExp:"textBox", msg:"Please enter the name that appears on the card", req:true, errMsg:"wrapper_cardName"},
				cctype: { type:"dropdown", msg:"Please select the card type", emptyValue:"", req:true, errMsg:"wrapper_cctype"},
				ccnumber: { type:"creditcard",  msg:"Please check your credit card number", req:true, errMsg:"wrapper_ccnumber"},
				securitycode: { type:"text", regExp:"securityCode", msg:"Please enter your 3 digit security code", req:true, errMsg:"wrapper_securityCode"},
				month: { type:"dropdown", emptyValue:"", msg:"Please select the expiry month of your card", req:true, errMsg:"wrapper_expiryDate"},
				year: { type:"dropdown", emptyValue:"", msg:"Please select the expiry year of your card", req:true, errMsg:"wrapper_expiryDate"}
				};

			// add inline validation
			SantaCam.validateForm.init({
				formID:"santaCamDonation",
				fields: fieldsToCheck
			});

			// optin
			if (typeof emailOptIn == "string" && emailOptIn != "") {
				$("#contactingYou").hide();
				if (emailOptIn == "true") {
					$("#emailoptin").attr("checked", "checked");
				}
			}
		},

		success:function() {
			if (messageID == "") {
				$("#Twitter a").attr("href", "http://twitter.com/?status=Check%20out%2020Shelter%20SantaCam:%20http://www.santacam.org.uk/");
				$("#Facebook a").attr("href", "http://www.facebook.com/sharer.php?u=http://santacam.org.uk/");
			}
		}

	}; // end SantaCam.donation

	if (typeof SantaCam.tellAFriend == "undefined") SantaCam.tellAFriend = {
		contentBlock:$("#friend1"),

		init:function() {
			var fieldsToCheck = {
				yourName: { type:"text", regExp:"textBox", msg:"Please enter your name", req:true, errMsg:"wrapper_name" },
				yourEmail: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:true, errMsg:"wrapper_email" },
				toName1: { type:"text", regExp:"textBox", msg:"Please enter your friends name", req:true, errMsg:"friend1"},
				toEmail1: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:true, errMsg:"friend1" },
				toName2: { type:"text", regExp:"textBox", msg:"Please enter your friends name", req:false, errMsg:"friend2"},
				toEmail2: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:false, errMsg:"friend2" },
				toName3: { type:"text", regExp:"textBox", msg:"Please enter your friends name", req:false, errMsg:"friend3"},
				toEmail3: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:false, errMsg:"friend3" },
				toName4: { type:"text", regExp:"textBox", msg:"Please enter your friends name", req:false, errMsg:"friend4"},
				toEmail4: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:false, errMsg:"friend4" },
				toName5: { type:"text", regExp:"textBox", msg:"Please enter your friends name", req:false, errMsg:"friend5"},
				toEmail5: { type:"text", regExp:"email", msg:"Please enter a valid email address", req:false, errMsg:"friend5" }
				}

			// add inline validation
			SantaCam.validateForm.init({
				formID:"tellAFriendForm",
				fields: fieldsToCheck
			});
		},
		
		addAFriend:function() {
			var content = this.contentBlock.clone();
			var noOfFriends = $("[id^='friend']").length + 1;
			if (noOfFriends < 11) {
				content.attr("id", "friend" + noOfFriends);
				$("fieldset.friends").append(content);
			}
			
		}
	}; // end SantaCam.tellAFriend

})(jQuery);

jQuery(document).ready(function($) {
	SantaCam.initCufon();
});

