// our lastminute stuff
var lastminute = {
	
	/*#####
	/* PRODUCTS
	/*#####

	/**
 	* makes call for products
 	*/
	getProductResults : function(list,page,loggedIn,showAuto){
		if($("#products-list-results").children()) $("#products-list-results").empty();
		$("#products-list > div.loader").removeClass("hide");
		var category = ($("#slider-find").val())? $("#slider-find").val():'everything';
		var sortby = ($("#slider-sort").val())? $("#slider-sort").val():"";
		var slider = ($("#slider-value").val())? $("#slider-value").val():0;
		var page = (page)? page:1;
		$.ajax({
			type: "GET",
			url: "/results/"+list+"/"+page,
			data: '&category=' + category + '&slider=' + slider +  '&sortby=' + sortby,
			error: function(data){
				lastminute.createErrorText('lastminute.getProductResults',data);
				if($("p#products-error")) $("p#products-error").remove();
				var p = document.createElement('P');
				$(p).attr("id", "products-error");
				$(p).attr("class", "error-hide");
				$(p).html("Sorry, we are unable to retrieve your products at the moment.");
				$("#products-list > div.loader").addClass("hide");
				$("#products-list-results").append($(p));
				$(p).fadeIn("slow");
			},
			success: function(data){
				lastminute.displayProductResults(list,page,data,loggedIn,showAuto);
			}
		});
	},
	
	/**
 	* displays the product results
 	*/
	displayProductResults : function(list,page,data,loggedIn,showAuto){
		
		var data = $.parseJSON(data);        
		
		$("#slider-adventurous").css("visibility","hidden");
		
		/* sliders */
		if($("#handle-container").children()) $("#handle-container").empty();
		
		var handleDiv = document.createElement("DIV");
		$(handleDiv).attr("id", "handle");
		$(handleDiv).html('<div id="slider-adventurous" class="ui-slider-handle"><img src="/images/sliders/slider-handle-0.gif" alt="" /></div>')
		
		$("#handle-container").append($(handleDiv));
		
		var sliderValue = (data.controls.slider)? data.controls.slider:0;
		$("#slider-value").val(sliderValue);
		$('#handle').slider({
			stepping: 10,
			min: -50, 
			max: 50,
			startValue: sliderValue, 
			change: function(e, ui){
				if(ui.value==0){
					$("#slider-adventurous").children().attr("src","/images/sliders/slider-handle.gif");
				}else{
					$("#slider-adventurous").children().attr("src","/images/sliders/slider-handle-0.gif");
				}
				lastminute.sendSliderRequest(ui.value, list, loggedIn, showAuto);
			},
			slide: function(e, ui){
				$("#slider-adventurous").children().attr("src","/images/sliders/slider-handle-0.gif");
			}
		});
		if(sliderValue==0) $("#slider-adventurous").children().attr("src","/images/sliders/slider-handle.gif");
		$("#slider-adventurous").css("visibility","visible");
		/* /sliders */
		
		/* selects */
		if(data.controls.category){
			$("#slider-find").val(data.controls.category);
		}else{
			$("#slider-find").val(0);
		}
		if(data.controls.sortby){
			$("#slider-sort").val(data.controls.sortby);
		}else{
			$("#slider-sort").val(0);
		}
		/* /selects */
		
		// got results?
		if(data["products"]!=null){
			if(data["products"].length>0){
	
				var clearDiv = document.createElement("DIV");
				$(clearDiv).attr("class", "clear");
	
				var topLevel = data;
				data = data["products"];
				
				/* pagination */
				if(topLevel.pages.nextPage||topLevel.pages.prevPage){
					var paginationDiv = document.createElement("DIV");
					$(paginationDiv).attr("class", "product-pagination");
					
					var paginationUl = document.createElement("UL");
		
					var paginationNextLi = document.createElement("LI");
					$(paginationNextLi).attr("class", "next");
					$(paginationNextLi).html('<a href="javascript:;" onclick="lastminute.getProductResults('+list+','+(page+1)+','+loggedIn+','+showAuto+'); lastminute.toTop(10);" title="next page" class="pagination-next">next</a>')
					
					var paginationPrevLi = document.createElement("LI");
					$(paginationPrevLi).attr("class", "prev");
					$(paginationPrevLi).html('<a href="javascript:;" onclick="lastminute.getProductResults('+list+','+(page-1)+','+loggedIn+','+showAuto+'); lastminute.toTop(10);" title="previous page" class="pagination-prev">prev</a>')
					
					var paginationFirstLi = document.createElement("LI");
					$(paginationFirstLi).attr("class", "first");
					$(paginationFirstLi).html('<a href="javascript:;" onclick="lastminute.getProductResults('+list+',1,'+loggedIn+','+showAuto+'); lastminute.toTop(10);" title="first page">first</a>')
					
					if(topLevel.pages.nextPage){
						$(paginationUl).append($(paginationNextLi.cloneNode(true)));
					}
					if(topLevel.pages.prevPage){
						if(page!=2) $(paginationUl).append($(paginationFirstLi.cloneNode(true)));
						$(paginationUl).append($(paginationPrevLi.cloneNode(true)));
					}
				
					$(paginationDiv).append($(paginationUl.cloneNode(true)));
				}
				/* /pagination */			
				
				$.each(data, function(i){
					
					var productDiv = document.createElement("DIV");
					$(productDiv).attr("class", "product prod-num-" + (i+1));
					
					var outerDiv = document.createElement("DIV");
					$(outerDiv).attr("class", "outer");
					
					var innerDiv = document.createElement("DIV");
					$(innerDiv).attr("class", "inner");
					
					var titleDiv = document.createElement("DIV");
					$(titleDiv).attr("class", "title");
					
					var titleNameDiv = document.createElement("DIV");
					$(titleNameDiv).attr("class", "left");
					if(data[i].product_url){
						$(titleNameDiv).html('<h6><a class="productClickThru" alt="' + data[i].id + '" href="'+data[i].product_url+'" title="continue (opens in a new window)" target="_blank">'+data[i].name+'</a></h6>');
					}else{
						$(titleNameDiv).html('<h6>'+data[i].name+'</h6>');
					}
					$(titleDiv).append($(titleNameDiv));
					
					var titlePriceDiv = document.createElement("DIV");
					$(titlePriceDiv).attr("class", "right");
					
					var price = data[i].from_price;
					if(isFloat(price)){
						var temp = price.split(".")[1];
						if(temp.length==1){
							price = price + "0";
						}
					}
					
					$(titlePriceDiv).html("<p>from &pound;" + price + "</p>");
					$(titleDiv).append($(titlePriceDiv));
					
					$(titleDiv).append($(clearDiv.cloneNode(true)));
					
					var imageDiv = document.createElement("DIV");
					$(imageDiv).attr("class", "image");
					if(data[i].product_url){
						var temp = data[i].image_url.substring((data[i].image_url.lastIndexOf("/")+1),data[i].image_url.lastIndexOf("."));
						if(temp.toLowerCase().indexOf('x')!=-1){
							$(imageDiv).html('<div><a class="productClickThru" alt="' + data[i].id + '" href="'+data[i].product_url+'" title="continue (opens in a new window)" target="_blank">' + lastminute.getImageDimensions(data[i].image_url) + '</a></div>');
						}else{
							$(imageDiv).html('<div><a class="productClickThru" alt="' + data[i].id + '" href="'+data[i].product_url+'" title="continue (opens in a new window)" target="_blank"><img src="'+data[i].image_url+'" style="width: 268px; height: 118px; left: 0; top: 0;" /></a></div>');
						}
					}else{
						var temp = data[i].image_url.substring((data[i].image_url.lastIndexOf("/")+1),data[i].image_url.lastIndexOf("."));
						if(temp.toLowerCase().indexOf('x')!=-1){
							$(imageDiv).html('<div>' + lastminute.getImageDimensions(data[i].image_url) + '</div>');
						}else{
							$(imageDiv).html('<div><img src="'+data[i].image_url+'" style="width: 268px; height: 118px; left: 0; top: 0;" /></div>');
						}
						$(imageDiv).html('<div>' + lastminute.getImageDimensions(data[i].image_url) + '</div>');
					}
					
					if(data[i].is_endorsed=="1"){
						var loveThisDiv = document.createElement("DIV");
						$(loveThisDiv).attr("class", "love-this");
						$(loveThisDiv).html('<img src="/images/general/love-this.png" alt="we love this" />');
						$(imageDiv).append($(loveThisDiv));
					}
					
					var infoDiv = document.createElement("DIV");
					$(infoDiv).attr("class", "info");
					
					var infoP = document.createElement("P");
					if(data[i].product_url){
						$(infoP).html(trimAll(data[i].short_desc) + ' <a class="productClickThru" alt="' + data[i].id + '" href="' + data[i].product_url + '" title="more details (opens in a new window)" target="_blank">more&nbsp;details&nbsp;&gt;</a>');
					}else{
						$(infoP).html(trimAll(data[i].short_desc));
					}
					$(infoDiv).append($(infoP));
					
					var ratingDiv = document.createElement("DIV");
					$(ratingDiv).attr("class", "rating");
					$(infoDiv).append($(ratingDiv));
					
					var ratingUl = document.createElement("UL");
					$(ratingDiv).append($(ratingUl));
					
					if(data[i].is_bestseller=="1"){
						score = 5;
					}else{
						var tempScore = data[i].score;
						if(tempScore<=20){
							score = 1;
						}else if(tempScore>20&&tempScore<=40){
							score = 2;
						}else if(tempScore>40&&tempScore<=60){
							score = 3;
						}else if(tempScore>60&&tempScore<=80){
							score = 4;
						}else{
							score = 5;
						}
					}
					
					var x = score;
					var t = 1;
					while(x--){
						var ratingLi = document.createElement("LI");
						$(ratingUl).append($(ratingLi));
						
						var ratingLiDiv = document.createElement("DIV");
						$(ratingLiDiv).attr("class", "on");
						$(ratingLi).append($(ratingLiDiv));
	
						t++;
					}
					
					var buttonsDiv = document.createElement("DIV");
					$(buttonsDiv).attr("class", "buttons");
					$(infoDiv).append($(buttonsDiv));
					
					if(data[i].product_url){
						var continueDiv = document.createElement("DIV");
						$(continueDiv).attr("class", "continue");
						$(continueDiv).html('<a href="'+data[i].product_url+'" title="continue (opens in a new window)" target="_blank"><img class="productClickThru" alt="' + data[i].id + '" src="/images/buttons/continue.gif" alt="continue" /></a>');
						$(buttonsDiv).append($(continueDiv));
					}
					
					var shareDiv = document.createElement("DIV");
					$(shareDiv).attr("class", "share");
					$(shareDiv).html('<a href="javascript:;" class="share-product-trigger" id="id_'+data[i].id+'" title="share"><img src="/images/buttons/share.gif" alt="share" /></a>');
					//$(buttonsDiv).append($(shareDiv));
	
					$(infoDiv).append($(clearDiv.cloneNode(true)));
					
					$(innerDiv).append($(titleDiv));
					
					$(innerDiv).append($(imageDiv));
					
					$(innerDiv).append($(infoDiv));
					
					$(innerDiv).append($(clearDiv.cloneNode(true)));
					
					$(outerDiv).append($(innerDiv));
					
					$(productDiv).append($(outerDiv));
					
					$("#products-list > div.loader").addClass("hide");
					$("#products-list-results").append($(productDiv))

				});


				/* PRODUCT CLICK THROUGH AJAX LINKS */
				$('.productClickThru').click(function(e){
					
					//grab the id (may be the surrounding link
					if( $(e.target).attr('alt') ) {
					 var id = $(e.target).attr('alt');
					}
					else {
						//console.log( $(e.target).parent() ); return false;
						var id = $(e.target).parent().attr('alt');
					}
					
					$.ajax({
						type: "GET",
						url: '/tracking/click?entity_id=' + id,
						error: function(data){
							return true;
						},
						success: function(data){
							return true;
						}
					});
				});
					
	
				/* pagination */
				if(topLevel.pages.nextPage||topLevel.pages.prevPage){
					$("h2#list-title").addClass("pages");
					
					$("#products-list-results").prepend($(clearDiv.cloneNode(true)));
					$("#products-list-results").prepend($(paginationDiv.cloneNode(true)));
					
					$("#products-list-results").append($(clearDiv));
					$("#products-list-results").append($(paginationDiv));
				}else{
					$("h2#list-title").removeClass("pages");
				}
				/* /pagination */
				
				/* share product */
				lastminute.innitShareProduct(loggedIn,showAuto);
				/* share product */
				
			}else{
				if($("#products-list-results").children()) $("#products-list-results").empty();
				if($("p#products-error")) $("p#products-error").remove();
				var p = document.createElement('P');
				$(p).attr("id", "products-error");
				$(p).attr("class", "error-hide");
				$(p).html("there aren't any products which match that combination of settings. please try again.");
				$("#products-list > div.loader").addClass("hide");
				$("#products-list-results").append($(p));
				$(p).fadeIn("slow");
			}
		}
		
		var scoreBlocks = $("#products-list .product .rating");
		$.each(scoreBlocks,function(i){
			var temp = $(scoreBlocks[i]).children().children().children();
			var score = 0;
			for(t=0;t<temp.length;t++){
				if($(temp[t]).attr("class")=="on") score++;
			}
			$(scoreBlocks[i]).mouseover(function(e){
				lastminute.showMessageBox("ScoreKey"+i,"<p class=\"no-transform\">VisualDNA&trade; match: "+score+" out of 5</p>",false,e.pageX,eval(e.pageY+20),false,208);
			});
			$(scoreBlocks[i]).mouseout(function(e){
				if($("#messageBoxScoreKey" + i).length){
					$("#messageBoxScoreKey" + i).remove();
				}
			});
		});
		
	},
	
	/**
 	* sends slider details off
 	*/
	sendSliderRequest : function(slider, list, loggedIn, showAuto){
		if($("#products-list-results").children()) $("#products-list-results").empty();
		$("#products-list > div.loader").removeClass("hide");
		var category = ($("#slider-find").val())? $("#slider-find").val():'everything';
		var sortby = ($("#slider-sort").val())? $("#slider-sort").val():"";
		$.ajax({
			type: "POST",
			url: "/results/"+list+"/update",
			data: '&category=' + category + '&slider=' + slider +  '&sortby=' + sortby,
			error: function(data){
				lastminute.createErrorText('hotelsdotcom.sendSliderRequest',data);
				if($("p#products-error")) $("p#products-error").remove();
				var p = document.createElement('P');
				$(p).attr("id", "products-error");
				$(p).attr("class", "error-hide");
				$(p).html("Sorry, we are unable to retrieve your products at the moment.");
				$("#products-list > div.loader").addClass("hide");
				$("#products-list-results").append($(p));
				$(p).fadeIn("slow");
			},
			success: function(data){
				lastminute.displayProductResults(list,1,data,loggedIn,showAuto);
			}
		});
	},
	
	/**
 	* sends selects off
 	*/
	sendSelectRequest : function(list){
		if($("#products-list-results").children()) $("#products-list-results").empty();
		$("#products-list > div.loader").removeClass("hide");
		var category = ($("#slider-find").val())? $("#slider-find").val():'everything';
		var sortby = ($("#slider-sort").val())? $("#slider-sort").val():"";
		var slider = ($("#slider-value").val())? $("#slider-value").val():0;
		var loggedIn = ($("#selectLoggedIn").val()=="false")? false:true;
		$.ajax({
			type: "POST",
			url: "/results/"+list+"/update",
			data: '&category=' + category + '&slider=' + slider +  '&sortby=' + sortby,
			error: function(data){
				lastminute.createErrorText('lastminute.sendSelectRequest',data);
				if($("p#products-error")) $("p#products-error").remove();
				var p = document.createElement('P');
				$(p).attr("id", "products-error");
				$(p).attr("class", "error-hide");
				$(p).html("Sorry, we are unable to retrieve your products at the moment.");
				$("#products-list > div.loader").addClass("hide");
				$("#products-list-results").append($(p));
				$(p).fadeIn("slow");
			},
			success: function(data){
				lastminute.displayProductResults(list,1,data,loggedIn,false);
			}
		});
	},
	
	/**
 	* slider intructions
 	*/
	
	innitSliderMessage : function(){
		$("#sliders-control").mouseover(function(e){
			var messageBoxId = "messageBox" + this.id;
			if(!$("#"+messageBoxId).length>0)
				var text = "<p>play it safe or spice it up for valentine's</p>";
				var x = (e.pageX-20);
				lastminute.showMessageBox(this.id,text,false,x,e.pageY,false,"240");
		});
		$("#sliders-control").mouseout(function(){
			var messageBoxId = "messageBox" + this.id;
			if($("#"+messageBoxId).length>0)
				$("#"+messageBoxId).remove();
		});
	},
	
	/*#####
	/* SPLASH PAGE
	/*#####
	
	/**
 	* creates the window for the extrospective name form
 	*/
	innitExtroForm : function(auto){
		if(auto){
			if(!lastminute.createPopUpWindow('extroWindow',350,true)){
				return false;
			}
			$('#extroWindow').jqm({ajax: '/forms/extro'});
			$('#extroWindow').jqmShow();		
		}
		$("a#extro-trigger").click(function(){
			if($('#extroWindow').length==0){
				if(!lastminute.createPopUpWindow('extroWindow',350,true)){
					return false;
				}
			}
			$('#extroWindow').jqm({ajax: '/forms/extro'});
			$('#extroWindow').jqmShow();									
		});
	},
	
	/**
 	* looks after extrospective name form
 	*/
	extro : function(){
		if(!$("#extro-form").length>0){
			return false;
		}
		var name = $("#extro-name").val();
		if(!name.length||name=="enter their name here..."){
			if($("p#extro-error")) $("p#extro-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "extro-error");
			$(error).attr("class", "error-hide");
			$(error).html("please enter the name of your valentine");
			$("#form-elements").prepend(error);
			$(error).fadeIn("slow");
			return false;
		}
		return true;
	},
	
	/**
 	* sets up the splash page form
 	*/
	innitSplashForm : function(){
		$("#extro-name").focus(function(){
			if($(this).val()=="enter their name here..."){
				$(this).val("");
			} 
		});
		$("#extro-name").blur(function(){
			if($(this).val()==""){
				$(this).val("enter their name here...");
			} 
		});
	},
	
	/**
 	* creates the windows and events for the blind user route
 	*/
	innitBlind : function(loggedIn, auto){
		if(auto){
			if(!lastminute.createPopUpWindow('inviteWindow',300,true)){
				return false;
			}
			$('#inviteWindow').jqm({ajax: '/forms/invite'});
			$('#inviteWindow').jqmShow();		
		}
		$("a#invite-trigger").click(function(){
			if(loggedIn){
				if($('#inviteWindow').length==0){
					if(!lastminute.createPopUpWindow('inviteWindow',300,true)){
						return false;
					}
				}
				$('#inviteWindow').jqm({ajax: '/forms/invite'});
				$('#inviteWindow').jqmShow();
			}else{
				if(!lastminute.createPopUpWindow('signinBeforeActionWindow',300,true)){
					return false;
				}
				$('#signinBeforeActionWindow').jqm({ajax: '/forms/signin'});
				$('#signinBeforeActionWindow').attr("class", $('#signinBeforeActionWindow').attr("class") + " invite");
				$('#signinBeforeActionWindow').jqmShow();
			}
		});
	},
	
	/**
 	* looks after blind user invite form
 	*/
	invite : function(){
		if(!$("#invite-form").length>0){
			return
		}
		var name = $("#invite-name").val();
		if(!name.length){
			if($("p#invite-error")) $("p#invite-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "invite-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must enter their name.");
			$("#invite-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var email = $("#invite-email").val();
		if(!email.length||!checkEmail(email)){
			if($("p#invite-error")) $("p#invite-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "invite-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter a valid email address.");
			$("#invite-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		$.ajax({
			type: "POST",
			url: "/start/secret",
			data: '&name=' + $("#invite-name").val() + '&email=' + $("#invite-email").val() + '&message=' + $("#invite-message").val(),
			error: function(data){
				lastminute.createErrorText('lastminute.invite()',data);
				if($("p#invite-error")) $("p#invite-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "invite-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#invite-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#invite-error")) $("p#invite-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "invite-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					$("#invite-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					$("#invite-form-container").children().remove();
					var error = document.createElement('P');
					$(error).attr("id", "invite-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["okMessage"]);
					$("#invite-form-container").append(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/*#####
	/* REGISTRATION
	/*#####
	
	/**
 	* show the registration form
 	*/
	showRegistration : function(){
		var type = $("#signin-type").val();
		var id = "id_" + $("#product-id").val();
		if($('#signinBeforeActionWindow').length>0){
			$('#signinBeforeActionWindow').jqmHide();	
		}
		if($('#signinWindow').length>0){
			$('#signinWindow').jqmHide();	
		}
		var winType =  false;
		if($("a#showRegLink").attr("class")=="module"){
			winType = true;
		}
		if(!lastminute.createPopUpWindow('registerWindow',716,winType)){
			return false;
		}
		$('#registerWindow').jqm({ajax: '/forms/register'});
		$('#registerWindow').attr("class", $('#registerWindow').attr("class") + " " + type);
		$('#registerWindow').attr("class", $('#registerWindow').attr("class") + " " + id);
		$('#registerWindow').jqmShow();		
	},
	
	/**
 	* looks after the register form
 	*/
	register : function(){
		if(!$("#register-form").length>0){
			return
		}
		var first_name = $("#register-first-name").val();
		if(!first_name.length){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter your first name.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var last_name = $("#register-last-name").val();
		if(!last_name.length){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter your last name.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var email = $("#register-email").val();
		if(!email.length||!checkEmail(email)){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter a valid email address.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var password = $("#register-password").val();
		if(!password.length){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter a password.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(password.length<6){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please choose a password of 6 characters or more.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var password_confirm = $("#register-password-confirm").val();
		if(!password_confirm.length){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please confirm your password.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(password_confirm!=password){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("The two passwords do not match.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(!Recaptcha.get_response().length){
			if($("p#register-error")) $("p#register-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "register-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please type the two words into the box provided.");
			$("#register-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var ref = escape($("#referer").val());
		var newsLetter = ($('#register-form input[id=register-newsletter]:checked').val())? '1':'0';
		var userGender = $('#register-form input[name=gender]:checked').val();
		var postData = 'email=' + $("#register-email").val() + '&firstname=' + $("#register-first-name").val() + '&lastname=' + $("#register-last-name").val() + '&password=' + $("#register-password").val() + '&newsletter=' + newsLetter + '&gender=' + userGender + '&register-type=' + $("#register-type").val() + '&recaptcha_challenge_field=' + Recaptcha.get_challenge() + '&recaptcha_response_field=' + Recaptcha.get_response() + '&list_id=' + $("#list-id").val() + '&product_id=' + $("#product-id").val() + '&referer=' + ref;
		$.ajax({
			type: "POST",
			url: "/register",
			data: postData,
			error: function(data){
				lastminute.createErrorText('lastminute.register()',data);
				if($("p#register-error")) $("p#register-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "register-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				Recaptcha.reload();
				$("#register-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				if($("p#register-error")) $("p#register-error").remove();
				var data = $.parseJSON(data);
				if(data["errorMessage"]){
					if($("p#register-error")) $("p#register-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "register-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					Recaptcha.reload();
					$("#register-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					$("#register-form-container").children().remove();
					var error = document.createElement('P');
					$(error).attr("id", "register-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["okMessage"]);
					$("#register-form-container").append(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/**
 	* populates the hiddent form field with type
 	*/
	innitRegisterType : function(){
		var windowId = $("div#registerWindow");
		if($(windowId).length>0){
			var type;
			if($(windowId).attr("class").toLowerCase().indexOf("invite")!=-1){
				type = "invite";
			}else if($(windowId).attr("class").toLowerCase().indexOf("share")!=-1){
				type = "share";
			}else if($(windowId).attr("class").toLowerCase().indexOf("product")!=-1){
				type = "product";
				if($(windowId).attr("class").toLowerCase().indexOf("id_")!=-1){
					var product_id = $(windowId).attr("class").split("id_")[1];
					$("#register-form #product-id").val(product_id);
				}
			}else{
				type = "";
			}
			$("#register-form #register-type").val(type);
		}
	},
	
	/*#####
	/* SIGN IN
	/*#####
	
	/**
 	* sets up the signup form	
 	*/
	innitSignUpForm : function(type){
		if(type=='confirm'){
			if($("#signup-confirm-email").length>0&&$("#signup-email").length>0){
				$("#signup-confirm-email").val($("#signup-email").val());
			}
		}else{
			if($("#signup-email").length>0){
				$("#signup-email").focus(function(){
					var msg = $("#signup-email").val();
					if(msg.toLowerCase()=="enter email address"){
						$("#signup-email").val("");
					}
				});
				$("#signup-email").blur(function(){
					var msg = $("#signup-email").val();
					if(!msg.length){
						$("#signup-email").val("enter email address");
					}
				});
			}
		}
	},
	
	/**
 	* looks after the sign in form
 	*/
	signIn : function(){
		if(!$("#signin-form").length>0){
			return
		}
		var email = $("#signin-email").val();
		if(!email.length||!checkEmail(email)){
			if($("p#signin-error")) $("p#signin-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "signin-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter a valid email address.");
			$("#signin-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var password = $("#signin-password").val();
		if(!password.length){
			if($("p#signin-error")) $("p#signin-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "signin-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter your password.");
			$("#signin-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(password.length<6){
			if($("p#signin-error")) $("p#signin-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "signin-error");
			$(error).attr("class", "error-hide");
			$(error).html("Your registered password will contain 6 or more characters.");
			$("#signin-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		var ref = escape($("#referer").val());
		var type = $("#signin-type").val();
		$.ajax({
			type: "POST",
			url: "/signin",
			data: '&email=' + $("#signin-email").val() + '&password=' + $("#signin-password").val() + '&signin-type=' + $("#signin-type").val() + '&list_id=' + $("#list-id").val() + '&product_id=' + $("#product-id").val() + '&referer=' + ref,
			error: function(data){
				lastminute.createErrorText('lastminute.signIn()',data);
				if($("p#signin-error")) $("p#signin-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "signin-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#signin-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#signin-error")) $("p#signin-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "signin-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					$("#signin-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					window.location.href = data["okMessage"];
					return;
				}
			}
		});
	},
	
	/**
 	* looks after the sign out functionalitu form
 	*/
	signOut : function(){
		$.ajax({
			type: "GET",
			url: "/signout",
			error: function(data){
				lastminute.createErrorText('lastminute.signOut()',data);
				if($("p#lists-error")) $("p#lists-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "lists-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#list-results").append(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#lists-error")) $("p#lists-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "lists-error");
					$(error).attr("class", "error-hide");
					$(error).html("Sorry, we've hit a problem. Please try again later.");
					$("#list-results").append(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					window.location.href = "/";
					return;
				}
			}
		});
	},
	
	/**
 	* toggles the signup/reminder forms
 	*/
	showPasswordReminder : function(){
		$("#form-signin-toggle").addClass("hide");
		$("#form-reminder-toggle").removeClass("hide");
	},
	
	/**
 	* looks after the reminder form
 	*/
	passwordReminder : function(){
		if(!$("#password-reminder-form").length>0){
			return
		}
		var email = $("#password-reminder-email").val();
		if(!email.length||!checkEmail(email)){
			if($("p#reminder-error")) $("p#reminder-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "reminder-error");
			$(error).attr("class", "error-hide");
			$(error).html("Please enter a valid email address.");
			$("#password-reminder-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		$.ajax({
			type: "POST",
			url: "/forgot_password",
			data: '&email=' + $("#password-reminder-email").val(),
			error: function(data){
				lastminute.createErrorText('lastminute.passwordReminder()',data);
				if($("p#reminder-error")) $("p#reminder-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "reminder-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#password-reminder-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#reminder-error")) $("p#reminder-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "reminder-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					$("#password-reminder-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					if($("p#reminder-error")) $("p#reminder-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "reminder-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["okMessage"]);
					$("#password-reminder-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/**
 	* populates the hiddent form field with type
 	*/
	innitSignInType : function(){
		var windowId = $("#signin-form").parents("div#signinBeforeActionWindow");
		if($(windowId).length>0){
			var type;
			if($(windowId).attr("class").toLowerCase().indexOf("invite")!=-1){
				$("a#showRegLink").attr("class","module");
				type = "invite";
			}else if($(windowId).attr("class").toLowerCase().indexOf("share")!=-1){
				$("a#showRegLink").attr("class","share");
				type = "share";
			}else if($(windowId).attr("class").toLowerCase().indexOf("product")!=-1){
				$("a#showRegLink").attr("class","product");
				type = "product";
				if($(windowId).attr("class").toLowerCase().indexOf("id_")!=-1){
					var product_id = $(windowId).attr("class").split("id_")[1];
					$("#signin-form #product-id").val(product_id);
				}
			}else{
				$("a#showRegLink").attr("class","share");
				type = "";
			}
			$("#signin-form #signin-type").val(type);
		}
	},
	
	/*#####
	/* SHARE
	/*#####
	
	/**
 	* creates the windows and events for the share button
 	*/
	innitShare : function(loggedIn, auto, list){
		if(auto){
			if(!lastminute.createPopUpWindow('shareWindow',716)){
				return false;
			}
			$('#shareWindow').jqm({ajax: '/forms/share'});
			$('#shareWindow').jqmShow();
		}
		$("a#share-trigger").click(function(){
			if(loggedIn){
				if($('#shareWindow').length==0){
					if(!lastminute.createPopUpWindow('shareWindow',716)){
						return false;
					}
				}
				$('#shareWindow').jqm({ajax: '/forms/share'});
				$('#shareWindow').jqmShow();
			}else{
				if(!lastminute.createPopUpWindow('signinBeforeActionWindow',300,false)){
					return false;
				}
				$('#signinBeforeActionWindow').jqm({ajax: '/forms/signin'});
				$('#signinBeforeActionWindow').attr("class", $('#signinBeforeActionWindow').attr("class") + " share");
				$('#signinBeforeActionWindow').jqmShow();
			}
		});
	},
	
	/**
 	* creates the windows and events for the share button on individual products
 	*/
	innitShareProduct : function(loggedIn, auto){
		if(auto){
			if(!lastminute.createPopUpWindow('shareProductWindow',716)){
				return false;
			}
			$('#shareProductWindow').jqm({ajax: '/forms/product'});
			$('#shareProductWindow').jqmShow();
		}
		$("#products-list a.share-product-trigger").click(function(){
			var id = $(this).attr("id");
			if(loggedIn){
				//if($('#shareProductWindow').length==0){
					if(!lastminute.createPopUpWindow('shareProductWindow',716)){
						return false;
					}
				//}
				$('#shareProductWindow').jqm({ajax: '/forms/product'});
				$('#shareProductWindow').attr("class", $('#shareProductWindow').attr("class") + " " + id);
				$('#shareProductWindow').jqmShow();
			}else{
				if(!lastminute.createPopUpWindow('signinBeforeActionWindow',300,false)){
					return false;
				}
				$('#signinBeforeActionWindow').jqm({ajax: '/forms/signin'});
				$('#signinBeforeActionWindow').attr("class", $('#signinBeforeActionWindow').attr("class") + " product");
				$('#signinBeforeActionWindow').attr("class", $('#signinBeforeActionWindow').attr("class") + " " + id);
				$('#signinBeforeActionWindow').jqmShow();
			}
		});
	},
	
	/**
 	* sees if a product id has been passed
 	*/
	findProductId : function(){
		var windowId = $("#share-form").parents("div#shareProductWindow");
		if($(windowId).length>0){
			if($(windowId).attr("class").toLowerCase().indexOf("id_")!=-1){
				var product_id = $(windowId).attr("class").split("id_")[1];
				$("#share-form #product-id").val(product_id);
			}
		}
	},
	
	/**
 	* looks after share form
 	*/
	share : function(){
		if(!$("#share-form").length>0){
			return
		}
		var names = new Array();
		var emails = new Array();
		for(i=1;i<=5;i++){
			if($("#share-name-"+i).val().length){
				names.push($("#share-name-"+i).val());
			}
			if($("#share-email-"+i).val().length){
				emails.push($("#share-email-"+i).val());
			}
		}
		if(emails.length==0&&names.length==0){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must enter at least one name and email address.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(names.length>emails.length){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must an email address for each name.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(emails.length>names.length){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must enter a name for each email address.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		for(t=0;t<emails.length;t++){
			if(!checkEmail(emails[t])){
				if($("p#share-error")) $("p#share-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "share-error");
				$(error).attr("class", "error-hide");
				$(error).html("Please check the email address " + emails[t]);
				$("#share-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			}
		}
		var data_emails = '';
		var f = 1;
		for(i=1;i<=5;i++){
			if($("#share-name-"+(i)).val().length){
				data_emails += '&name_'+(f)+'=' + $("#share-name-"+(i)).val();
				data_emails += '&email_'+(f)+'=' + $("#share-email-"+(i)).val();
				f++;
			}
		}
		$.ajax({
			type: "POST",
			url: "/list/" + $("#share-list").val() + "/share",
			data: '&&message=' + $("#share-message").val() + data_emails,
			error: function(data){
				lastminute.createErrorText('lastminute.invite()',data);
				if($("p#share-error")) $("p#share-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "share-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#share-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#share-error")) $("p#share-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "share-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					$("#share-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					$("#share-form-container").children().remove();
					var error = document.createElement('P');
					$(error).attr("id", "share-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["okMessage"]);
					$("#share-form-container").append(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/**
 	* looks after the individual product share form
 	*/
	shareProduct : function(){
		if(!$("#share-form").length>0){
			return
		}
		var names = new Array();
		var emails = new Array();
		for(i=1;i<=5;i++){
			if($("#share-name-"+i).val().length){
				names.push($("#share-name-"+i).val());
			}
			if($("#share-email-"+i).val().length){
				emails.push($("#share-email-"+i).val());
			}
		}
		if(emails.length==0&&names.length==0){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must enter at least one name and email address.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(names.length>emails.length){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must an email address for each name.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		if(emails.length>names.length){
			if($("p#share-error")) $("p#share-error").remove();
			var error = document.createElement('P');
			$(error).attr("id", "share-error");
			$(error).attr("class", "error-hide");
			$(error).html("You must a name for each email address.");
			$("#share-form").prepend(error);
			$(error).fadeIn("slow");
			return;
		}
		for(t=0;t<emails.length;t++){
			if(!checkEmail(emails[t])){
				if($("p#share-error")) $("p#share-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "share-error");
				$(error).attr("class", "error-hide");
				$(error).html("Please check the email address " + emails[t]);
				$("#share-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			}
		}
		var data_emails = '';
		var f = 1;
		for(i=1;i<=5;i++){
			if($("#share-name-"+(i)).val().length){
				data_emails += '&name_'+(f)+'=' + $("#share-name-"+(i)).val();
				data_emails += '&email_'+(f)+'=' + $("#share-email-"+(i)).val();
				f++;
			}
		}
		$.ajax({
			type: "POST",
			url: "/product/share/",
			data: '&list_id=' + $("#share-list").val() + '&product_id=' + $("#product-id").val() + '&message=' + $("#share-message").val() + data_emails,
			error: function(data){
				lastminute.createErrorText('lastminute.invite()',data);
				if($("p#share-error")) $("p#share-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "share-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#share-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);   
				if(data["errorMessage"]){
					if($("p#share-error")) $("p#share-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "share-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["errorMessage"]);
					$("#share-form").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					$("#share-form-container").children().remove();
					var error = document.createElement('P');
					$(error).attr("id", "share-error");
					$(error).attr("class", "error-hide");
					$(error).html(data["okMessage"]);
					$("#share-form-container").append(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/*#####
	/* LISTS
	/*#####
	
	/**
 	* gets the user's lists
 	*/
	getLists : function(listId){
		$.ajax({
			type: "GET",
			url: "/profile/lists",
			error: function(data){
				lastminute.createErrorText('lastminute.displayLists()',data);
				if($("#list-results").children()) $("#list-results").children().remove();
				var error = document.createElement('P');
				$(error).attr("id", "lists-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we can't retrieve your lists at the moment. Please try later.");
				$("#list-results").append(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);
				if(data["errorMessage"]){
					if($("#list-results").children()) $("#list-results").children().remove();
					var error = document.createElement('P');
					$(error).attr("id", "lists-error");
					$(error).attr("class", "error-hide");
					$(error).html("Sorry, we can't retrieve your lists at the moment. Please try later.");
					$("#list-results").append(error);
					$(error).fadeIn("slow");
					return;
				}else{
					lastminute.displayLists(listId,data);
				}
			}
		});
	},
	
	/**
 	* displays the user's lists
 	*/
	displayLists : function(listId,data){
		if($("#list-results").children()) $("#list-results").children().remove();
		if(data.length){
			var listUL = document.createElement("UL");
			$("#list-results").append($(listUL));
			$.each(data, function(i){
				if(data[i].name){
					var listLI = document.createElement("LI");
					var linkClass = (listId==data[i].id)? "list selected":"list";
					if(data[i].can_delete){
						$(listLI).html('<a href="/results/'+data[i].id+'" class="'+linkClass+'" title="your list for '+data[i].name.toLowerCase()+'">Your list for '+data[i].name+'</a><a href="javascript:lastminute.deleteList('+data[i].id+');" class="delete" title="delete this list">x</a>');
					}else{
						$(listLI).html('<a href="/results/'+data[i].id+'" class="'+linkClass+'" title="your list for '+data[i].name.toLowerCase()+'">'+data[i].owner_name+'\'s list for '+data[i].name+'</a>');
					}
					$(listUL).append($(listLI));		
				}
			});
			var listClear = document.createElement("DIV");
			$(listClear).attr("class","clear-list");
			$("#list-results").append($(listClear));
		}else{
			var error = document.createElement('P');
			$(error).attr("id", "lists-error");
			$(error).attr("class", "error-hide");
			$(error).html("You have no saved lists at the moment.");
			$("#list-results").append($(error));
			$(error).fadeIn("slow");
			/*
			var remember = document.createElement('A');
			$(remember).attr("title","remember this list");
			$(remember).attr("id","remember-trigger");
			$(remember).attr("href","javascript:;");
			$(remember).attr("class","rfloat signin-trigger");
			$(remember).html('<img src="/images/buttons/remember.gif" alt="remember this list" />');
			$("#list-results").append($(remember));
			var clear = document.createElement('DIV');
			$(clear).attr("class","clear");
			$("#list-results").append($(clear));
			*/
			return;
		}
	},
	
	/**
 	* creates the windows and events for the remember this list button, and "sign in" under "lists"
 	*/
	rememberList : function(auto){
		var links = $("#list-results a.signin-trigger");
		$.each(links, function(i){
			$(this).click(function(){
				if(!lastminute.createPopUpWindow('signinWindow',300)){
					return false;
				}
				$('#signinWindow').jqm({ajax: '/forms/signin'});
				$('#signinWindow').jqmShow();			

			});
		});
	},
	
	/**
 	* deletes a list
 	*/
	deleteList : function(list){
		if(!list){
			return;
		}
		$.prompt('<p>Are you sure you want to delete this list?</p>',{ 
			buttons: { Yes: true, No: false }, 
			opacity: 0.5, 
			overlay: "fast", 
			promptspeed: "fast", 
			show: "fadeIn", 
			callback: function(v,m){
				if(v){
					$.ajax({
						type: "GET",
						url: "/profile/list/"+list+"/delete",
						error: function(data){
							lastminute.createErrorText('lastminute.deleteList()',data);
							if($("#lists-error")) $("#lists-error").remove();
							var error = document.createElement('P');
							$(error).attr("id", "lists-error");
							$(error).attr("class", "error-hide");
							$(error).html("Sorry, we've hit a problem. Please try again later.");
							$("#list-results").append(error);
							$(error).fadeIn("slow");
							return;
						},
						success: function(data){
							var data = $.parseJSON(data);
							if(data["errorMessage"]){
								if($("#lists-error")) $("#lists-error").remove();
								var error = document.createElement('P');
								$(error).attr("id", "lists-error");
								$(error).attr("class", "error-hide");
								$(error).html(data["errorMessage"]);
								$("#list-results").prepend(error);
								$(error).fadeIn("slow");
								return;
							}else{
								lastminute.displayLists(list,data);
							}
						}
					});
				}
			}
		});
	},
	
	/*#####
	/* NEWSLETTER SIGNUP
	/*#####
	
	/**
 	* deals with the newsletter signup form
 	*/
	signUp : function(type){
		if(type=='confirm'){
			if(!$("#signup-confirm-email").length>0){
				return
			}
			var msg = $("#signup-confirm-email").val();
			if(!msg.length||!checkEmail(msg)){
				// if it's wrong at this stage, they're hacking, so just return
				return false;
			}
			$.ajax({
				type: "POST",
				url: "/newsletter",
				data: '&email=' + msg,
				error: function(data){
					lastminute.createErrorText('lastminute.signUp(\'confirm\')',data);
					if($("p#signup-confirm-error")) $("p#signup-confirm-error").remove();
					var error			= document.createElement('P');
					error.id			= "signup-confirm-error";
					error.style.display	= "none";
					error.className		= "error-hide";
					error.innerHTML		= "Sorry, we've hit a problem. Please try again later.";
					$("#signup-confirm-form").prepend(error);
					$("#signup-confirm-error").fadeIn("slow");
					return;
				},
				success: function(data){
					var data = $.parseJSON(data);
					if(data["errorMessage"]){
						if($("p#signup-confirm-error")) $("p#signup-confirm-error").remove();
						var error			= document.createElement('P');
						error.id			= "signup-confirm-error";
						error.style.display	= "none";
						error.className		= "error-hide";
						$(error).html("Sorry, we've hit a problem. Please try again later.");
						$("#signup-confirm-form").prepend(error);
						$("#signup-confirm-error").fadeIn("slow");
						return;
					}
					if(data["okMessage"]){
						if($("p#signup-confirm-error")) $("p#signup-confirm-error").remove();
						var error			= document.createElement('P');
						error.id			= "signup-confirm-error";
						error.style.display	= "none";
						error.className		= "error-hide";
						$(error).html(data["okMessage"]);
						$("#signup-confirm-form").prepend(error);
						$("#signup-confirm-error").fadeIn("slow");
						return;
					}
				}
			});
		}else{
			if(!$("#signup-email").length>0){
				return
			}
			var msg = $("#signup-email").val();
			if(!msg.length||!checkEmail(msg)){
				if($("p#signup-error")) $("p#signup-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "signup-error");
				$(error).attr("class", "error-hide");
				$(error).html("Please enter a valid email address.");
				$("#signup-form").prepend(error);
				$(error).fadeIn("slow");
				return;
			}
			if(!lastminute.createPopUpWindow('signupWindow',300)){
				return false;
			}
			$('#signupWindow').jqm({ajax: '/forms/signup'});
			$('#signupWindow').jqmShow(); 
		}
	},
	
	/*#####
	/* GENERAL
	/*#####
	
	/**
 	* creates a 'pop up' window container - how you say - 'on the fly'?
 	*/
	createPopUpWindow : function(id,size,module){
		if($("#noDestroyFix").length>0){
			$("#noDestroyFix").remove();
		}
		
		if(!id){
			return;
		}
		if($(id).length>0){
			return true;
		}
		var size = (size)? size:600;
		
		var winOuter = document.createElement("DIV");
		$(winOuter).attr("class", "jqmWindow jqmWindow" + size);
		$(winOuter).attr("id", id);
		
		var noDestroyFix = document.createElement("DIV");
		$(noDestroyFix).attr("id", "noDestroyFix");
		$(noDestroyFix).append($(winOuter));
		
		if(module){
			$("body.splash").append(noDestroyFix);
		}else{
			$("#container").append(noDestroyFix);
		}
		
		var winInner = document.createElement("DIV");
		$(winInner).attr("class", "jqmWindow-loading");
		$(winOuter).append($(winInner));
		
		var winImg = document.createElement("IMG");
		$(winImg).attr("src", "/images/loaders/small-on-grey.gif");
		$(winImg).attr("alt", "loading");
		$(winInner).append($(winImg));
			
		return true;
	},
	
	/**
 	* creates some error text to be sent to someone
 	*/
	createErrorText : function(func,data){
		var errorStr = '';
		errorStr += "navigator.platform=" + navigator.platform;
		errorStr += "&navigator.appCodeName=" + navigator.appCodeName;
		errorStr += "&navigator.userAgent = " + navigator.userAgent;
		errorStr += "&navigator.appName = " + navigator.appName;
		errorStr += "&navigator.appVersion = " + navigator.appVersion;
		errorStr += "&navigator.cookieEnabled = " + navigator.cookieEnabled;
		errorStr += "&function = " + func;
		if(data['status']) errorStr += "&status = " + data['status'];
		if(data['statusText']) errorStr += "&statusText = " + data['statusText'];
		if(data['responseText']) errorStr += "&responseText = " + data['responseText'];
		if(data['responseXML']) errorStr += "&responseXML = " + data['responseXML'];
		/*
		$.ajax({
			type: "POST",
			url: "/services/clientError/ajax/",
			data: errorStr,
			error: function(){
				try{
  					console.log("error on sending error");
				}catch(e){}			
			},
			success: function(data){
				try{
  					console.log("ok sending error");
				}catch(e){}	
			}
		});
		*/
	},
	
	/**
 	* makes the book scrollable
 	*/
	confirmLetEmHaveIt : function(id){
		if(!id){ return; }
		$.ajax({
			type: "GET",
			url: "/secret/"+id,
			error: function(){
				if($("p#confirm-error")) $("p#confirm-error").remove();
				var error = document.createElement('P');
				$(error).attr("id", "confirm-error");
				$(error).attr("class", "error-hide");
				$(error).html("Sorry, we've hit a problem. Please try again later.");
				$("#splash-buttons").prepend(error);
				$(error).fadeIn("slow");
				return;
			},
			success: function(data){
				var data = $.parseJSON(data);
				if(data["errorMessage"]){
					if($("p#confirm-error")) $("p#confirm-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "confirm-error");
					$(error).attr("class", "error-hide");
					$(error).html("Sorry, we've hit a problem. Please try again later.");
					$("#splash-buttons").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
				if(data["okMessage"]){
					$("#splash-intro-text").addClass("hide");
					$("#splash-redo").removeClass("hide");
					$("#splash-buttons-tohide").addClass("hide");
					if($("p#confirm-error")) $("p#confirm-error").remove();
					var error = document.createElement('P');
					$(error).attr("id", "confirm-error");
					$(error).attr("class", "error-hide");
					$(error).html("Thank you. An email has been sent.");
					$("#splash-buttons").prepend(error);
					$(error).fadeIn("slow");
					return;
				}
			}
		});
	},
	
	/**
	* a nicerer "back to top"
	*/
	toTop : function(speed){
		var targetOffset = $("body").offset().top;
		$('html,body').animate({scrollTop: targetOffset},speed);
		return false;
	},
	
	/**
	* gets image dimensions from the filename, then passes the file onto be resized
	*/
	getImageDimensions : function(src){
		// needs fixing
		/*
		var dimensions = src.substring((src.lastIndexOf("/")+1),src.lastIndexOf("."));
		if(dimensions.toLowerCase().indexOf('x')!=-1){
			var width = dimensions.toLowerCase().split("x")[0];
			var height = dimensions.toLowerCase().split("x")[1];
			return lastminute.scaleImage(src, alt, width, height, 268, 118, "fit");
		}else{
			return '<img src="'+src+'" style="width: 268px; height: 118px; left: 0; top: 0;" />';	
		}
		*/
		
		var dimensions = src.substring((src.lastIndexOf("/")+1),src.lastIndexOf("."));
		var temp = dimensions.toLowerCase().split("x");
		var width = temp[0];
		var height = temp[1];
		var alt = '';
		
		//alert(src + " , " + alt + " , " + width + " , " + height);
		
		return lastminute.scaleImage(src, alt, width, height, 268, 118, "fit");
	},
	
	/**
	* passes arguments to resizeToFit() to resize an image to fit in a container
	* accepts...
	* src: string. path to image.
	* alt: string. alt attribute value.
	* width: integer. width of the image to be resized.
	* height: integer. height of the image to be resized.
	* dwidth: integer. the width of the box the image needs to fit.
	* dheight: integer. the height of the box the image needs to fit.
	* method: "fill" || "fit". "fill" will crop the image to completely fill the box. "fit" will scale the image to fit the box.
	* return...
	* <img src="src" alt="alt" style="width: widthl height: height; top: any necessary offset; left: any necessary offset;" />
	* customised, but originally from www.cjboco.com
	*/
	scaleImage : function(src, alt, width, height, dwidth, dheight, method) {
		var file = lastminute.resizeToFit({
			srcWidth: width,
			srcHeight: height,
			destWidth: dwidth,
			destHeight: dheight,
			method: method
		});
		return '<img src="'+src+'" style="width: '+file.width+'px; height: '+file.height+'px; top: '+file.offset.y+'px; left: '+file.offset.x+'px" />';
	},

	/**
	* the meat and potatoes of scaleImage()
	* customised, but originally from www.cjboco.com
	*/
	resizeToFit : function(options) {
		var ratioX, ratioY, scale, newWidth, newHeight;
		ratioX = options.destWidth / options.srcWidth;
		ratioY = options.destHeight / options.srcHeight;
		if (options.method === "fit") {
			scale = ratioX < ratioY ? ratioX: ratioY;
		} else if (options.method === "fill") {
			scale = ratioX > ratioY ? ratioX: ratioY;
		}
		newWidth = parseInt(options.srcWidth * scale, 10);
		newHeight = parseInt(options.srcHeight * scale, 10);
		return {
			width: newWidth,
			height: newHeight,
			offset: {
				x: parseInt((options.destWidth - newWidth) / 2, 10),
				y: parseInt((options.destHeight - newHeight) / 2, 10)
		},
			fits: options.srcWidth >= options.destWidth && options.srcHeight >= options.destHeight ? true: false
		};
	},
	
	/**
 	* shows a message/alert box
	* id = string. unique identifier of the 'pop up'. can just be random number.
	* message = string. the message to display
	* time = integer || false. the time the box should stay on the screen. can be false if you want it to stay until another event
	* x = integer. the x coordinate of the event that fired this
	* y = integer. the y coordinate of the event that fired this
	* canClose = true || false. show the close button, or remove it and close the box some other way
	* width = integer || false. width of the message window. default is 200;
 	*/
	showMessageBox : function(id,message,time,x,y,canClose,width){
		//prevents 2 message boxes with same id from being opened
		if($('#messageBox' + id).length > 0) { return false; }
		
		// create and prepend message box
		var messageDiv = document.createElement("DIV");
		messageDiv.className = "messageBox";
		if(width){
			messageDiv.style.width = width + "px";
		}
		messageDiv.id = "messageBox" + id;
		messageDiv.innerHTML = "<span><a>X</a></span>";
		var closeButton = (canClose)? "X":"&nbsp";
		//messageDiv.innerHTML = "<span><a>"+closeButton+"</a></span>";
		messageDiv.innerHTML = "<span>&nbsp;</span>";
		var messageDivInner = document.createElement("DIV");
		messageDivInner.className = "inner";
		messageDivInner.innerHTML = message;
		$(messageDiv).append(messageDivInner);
		$("div#container").prepend(messageDiv);
		// calculate good x and y coordinates
		var newX = x + 10;
		var newY = (y - $("#" + messageDiv.id).height()) - 30;
		$("#" + messageDiv.id).css("top",newY + "px");
		$("#" + messageDiv.id).css("left",newX + "px");
		if(canClose){
		// add a click event for the close button
			$("#" + messageDiv.id + " > span > a").click(function(){
				$("#" + messageDiv.id).hide();							 
			});
		}
		// fade it in, then fade it out, then remove it
		$("#" + messageDiv.id).fadeIn("slow", function(){
			if(time){
				 setTimeout(function() {
					$("#" + messageDiv.id).fadeOut("slow", function(){
						$("#" + messageDiv.id).remove();
					});
				}, time);	
			}
		});
	}
	
}

/**
* stop image flicker on backgrounds in ie6
*/
try {
  document.execCommand('BackgroundImageCache', false, true);
} catch(e) {}

/**
* ajax config
*/
$.ajaxSetup({
	headers: {"X-Requested-With":"Ajax"},
	contentType: "application/x-www-form-urlencoded",
	cache: false,
	data: {}
});

/**
* outputs string to screen nicely in FF, standard in others
*/
say = function(str){
	try{
		console.log(str)
	}catch(e){
		alert(str);
	}
}

/**
* left trim function
*/
leftTrim = function (sString){
	while(sString.substring(0,1)==' '){
		sString = sString.substring(1, sString.length);
	}
	return sString;
}

/**
* right trim function
*/
rightTrim = function(sString){
	while(sString.substring(sString.length-1, sString.length)==' '){
		sString = sString.substring(0,sString.length-1);
	}
	return sString;
}

/**
* combines left and right trim functions
*/
trimAll = function(sString){
	while(sString.substring(0,1)==' '){
		sString = sString.substring(1, sString.length);
	}
	while(sString.substring(sString.length-1, sString.length)==' '){
		sString = sString.substring(0,sString.length-1);
	}
	return sString;
}

/**
* checks an email address
*/
checkEmail = function (sEmail) {
	var at							= "@";
	var dot							= ".";
	var lat							= sEmail.indexOf(at);
	var lstr						= sEmail.length;
	var ldot						= sEmail.indexOf(dot);
	if (sEmail.indexOf(at) == -1) {return false;}
	if (sEmail.indexOf(at) == -1 || sEmail.indexOf(at)==0 || sEmail.indexOf(at)==lstr) {return false;}
	if (sEmail.indexOf(dot) == -1 || sEmail.indexOf(dot)==0 || sEmail.indexOf(dot)==lstr) {return false;}
	if (sEmail.indexOf(at,(lat+1)) != -1) {return false;}
	if (sEmail.substring(lat-1,lat) == dot || sEmail.substring(lat+1,lat+2)==dot) {return false;}
	if (sEmail.indexOf(dot,(lat+2)) == -1) {return false;}
	if (sEmail.indexOf(" ")!=-1) {return false;}
	return true;
}

/**
* checks if an integer is a float
*/
isFloat = function(s){
	return s.length>0 && !(/[^0-9.]/).test(s) && (/\.\d/).test(s);
}

	

