function initializeStockLevel(){
	$('select#spec,#prod-stock-notify-form select').each(function(){
		$(this).change(function(){
			var variant = variantAvailability[$(this).val()];
			if (null != variant) {
				var availableToPromiseTotal = variant.availableToPromiseTotal;
				var estimatedArrivalDate = variant.estimatedArrivalDate;
				displayStockLevel(this, availableToPromiseTotal, estimatedArrivalDate);
			}
		});
		$(this).change();
	});
}

function displayStockLevel(input, level, due){
	var stocklevel = $('#product_stocklevel');
	var availability = $('#productAvailability');
	
	if (level <= 0) {
		if (isEmpty(due)) {
			stocklevel.each(function(){
				$(this).removeClass('highlight');
				$(this).text('Out of stock');
			});
			availability.each(function(){
				$(this).text('Awaiting delivery date');
			});
		} else {
			stocklevel.each(function(){
				$(this).removeClass('highlight');
				$(this).text('Out of stock');
			});
			availability.each(function(){
				$(this).html('Expected delivery date<br>'+due);
			});
		}
		
		$(".basketadd").attr("disabled", "disabled").hide("fast");

//		$("#prod-notify-show-hide").show("fast");
	} else {
		stocklevel.each(function(){
			$(this).addClass('highlight');
			$(this).text(level+" in stock");
		});
		availability.each(function(){
			$(this).text('Available NOW');
		});

		$(".basketadd").removeAttr("disabled").show("fast");

//		$("#prod-notify-show-hide").hide("fast");
	}
}

function initializeDynamicNavigation(){
	$('#navigation .submenu').each(function(i){
		$(this).parents('li').hover(function(){
			var submenu = $(this).children('.submenu').eq(0);
			var anchor = $(this).children('a.top_level').eq(0);
			
			// Only make AJAX call if the HTML fragment has not yet been loaded
			if (submenu.children().eq(0).hasClass('notloaded')) {
				submenu.load(getAJAXUrl(anchor.attr('href')));
			}
		});
	});
}

function initializeAjaxScrollers() {
	$('ul.dem-tab-control > li > a').each(function(i) {
		$(this).click(function() {
			// Find name of the div being loaded
			var panelName = $(this).attr('href');
			panelName = panelName.replace('#', '');
			
			// Get the div into which to load the content
			var panel = $('.dem-tabbed > #' + panelName);
			
			// If there is an error showing, and the user has clicked again, remove the error message and show the loading
			// spinner to give feedback
			if (panel.children().eq(0).hasClass('error')) {
				$(panel).empty();
				$(panel).append('<div class="ajax_loader notLoaded"></div>');
			}

			// Only ever load the data once: 			
			if (panel.children().eq(0).hasClass('notLoaded')) {
				// Not using getAJAXUrl here as the links are of the form #new, #soon, etc
				panel.load('storefront/scroller.ajax', {"scroller": panelName}, function(rt, textStatus, xhttp) {
					if (textStatus == "success") {
						DEMOTIVE.scroller.init($('.promotions #' + panelName + ' .dem-scroller'), {scrollStyle:'group', speed:600, behaviour:'loop'});
						//panel.data('loaded', true);	
	  				}
	  				else {
	  					$(panel).empty();
	  					$(panel).append('<p class="error notLoaded">Error contacting server, please try again later</p>');
	  				}
	  			});
			}
		});
	});
}

function initializeDynamicAddToBasket(){
    $('form#add-to-basket button[type=submit]').click(function(event){
		var extra = $(this).attr('name') + '=' + $(this).attr('value');
		postFormJSON(this.form, extra, addedToBasketJSON);
        event.preventDefault();
    });
}

function initializeViewOrder(){
    $('.order_history a.view').click(function(event){
		var row = $(this).parents('tr').eq(0);
		row.siblings().each(function() {
			if ($(this).hasClass('open')) {
				$(this).next().remove();
				$(this).removeClass('open');
			}			
		});
		if (row.hasClass('open')) {
			row.next().remove();
			row.removeClass('open');
		} else {
			var view = $('<tr></tr>');
			row.after(view);
			row.addClass('open');
			view.load(getAJAXUrl($(this).attr('href')));
		}
        event.preventDefault();
    });
}

function addedToBasketJSON(data){
    if (processResultJSON(data)) {
        if (isDefined(data.totalQuantity)){
            dispayBasketJSON(data);
            alert('Your selection has been added to your basket');
        }
    }
}

function dispayBasketJSON(data){
    if (processResultJSON(data)) {
        if (isDefined(data.totalQuantity)){
			setBasketTotalQuantity(data.totalQuantity);
		}
        if (isDefined(data.displayGrandTotalCurrencyFormatted)){
			setBasketTotalAmount(data.displayGrandTotalCurrencyFormatted);	
        }
		displayBasket();
    }
}

function displayBasket(){
    items = getBasketTotalQuantity();
    total = getBasketTotalAmount();
    if (isEmpty(items) || isEmpty(total)){
		$('a#basket_link').each(function(){getLinkJSON(this, dispayBasketJSON);});
	}else{
		$('a#basket_link').html('<strong>Basket</strong> (' + items + ' items, ' + total + ')');
	}
}

function setBasketTotalQuantity(quantity) {
	var date = new Date();
	date.setTime(date.getTime() + (30 * 60 * 1000));
	$.cookie('basket_items', quantity, {expires:date});
}

function getBasketTotalQuantity() {
	return $.cookie('basket_items');
}

function setBasketTotalAmount(total) {
	var date = new Date();
	date.setTime(date.getTime() + (30 * 60 * 1000));
	$.cookie('basket_total', total, {expires:date});
}

function getBasketTotalAmount() {
	return $.cookie('basket_total');
}

var lastLookup;

function getAddressSuggestions(input) {

   	if (input.val() == lastLookup) return;
  	var addressForm = input.parents('form');
	var addressFieldPrefix = '#' + addressForm.attr('id');
 	var postcodeLookupArea = $(addressFieldPrefix + 'PostcodeLookup');

	var params = new Object();
	params.postalCode = input.val();

   	// send request
   	$.post(getAddressSuggestionsUrl, params, function(json) {
   		var select = $(addressFieldPrefix + 'PostcodeLookup select');
		select.children('option').remove();
 	  	var response = eval('('+json+')');
	  	var code = response.responseMessage;
	  	if (code == 'success') {
		  	var suggestions = response.lookupResults;
		  	for (x = 0; x < suggestions.length; x++) {
		  		var address = suggestions[x];
				select.append('<option value="' + address.lookupKey + '">' + address.address.split('\t')[1] + '</option>');
 			}	
    		lastLookup = input.val();
		}
	});
}

function getAddress(element) {

  	var addressForm = $(element).parents('form');
	var addressFieldPrefix = '#' + addressForm.attr('id');

	var params = new Object();
	params.lookupKey = $(element).val();

   	// send request
   	$.post(getAddressUrl, params, function(json) {
	  	var response = eval('('+json+')');
	  	var code = response.responseMessage;
	  	if (code == 'success') {
		  	var address = response.address;
		  	if (address.organisation) {
				$(addressFieldPrefix + 'AttnName').val(address.organisation);
		  	}
		  	if (address.property) {
				$(addressFieldPrefix + 'Address1').val(address.property);
        		if (address.street) {
					$(addressFieldPrefix + 'Address2').val(address.street);
        		} else {
            		if (address.locality) {
						$(addressFieldPrefix + 'Address2').val(address.locality);
            		}
        		}
	  		} else {
        		if (address.street) {
        			$(addressFieldPrefix + 'Address1').val(address.street);
        			if (address.locality) {
        				$(addressFieldPrefix + 'Address2').val(address.locality);
        			} 
        		} else {
    				$(addressFieldPrefix + 'Address1').val(address.locality);
    			}
        	}
			$(addressFieldPrefix + 'City').val(address.town);
			$(addressFieldPrefix + 'StateProvinceGeoId').val(address.authority);
        	if (address.town == 'Jersey' || address.town == 'Guernsey') {
        		var country = 'CI';
        	} else {
        		var country = 'GB';
        	}
			$(addressFieldPrefix + 'registerCountryGeoId').val(country);
        }
	});
}

function showHidePostcodeLookup(element) {
  	var addressForm = $(element).parents('form');
	var addressFieldPrefix = '#' + addressForm.attr('id');
 	var postcodeLookupArea = $(addressFieldPrefix + 'PostcodeLookup');
	var countryInput = $(addressFieldPrefix + 'CountryGeoId');
	var postcodeInput = $(addressFieldPrefix + 'PostalCode');
	
  	if (countryInput.val() == 'GB' || countryInput.val() == 'CI') {
  		postcodeLookupArea.show('fast');
   		var select = $(addressFieldPrefix + 'PostcodeLookup select');
		select.html('<option value="">Please wait...</option>');
  		if (postcodeInput.val() != '') {
  			getAddressSuggestions(postcodeInput);
	  	} else {
	  		postcodeLookupArea.hide('fast');
  		}
  	} else {
  		postcodeLookupArea.hide('fast');
  	}
	return false;
}

function populateAddressFromContactMech(element, disable) {
	
	var json = $(element).children(':selected').attr('title');
	var addressForm = $(element).parents('form');
	var addressFieldPrefix = '#' + addressForm.attr('id');

	var toNameField = $(addressFieldPrefix + 'Name');
	var attnNameField = $(addressFieldPrefix + 'AttnName');
	var address1Field = $(addressFieldPrefix + 'Address1');
	var address2Field = $(addressFieldPrefix + 'Address2');
	var cityField = $(addressFieldPrefix + 'City');
	var stateProvinceGeoIdField = $(addressFieldPrefix + 'StateProvinceGeoId');
	var postalCodeField = $(addressFieldPrefix + 'PostalCode');
	var countryGeoIdField = $(addressFieldPrefix + 'CountryGeoId');

	if (json.length > 0) {
		var address = eval('('+json+')');
		toNameField.val(address.toName                        ||'');
		attnNameField.val(address.attnName                    ||'');
		address1Field.val(address.address1                    ||'');
		address2Field.val(address.address2                    ||'');
		cityField.val(address.city                            ||'');
		stateProvinceGeoIdField.val(address.stateProvinceGeoId||'');
		postalCodeField.val(address.postalCode                ||'');
		countryGeoIdField.val(address.countryGeoId            ||'');
		if (disable) {
			toNameField.attr('disabled', 'disabled');
			attnNameField.attr('disabled', 'disabled');
			address1Field.attr('disabled', 'disabled');
			address2Field.attr('disabled', 'disabled');
			cityField.attr('disabled', 'disabled');
			stateProvinceGeoIdField.attr('disabled', 'disabled');
			postalCodeField.attr('disabled', 'disabled');
			countryGeoIdField.attr('disabled', 'disabled');
		}
	} else {
		toNameField.val('');
		attnNameField.val('');
		address1Field.val('');
		address2Field.val('');
		cityField.val('');
		stateProvinceGeoIdField.val('');
		postalCodeField.val('');
		countryGeoIdField.val('GB');
		if (disable) {
			toNameField.removeAttr('disabled');
			attnNameField.removeAttr('disabled');
			address1Field.removeAttr('disabled');
			address2Field.removeAttr('disabled');
			cityField.removeAttr('disabled');
			stateProvinceGeoIdField.removeAttr('disabled');
			postalCodeField.removeAttr('disabled');
			countryGeoIdField.removeAttr('disabled');
		}
	}
}

function populateEmailFromContactMech(element, disable) {
	
	var json = $(element).children(':selected').attr('title');
	var contactMechFieldset = $(element).parents('form');
	var contactMechIdPrefix = '#' + contactMechFieldset.attr('id');
	var emailAddressField = $(contactMechIdPrefix + 'Address');

	if (json.length > 0) {
		var email = eval('('+json+')');
		emailAddressField.val(email.infoString);
		if (disable) {
			emailAddressField.attr('disabled', 'disabled');
		}
	} else {
		emailAddressField.val('');
		if (disable) {
			emailAddressField.removeAttr('disabled');
		}
	}
}

function populatePhoneFromContactMech(element, disable) {
	
	var json = $(element).children(':selected').attr('title');
	var contactMechFieldset = $(element).parents('form');
	var contactMechIdPrefix = '#' + contactMechFieldset.attr('id');
	var contactNumberField = $(contactMechIdPrefix + 'ContactNumber');

	if (json.length > 0) {
		var telecomNumber = eval('('+json+')');
		contactNumberField.val(telecomNumber.contactNumber);
		if (disable) {
			contactNumberField.attr('disabled', 'disabled');
		}
	} else {
		contactNumberField.val('');
		if (disable) {
			contactNumberField.removeAttr('disabled');
		}
	}
}

function showHideDeliveryInstructions(input) {
	var signatureReq = '<option value="Signature Req : DO NOT LEAVE">Signature Required - DO NOT LEAVE</option>';
	var neighbourOk = '<option value="Neighbour OK : POD & CARD">If no answer, try a near neighbour &amp; leave a card</option>';
	var leaveSafeOk = '<option value="OK To Leave Safe : LEAVE CARD">If no answer, leave at my property with NO SIGNATURE &amp; leave a card</option>';
	var neighbourNotOk = '<option value="Neighbour Not OK : POD or CARD">If no answer, do not try neighbour - leave a card</option>';
	var value = $(input).val();
	var instructions = $('#shipping_instructions');
	instructions.children('option').remove();
	if (value != '' && (value.substring(value.indexOf('@')+1) == 'CC')) {
		$('#deliveryInstructionNotesSig').hide();
		$('#deliveryInstructionNotesNoSig').hide();
		$('#deliveryInstructionForm').hide();
	} else if (value != '' && (value.substring(value.indexOf('@')+1) == 'RM')) {
		$('#deliveryInstructionNotesSig').show();
		$('#deliveryInstructionNotesNoSig').hide();
		$('#deliveryInstructionForm').hide();
	} else if (value != '' && (value.substring(value.indexOf('@')+1) == 'HDNL')) {
		instructions.append(neighbourOk);
		instructions.append(neighbourNotOk);
		$('#deliveryInstructionNotesSig').show();
		$('#deliveryInstructionNotesNoSig').hide();
		$('#deliveryInstructionForm').show();
	} else {
		instructions.append(signatureReq);
		instructions.append(neighbourOk);
		instructions.append(leaveSafeOk);
		$('#deliveryInstructionNotesSig').show();
		$('#deliveryInstructionNotesNoSig').show();
		$('#deliveryInstructionForm').show();
	}
}

function initializeCreditCardShowHide(){
	$('select[name=cardType]').each(function(){
		$(this).change(showHideCreditCardFormFields);
		$(this).change();		
	});
	$('input[name=paymentMethodTypeId]').each(function(){
		$(this).click(showHideCreditCardForm);
		$(this).click();
	});
}

function showHideCreditCardForm(){
	var paymentMethodTypeId = $(this).val();
	if (paymentMethodTypeId == 'CREDIT_CARD') {
		$('#ccFieldSet').show();
	} else if (paymentMethodTypeId == 'SINGLE_USE_CC') {
		$('#ccFieldSet').show();
	} else {
		$('#ccFieldSet').hide();
	}		
}

function showHideCreditCardFormFields(){
	var cardType = $(this).val();
	if(cardType == "Solo"){
		$('#ccFieldSet input[name=issueNumber]').parent().show();
		$('#ccFieldSet select[name=validFromMonth]').parent().show("slow");
		$('#ccFieldSet select[name=validFromYear]').parent().show("slow");
	}else{
		$('#ccFieldSet input[name=issueNumber]').parent().hide();
		$('#ccFieldSet select[name=validFromMonth]').parent().hide();
		$('#ccFieldSet select[name=validFromYear]').parent().hide();
	}
}


function paginatorKeypress(event, control, url, searchParameters, viewIndexMax) {
	// Detect the enter key being pressed
	if (event.which == 13) {
		var pageNumStr = $(control).val();
		var pageNum = parseInt(pageNumStr);
		var viewIndex = pageNum - 1;
		
		// Ensure what has been typed is definitely numeric
		if (pageNumStr == pageNum && pageNum > 0 && pageNum <= viewIndexMax) {
			
			searchParameters.VIEW_INDEX = viewIndex;
			
			// Join the json object to a string
			var searchParametersStr = "";
			for (var key in searchParameters) {
				searchParametersStr += key + "=" + searchParameters[key] + "&";
			}
			
			// Go to the specified URL with the given search parameters
			window.location = url + "?" + searchParametersStr;
		}
	}
}

function initializeLinkedVariantDropdowns(){
	$("select#spec,#prod-stock-notify-form select").change(function() {
		var v = $(this).val();
		
		$("select#spec,#prod-stock-notify-form select").not(this).each(function() {
			$(this).val(v);
		});
	});
}

function initializeProductNotification() {
	var submitProductNotification = function() {
		var url = $(".product-notify-signup-url").val();
		postFormAJAX("#prod-stock-notify-form input[name],#prod-stock-notify-form select", $("#prod-stock-notify-form"), null, url);
	};

	// Plug for IE hole:
	$(".add-to-basket").submit(function(event) {
		if ($("#prod-stock-notify-form *").is(":focus")) {
			submitProductNotification();
			event.preventDefault();
		}
	});
	
	$("#prod-stock-notify-form .notifyMeBtn").live("click", function(event) {
		submitProductNotification();
		event.preventDefault();
	});
}

