var basket_widget = {
  basketLinesT: $('<table cellspacing="0"></table>'),
  basketLineT: $('<tr class="basket-widget-basket-line"><td><div class="basket-widget-product-description"></div><div class="basket-widget-product-code"></div></td><td><div class="basket-widget-quantity"><input name="quantity" class="quantity-field" value="" onchange="basket_widget.quantityUpdate(this);" /></div></td><td><div class="basket-widget-line-goods"></div></td><td><div class="basket-widget-vat"></div></td><td><div class="basket-widget-line-total"></div></td><td><div class="basket-widget-control-buttons"><a href="javascript:void(0);" onclick="javascript:basket_widget.deleteBasketLine(this)"><img src="/templates/newimage2010/images/basketwidget-closeicon.png" alt="Delete this line" /></a></div></td></tr>'),
  currentBasketLines: null,
  oldBasketLines: null,
  basketXml: null,
  currentPage: -1,
  widgetOpen: false,
  loaderXmlHttp: null,
  display:
    function() {
      if (basket_widget.widgetOpen) {
        basket_widget.close();
        return;
      }
      $('#basket-widget-clip').remove();
      
      $('#header-position').append('<div id="basket-widget-clip"><div id="basket-widget"><div id="basket-widget-frame"><h3>Items added to your basket</h3><a id="basket-widget-close" href="javascript:void(0);" onclick="javascript:basket_widget.close()">[close]</a><div id="basket-widget-content"></div></div></div></div><div id="basket-widget-matte" /><div id="basket-widget-right" /><div id="basket-widget-bottom" />');
      $('#basket-widget-content').append('<table cellspacing="0"><tr><th><div class="basket-widget-product-description">Product Description</div></th><th><div class="basket-widget-quantity">Quantity</div></th><th><div class="basket-widget-line-goods">Line Goods</div></th><th><div class="basket-widget-vat">VAT</div></th><th><div class="basket-widget-line-total">Line Total</div></th><th><div id="basket-widget-scroll-prev"></div></th></tr></table>');
      $('#basket-widget-content').append('<div id="basket-widget-basket-lines"></div>');
      $('#basket-widget-content').append('<div id="basket-widget-scroll-next"></div>')
      $('#basket-widget-content').append('<div id="basket-widget-footer"><div id="basket-widget-buttons"><a href="javascript:void(0);" onclick="basket_widget.refreshBasket()"><img src="/templates/newimage2010/images/refreshbasket-button.png" alt="Refresh basket" /></a><br /><a href="/checkout0.kmod"><img src="/templates/newimage2010/images/checkout-button.png" alt="Refresh basket" /></a></div><table id="basket-widget-summary" cellspacing="0"><tr class="goods-total"><th>Goods Total:</th><td></td></tr><tr class="shipping-total"><th>Postage &amp; Packaging:</th><td></td></tr><tr class="vat-total"><th>VAT:</th><td></td></tr><tr class="basket-total"><th>TOTAL COST:</th><td></td></tr></table></div>')
    
      //basket_widget.nextPage();
      
      var bw = $('#basket-widget');
      var bwm = $('#basket-widget-matte');
      var bwr = $('#basket-widget-right');
      var bwb = $('#basket-widget-bottom');

      bwm.css({ background: "transparent url(/templates/newimage2010/images/basketwidget-m.png) no-repeat top left",
        width: 136, height: 6, position: "absolute", left: 819, top: 64 });
      bwr.css({ background: "transparent url(/templates/newimage2010/images/basketwidget-bgr.png) no-repeat top left",
        width: 8, height: 0, position: "absolute", left: 954, top: 64 });
      bwb.css({ background: "transparent url(/templates/newimage2010/images/basketwidget-bgb.png) no-repeat top left",
        width: 136, height: 8, position: "absolute", left: 819, top: 64 });
      bw.animate({ width: 638, height: 400, left: 0, top: -4 }, 500);
      bwr.animate({ height: 400 }, 500);
      bwb.animate({ width: 638, left: 316, top: 462 }, 500);
      basket_widget.widgetOpen=true;
      
      basket_widget.loadBasket();
    },
  loadBasket:
    function(targetPage) {
      //display a wait indicator in the basket lines area, visually put the scrollers in no-scroll mode and clear the totals
      $('#basket-widget-basket-lines').html('<p>Loading...</p>');
      $('#basket-widget-scroll-prev').html('');
      $('#basket-widget-scroll-next').html('');
      basket_widget.basketXml = null;
      basket_widget.currentPage = targetPage ? targetPage : 0;

      basket_widget.loaderXmlHttp = $.ajax({
          type: "POST",
          url: "/jqbasket.kmod",
          dataType: "xml",
          success: function(data, status) {
            $('#basket-widget-basket-lines').html('');
            basket_widget.basketXml = data;
            basket_widget.setSummary();

            var lines = $('basketlines line', basket_widget.basketXml);
            var numpages = Math.floor((lines.size()+3) / 4);
            if (basket_widget.currentPage+1 >= numpages) { basket_widget.currentPage = numpages-1; }
            basket_widget.currentPage--;
            basket_widget.nextPage();

            var numitems = 0;
            lines.each(function(){ numitems += Number($('quantity', this).text()); });
            
            $('#view-basket-button').text('BASKET ('+numitems+')');
          },
          error: function(request, status, error) {
            $('#basket-widget-basket-lines').html('<p>There was an error, please hit the "Refresh Basket" button.</p>');
          }
      });
    },
  refreshBasket:
    function() {
      basket_widget.loadBasket((basket_widget.currentPage<0) ? 0 : basket_widget.currentPage);
      $('#basket-widget').trigger('basketwidgetupdated');
    },
  deleteBasketLine:
    function(linkbutton) {
      basket_widget.deleteBasketLineInner($(linkbutton).parents('.basket-widget-basket-line').data('lineid'));
      $('#basket-widget').trigger('basketwidgetupdated');
    },
  deleteBasketLineInner:
    function(lineid) {
      $.ajax({
          async: false,
          type: "POST",
          url: "/cmsapps/ecommerce/ajax_remove_basket_line.asp",
          data: { lineid: lineid },
          dataType: "text",
          success: function(data, status) {
            if (/SUCCESS/.test(data)) {
              //line has been removed from basket, rebind the basket so that our data state is up to date
              //get the reload to come to the same page if possible
              basket_widget.refreshBasket();
            }
          },
          error: function(request, status, error) {
            alert('There was an error communicating with the server.');
          }
      });
    },
  quantityUpdate:
    function(input) {
      var quantity = $(input).val();
      
      if (quantity <= 0) {
        basket_widget.deleteBasketLineInner($(input).parents('.basket-widget-basket-line').data('lineid'));        
      }
      
      $.ajax({
          async: false,
          type: "POST",
          url: "/cmsapps/ecommerce/ajax_update_basket_line.asp",
          data: {
            lineid: $(input).parents('.basket-widget-basket-line').data('lineid'),
            quantity: quantity
          },
          dataType: "text",
          success: function(data, status) {
            if (/SUCCESS/.test(data)) {
              //Quantity was updated, since basket totals, promos and other features may have changed, we need to refresh the basket
              basket_widget.refreshBasket();
              $('#basket-widget').trigger('basketwidgetupdated');
          } else {
              //Quantity update at server failed, so recover original value from XML
            }
          },
          error: function(request, status, error) {
            alert('There was an error communicating with the server.');
          }
      });
    },
  close:
    function() {
      $('#basket-widget').fadeOut(200, function(){ $('#basket-widget-clip').remove(); });
      $('#basket-widget-matte').fadeOut(200, function(){ $('#basket-widget-matte').remove(); });
      $('#basket-widget-right').fadeOut(200, function(){ $('#basket-widget-right').remove(); });
      $('#basket-widget-bottom').fadeOut(200, function(){ $('#basket-widget-bottom').remove(); });
      basket_widget.widgetOpen=false;
    },
  setSummary:
    function() {
      if (basket_widget.basketXml == null) {
        $('#basket-widget-summary .goods-total td').text('');
        $('#basket-widget-summary .shipping-total td').text('');
        $('#basket-widget-summary .vat-total td').text('');
        $('#basket-widget-summary .basket-total td').text('');
      } else {
        $('#basket-widget-summary .goods-total td').text($('basketsummary goodstotal', basket_widget.basketXml).text());
        $('#basket-widget-summary .shipping-total td').text($('basketsummary shippingtotal', basket_widget.basketXml).text());
        $('#basket-widget-summary .vat-total td').text($('basketsummary taxtotal', basket_widget.basketXml).text());
        $('#basket-widget-summary .basket-total td').text($('basketsummary grandtotal', basket_widget.basketXml).text());
      }
    },
  renderBasketLines:
    function() {
      var bl = basket_widget.basketLinesT.clone();
      var first = (basket_widget.currentPage) * 4;
      var basketlines = $('basketlines line', basket_widget.basketXml);
      var pagelines; if (first>0) { pagelines = basketlines.filter(':gt('+(first-1)+')').filter(':lt(4)'); } else { pagelines = basketlines.filter(':lt(4)'); }

      pagelines.each(function(){
        var newline = basket_widget.basketLineT.clone();
        newline.appendTo(bl);
        $('.basket-widget-product-description', newline).text($('name',this).text());
        $('.basket-widget-product-code', newline).text('Product code: ' + $('prodcode',this).text());
        $('.quantity-field', newline).val($('quantity',this).text());
        $('.basket-widget-line-goods', newline).text($('lineprice',this).text());
        $('.basket-widget-vat', newline).text($('linetax',this).text());
        $('.basket-widget-line-total', newline).text($('linetotal',this).text());
        newline.data('lineid', $('lineid',this).text());        
        newline.data('productid', $('productid',this).text());        
      });
    
      return bl;
    },
  nextPage:
    function() {
      var lines = $('basketlines line', basket_widget.basketXml);
      var numpages = Math.floor((lines.size()+3) / 4);
      if (lines.size()==0) {
        $('#basket-widget-basket-lines').html('<p>Your shopping basket is empty.</p>');
        
        return;
      }
      var selectedPage = basket_widget.currentPage + 1;
      if (selectedPage >= numpages) { return; }

      //we are going to change pages
      if (selectedPage + 1 >= numpages) {
        $('#basket-widget-scroll-next').html('');
      } else {
        $('#basket-widget-scroll-next').html('<a href="javascript:void(0);" onclick="basket_widget.nextPage()"><img src="/templates/newimage2010/images/basketwidget-scrollnextoff.png" /></a>');
      }
      if (selectedPage <= 0) {
        $('#basket-widget-scroll-prev').html('');
      } else {
        $('#basket-widget-scroll-prev').html('<a href="javascript:void(0);" onclick="basket_widget.previousPage()"><img src="/templates/newimage2010/images/basketwidget-scrollprevoff.png" /></a>');
      }
      
      basket_widget.oldBasketLines=basket_widget.currentBasketLines;
      if (basket_widget.oldBasketLines) {
        var storeBasketLines = basket_widget.oldBasketLines;
        basket_widget.oldBasketLines.css({ opacity: 0.5 });
        basket_widget.oldBasketLines.animate({ opacity: 0 }, 400, function() { storeBasketLines.remove(); });
      }

      basket_widget.currentPage = selectedPage;
    
      basket_widget.currentBasketLines=basket_widget.renderBasketLines();
//      basket_widget.currentBasketLines.css({ position: "absolute", top: 0, left: 638 });
      basket_widget.currentBasketLines.css({ position: "absolute", top: 174, left: 0 });
      basket_widget.currentBasketLines.appendTo($('#basket-widget-basket-lines'));
//      basket_widget.currentBasketLines.animate({ left: 0 }, 1000);
      basket_widget.currentBasketLines.animate({ top: 0 }, 1000);
    },
  previousPage:
    function() {
      var lines = $('basketlines line', basket_widget.basketXml);
      var numpages = Math.floor((lines.size()+3) / 4);
      if (lines.size()==0) {
        $('#basket-widget-basket-lines').html('<p>Your shopping basket is empty.</p>');
        
        return;
      }
      var selectedPage = basket_widget.currentPage - 1;
      if (selectedPage < 0) { return; }

      //we are going to change pages
      if (selectedPage >= numpages) {
        $('#basket-widget-scroll-next').html('');
      } else {
        $('#basket-widget-scroll-next').html('<a href="javascript:void(0);" onclick="basket_widget.nextPage()"><img src="/templates/newimage2010/images/basketwidget-scrollnextoff.png" /></a>');
      }
      if (selectedPage - 1 < 0) {
        $('#basket-widget-scroll-prev').html('');
      } else {
        $('#basket-widget-scroll-prev').html('<a href="javascript:void(0);" onclick="basket_widget.previousPage()"><img src="/templates/newimage2010/images/basketwidget-scrollprevoff.png" /></a>');
      }

      basket_widget.oldBasketLines=basket_widget.currentBasketLines;
      if (basket_widget.oldBasketLines) {
        var storeBasketLines = basket_widget.oldBasketLines;
        basket_widget.oldBasketLines.css({ opacity: 0.5 });
        basket_widget.oldBasketLines.animate({ opacity: 0 }, 400, function() { storeBasketLines.remove(); });
      }
      
      basket_widget.currentPage = selectedPage;
    
      basket_widget.currentBasketLines=basket_widget.renderBasketLines();
//      basket_widget.currentBasketLines.css({ position: "absolute", top: 0, left: -638 });
      basket_widget.currentBasketLines.css({ position: "absolute", top: -174, left: 0 });
      basket_widget.currentBasketLines.appendTo($('#basket-widget-basket-lines'));
//      basket_widget.currentBasketLines.animate({ left: 0 }, 1000);
      basket_widget.currentBasketLines.animate({ top: 0 }, 1000);
    },
  abortAJAX:
    function() {
      if (basket_widget.loaderXmlHttp) {
        basket_widget.loaderXmlHttp.abort();
      }
    }
};
$().ready(function(){
  $('#view-basket-button').attr('href', 'javascript:void(0);').click(basket_widget.display);
  $(window).unload(function(){  basket_widget.abortAJAX();  });
});

function product_box_quick_add(button) {
  var form = button.parents('form');
  var productid = -1;
  var quantity = $('input[name=quantity]', form).val();
  try {
    if (/productid=([0-9]+)/i.exec(form.attr('action'))) {
      productid = RegExp.$1;
    }
  } catch (e) {
    alert(e);
  }
  if (!button.data('posting') && productid != -1 && /[0-9]+/.test(quantity)) {
//    alert('adding prodid' + prodid + ' times ' + quantity);
    button.data('posting', true);
    button.data('orgsrc', button.attr('src'));
    
    button.attr('src', '/templates/newimage2010/images/adding-button.gif');

    $.ajax({
        async: true,
        type: "POST",
        url: "/cmsapps/ecommerce/ajax_update_basket_line.asp?productid="+productid,
        data: {
          quantity: quantity
        },
        dataType: "text",
        success: function(data, status) {
          if (/SUCCESS/.test(data)) {
            
            window.setTimeout(function() {
              button.attr('src', button.data('orgsrc'));
              button.data('posting', false);

	            //remove the timeout resource
	            if (tooltipSequencer.intervalid) { window.clearTimeout(tooltipSequencer.intervalid); }

	            //when the mouse runs over a label, begin the hide anim since we have a wait interval before the
	            //new tooltip arrives - hideTooltip will not act if the tooltip is already hiding (or hidden)
	            hideTooltip();

	            //record which element we're raising a tooltip against - once timer runs out raise the tooltip
	            tooltipSequencer.parentcontrol = button;
	            tooltipSequencer.intervalid = window.setTimeout(raiseTooltip, tooltipSequencer.showdelay);
              
            }, 1000);
            
            //Quantity was updated, since basket totals, promos and other features may have changed, we need to refresh the basket
            basket_widget.refreshBasket();
            $('#basket-widget').trigger('basketwidgetupdated');
        } else {
            //Quantity update at server failed, so recover original value from XML
          }
        }
    });
  }
}

$().ready(function() {
  //find product box add to basket forms and alter their behaviour to perform an AJAX add to basket
  $('.product-box .add-to-basket-button,.wide-product-box .add-to-basket-button').each(function(){
    var button = $(this);
    button.data('posting', false);
    var form = button.parents(form).eq(1);
    
    button.data("ToolTipFunc", "getAddToBasketBoxTooltip");
    button.data("Position", "bottom");

    button.mouseout(function() {
        if (tooltipSequencer.intervalid) {
            window.clearTimeout(tooltipSequencer.intervalid);
        }
        if (tooltipSequencer.state == 'hiding' || tooltipSequencer.state == 'hidden') {
            return;
        }
        tooltipSequencer.intervalid = window.setTimeout(lowerTooltip, tooltipSequencer.hidedelay);
    });
    
    form.submit(function() { return false; });
    button.click(function() { product_box_quick_add(button); return false; });
    
  });
});
function getAddToBasketBoxTooltip(tt, jitem) {
  $('.tooltipbox-content', tt).html('<h2>Item(s) added to basket</h2><p><br />To checkout, use the button below, or the links in the header and footer menus.</p><p><a href="/checkout0.kmod"><img src="/templates/newimage2010/images/checkout-button.png" alt="Refresh basket" /></a>&#160;<a href="javascript:void(0);" onclick="javascript:lowerTooltip();"><img alt="Continue Shopping" src="/templates/newimage2010/images/continueshopping.png"></a></p>');
}

