	
	var productOptionsHTML=null;
	var products=null;
	var productTypes=null;
	var paymentOptions = {0:'monthly',1:'annual',2:'biennial'};
	var reversePaymentOptions = {'monthly':0,'annual':1,'biennial':2};
	var domainPriceHtml = {};
	var inBasket = false;
	var counter = 0;
	
	
	$(function() {

		$('.matrixinfo').live('click',function() {
			$('#matrix-overlay').remove();
			$('body').prepend('<div id="matrix-overlay"></div>');
			var elementId = $(this).attr('href');
			
			// IE7 Fix
			elementId = elementId.replace(location.href,'');

			if(!$(elementId).hasClass('moved')) {
				var element = $(elementId).clone(true);
				element.addClass('moved');
				$(elementId).remove();
				$('body').append(element);
			}
			$(elementId).center().fadeIn();
			return false;
		});
		
		$('.close-matrix').live('click',function() {
			$('#matrix-overlay').remove();
			$(this).parents('.matrix:nth(0)').fadeOut();
			return false;
		});
	});
	
	function getDomainNameString(parent) {
		if(inBasket) {
			return $('.col1',parent).attr('id');
		} else {
			return $('.col1 label',parent).html();
		}
	}
	
	function setInBasket(basket) {
		inBasket = basket;
	}

	function getProductOptionsHTML(ignoreHTML) {
		var returnHTML = 1;
		if(ignoreHTML) {
			returnHTML = 0;
		}
		
		if(productOptionsHTML == null || products == null || productTypes == null) {
			$.ajax({
		   	   type:          'post',
			   dataType:      'json',
			   data:		  {html:returnHTML},
			   url:           '/domains/index/search-options',
			   async:		  false,
			   success:       function(r) {
			      if(r != null && r.status == 'success') {
			    	  if(returnHTML) {
			    		  productOptionsHTML = r.template;
			    	  } else {
			    		  productOptionsHTML = true;
			    	  }
			    	  
			    	  products = r.products;
			    	  productTypes = r.types;
			      }
			   }
		   });
		}
	}
	
	function calculateSliderPackageCost(parent,addToBasket) {
		var packageCost = 0;
		var packageDiscount = 0;
		var paymentOptionDiscount = 0;
		
		// lets get the payment option first
		var paymentParent = $(".payment-options",parent).parents('.package');
		var paymentOption = paymentOptions[$('.amount',paymentParent).val()];
		
		// now lets get the packages and their costs and tally them up
		$(".slider-range",parent).not('.payment-options').each(function() {
			var sliderParent = $(this).parents('.package');
			var id = $('.amount',sliderParent).val();
			var productName = $('.amount',sliderParent).attr('name');
			
			// if the current slider is a sitebuilder product
			// lets see if there is a discounted associated product
			if($(sliderParent).hasClass('sitebuilder')) {
				// determines if a sitebuilder product has been chosen
				if(id > 0) {
					// if an email asscoiated product exists for the chosen sitebuilder product and the chosen email product is equal to or greather than the associated product group then add 
					// the associated product cost to the discount total
					if(products.sitebuilder[id][paymentOption].associations[productTypes.email] && ($('.email .amount',parent).val() >= products.sitebuilder[id][paymentOption].associations[productTypes.email].products[0].group)) {
						packageDiscount += parseFloat(products.sitebuilder[id][paymentOption].associations[productTypes.email].products[0].amount);
					}
				}
				
				
				// is there a free domain with this product
				if(id > 0) {
					// input box - one product
					if($('span.price .oneProduct',parent).length) {
						var currentDomainProductId = $('span.price input',parent).val();
						if(products[productName][id][paymentOption].associations[productTypes.domain]) {
//							if(!domainPriceHtml[currentDomainProductId]) {
//								domainPriceHtml[currentDomainProductId] = $('span.price .oneProduct',parent).html();
//							}
//							
//							var freeDomainHtml = domainPriceHtml[currentDomainProductId].replace(/\u00A3.+/,'&pound;0.00');
//							$('span.price .oneProduct',parent).html(freeDomainHtml);
//							$('span.price input',parent).addClass('freeDomain');
							
							for(index in products[productName][id][paymentOption].associations[productTypes.domain].products) {
								if(products[productName][id][paymentOption].associations[productTypes.domain].products[index].id == currentDomainProductId) {
									if(!domainPriceHtml[currentDomainProductId]) {
										domainPriceHtml[currentDomainProductId] = $('span.price .oneProduct',parent).html();
									}
									var freeDomainHtml = domainPriceHtml[currentDomainProductId].replace(/\u00A3.+/,'&pound;0.00');
									$('span.price .oneProduct',parent).html(freeDomainHtml);
									$('span.price input',parent).addClass('freeDomain');
									
								} else if(domainPriceHtml[products[productName][id][paymentOption].associations[productTypes.domain].products[index].id]) {
									var domainProductId = products[productName][id][paymentOption].associations[productTypes.domain].products[index].id;
									//$('span.price select option[value="'+domainProductId+'"]',parent).html(domainPriceHtml[domainProductId]).removeClass('freeDomain');
								}
							}
							
							
							
							
						} else {
							$('span.price .oneProduct',parent).html(domainPriceHtml[currentDomainProductId]);
							$('span.price input[value="'+currentDomainProductId+'"]',parent).removeClass('freeDomain');
						}
					}
					
					
					// select box - more than one product
					$('span.price select option',parent).each(function() {
						var currentDomainProductId = $(this).attr('value');
						if(products[productName][id][paymentOption].associations[productTypes.domain]) {
							for(index in products[productName][id][paymentOption].associations[productTypes.domain].products) {
								if(products[productName][id][paymentOption].associations[productTypes.domain].products[index].id == currentDomainProductId) {
									if(!domainPriceHtml[currentDomainProductId]) {
										domainPriceHtml[currentDomainProductId] = $('span.price select option[value="'+currentDomainProductId+'"]',parent).html();
									}
									var freeDomainHtml = domainPriceHtml[currentDomainProductId].replace(/\u00A3.+/,'&pound;0.00');
									$('span.price select option[value="'+currentDomainProductId+'"]',parent).html(freeDomainHtml).addClass('freeDomain');
									
								} else if(domainPriceHtml[products[productName][id][paymentOption].associations[productTypes.domain].products[index].id]) {
									var domainProductId = products[productName][id][paymentOption].associations[productTypes.domain].products[index].id;
									//$('span.price select option[value="'+domainProductId+'"]',parent).html(domainPriceHtml[domainProductId]).removeClass('freeDomain');
								}
							}
						} else if(domainPriceHtml[currentDomainProductId]) {
							$('span.price select option[value="'+currentDomainProductId+'"]',parent).html(domainPriceHtml[currentDomainProductId]).removeClass('freeDomain');
						}
					});
				} else {
					
					if($('span.price .oneProduct',parent).length) {
						var domainProductId = $('span.price input',parent).val();
						$('span.price .oneProduct',parent).html(domainPriceHtml[domainProductId]);
						$('span.price input[value="'+domainProductId+'"]',parent).removeClass('freeDomain');
					} else {
					
						$('span.price select option',parent).each(function() {
							var domainProductId = $(this).attr('value');
							if(domainPriceHtml[domainProductId]) {
								$('span.price select option[value="'+domainProductId+'"]',parent).html(domainPriceHtml[domainProductId]).removeClass('freeDomain');
							}
						});
					}
				}
			}
			
			// check if a product for group 'id' and 'productName' exists in the products object
			if(id > 0 && products[productName][id][paymentOption]) {
				
				// if the email slider is moving and a sitebuilder product has been chosen
				if($(sliderParent).hasClass('email') && $('.sitebuilder .amount',parent).val() > 0) {
					// if the chosen sitebuilder product has a product association
					if(products.sitebuilder[$('.sitebuilder .amount',parent).val()][paymentOption].associations[productTypes.email]) {
						// if the email group chosen (manually or auto) is greather than or equal to the group of the associated product add the cost
						// if the group is less, then no cost is added - if a customer downgrades their free product the price remains the same
						if($('.email .amount',parent).val() >= products.sitebuilder[$('.sitebuilder .amount',parent).val()][paymentOption].associations[productTypes.email].products[0].group) {
							packageCost += parseFloat(products[productName][id][paymentOption].amount);
						}
					} else {
						// if no product association then add product cost
						packageCost += parseFloat(products[productName][id][paymentOption].amount);
					}
				} else { 
					// if the email slider has been moved manually and no sitebuilder
					// product has been chosen add product cost or if its the sitebuilder slider
					// that has been moved then add product cost
					packageCost += parseFloat(products[productName][id][paymentOption].amount);
				}
				
				// further savings based on payment options
				if($('.sitebuilder .amount',parent).val() == 0) {
					paymentOptionDiscount += parseFloat(products[productName][id][paymentOption].saving);
				} else if(productName == 'sitebuilder') {
					paymentOptionDiscount += parseFloat(products['sitebuilder'][id][paymentOption].saving);
				}
			}
		});
		
		// subtract discount from cost
		packageCost -= packageDiscount;
		
		// add the paymentOption discount - we need to show the saving but the cost price already contains the adjusted price so 
		// the discount doesn't deducting from the package cost
		packageDiscount += paymentOptionDiscount;
		
		// if a sitebuilder product has been chosen and the associated product has been manually downgraded there still maybe a discount to show
		// even when the discount has not been taken off the current cost
		if($('.sitebuilder .amount',parent).val() > 0 && products.sitebuilder[$('.sitebuilder .amount',parent).val()][paymentOption].associations[productTypes.email]) {
			// if the chosen email package group is then than the associated product group then the customer is still receiving a discount and we need to show it
			// this will happen if they select the pro site builder and downgrade their email package from group to personal
			// we don't take the cost of the group package off the cost but they are still receiving it free and therefore are still getting a discount
			if($('.email .amount',parent).val() < products.sitebuilder[$('.sitebuilder .amount',parent).val()][paymentOption].associations[productTypes.email].products[0].group && $('.email .amount',parent).val() > 0) {
				packageDiscount += parseFloat(products.email[$('.email .amount',parent).val()][paymentOption].amount);
			}
		}
		
		// display package cost
		if(packageCost > 0) {
			$('.package-pricing .package-cost .price',parent).html('&pound;'+packageCost.toFixed(2));
			if(!priceIsFadingIn && !priceIsFadingOut) {
				var priceIsFadingIn = true;
				$('.package-pricing',parent).fadeIn(500,function() {
					priceIsFadingIn = false;
				});
			}
		} else {
			if(!priceIsFadingOut && !priceIsFadingIn) {
				var priceIsFadingOut = true;
				$('.package-pricing',parent).fadeOut(500,function(){
					$('.package-pricing .package-cost .price',parent).html('&pound;'+packageCost.toFixed(2));
					priceIsFadingOut = false;
				});
			} else {
				$('.package-pricing .package-cost .price',parent).html('&pound;'+packageCost.toFixed(2));
			}
				
		}
		
		// display package discount
		if(packageDiscount > 0){
			$('.package-pricing .savings span',parent).html('&pound;'+packageDiscount.toFixed(2));
			if(!discountIsFadingIn && !discountIsFadingOut) {
				var discountIsFadingIn = true;
				$('.package-pricing .savings',parent).fadeIn(500,function() {
					discountIsFadingIn = false;
				});
			}
		} else {
			if(!discountIsFadingOut && !discountIsFadingIn) {
				var discountIsFadingOut = true
				$('.package-pricing .savings',parent).fadeOut(500,function() {
					$('.package-pricing .savings span',parent).html('&pound;'+packageDiscount.toFixed(2));
					discountIsFadingOut = false;
				});
			} else {
				$('.package-pricing .savings span',parent).html('&pound;'+packageDiscount.toFixed(2));
			}
		}
		
		/// add to basket
		var basketData = {id:$('.price .productId',parent).val(),packages:{},payment:paymentOptions[$('.paymentAmount',parent).val()],index:getDomainNameString(parent)};
		$('.package .amount',parent).not('.paymentAmount').each(function() {
			basketData.packages[$(this).attr('name')] = $(this).val();
		});
		
		if(addToBasket) {
			
			$('.package-configuration',parent).prepend('<div class="packageSliderOverlay"></div>');
			$('.packageSliderOverlay',parent).after('<img class="packageSliderLoading" src="'+getLoaderImage('largeAddToBasket')+'" />');
			
			objBasket.observe(objBasket.events.slider.packageAdded, function() {
				objBasket.forget(objBasket.events.slider.packageAdded);
				if(inBasket) {
					if($('.price select.productId',parent).length) {
						updateBasketSummary($('.price .productId',parent),true);
					} else {
						updateBasketSummary($(parent),true);
					}
				} else {
					objBasket.getBasket();
				}
				$('.packageSliderOverlay',parent).remove();
				$('.packageSliderLoading',parent).remove();
				if(!inBasket) {objBasket.pulseBasket();}
				$(window).trigger('slider.packageAdded');
			});
			
			objBasket.addSliderPackageToBasket(basketData);
		}
	}
	
	function parseSliderValue(ui,sliderParent,parent) {
		var handleParent = $(ui.handle).parents('.slider-container:nth(0)',parent);
		var id = 0; 
		if(ui.value > 0) {
			id = $('ul li:nth('+ui.value+')',handleParent).attr('data');
		}
		$(".amount",sliderParent).val(id);
		
		if($(sliderParent).hasClass('sitebuilder')) {

			if(id > 0) {
				var paymentParent = $(".payment-options",parent).parents('.package');
				var paymentOption = paymentOptions[$('.amount',paymentParent).val()];
				if(products.sitebuilder[id][paymentOption].associations[productTypes.email]) {
					var assocId = products.sitebuilder[id][paymentOption].associations[productTypes.email].products[0].group;
					var index = $('.email .slider-container ul li',parent).index($('li[data="'+assocId+'"]',parent));
					$('.slider-range',$('.email',parent)).slider('option','value',index);
					$('.email .amount',parent).val(assocId);
				}
			}
		}
		
	}
	
	function addSliderEvents(parent){
		$(".slider-range",parent).slider('destroy');
		$(".slider-range",parent).not('.payment-options').each(function() {
			var sliderParent = $(this).parents('.package');
			$(this).slider({
				range: "min",
				value: 0,
				min: 0,
				max: 3,
				step: 1,

				slide: function(event, ui) {
					parseSliderValue(ui,sliderParent,parent);
					calculateSliderPackageCost(parent);
				},
				stop: function(event,ui) {
					calculateSliderPackageCost(parent,true);
				},
				change: function(event, ui) {
					parseSliderValue(ui,sliderParent,parent);
					calculateSliderPackageCost(parent);
				}
			});

			$( ".amount",sliderParent).val($(this).slider("value"));
		});
		
		var paymentSliderIsSliding = false;
		
		$(".payment-options",parent).slider({
			// This is for the 2 step slider (payment plan)
			range: "min",
			value: 0,
			min: 0,
			max: 2,
			step: 1,
			stop: function(event, ui) {
				if($('.email .amount',parent).val() > 0 || $('.sitebuilder .amount',parent).val() > 0 ) {
				calculateSliderPackageCost(parent,true);
				}
			},
			slide: function(event, ui){
				var paymentParent = $(".payment-options",parent).parents('.package:nth(0)');
				$(".amount",paymentParent).val(ui.value);
				calculateSliderPackageCost(parent);
			},
			change: function(event, ui) {
				var paymentParent = $(".payment-options",parent).parents('.package:nth(0)');
				$(".amount",paymentParent).val(ui.value);
				calculateSliderPackageCost(parent);
			}
		});
		var paymentParent = $(".payment-options",parent).parents('.package:nth(0)');
		$(".amount",paymentParent).val($(".payment-options",parent).slider("value"));
	}
	
	function setSliderPackage(element,sitebuilder,payment,ignoreEvent) {
		
		if(ignoreEvent) {
			var paymentValue = reversePaymentOptions[payment];
			var value = $('.slider-container:nth(0) ul li',element).index($('li[data="'+sitebuilder+'"]',element));	
			$('.slider-range:nth(0)',element).slider('option','value',value);
			$('.payment-options:nth(0)',element).slider('option','value',paymentValue);
			calculateSliderPackageCost(element,true);
		} else {
			objBasket.observe(objBasket.events.domainAdded,function() {
				var paymentValue = reversePaymentOptions[payment];
				var value = $('.slider-container:nth(0) ul li',element).index($('li[data="'+sitebuilder+'"]',element));				
				$('.slider-range:nth(0)',element).slider('option','value',value);
				$('.payment-options:nth(0)',element).slider('option','value',paymentValue);
				calculateSliderPackageCost(element,true);
			});
		}
	}
	
	function setSliderPackageEmail(element,email,payment,ignoreEvent) {
		
		if(ignoreEvent) {
			var paymentValue = reversePaymentOptions[payment];
			var value = $('.email .slider-container:nth(0) ul li',element).index($('li[data="'+email+'"]',element));	
			$('.email .slider-range:nth(0)',element).slider('option','value',value);
			$('.payment-options:nth(0)',element).slider('option','value',paymentValue);
			calculateSliderPackageCost(element,true);
		} else {
			objBasket.observe(objBasket.events.domainAdded,function() {
				var paymentValue = reversePaymentOptions[payment];
				var value = $('.email .slider-container:nth(0) ul li',element).index($('li[data="'+email+'"]',element));				
				$('.email .slider-range:nth(0)',element).slider('option','value',value);
				$('.payment-options:nth(0)',element).slider('option','value',paymentValue);
				calculateSliderPackageCost(element,true);
			});
		}
	}
	
	function setPopularSliderPackage(element,ignoreEvent) {
		if(ignoreEvent) {
			$('.slider-range:nth(0)',element).slider('option','value',1);
			$('.payment-options:nth(0)',element).slider('option','value',1);
			calculateSliderPackageCost(element,true);
		} else {
			objBasket.observe(objBasket.events.domainAdded,function() {
				$('.slider-range:nth(0)',element).slider('option','value',1);
				$('.payment-options:nth(0)',element).slider('option','value',1);
				calculateSliderPackageCost(element,true);
			});
		}
		
	}
	
	function hasSliderProduct(packages) {
		productTypeId = false;
		if(packages.instances) {
			if(packages.instances.length) {
				for(i in packages.instances) {
					if(packages.instances[i].productTypeId == productTypes.email || packages.instances[i].productTypeId == productTypes.sitebuilder) {
						productTypeId = packages.instances[i].productTypeId;
					}
				}
			}
		}
		
		return productTypeId;
	}
	
	function removeSliderProduct(sliderTypeId) {
		if(sliderTypeId == productTypes.email) {
			$('.package-configuration .email').remove();
		} else if(sliderTypeId == productType.sitebuilder) {
			$('.package-configuration .sitebuilder').remove();
		}
	}

