String.prototype.trim = function()
{
	a = this.replace(/^\s+/, '');
	return a.replace(/\s+$/, '');
}

function Ajax(URL, responseHandler, data)
{

	var me = this;
	this.data = data;
	this.xmlhttp = false;
	this.CreateXmlHttp = CreateXmlHttp;
	this.URL = URL
	this.responseHandler = responseHandler;
	this.defaultHandler = defaultHandler;
	this.responseXML = responseXML;
	this.responseText = "";
	this.post = Post;

	function responseXML()
	{
		var xmldoc = false;

		if (this.xmlhttp.responseText)
		{
			if (window.ActiveXObject)
			{
				xmldoc = new ActiveXObject("Microsoft.XMLDOM");
				xmldoc.async = "false";
				xmldoc.loadXML(this.xmlhttp.responseText);
			}
			else
			{
				var parser = new DOMParser();
				xmldoc = parser.parseFromString(this.xmlhttp.responseText, "text/xml");
			}
		}

		return xmldoc;
	}


	function defaultHandler()
	{
		if (this.xmlhttp && (this.xmlhttp.readyState==4) && this.responseHandler)
		{
			this.responseText = this.xmlhttp.responseText;
			this.responseHandler(this, this.data);
		}
	}


	function CreateXmlHttp()
	{
		try
		{
			this.xmlhttp = new XMLHttpRequest();
		}
		catch (trymicrosoft)
		{
			try
			{
				this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (othermicrosoft)
			{
				try
				{
					this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (failed)
				{
					this.xmlhttp = false;
				}
			}
		}
	}

	function Post(parameterList)
	{
		if (this.xmlhttp)
		{
			paramStr = "";
			for (var i = 0; i<parameterList.length;i++)
				paramStr += parameterList[i]["name"] + "=" + encodeURI(parameterList[i]["value"]) + "&";
			paramStr = paramStr.substring(0, paramStr.length-1);

			if (this.xmlhttp.overrideMimeType) this.xmlhttp.overrideMimeType('text/html');

			this.xmlhttp.open("POST", this.URL, true);
			this.xmlhttp.onreadystatechange = function() { me.defaultHandler(); };
			this.xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
			this.xmlhttp.setRequestHeader("Content-length", paramStr.length);
			this.xmlhttp.setRequestHeader("Connection", "close");
			this.xmlhttp.send(paramStr);
		}
	}

	this.CreateXmlHttp();

}

function ajaxpost(aURL, aHandler, params, data)
{
	var ajax = new Ajax(aURL, aHandler, data)
	ajax.post(params);
}

var categories = (function($) {
	var storageIdentifier = 'categoryscrollpos';
	var scrollPos;

	function toggle() {
		if ($(this).text() == '▸') {
			$(this.parentNode).next().removeClass('hidden');
			$(this).text('▾');
		}
		else {
			$(this.parentNode).next().addClass('hidden');
			$(this).text('▸');
		}
	}

	function loadScrollPos() {
		try {
			if ((scrollPos = sessionStorage.getItem(storageIdentifier)) && ($('#categorylist').length > 0)) {
				$('#categorylist').scrollTop(scrollPos);
			}
		}
		catch (e) {
			$('#categorylist').scrollTop(scrollPos);
		}
	}

	function saveScrollPos() {
		try {
				sessionStorage.setItem(storageIdentifier, this.scrollTop);
			}
		catch (e) {
			scrollPos = this.scrollTop;
		}
	}

	function hideScrollbars(e) {
		if (($(e.relatedTarget).parents('#categorylist').length > 0) || ($(e.relatedTarget).is('#categorylist'))) {
			return true;
		}

		$('#categorylist').css('overflow', 'hidden');
	}

	function showScrollbars(e) {
		if (($(e.relatedTarget).parents('#categorylist').length > 0) || ($(e.relatedTarget).is('#categorylist'))) {
			return true;
		}

		$('#categorylist').css('overflow', 'auto');
		loadScrollPos();
	}

	function init() {
		$('#categorylist span.heart:not(.empty)').css('cursor', 'pointer').click(toggle);
		loadScrollPos();
		$('#categorylist').scroll(saveScrollPos)
											.mouseover(showScrollbars)
											.mouseout(hideScrollbars)
											.css('overflow', 'hidden');
	}

	$(document).ready(init);
}(jQuery));

(function($) {
	function toggleFlags() {
		$('#flags').toggle();
	}
	function init() {
		$('#flags').css('display', 'none');
		$('#flagtoggle').css('cursor', 'pointer').click(toggleFlags);
		if ($('#bubble td').text().match(/\s/)) {
			$('#bubble').css('max-width', '45%');
		}

	}

	$(document).ready(init);
}(jQuery));


// Animate main category items
(function($) {
	var animationTime = 150;

	function animate() {
		$(this).animate({left: '10px'}, animationTime);
	}

	function restore() {
		$(this).animate({left: '0px'}, animationTime);
	}

	function init() {
		$('#categorylist ul').css('position', 'relative');
		$('#categorylist li a').css('position', 'relative').hover(animate, restore);
	}

	$(document).ready(init);
}(jQuery));



(function($) {
  function init() {
    if (typeof allowCufon != 'undefined' && allowCufon && typeof Cufon == 'function') {
      Cufon.replace('#menu > li > a', {fontFamily: 'FuturaLight'}); 
      Cufon.replace('#bubble h1', {fontFamily: 'Arial Black', color: '-linear-gradient(#51ed62, #16e5c3)', 'line-height': 0.8}); 
    }
  }

  $(document).ready(init);
}(jQuery));

var search = (function($) {
  function clearSearchForm() {
    $('#searchform input:text').val('');
    $('#searchform input:checkbox').attr('checked', '');
    $('img.swatch').removeClass('selected');
    $('#searchform input.colour').remove();
    
    if (typeof searchSliders == 'object') {
      searchSliders.reset();
    }
    
  }
  
  function searchTabActivated() {
    $('#filter,#warning').hide(); 
  }
  
  function catsTabActivated() {
    if (!window.location.pathname.match(/search/)) {
      $('#filter,#warning:not(.hidden)').show();
    }
  }
  
  function init() {
    $('#clearbutton').click(clearSearchForm);
    if (typeof tabs == 'object') {
      tabs.tabActivate('searchtab', searchTabActivated);
      tabs.tabDeactivate('searchtab', catsTabActivated);
    }
  }
  
  $(document).ready(init);
}(jQuery));

var sliderTypes = {'search': 1, 'narrowdown': 2};

function ColourSearch($, c) {
  var self = this;
  
  function showColourName() {
    $(this).closest('.colours').find('.colourname').html($(this).attr('title'));
  }
  
  function removeColourName() {
    var container = $(this).closest('.colours'),
        i = $('img.selected', c);
    
    switch (i.length) {
      case 0: {
        container.find('.colourname').html('&nbsp;'); break;      
      }
      case 1: {
        container.find('.colourname').html(i.attr('alt')); break;
      }
      default: {
        container.find('.colourname').html(searchData.multiple); break;
      }
    }
  }
  
  toggleColour = function toggleColour() {
    var attrID = $(this).data('colour');
    $('img.swatch.colour' + attrID, c).toggleClass('selected');
    
    if (typeof self.onChange === 'function') {
      self.onChange();
    } 
  }
  
  function init() {
    $('img.swatch', c).mouseenter(showColourName).mouseleave(removeColourName).click(toggleColour);
    $('img.swatch:first', c).trigger('mouseleave');
  }
  
  this.onChange = null;

  init();
  
  return this;
}



function Sliders($, c, t) {
  var self = this,
      lastValues = {quantities: [], budget: [], deliveryTime: -1, colours: []},
      slidertype = t,
      container = c;
  
  this.colourSearch = null;
  
  this.getParams = function() {
    var result = [{name: "minq", value: $('.quantityslider:first', container).slider("values", 0)},
                  {name: "maxq", value: $('.quantityslider:first', container).slider("values", 1)},
                  {name: "minb", value: $('.budgetslider:first', container).slider("values", 0)},
                  {name: "maxb", value: $('.budgetslider:first', container).slider("values", 1)},
                  {name: "delivery", value: $('.deliveryslider:first', container).slider("values", 0)}];
    
    $('img.swatch.selected', container).each(function() { result.push({name: "colours[]", value: $(this).data('colour')}) });
    
    return result;
  }
  
  this.s = {quantity: null, budget: null, delivery: null};

  this.changeFuncs = {quantity: null, deliveryTime: null, budget: null};

  this.filtered = function() {
    return  ($('.quantityslider:first', container).slider("values", 0) != searchData.quantities[0].id) ||
            ($('.quantityslider:first', container).slider("values", 1) != searchData.quantities[searchData.quantities.length - 1].id) ||
            ($('.budgetslider:first', container).slider("values", 0) != searchData.budgets[0].id) ||
            ($('.budgetslider:first', container).slider("values", 1) != searchData.budgets[searchData.budgets.length - 1].id) ||
            ($('.deliveryslider:first', container).slider("value") != searchData.deliveryTimes[searchData.deliveryTimes.length - 1]) ||
            ($('img.swatch.selected', container).length > 0);
  }

  function findArrayItemByID(arr, id) {
    for (var idx in arr) {
      if (arr[idx].id == id) {
        return arr[idx].value;
      }
    }
  }

  function quantitiesChanged(e, ui) {
    if (ui.values.toString() !== lastValues.quantities.toString()) {
      lastValues.quantities = ui.values;
      if (typeof(sessionStorage) != 'undefined') {
        sessionStorage.setItem('minQuantity' + slidertype, ui.values[0]);
        sessionStorage.setItem('maxQuantity' + slidertype, ui.values[1]);
      }
      if (typeof self.changeFuncs.quantity === 'function') {
        self.changeFuncs.quantity();
      }
    }
  }

  function budgetChanged(e, ui) {
    if (ui.values.toString() !== lastValues.budget.toString()) {
      lastValues.budget = ui.values;
      if (typeof(sessionStorage) != 'undefined') {
        sessionStorage.setItem('minBudget' + slidertype, ui.values[0]);
        sessionStorage.setItem('maxBudget' + slidertype, ui.values[1]);
      }
      if (typeof self.changeFuncs.budget === 'function') {
        self.changeFuncs.budget();
      }
    }
  }

  function deliveryChanged(e, ui) {
    if (ui.value !== lastValues.deliveryTime) {
      lastValues.deliveryTime = ui.value;
      if (typeof(sessionStorage) != 'undefined') {
        sessionStorage.setItem('delivery' + slidertype, ui.value);
      }
      if (typeof self.changeFuncs.deliveryTime === 'function') {
        self.changeFuncs.deliveryTime();
      }
    }
  }

  function getParentElement(ui) {
    return $(ui.handle).parents('.filtersection:first');
  }

  function quantitiesSlide(e, ui) {
    $('.range', getParentElement(ui)).html(findArrayItemByID(searchData.quantities, ui.values[0]) + ' - ' + findArrayItemByID(searchData.quantities, ui.values[1]));
  }

  function budgetSlide(e, ui) {
    $('.range', getParentElement(ui)).html(findArrayItemByID(searchData.budgets, ui.values[0]) + ' - ' + findArrayItemByID(searchData.budgets, ui.values[1]));
  }

  function deliverySlide(e, ui) {
    $('.range', getParentElement(ui)).html('&lt; ' + ui.value + ' ' + (ui.value == 1?searchData.weeks.singular:searchData.weeks.plural));
  }

  function init() {
    var tmp, highlight = false;

    if ((slidertype == sliderTypes.narrowdown) && (typeof slidervals !== 'undefined')) {
      tmp = [slidervals.quantity.min, slidervals.quantity.max];
    }
    else if (typeof(sessionStorage) != 'undefined') {
      tmp = [sessionStorage.getItem('minQuantity' + slidertype) || searchData.quantities[0].id, sessionStorage.getItem('maxQuantity' + slidertype) || searchData.quantities[searchData.quantities.length-1].id];
    } else {
      tmp = [searchData.quantities[0].id, searchData.quantities[searchData.quantities.length-1].id];
    }

    highlight = highlight || (tmp[0] != searchData.quantities[0].id) || (tmp[1] != searchData.quantities[searchData.quantities.length-1].id);

    self.s.quantity = $('.quantityslider', container).slider({
      range: true,
      min: searchData.quantities[0].id,
      max: searchData.quantities[searchData.quantities.length-1].id,
      values: tmp,
      slide: quantitiesSlide,
      change: quantitiesChanged});

    if ((slidertype == sliderTypes.narrowdown) && (typeof slidervals !== 'undefined')) {      
      tmp = [slidervals.budget.min, slidervals.budget.max];
    }
    else if (typeof(sessionStorage) != 'undefined') {
      tmp = [sessionStorage.getItem('minBudget' + slidertype) || searchData.budgets[0].id, sessionStorage.getItem('maxBudget' + slidertype) || searchData.budgets[searchData.budgets.length-1].id];
    } else {
      tmp = [searchData.budgets[0].id, searchData.budgets[searchData.budgets.length-1].id];
    }

    highlight = highlight || (tmp[0] != searchData.budgets[0].id) || (tmp[1] != searchData.budgets[searchData.budgets.length-1].id);

    self.s.budget = $('.budgetslider', container).slider({
      range: true,
      min: searchData.budgets[0].id,
      max: searchData.budgets[searchData.budgets.length-1].id,
      values: tmp,
      slide: budgetSlide,
      change: budgetChanged});

    if ((slidertype == sliderTypes.narrowdown) && (typeof slidervals !== 'undefined')) {
      tmp = slidervals.deliveryTime;
    }
    else if (typeof(sessionStorage) != 'undefined') {
      tmp = sessionStorage.getItem('delivery' + slidertype) || searchData.deliveryTimes[searchData.deliveryTimes.length - 1];
    } else {
      tmp = searchData.deliveryTimes[searchData.deliveryTimes.length - 1];
    }

    highlight = highlight || (tmp != searchData.deliveryTimes[searchData.deliveryTimes.length - 1]) || ($('img.swatch.selected', container).length > 0);

    self.s.delivery = $('.deliveryslider', container).slider({
    value: tmp,
    min: searchData.deliveryTimes[0],
    max: searchData.deliveryTimes[searchData.deliveryTimes.length - 1],
    slide: deliverySlide,
    change: deliveryChanged});

    $('.quantity .range', container).html(findArrayItemByID(searchData.quantities, $('.quantityslider', container).slider("values", 0)) + ' - ' + findArrayItemByID(searchData.quantities, $('.quantityslider', container).slider("values", 1)));
    $('.budget .range', container).html(findArrayItemByID(searchData.budgets, $('.budgetslider', container).slider("values", 0)) + ' - ' + findArrayItemByID(searchData.budgets, $('.budgetslider', container).slider("values", 1)));
    $('.deliverytime .range', container).html('&lt; ' + $('.deliveryslider', container).slider("value") + ' ' + ($('.deliveryslider', container).slider("value") == 1?searchData.weeks.singular:searchData.weeks.plural));

    if (self.filtered() && (slidertype == sliderTypes.narrowdown)) {
      $('#warning').removeClass('hidden');
      $('#warning button').click(resetSliders);
    }
    
    self.colourSearch = new ColourSearch($, container);
  }
  
  this.reset = function() { 
    resetSliders();
    if (typeof self.colourSearch.onChange == 'function') {
      self.colourSearch.onChange(); 
    }
  };

  function resetSliders() {
    if ((slidertype == sliderTypes.narrowdown) && (typeof(sessionStorage) != 'undefined')) {
      sessionStorage.setItem('minQuantity' + slidertype, searchData.quantities[0].id);
      sessionStorage.setItem('maxQuantity' + slidertype, searchData.quantities[searchData.quantities.length-1].id);
      sessionStorage.setItem('minBudget' + slidertype, searchData.budgets[0].id);
      sessionStorage.setItem('maxBudget' + slidertype, searchData.budgets[searchData.budgets.length-1].id);
      sessionStorage.setItem('delivery' + slidertype, searchData.deliveryTimes[searchData.deliveryTimes.length - 1]);
    }

    self.s.budget.each(function(i, o) { $(o).slider('values', [searchData.budgets[0].id, searchData.budgets[searchData.budgets.length-1].id]); });
    self.s.quantity.each(function(i, o) { $(o).slider('values', [searchData.quantities[0].id, searchData.quantities[searchData.quantities.length-1].id]); });
    self.s.delivery.each(function(i, o) { $(o).slider('value', searchData.deliveryTimes[searchData.deliveryTimes.length - 1]); });

    $('.budget .range', container).html(searchData.budgets[0].value + ' - ' + searchData.budgets[searchData.budgets.length-1].value);
    $('.quantity .range', container).html(searchData.quantities[0].value + ' - ' + searchData.quantities[searchData.quantities.length-1].value);
    $('.deliverytime .range', container).html('&lt; ' + searchData.deliveryTimes[searchData.deliveryTimes.length - 1] + ' ' + searchData.weeks.plural);
    $('img.swatch', container).removeClass('selected');

    if (slidertype == sliderTypes.narrowdown) {
      $('#warning').addClass('hidden');
    }
  }

  if (typeof searchData == 'object') {
    init();
    return this;
  }
  else {
    return null;
  }
}

var searchSliders, narrowDownSliders;

(function($) {
  var timerHandle = null;
  var queue = [];
  
  function sendAjaxRequest() {
    var vis;
    if (queue.length === 0) {
      $("div.product").fadeTo(200, 0.1);
    } 

    queue.push(1 + queue.length);
    var params = searchSliders.getParams();
    if ($('#searchkeywords').val() !== '') {
      params.push({name: "Keywords", value: $('#searchkeywords').val()});
    }
    $('#searchform input:checkbox:checked').each(function() { params.push({name: this.name, value: this.value})});
    
    $('#searchform select').each(function() { if (this.value > 0) { params.push({name: this.name, value: this.value})}});
    ajaxpost('ajax/search', rh, params);
  }
  
  function rh(o) {
    var category;

    queue.pop();
    if ((queue.length === 0) && (o.xmlhttp.status == 200)) {
      category = ((typeof(JSON) == 'object') && (typeof(JSON.parse) == 'function'))?JSON.parse(o.responseText):eval(o.responseText);

      if (category.Paginator == '') {
        $('.pagenav').html('');
      } else {
        $('.pagenav').replaceWith(category.Paginator);
      }
      $('#searchresults *').remove();
      $('#searchresults').append(category.Items);
      $('img.prod').lazyload();
    }
  }
  
  function changeFunc() {
    var i, params = searchSliders.getParams();
    $('#searchform input[type=hidden].slider').remove();
    for (i=0; i<params.length; i++) {
      $('#searchform').append('<input type="hidden" class="slider" name="' + params[i].name + '" value="' + params[i].value + '" />');
    }
    
    if (window.location.pathname.match(/searchresults/)) {
      if (timerHandle !== null) {
        clearTimeout(timerHandle);
      }
      timerHandle = setTimeout(sendAjaxRequest, 400);
    }
  }
  
  function colourChangeFunc() {
    $('#searchform input.colour').remove();
    $('#searchform img.swatch.selected').each( function () { $('#searchform').append('<input type="hidden" name="colours[]" class="colour" value="' + $(this).data('colour') + '" />'); });
    changeFunc();
  }
  
  function init() {
    searchSliders = new Sliders($, $('#searchform'), sliderTypes.search);
    searchSliders.changeFuncs.quantity = changeFunc;
    searchSliders.changeFuncs.budget = changeFunc;
    searchSliders.changeFuncs.deliveryTime = changeFunc;

    if ((typeof searchSliders == 'object') && (searchSliders.colourSearch !== null)) {
      searchSliders.colourSearch.onChange = colourChangeFunc;
    }
    
    if ($('#filter').length === 1) {
      narrowDownSliders = new Sliders($, $('#filter'), sliderTypes.narrowdown);
    }
  }

  $(document).ready(init);
}(jQuery));
