/**
 * FORTNUM FRONTEND JAVASCRIPT
 * 
 * Created By	: Sam Clark
 * Version 		: 1.0.0
 * Additional	:
 * 
 * This script provides all the javascript for the front end
 * of Fortnum.
 * 
 * REQUIREMENTS
 * 
 * This script requires the jQuery library available from (http://jquery.com)
 * 
 * TODO
**/


/**
 * addLoadEvent(function)
 * 
 * Creates a queue of submitted functions that execute when the page finishes loading
 * Add Load Event function
 * Written by Simon Willison
 * (c) 2004 Simon Willison, http://simon.incutio.com
 * GPL Licence
 **/
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

// On page load, run these functions
addLoadEvent(onLoad_queue);
function onLoad_queue()
{
	set_key_range_boxes_height();
	search_tag_cloud();
	
	// Images
	alternative_product_images();
	
	// Predictive Search
	predictive_search();
	
	
	// Basket Controls
	view_summary();
	view_wishlist();
  view_checkout_options();

	// Checkout Controls
	useBillingAddress();
	expand_checkout_basket();
	printPage();
	creditcard_verify();
	
	// Product finder
	if($.browser.msie == false)
		shop_by_situation_menu();
	
	clearSubmitBtns();
	category_search();
	tags_search();
	shop_by_situation_highlight();
  pager_submit_search();
	
	// Frontpage
	keyRanges();
}

function useBillingAddress(){
	var usebillingbtn = "<img class=\"useBillingBtn\" src=\"" + pdnh_sec_rootURL + "/assets/images/btn-usebillingaddress.gif\" />";
	
	$("div.rightsplit").prepend(usebillingbtn);

	$("img.useBillingBtn").click(function() {
		$("input#delivery_fullname").val($("input#billing_fullname").val());
		$("input#delivery_property").val($("input#billing_property").val());
		$("input#delivery_line1").val($("input#billing_line1").val());
		$("input#delivery_line2").val($("input#billing_line2").val());
		$("input#delivery_city").val($("input#billing_city").val());
		$("input#delivery_postal_code").val($("input#billing_postal_code").val());
	});
	 
	$("img.useBillingBtn").css("cursor", "pointer"); 

}

function printPage()
{
	$("p.print").css("cursor", "pointer");
	$("p.print").click(function() {
		window.print();
		return false;
	});
}

function search_tag_cloud()
{
	$("a#openTagCloud").click(function(){
							
		$("div#search div#searchTagCloud").fadeIn("slow");
		
		return false;
	});

	$("a#openTagCloud").blur(function(){
		$("div#search div#searchTagCloud").fadeOut("slow");
	});
}

function set_key_range_boxes_height()
{
	var heights = 0;
	
	$("div#keyRanges div p").each(function() {
		if($(this).height() > heights)
			heights = $(this).height();
	});

	$("div#keyRanges div.keyRange p.cat_desc").height(heights);
	
	heights = 0;
	
	$("div#keyRanges div div.productShowcase").each( function(){
		if($(this).height() > heights)
			heights = $(this).height();
	});
		
	$("div#keyRanges div.keyRange div.productShowcase").height(heights);
	
}

function expand_checkout_basket()
{
	$("div.basketDetails a").click(function() {
		
		if($("div#basketItems").height() < $("body").height())
			var real_height = $("div#basketItems").height();		
		else
			var real_height = $("div#basketItems").height() - 75;
					
		if($("#basketItemsContainer").height() < real_height)
		{
			$("#basketItemsContainer").animate({
				height: real_height + "px"
			}, "normal", 'swing');
			$("div.basketDetails a").attr("class", "up");
		}
		else
		{
			$("#basketItemsContainer").animate({
				height: "0px"
			}, "normal", "swing");			
			$("div.basketDetails a").attr("class", "");
		}
		
		return false;
	});
}


function alternative_product_images()
{
	$("div.alternatives img").click(function() {
		var img_id = $(this).attr("id");

		$(this).ajaxStart(function(){
			var loading = "<span id='loading_image'>Loading...</span>";
			if(!document.getElementById("loading_image"))
			{
				$(loading).appendTo("div#productImages div.productPage span#product_image");
				$("span#loading_image").css({position:"absolute", top:"10px", left:"10px",backgroundColor:"#ff0000", color:"white", padding:"3px"});				
			}
 		});
		
		$(this).ajaxStop(function(){
			$("div#productImages div.productPage span#product_image span#loading_image").fadeOut("slow",function(){
					$(this).remove()			
				}
			);		
		});
	
		$.ajax({
			type: "GET",
			global: false,
			url: pdnh_rootURL+"/index.php/api/getImage/"+img_id,
			dataType: "xml",
			start: function(){
			},
			success: function(img, status){				
				if(img.getElementsByTagName("image"))
				{
					var image_url = img.getElementsByTagName("url")[0].lastChild.nodeValue;
					var image_alt = img.getElementsByTagName("alt")[0].lastChild.nodeValue;
					var image_id = "img_"+img.getElementsByTagName("id")[0].lastChild.nodeValue;
					$("div#productImages div.productPage span#product_image img").attr({
						src: image_url,
						alt: image_alt,
						id: image_id
					});
				}			
			}
		});
	});
}

var basket_interval;

function expand_basket() {

	if($("#basketItems").height() < $("body").height())
		var real_height = $("#basketItems").height() + 5;		
	else
		var real_height = $("#basketItems").height() - 75;
		
	$("#basketLink").animate({
		height: real_height + "px"
		}, "fast", 'swing');

	$("li.summary a").attr("class", "up");
		
	input_timer = setTimeout(function()
	{
		$("#basketLink").animate({
			height: "25px"
		}, "normal", "swing");
		$("li.summary a").attr("class", "");
					
		clearBasketTimer();
	},4000);
}

function clearBasketTimer()
{
	clearTimeout(basket_interval);

}

function view_summary()
{

	if ($("#basketItems").children().size() > 0) {
		$("li.summary a").click(function(){
		
			if ($("#basketItems").height() < $("body").height()) 
				var real_height = $("#basketItems").height() + 5;
			else 
				var real_height = $("#basketItems").height() - 75;
        
			
			if ($("#basketLink").height() < real_height) {
				$("#basketLink").animate({
					height: real_height + "px"
				}, "normal", 'swing');
				$("li.summary a").attr("class", "up");
			}
			else {
				$("#basketLink").animate({
					height: "25px"
				}, "normal", "swing");
				$("li.summary a").attr("class", "");
			}
			
			return false;
		});
	}
	else
	{
		$("li.summary a").fadeTo("fast", 0.5);
		$("li.summary a").click(function() {return false});
		$("li.summary a").css("cursor", "default");
	}
}


function expand_wishlist() {

	if($("#wishlistItems").height() < $("body").height())
		var real_height = $("#wishlistItems").height();		
	else
		var real_height = $("#wishlistItems").height() - 75;
		
	$("#wishlistLink").animate({
		height: real_height + "px"
		}, "fast", 'swing');

	$("li.wishlist a").attr("class", "up");
		
	input_timer = setTimeout(function()
	{
		$("#wishlistLink").animate({
			height: "0px"
		}, "normal", "swing");
		$("li.wishlist a").attr("class", "");
					
		clearBasketTimer();
	},4000);
}

function clearBasketTimer()
{
	clearTimeout(basket_interval);

}

function view_wishlist()
{
	if ($("#wishlistItems").children().size() > 0) {
		$("li.wishlist a").click(function() {
			
			if($("#wishlistItems").height() < $("body").height())
				var real_height = $("#wishlistItems").height();		
			else
				var real_height = $("#wishlistItems").height() - 75;
			
			if($("#wishlistLink").height() < real_height)
			{
				$("#wishlistLink").animate({
					height: real_height + "px"
				}, "normal", 'swing');
				$("li.wishlist a").attr("class", "up");
			}
			else
			{
				$("#wishlistLink").animate({
					height: "0px"
				}, "normal", "swing");			
				$("li.wishlist a").attr("class", "");
			}
			
			return false;
		});
	}
	else
	{
		$("li.wishlist a").fadeTo("fast", 0.5);
		$("li.wishlist a").click(function() {return false});
		$("li.wishlist a").css("cursor", "default");
	}
}


var input_timer;

function predictive_search()
{
	$("input#search_terms").keyup(function() {
		clearInputTimer();

		$(this).ajaxStart(function() {
			$("div#searchSuggestions").remove();
			var predictiveSearchBox = "<div id=\"searchSuggestions\">\n<span id=\"searchStatus\">Searching...</span>\n</div>";
			$(predictiveSearchBox).appendTo("div#search");				
			$("span#searchStatus").css({backgroundColor:"#ff0000", color:"white", padding:"3px"});				
		});

		$(this).blur(function() 
		{
			clearInputTimer();
			$("div#searchSuggestions").fadeOut("slow", function()
			{
				$(this).remove();	
			});
		});

		input_timer = setTimeout(function()
		{

			if ($("input#search_terms").val() != "")
			{
				$.ajax({
					type: "GET",
					url: pdnh_rootURL + "/index.php/api/search/" + $("input#search_terms").val() + "/-/type=fulltext/hybrid=true/",
					dataType: "xml",
					success: function(results, status){
						if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {
							$("span#searchStatus").remove();
							var products = results.getElementsByTagName("product");
							var search_result_window = "";
							var products_out = "<p>Product suggestions</p>\n";
							for (i = 0; i < products.length; i++) {
								var title = products[i].getElementsByTagName("title")[0].lastChild.nodeValue;
								if(products[i].getElementsByTagName("shortName")[0].lastChild)
									var shortName = products[i].getElementsByTagName("shortName")[0].lastChild.nodeValue;
								else
									var shortName = "null";
								var lowestPrice = products[i].getElementsByTagName("lowestPrice")[0].lastChild.nodeValue;
								var lowestPriceQty = products[i].getElementsByTagName("lowestPriceQty")[0].lastChild.nodeValue;
								var lowestSalePercentage = products[i].getElementsByTagName("lowestSalePercentage")[0].lastChild.nodeValue;
								var linkToProduct = pdnh_rootURL + "/index.php/product/" + shortName;
								
								var defaultImage = "";
								var images = products[i].getElementsByTagName("image");
								if (images.length >= 1) {
									var imageDefaults = products[i].getElementsByTagName("default");
									var imageSrcs = products[i].getElementsByTagName("thumb");
									var imageAlts = products[i].getElementsByTagName("alt");
									if (imageDefaults.length >= 1) {
										for (ii = 0; ii < imageDefaults.length; ii++) {
											if (imageDefaults[ii].lastChild.nodeValue == "1") {
												defaultImage = "<img width=\"50\" height=\"50\" alt=\"" + imageAlts[ii].lastChild.nodeValue + "\" src=\"" + imageSrcs[ii].lastChild.nodeValue + "\"/>";
											}
										}
										if (defaultImage == "") 
											defaultImage = "<img width=\"50\" height=\"50\" alt=\"" + imageAlts[0].lastChild.nodeValue + "\" src=\"" + imageSrcs[0].lastChild.nodeValue + "\"/>";
									}
								}
								else 
									defaultImage = "<img width=\"50\" height=\"50\" alt=\"No product image available\" src=\"" + pdnh_rootURL + "/assets/images/uploads/no-image-thumb.gif\"/>";
								
								var salePercentage = ""
								if (lowestSalePercentage != 0) {
									salePercentage = "<div class=\"searchSaving\">  Save up to " + lowestSalePercentage + "%! </div>";
								}
								
								products_out += "<div class=\"suggestion\">\n<a href=\"" + linkToProduct + "\">" + defaultImage + "</a>" + salePercentage + "\n<strong>\n<a href=\"" + linkToProduct + "\">" + title + "</a>\n</strong>\n<br/>\nfrom just &pound;" + lowestPrice + " for "+ lowestPriceQty +"<p class=\"pageClear\" /></div>\n"
							//		products_out += title + "\n";
							}
							
							products_out += "<a href=\""+pdnh_rootURL+"/index.php/search/?search="+$("input#search_terms").val()+"\">View detailed search results...</a>\n";							
							$(products_out).appendTo("div#searchSuggestions");
						}
						else {
							$("span#searchStatus").remove();
							
							products_out = "<p>No products found</p>";
							$(products_out).appendTo("div#searchSuggestions");
							
						}
					}
				});
				
				clearInputTimer();
			}
			else
			{
				$("div#searchSuggestions").remove();
				$("span#searchStatus").remove();
				clearInputTimer();				
			}
		}, 750);
	});
}

function clearInputTimer(){
	clearTimeout(input_timer);
}


// PRODUCT FINDER

function clearSubmitBtns()
{
	$("#submit_cats").remove();
	$("#submit_tags").remove();
}


function category_search()
{
	$("ul#dynamic_cat_list input").click(function() {
		
		$("#products_found_list").fadeOut("fast", function() {
			$(this).remove();				
		});	
				
	// Create searching
		$("div#found_products").ajaxStart(function() {
			$("span#pfStatus").remove();
			var productFinderStatus = "<span id=\"pfStatus\">Matching your selection...</span>\n";
			$(productFinderStatus).appendTo("div#found_products");				
			$("span#pfStatus").css({backgroundColor:"#ff0000", color:"white", padding:"3px"});				
		});

		$.ajax({
			type: "GET",
			url: pdnh_rootURL + "/index.php/api/getProductsByCategory/" + $(this).val(),
			dataType: "xml",
			success: function(results, status){
				if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {
					$("span#pfStatus").remove();
					var products = results.getElementsByTagName("product");
					var search_result_window = "";
					var products_out = "<ul id=\"products_found_list\">\n";
					for (i = 0; i < products.length; i++) {
						//FOR EACH PRODUCT

						// Get title
						var title = products[i].getElementsByTagName("title")[0].lastChild.nodeValue;

						// Get short name
						if(products[i].getElementsByTagName("shortName")[0].lastChild)
							var shortName = products[i].getElementsByTagName("shortName")[0].lastChild.nodeValue;
						else
							var shortName = "null";
							
						// Get the product URL
						var linkToProduct = pdnh_rootURL + "/index.php/product/" + shortName;


						// GET DEFAULT IMAGE								
						var defaultImage = "";
						var images = products[i].getElementsByTagName("image");
						
						// If there are images
						if (images.length >= 1) {
							var imageDefaults = products[i].getElementsByTagName("default");
							var imageSrcs = products[i].getElementsByTagName("thumb");
							var imageAlts = products[i].getElementsByTagName("alt");
							if (imageDefaults.length >= 1) {
								for (ii = 0; ii < imageDefaults.length; ii++) {
									if (imageDefaults[ii].lastChild.nodeValue == "1") {
										defaultImage = "<img width=\"75\" height=\"75\" alt=\"" + imageAlts[ii].lastChild.nodeValue + "\" src=\"" + imageSrcs[ii].lastChild.nodeValue + "\"/>";
									}
								}
								if (defaultImage == "") 
									defaultImage = "<img width=\"75\" height=\"75\" alt=\"" + imageAlts[0].lastChild.nodeValue + "\" src=\"" + imageSrcs[0].lastChild.nodeValue + "\"/>";
								}
							}
							else 
								defaultImage = "<img width=\"75\" height=\"75\" alt=\"No product image available\" src=\"" + pdnh_rootURL + "/assets/images/uploads/no-image-thumb.gif\"/>";
								
							
							products_out += "<li>\n<a class=\"" + shortName + "\" href=\"" + linkToProduct + "\">" + defaultImage + "<span class=\"hidden\">"+ title +"</span></a>\n";
							}
							
							$(products_out).prependTo("div#found_products");
							shop_by_situation_highlight();
							
							
						// SET UP TAG CHECK BOXES
						var tags = results.getElementsByTagName("tag");
						
						if(tags.length > 0)
						{
							
							$("form#dym_tags :checkbox").each(function (){
								
								$(this).attr("checked", "");
								for(ii=0; ii < tags.length; ii++)
								{
									var tag = tags[ii].lastChild.nodeValue;
									tag = tag.replace(/%20/," ");
									if($(this).val() === tag)
									{
										$(this).attr("checked", "checked");										
									}
								}
							});			
						}
						
						
				}
				else 
				{
					$("span#searchStatus").remove();
						
					products_out = "<p id=\"products_found_list\">No products found</p>";
					$(products_out).prependTo("div#searchSuggestions");
						
				}
			}
		});
	});
}


function tags_search()
{
	$("form#dym_tags input").click(function() {
				
		$("#products_found_list").fadeOut("fast", function() {
			$(this).remove();				
		});	
	
		// Get all check boxes that are selected
		

		var tags = "";
		
		$("form#dym_tags :checked").each(function (){
			tags += $(this).val() + "/";
		});

		$("ul#dynamic_cat_list input:checked").each(function (){
			$(this).attr("checked", "");
		});
				
	// Create searching
		$("div#found_products").ajaxStart(function() {
			$("span#pfStatus").remove();
			var productFinderStatus = "<span id=\"pfStatus\">Matching your selection...</span>\n";
			$(productFinderStatus).appendTo("div#found_products");				
			$("span#pfStatus").css({backgroundColor:"#ff0000", color:"white", padding:"3px"});				
		});

		$.ajax({
			type: "GET",
			url: pdnh_rootURL + "/index.php/api/getProductsByTags/" + tags,
			dataType: "xml",
			success: function(results, status){
				if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {
					$("span#pfStatus").remove();
					var products = results.getElementsByTagName("product");
					var search_result_window = "";
					var products_out = "<ul  id=\"products_found_list\">\n";
					for (i = 0; i < products.length; i++) {
						//FOR EACH PRODUCT

						// Get title
						var title = products[i].getElementsByTagName("title")[0].lastChild.nodeValue;

						// Get short name
						if(products[i].getElementsByTagName("shortName")[0].lastChild)
							var shortName = products[i].getElementsByTagName("shortName")[0].lastChild.nodeValue;
						else
							var shortName = "null";
							
						// Get the product URL
						var linkToProduct = pdnh_rootURL + "/index.php/product/" + shortName;


						// GET DEFAULT IMAGE								
						var defaultImage = "";
						var images = products[i].getElementsByTagName("image");
						
						// If there are images
						if (images.length >= 1) {
							var imageDefaults = products[i].getElementsByTagName("default");
							var imageSrcs = products[i].getElementsByTagName("thumb");
							var imageAlts = products[i].getElementsByTagName("alt");
							if (imageDefaults.length >= 1) {
								for (ii = 0; ii < imageDefaults.length; ii++) {
									if (imageDefaults[ii].lastChild.nodeValue == "1") {
										defaultImage = "<img width=\"75\" height=\"75\" alt=\"" + imageAlts[ii].lastChild.nodeValue + "\" src=\"" + imageSrcs[ii].lastChild.nodeValue + "\"/>";
									}
								}
								if (defaultImage == "") 
									defaultImage = "<img width=\"75\" height=\"75\" alt=\"" + imageAlts[0].lastChild.nodeValue + "\" src=\"" + imageSrcs[0].lastChild.nodeValue + "\"/>";
								}
							}
							else 
								defaultImage = "<img width=\"75\" height=\"75\" alt=\"No product image available\" src=\"" + pdnh_rootURL + "/assets/images/uploads/no-image-thumb.gif\"/>";
								
							
							products_out += "<li>\n<a class=\"" + shortName + "\" href=\"" + linkToProduct + "\">" + defaultImage + "<span class=\"hidden\">"+ title +"</span></a>\n";
							}
							
							$(products_out).prependTo("div#found_products");
							shop_by_situation_highlight();
				}
				else {
					$("span#searchStatus").remove();
						
					products_out = "<p>No products found</p>";
					$(products_out).appendTo("div#searchSuggestions");
				}
			}
		});
	});
}

var keyRangesData = new Array();   // Data variable
var keyRangeState = new Array(0,0,0);
var trackingVar = 0;

function keyRanges()
{
	/**
	 * Creates the key ranges boxes for the home page
	 */
	
	// Exit if keyRanges div does not exist
	if(!document.getElementById("keyRanges")) return false;
	
	
	
	$("div#keyRanges div.keyRange").each(function () {
		// Get the id of the category
		var category_name = $(this).attr("id");
		
		// Load products for category
		$.ajax({
			type: "GET",
			global: false,
			url: pdnh_rootURL + "/index.php/api/getProductsByCategory/" + category_name,
			dataType: "xml",
			success: function(results, status) {
				if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {

					// Get products from XML
					var products = results.getElementsByTagName("product");
					var temp_data = new Array();
					// For each results
					for(i=0;i<products.length;i++) {
						var itemInformation = "";

						// Get title
						var title = products[i].getElementsByTagName("title")[0].lastChild.nodeValue;

						// Get short name
						if(products[i].getElementsByTagName("shortName")[0].lastChild)
							var shortName = products[i].getElementsByTagName("shortName")[0].lastChild.nodeValue;
						else
							var shortName = "null";
						
						// Get the description	
						if(products[i].getElementsByTagName("description")[0].lastChild)
							var description = products[i].getElementsByTagName("description")[0].lastChild.nodeValue;
						else
							var description = "";
							
						// Get the product URL
						var linkToProduct = pdnh_rootURL + "/index.php/product/" + shortName;

						// Get lowest price
						var lowestPrice = "&pound;" + products[i].getElementsByTagName("lowestPrice")[0].lastChild.nodeValue;
						var lowestPriceQty = products[i].getElementsByTagName("lowestPriceQty")[0].lastChild.nodeValue;

						// GET DEFAULT IMAGE								
						var defaultImage = "";
						var images = products[i].getElementsByTagName("image");
						
						// If there are images
						if (images.length >= 1) {
							var imageDefaults = products[i].getElementsByTagName("default");
							var imageSrcs = products[i].getElementsByTagName("thumb");
							var imageAlts = products[i].getElementsByTagName("alt");
							if (imageDefaults.length >= 1) {
								for (ii = 0; ii < imageDefaults.length; ii++) {
									if (imageDefaults[ii].lastChild.nodeValue == "1") {
										defaultImage = "<img class=\"product\"  width=\"95\" height=\"95\" alt=\"" + imageAlts[ii].lastChild.nodeValue + "\" src=\"" + imageSrcs[ii].lastChild.nodeValue + "\"/>";
									}
								}
								if (defaultImage == "") 
									defaultImage = "<img class=\"product\"  width=\"95\" height=\"95\" alt=\"" + imageAlts[0].lastChild.nodeValue + "\" src=\"" + imageSrcs[0].lastChild.nodeValue + "\"/>";
							}
						}
						else 
							defaultImage = "<img class=\"product\" width=\"95\" height=\"95\" alt=\"No product image available\" src=\"" + pdnh_rootURL + "/assets/images/uploads/no-image-thumb.gif\"/>";
								
						var product_out 	= "<div class=\"productShowcase\"><a href=\"" + linkToProduct + "\">" + defaultImage + "</a>\n";
						product_out 		+= "<a href=\"" + linkToProduct + "\">" + title + "</a><br />\n" + description;
						product_out			+= "<p><strong>from " + lowestPrice + " for " + lowestPriceQty + "</strong></p></div>";
							
						// Populate cache
						temp_data[i] = product_out;
					}
					
					// Add data to cache
					addData ( temp_data );
				}				
			},
			complete: function() {
				buildKeyRanges(category_name);
			}
		});
	});
	
	
}

function addData (data)
{
	/**
	 * Adds returned data from Key Ranges to keyRanges cache keyRangesData
	 */
	var index = trackingVar;
		
	keyRangesData[index] = data;
	trackingVar++;
	return true;
}

function buildKeyRanges (content_id)
{
	// CREATE NEW ID
	content_id = "#" + content_id;
	
	// DELETE EXISTING CONTENT
	$(content_id + " .productShowcase").remove();
	
	// DISCOVER NEW ID
	var c_index = $(".keyRange").index($(content_id)[0]);
	var product_count = keyRangesData[c_index].length;	

	// ADD FIRST INDEX FOR EACH RANGE
	$(content_id).append(keyRangesData[c_index][0]);
		
	// ADD CONTROLS AND CONTROLLER FUNCTIONS
	$(content_id).append(buildKeyRangeControls());
	
	var control_height = $("div#keyRanges div.keyRange p.cat_desc:first").height() + 60;
		
	$(content_id + " div#controls span").css("top",control_height+"px");
	
	$(content_id + " span.left a").click(function(){
		
		// Discover rollover state
		if((keyRangeState[c_index] - 1) >= 0)
			keyRangeState[c_index]--;
		else
			keyRangeState[c_index] = product_count-1;
		
		// Fade out current
		$(content_id + " .productShowcase").fadeOut("normal",function() {		
			// Set opacity to zero
			$(keyRangesData[c_index][keyRangeState[c_index]]).css("opacity","0.0");
			// Insert new
			$(content_id + " .productShowcase").replaceWith(keyRangesData[c_index][keyRangeState[c_index]]);
	
			// Fade in new
			$(content_id + " .productShowcase").fadeIn("normal");
			
			set_key_range_boxes_height();
		});
		// Return false
		return false;
		
	});
	
	$(content_id + " span.right a").click(function(){
		// Discover rollover state
		if((keyRangeState[c_index] + 1) < product_count)
			keyRangeState[c_index]++;
		else
			keyRangeState[c_index] = 0;
		
		// Fade out current
		$(content_id + " .productShowcase").fadeOut("normal", function() {
			// Set opacity to zero
			$(keyRangesData[c_index][keyRangeState[c_index]]).css("opacity","0.0");

			// Insert new
			$(content_id + " .productShowcase").replaceWith(keyRangesData[c_index][keyRangeState[c_index]]);

			// Fade in new
			$(content_id + " .productShowcase").fadeIn("normal");
		
			set_key_range_boxes_height();	
		});
		
		// Return false
		return false;
		
	});	
	
	// RESIZE BOXES TO MATCH HEIGHT
	set_key_range_boxes_height();
}

function buildKeyRangeControls ()
{
	var controls = "<div id=\"controls\">\n";
	controls 	+= "<span class=\"left\">\n";
	controls	+= "<a title=\"view previous product\" href=\"#\">\n";
	controls	+= "<img width=\"15\" height=\"80\" alt=\"view previous product\" src=\"assets/images/previous.gif\"/>\n";
	controls	+= "</a>\n</span>\n";
	controls	+= "<span class=\"right\">\n";
	controls	+= "<a title=\"view next product\" href=\"#\">\n";
	controls	+= "<img width=\"15\" height=\"80\" alt=\"view next product\" src=\"assets/images/next.gif\"/>\n";
	controls	+= "</a>\n</span>\n</div>\n";
	
	return controls;	
}


function shop_by_situation_menu ()
{
	$("li.finder a").click( function() {
		// On click

		// Load products for category
		$.ajax({
			type: "GET",
			global: false,
			url: pdnh_rootURL + "/index.php/api/getAllCategories/1",
			dataType: "xml",
			success: function(results, status) {
				if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {

					// Get products from XML
					var categories = results.getElementsByTagName("category");

					var shop_by_situ_out 	= "<div id=\"shopBySituationMenu\">\n<ul>\n";

					// For each results
					for(i=0;i<categories.length;i++) {
						var cateogry = "";

						// Get title
						var title = categories[i].getElementsByTagName("title")[0].lastChild.nodeValue;

						// Get short name
						if(categories[i].getElementsByTagName("name")[0].lastChild)
							var name = categories[i].getElementsByTagName("name")[0].lastChild.nodeValue;
						else
							var name = "null";
						
						// Get the description	
						if(categories[i].getElementsByTagName("description")[0].lastChild)
							var description = categories[i].getElementsByTagName("description")[0].lastChild.nodeValue;
						else
							var description = "";
							
						// Get the product URL
						var linkToCategory = pdnh_rootURL + "/index.php/productfinder/" + name;

						
						shop_by_situ_out	+= 	"<li><a class=\"shop_by_situ_link\" href=\"" + pdnh_rootURL + "/index.php/productfinder/" + name + "\">" + title + "</a></li>\n";
							
					}
					shop_by_situ_out	+=	"</ul>\n</div>\n";
					
					$("div#wrapper").append(shop_by_situ_out);
				}				
			}
		});		
		
		return false;
	});
	
	$("li.finder a").blur( function() {
		$("div#shopBySituationMenu").fadeOut("slow", function() {
			$(this).remove();
		});
	});
}

function shop_by_situation_highlight()
{
	// For all Links within the canvas
	$("div#found_products li a").click( function () {
		
		// Get the ID of the image and remove img_ padding
		var product = $(this).attr("class");		
		
		// Remove existing box if exists
		$("div#info_box").remove();

		// Begin AJAX request for product
		$("div#found_products").append("<div id=\"info_box\"><span id=\"piStatus\">Loading product information</span></div>");
		$("span#piStatus").css({backgroundColor:"#ff0000", color:"white", padding:"5px", margin:"10px"});				
		

		$.ajax({
			type: "GET",
			global: false,
			url: pdnh_rootURL + "/index.php/api/getProductByName/" + product,
			dataType: "xml",
			success: function(results, status) {
				if (results.getElementsByTagName("response")[0].lastChild.nodeValue === "OK") {
				
					// Get products from XML
					var product_info = results.getElementsByTagName("product");
					
						// Get title
						var title = product_info[0].getElementsByTagName("title")[0].lastChild.nodeValue;

						// Get short name
						if(product_info[0].getElementsByTagName("shortName")[0].lastChild)
							var shortName = product_info[0].getElementsByTagName("shortName")[0].lastChild.nodeValue;
						else
							var shortName = "null";
						
						// Get the description	
						if(product_info[0].getElementsByTagName("description")[0].lastChild)
							var description = product_info[0].getElementsByTagName("description")[0].lastChild.nodeValue;
						else
							var description = "";
							
						// Get the product URL
						var linkToProduct = pdnh_rootURL + "/index.php/product/" + shortName;

						// Get lowest price
						var lowestPrice = "&pound;" + product_info[0].getElementsByTagName("lowestPrice")[0].lastChild.nodeValue;
						var lowestPriceQty = product_info[0].getElementsByTagName("lowestPriceQty")[0].lastChild.nodeValue;

						// GET DEFAULT IMAGE								
						var defaultImage = "";
						var images = product_info[0].getElementsByTagName("image");
						
						// If there are images
						if (images.length >= 1) {
							var imageDefaults = product_info[0].getElementsByTagName("default");
							var imageSrcs = product_info[0].getElementsByTagName("thumb");
							var imageAlts = product_info[0].getElementsByTagName("alt");
							if (imageDefaults.length >= 1) {
								for (ii = 0; ii < imageDefaults.length; ii++) {
									if (imageDefaults[ii].lastChild.nodeValue == "1") {
										defaultImage = "<img class=\"product\"  width=\"95\" height=\"95\" alt=\"" + imageAlts[ii].lastChild.nodeValue + "\" src=\"" + imageSrcs[ii].lastChild.nodeValue + "\"/>";
									}
								}
								if (defaultImage == "") 
									defaultImage = "<img class=\"product\"  width=\"95\" height=\"95\" alt=\"" + imageAlts[0].lastChild.nodeValue + "\" src=\"" + imageSrcs[0].lastChild.nodeValue + "\"/>";
							}
						}
						else 
							defaultImage = "<img class=\"product\" width=\"95\" height=\"95\" alt=\"No product image available\" src=\"" + pdnh_rootURL + "/assets/images/uploads/no-image-thumb.gif\"/>";
					
					var product_box_out 	 = "";
					product_box_out			+= "<h2><a href=\"" + linkToProduct + "\">" + title + "</a></h2>";
					product_box_out			+= "<div class=\"productInfo\"><a href=\"" + linkToProduct + "\">" + defaultImage + "</a><p class=\"descriptionText\">" + description + "<br /><a class=\"viewProduct\" href=\"" + linkToProduct + "\">View</a> <a href=\"#\" class=\"closeBox\">Close</a></p></div>";
					product_box_out			+= "<div class=\"pricepoint\"><p>from just <br /><strong>" + lowestPrice + "</strong><br /> per " + lowestPriceQty + "</p></div>";
					
					$("div#info_box span#piStatus").remove();
					$("div#info_box").append(product_box_out);

					$("div#info_box a.closeBox").click(function () {
						$("div#info_box").fadeOut("slow", function() {
							$(this).remove();
						});
						return false;
					});
				}
			}
		});
		

		return false;
		
		
	});


}


function pager_submit_search() {
  $("form.pager-form select").change(function() {
    $("form.pager-form").get(0).submit();
  });
}



function check_credit_card (cardnumber, cardname) {
     
	var ccErrorNo = 0;
	var ccErrors = new Array();

	ccErrors [0] = "Unknown card type";
	ccErrors [1] = "No card number provided";
	ccErrors [2] = "Credit card number is in invalid format";
	ccErrors [3] = "Credit card number is invalid";
	ccErrors [4] = "Credit card number has an inappropriate number of digits";
		 
  // Array to hold the permitted card characteristics
  var cards = new Array();

  // Define the cards we support. You may add addtional card types.
  
  //  Name:      As in the selection box of the form - must be same as user's
  //  Length:    List of possible valid lengths of the card number for the card
  //  prefixes:  List of possible prefixes for the card
  //  checkdigit Boolean to say whether there is a check digit
  
  cards [0] = {name: "Visa", 
               length: "13,16", 
               prefixes: "4",
               checkdigit: true};
  cards [1] = {name: "mc",  // mastercard
               length: "16", 
               prefixes: "51,52,53,54,55",
               checkdigit: true};
  cards [2] = {name: "DinersClub", 
               length: "14,16", 
               prefixes: "300,301,302,303,304,305,36,38,55",
               checkdigit: true};
  cards [3] = {name: "CarteBlanche", 
               length: "14", 
               prefixes: "300,301,302,303,304,305,36,38",
               checkdigit: true};
  cards [4] = {name: "AmEx", 
               length: "15", 
               prefixes: "34,37",
               checkdigit: true};
  cards [5] = {name: "Discover", 
               length: "16", 
               prefixes: "6011,650",
               checkdigit: true};
  cards [6] = {name: "JCB", 
               length: "15,16", 
               prefixes: "3,1800,2131",
               checkdigit: true};
  cards [7] = {name: "enRoute", 
               length: "15", 
               prefixes: "2014,2149",
               checkdigit: true};
  cards [8] = {name: "Solo", 
               length: "16,18,19", 
               prefixes: "6334,6767",
               checkdigit: true};
  cards [9] = {name: "Switch", 
               length: "16,18,19", 
               prefixes: "4903,4905,4911,4936,564182,633110,6333,6759",
               checkdigit: true};
  cards [10] = {name: "Maestro", 
               length: "16,18", 
               prefixes: "5020,6",
               checkdigit: true};
  cards [11] = {name: "VisaElectron", 
               length: "16", 
               prefixes: "417500,4917,4913",
               checkdigit: true};
               
  // Establish card type
  var cardType = -1;
  for (var i=0; i<cards.length; i++) {

    // See if it is this card (ignoring the case of the string)
    if (cardname.toLowerCase () == cards[i].name.toLowerCase()) {
      cardType = i;
      break;
    }
  }
  
  // If card type not found, report an error
  if (cardType == -1) {
     ccErrorNo = 0;
     return false; 
  }
   
  // Ensure that the user has provided a credit card number
  if (cardnumber.length == 0)  {
     ccErrorNo = 1;
     return false; 
  }
    
  // Now remove any spaces from the credit card number
  cardnumber = cardnumber.replace (/\s/g, "");
  
  // Check that the number is numeric
  var cardNo = cardnumber;
  var cardexp = /^[0-9]{13,19}$/;
  if (!cardexp.exec(cardNo))  {
     ccErrorNo = 2;
     return false; 
  }
       
  // Now check the modulus 10 check digit - if required
  if (cards[cardType].checkdigit) {
    var checksum = 0;                                  // running checksum total
    var mychar = "";                                   // next char to process
    var j = 1;                                         // takes value of 1 or 2
  
    // Process each digit one by one starting at the right
    var calc;
    for (i = cardNo.length - 1; i >= 0; i--) {
    
      // Extract the next digit and multiply by 1 or 2 on alternative digits.
      calc = Number(cardNo.charAt(i)) * j;
    
      // If the result is in two digits add 1 to the checksum total
      if (calc > 9) {
        checksum = checksum + 1;
        calc = calc - 10;
      }
    
      // Add the units element to the checksum total
      checksum = checksum + calc;
    
      // Switch the value of j
      if (j ==1) {j = 2} else {j = 1};
    } 
  
    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if (checksum % 10 != 0)  {
     ccErrorNo = 3;
     return false; 
    }
  }  

  // The following are the card-specific checks we undertake.
  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  // We use these for holding the valid lengths and prefixes of a card type
  var prefix = new Array ();
  var lengths = new Array ();
    
  // Load an array with the valid prefixes for this card
  prefix = cards[cardType].prefixes.split(",");
      
  // Now see if any of them match what we have in the card number
  for (i=0; i<prefix.length; i++) {
    var exp = new RegExp ("^" + prefix[i]);
    if (exp.test (cardNo)) PrefixValid = true;
  }
      
  // If it isn't a valid prefix there's no point at looking at the length
  if (!PrefixValid) {
     ccErrorNo = 3;
     return false; 
  }
    
  // See if the length is valid for this card
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
    if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  // See if all is OK by seeing if the length was valid. We only check the 
  // length if all else was hunky dory.
  if (!LengthValid) {
     ccErrorNo = 4;
     return false; 
  };
	
	// The credit card is in the required format.
	
	return true;
  
  

}


function creditcard_check(num) {
  var type = $('#cardtype').val();
  
  if (num == null) {
    num = $('#cardnumber').val();
  }
  var len;
  if ((len = new String($('#cardnumber').val()).length) < 16) {
    $('#cardnumber').removeClass('credit-card-cross');
  }
  
  if (check_credit_card(num, type)) {
    $('#cardnumber').addClass('credit-card-tick');
    $('#cardnumber').removeClass('credit-card-cross');
  } else {
    $('#cardnumber').removeClass('credit-card-tick');
    if (len >= 16) {
      $('#cardnumber').addClass('credit-card-cross');
    }
  }
}


function creditcard_verify() {

	$('#cardnumber').keypress(function(e) {

    window.setTimeout(function() { creditcard_check(null); }, 10);
	
	/*	if (e.which >= 48 && e.which <= 57) {
      window.setTimeout(function() { creditcard_check(null); }, 10);
		} else {
  
			if (e.keyCode == 8 || e.keyCode == 9 || (e.keyCode >= 35 && e.keyCode <= 39) || e.keyCode == 127) {
        window.setTimeout(function() { creditcard_check(null); }, 10);
				return true;
			}
			//return false;
		}
  */

    
		//console.log(check_credit_card(num, type));

	});
  
  $('#cardtype').change(function(e) {
    creditcard_check(null);
  });
}


function add_to_basket_check() {
  var has_qty = false;
  $('input[name="sku_qty[]"]').each(function() {
    if ($(this).val()) {
      has_qty = true;
      return false; // end the loop
    }
    return true;
  });
  
  if (!has_qty) {
    $('.add_to_basket').addClass('add_to_basket_disabled');
    $('.add_to_wishlist').addClass('add_to_wishlist_disabled');
    $('.add_to_wishlist').attr('disabled', 'disabled');
  } else {
    $('.add_to_basket').removeClass('add_to_basket_disabled');
    $('.add_to_wishlist').removeClass('add_to_wishlist_disabled');
    $('.add_to_wishlist').attr('disabled', '');
  }
  
}

function add_to_basket_attach() {
  $('.add_to_basket').click(function() {
    if ($(this).hasClass('add_to_basket_disabled')) {
      return false;
    }
  });
  
  $('input[name="sku_qty[]"]').keypress(function() {
    window.setTimeout(add_to_basket_check, 1);
  });
  
  $('input[name="sku_qty[]"]').change(add_to_basket_check);
  
  add_to_basket_check();
}

addLoadEvent(add_to_basket_attach);

function view_checkout_options() {
	if ($("#basketItems").children().size() > 0) {
		$("li.checkout a").click(function(){
		
			if ($("#checkoutOptionsInner").height() < $("body").height()) 
				var real_height = $("#checkoutOptionsInner").height() + 5;
			else 
				var real_height = $("#checkoutOptionsInner").height() - 75;
        
      real_height += 20; // correct for padding
			
			if ($("#checkoutOptions").height() < real_height) {
				$("#checkoutOptions").animate({
					height: real_height + "px"
				}, "normal", 'swing');
				$("li.checkout a").attr("class", "up");
			}
			else {
				$("#checkoutOptions").animate({
					height: "0px"
				}, "normal", "swing");
				$("li.checkout a").attr("class", "");
			}
			
			return false;
		});
	}
	else
	{
		$("li.checkout a").fadeTo("fast", 0.5);
		$("li.checkout a").click(function() {return false});
		$("li.checkout a").css("cursor", "default");
	}
}