// Lovell Rugby website functions - inc. pop-up, changePic, video display, AJAX live search
// v2.75 100621 - These functions now cover all skinned sites (no longer requiring their own functions files)

// Set-up JavaScript skinning default values
var skinJS_SiteCode   = 'LR';
var skinJS_SiteURL    = 'www.lovell-rugby.co.uk';
var skinJS_NewStyle   = 0;
var skinJS_RunningOn  = 'WEB';
var skinJS_PreImg     = '';
var skinJS_FilterHR   = '';
var skinJS_ShadowType = 'big/';
var skinJS_WithTicks  = 1;
var skinJS_FlexTabs   = 0;

function skinJSVariables(skinAsSite) {
  // Skinned variables
  if (skinAsSite=='LR') {
    skinJS_SiteCode   = 'LR';
    skinJS_SiteURL    = 'http://www.lovell-rugby.co.uk';
    skinJS_PreImg     = 'rugby/';
    skinJS_FilterHR   = '<img src="images/rugby/filter-hr.png" width="235" height="3" border="0" style="margin: 5px 0px">';
    skinJS_ShadowType = 'faint/';
  }
  else if (skinAsSite=='LS') {
    skinJS_SiteCode = 'LS';
    skinJS_SiteURL  = 'http://www.lovellsoccer.co.uk';
    skinJS_PreImg   = 'soccer/';
    skinJS_FilterHR = '<img src="images/soccer/filter-hr.png" width="230" height="2" border="0" style="margin: 5px 0px">';
  }
  else if (skinAsSite=='LFC') {
    skinJS_SiteCode = 'LFC';
    skinJS_SiteURL  = 'http://www.lfcbootroom.tv';
    skinJS_FilterHR = '<img src="images/LFC-Bootroom/filter-hr.png" width="230" height="2" border="0" style="margin: 5px 0px">';
  }
  else if (skinAsSite=='FBS') {
    skinJS_SiteCode = 'FBS';
    skinJS_SiteURL  = 'http://www.nb-soccerstore.com';
  }
  else if (skinAsSite=='WBR') {
    skinJS_SiteCode = 'WBR';
    skinJS_SiteURL  = 'http://www.lovellsoccer.co.uk';
  }
  else if (skinAsSite=='MMS') {
    skinJS_SiteCode = 'MMS';
    skinJS_SiteURL  = 'http://www.matchmagstore.co.uk';
    skinJS_PreImg   = 'soccer/';
    skinJS_FilterHR = '<img src="images/soccer/filter-hr.png" width="230" height="2" border="0" style="margin: 5px 0px">';
  }
  else if (skinAsSite=='WSS') {
    skinJS_SiteCode = 'WSS';
    skinJS_SiteURL  = 'http://www.lovellworldsoccerstore.co.uk';
    skinJS_PreImg   = 'soccer/';
    skinJS_FilterHR = '<img src="images/soccer/filter-hr.png" width="230" height="2" border="0" style="margin: 5px 0px">';
  }
  else if (skinAsSite=='TFS') {
    skinJS_SiteCode = 'TFS';
    skinJS_SiteURL  = 'http://www.tribalfootballstore.com';
    skinJS_PreImg   = 'tribalfootball/';
    skinJS_FilterHR = '<img src="images/tribalfootballstore/filter-hr.png" width="230" height="1" border="0" style="margin: 5px 0px">';
    skinJS_WithTicks = 0;
    skinJS_FlexTabs = 1;
  }
  else if (skinAsSite=='RH') {
    skinJS_SiteCode  = 'RH';
    skinJS_SiteURL   = 'http://www.rugby-heaven.co.uk';
    skinJS_PreImg    = 'rugbyheaven/';
    skinJS_FilterHR  = '<img src="images/rugbyheaven/filter-hr.png" width="235" height="3" border="0" style="margin: 5px 0px">';
    skinJS_WithTicks = 0;
  }

  // Local settings
  if (skinJS_RunningOn == 'OFFICE') {
    skinJS_SiteURL  = 'http://92.27.110.120';
    }
  else if (skinJS_RunningOn == 'FLIPPRO' || skinJS_RunningOn == 'FLIPAIR') {
    skinJS_SiteURL  = 'http://localhost/lovellrugby';
  }
}

function posDisc(offset) {
  // Move free deliver disc in line with product image
  if (document.getElementById) { var mp = document.getElementById('mainpic') }
  else if (document.all) { var mp = document.all['mainpic'] }
  else if (document.layers) { var mp = document.layers['mainpic'] }
  if (document.getElementById) { var fcd = document.getElementById('freecarriagedisc') }
  else if (document.all) { var fcd = document.all['freecarriagedisc'] }
  else if (document.layers) { var fcd = document.layers['freecarriagedisc'] }
  if (!mp || !fcd) { return }
  findPos(mp);
  fcd.style.top  = (postop + offset) + 'px';
  fcd.style.left = (posleft-10)+'px';
  fcd.style.visibility='visible';
}

function changePic(imageDiv, imageName, ord, width, height) {
// View alternate image
  var mainPic = document.getElementById(imageDiv);
  var src = 'products/'+imageName;
  if (ord > 1) { src += '_'+ord }
  src += '.jpg';
  mainPic.src=src;
  mainPic.width=width;
  mainPic.height=height;
}

var posleft = 0;
var postop = 0;

function findPos(obj) {
// Returns position of supplied object
var curleft = curtop = 0;
if (obj) {
  if (obj.offsetParent) {
    curleft = obj.offsetLeft;
    curtop = obj.offsetTop;
    while (obj = obj.offsetParent) {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    }
  }
}
posleft = curleft;
postop = curtop;
}

function hitMe(log) {
// On page logging
if (log.length > 0) { document.getElementById('hitme').src='cgi-bin/hitme.cgi?'+log }
}

// Pop-up
function popup(mylink, windowname, width, height) {
if (!window.focus) { return true }
var href;
if (typeof(mylink) == 'string') { href=mylink }
else { href=mylink.href }
window.open(href, windowname, 'width='+width+',height='+height+',status=no,scrollbars=yes,resizable=yes');
return false;
}


// Core AJAX code
var ajax = [];
function pjx(args,fname,method) { this.target=args[1]; this.args=args[0]; method=(method)?method:'GET'; if(method=='post'){method='POST';} this.method = method; this.r=ghr(); this.url = this.getURL(fname);}

function formDump(){ var all = []; var fL = document.forms.length; for(var f = 0;f<fL;f++){ var els = document.forms[f].elements; for(var e in els){ var tmp = (els[e].id != undefined)? els[e].id : els[e].name; if(typeof tmp != 'string'){continue;} if(tmp){ all[all.length]=tmp} } } return all;}

function getVal(id) {
  if (id.constructor == Function ) { return id() }
  if (typeof(id)!= 'string') { return id }
  var element = document.getElementById(id);
  if (!element) {
    for (var i=0; i<document.forms.length; i++) {
      element = document.forms[i].elements[id];
      if (element) break;
    }
    if (element && !element.type) element = element[0];
  }
  if (!element) {
    alert('ERROR: Cant find HTML element with id or name: '+id+'. Check that an element with name or id='+id+' exists');
    return 0;
  }
  if (element.type == 'select-one') {
    if (element.selectedIndex == -1) return;
    var item = element[element.selectedIndex];
    return item.value || item.text;
  }
  if (element.type == 'select-multiple') {
    var ans = [];
    var k =0;
    for (var i=0; i<element.length; i++) {
      if (element[i].selected || element[i].checked) {
        ans[k++] = element[i].value || element[i].text;
      }
    }
    return ans;
  }
  if (element.type == 'radio' || element.type == 'checkbox') {
    var ans = [];
    var elms = document.getElementsByTagName('input');
    var endk = elms.length;
    var i = 0;
    for (var k=0; k<endk; k++) {
      if (elms[k].type == element.type && elms[k].checked && (elms[k].id==id || elms[k].name==id)) { ans[i++]=elms[k].value }
    }
    return ans;
  }
  if (element.value == undefined) {
    return element.innerHTML;
  }
  else {
    return element.value;
  }
}

function fnsplit(arg) {
  var url="";
  if(arg=='NO_CACHE') {return '&pjxrand='+Math.random()}
  if((typeof(arg)).toLowerCase() == 'object') {
    for(var k in arg) { url += '&' + k + '=' + arg[k]; }
    }
  else if (arg.indexOf('__') != -1) {
    arga = arg.split(/__/);
    url += '&' + arga[0] +'='+ escape(arga[1]);
    }
  else {
    var res = getVal(arg) || '';
    if(res.constructor != Array){ res = [res] }
    for(var i=0;i<res.length;i++) { url += '&args=' + escape(res[i]) + '&' + arg + '=' + escape(res[i]); }
    }
  return url;
}

pjx.prototype = {
  send2perl : function() {
    var r = this.r;
    var dt = this.target;
    this.pjxInitialized(dt);
    var url=this.url;
    var postdata;
    if(this.method=="POST"){ var idx=url.indexOf('?'); postdata = url.substr(idx+1); url = url.substr(0,idx); }
    // See error explaination at: http://stackoverflow.com/questions/51283/access-to-restricted-uri-denied-code-1012
    r.open(this.method,url,true); ;
    if(this.method=="POST"){ r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); r.send(postdata); }
    if(this.method=="GET"){ r.send(null); }
    r.onreadystatechange = handleReturn;
  },

  pjxInitialized : function(){},

  pjxCompleted : function(){},

  readyState4 : function() {
    var rsp = unescape(this.r.responseText); /* the response from perl */
    var splitval = '__pjx__'; /* to split text */
    /* fix IE problems with undef values in an Array getting squashed*/
    rsp = rsp.replace(splitval+splitval+'g',splitval+" "+splitval);
    var data = rsp.split(splitval);
    dt = this.target;
    if (dt.constructor != Array) { dt=[dt]; }
    if (data.constructor != Array) { data=[data]; }
    if (typeof(dt[0])!='function') {
      for ( var i=0; i<dt.length; i++ ) {
        var div = document.getElementById(dt[i]);
        if (div.type =='text' || div.type=='textarea' || div.type=='hidden' ) { div.value=data[i]; }
        else{ div.innerHTML = data[i]; }
        }
      }
    else if (typeof(dt[0])=='function') { dt[0].apply(this,data); }
    this.pjxCompleted(dt);
    },

  getURL : function(fname) {
    var args = this.args;
    var url= 'fname=' + fname;
    for (var i=0;i<args.length;i++) { url=url + args[i]; }
    return url;
  }
}

handleReturn = function() {
  for( var k=0; k<ajax.length; k++ ) {
    if (ajax[k].r==null) { ajax.splice(k--,1); continue; }
    if ( ajax[k].r.readyState== 4) { ajax[k].readyState4(); ajax.splice(k--,1); continue; }
  }
}

var ghr=getghr();

function getghr() {
  if(typeof XMLHttpRequest != "undefined") { return function(){return new XMLHttpRequest();} }
  var msv= ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
  for(var j=0;j<=msv.length;j++){ try { A = new ActiveXObject(msv[j]); if(A){ return function(){return new ActiveXObject(msv[j]);} } } catch(e) { } } return false;
}

function jsdebug() {
  var tmp = document.getElementById('pjxdebugrequest').innerHTML = "<br /><pre>"; for( var i=0; i < ajax.length; i++ ) { tmp += '<a href= '+ ajax[i].url +' target=_blank>' + decodeURI(ajax[i].url) + ' </a><br />'; } document.getElementById('pjxdebugrequest').innerHTML = tmp + "</pre>";
}

// -- End of core AJAX code

// Functions using above AJAX code

// AJAX - Live search
var currentSearchPhrase;
function doLiveSearch(searchPhrase) {
  // Prevent unnecessary calling via AJAX
  if (searchPhrase != currentSearchPhrase && searchPhrase != (currentSearchPhrase + ' ') && (searchPhrase + ' ') != currentSearchPhrase && searchPhrase.length > 2) {
    currentSearchPhrase = searchPhrase;
    livesearch(['search__'+getVal('search')+'~'+skinJS_SiteCode], ['livesearchresults']);
  }
}

function livesearch() {
var args = livesearch.arguments;
for( var i=0; i<args[0].length;i++ ) { args[0][i] = fnsplit(args[0][i]); }
var l = ajax.length;
ajax[l]= new pjx(args,"livesearch",args[2]);
ajax[l].url = 'cgi-bin/dolivesearch.cgi?' + ajax[l].url;
ajax[l].send2perl();
}

function closeLiveSearch() {
var ls = document.getElementById('livesearchresults');
if (ls) { ls.innerHTML='' }
}

function searchPos() {
// Position live search div
var sbdiv;
if (document.getElementById) { sbdiv = document.getElementById('search') }
else if (document.all) { sbdiv = document.all['search'] }
else if (document.layers) { sbdiv = document.layers['search'] }

var lsdiv;
if (document.getElementById) { lsdiv = document.getElementById('livesearchresults') }
else if (document.all) { lsdiv = document.all['livesearchresults'] }
else if (document.layers) { lsdiv = document.layers['livesearchresults'] }

findPos(sbdiv);

var shiftLeft = 0;
var shiftDown = 24;
if (skinJS_SiteCode == 'LS' && skinJS_NewStyle) {
  shiftLeft = 81;
  shiftDown = 30;
  }

if (lsdiv) {
  lsdiv.style.left = (posleft - shiftLeft)+'px';
  lsdiv.style.top  = (postop + shiftDown)+'px';
  }
}

// AJAX - Update basket on server
var hidingBasket = 0;
function updateBasket() {
  var productId       = getVal('ba_ProductID');
  var quantity        = getVal('ba_Quantity');
  var size            = getVal('ba_Size');
  var personalisation = getVal('ba_Personalisation');

  if (productId && quantity && size) {
    basketUpdate(['basketData__' + productId + '~' + quantity + '~' + size + '~' + personalisation], ['basketSummary']);
    updateCompactBasket(); // Update compact basket
    showBasket(1);
    hidingBasket = setTimeout('showBasket(0)', 10000);
  }
  else if (!size) {
    updateOrderInfo('<strong>Please select a size to add this item to your cart</strong>');
  }
}

function basketUpdate() {
var args = basketUpdate.arguments;
for( var i=0; i<args[0].length;i++ ) { args[0][i] = fnsplit(args[0][i]); }
var l = ajax.length;
ajax[l]= new pjx(args,"ajax_basket",args[2]);
ajax[l].url = 'cgi-bin/basketupdate.cgi?' + ajax[l].url;
ajax[l].send2perl();
}

function showBasket(showHide) {
var bi = document.getElementById('basketInfo');
if (showHide) {
  // Show basket
  closeOpen();
  basketPos();
  bi.style.visibility = 'visible';
  }
else {
  // Hide basket
  bi.style.visibility = 'hidden';
  }
}

function basketPos() {
// Position basket info div - align to left of basket area and at top of (scrolled) page
var basket = document.getElementById('basket');
var bi = document.getElementById('basketInfo');

if (basket && bi) {
  findPos(basket);

  var screenSizeValuesString = screenSize();
  var screenSizeValues = new Array();
  screenSizeValues = screenSizeValuesString.split(',');
  var scrOfY    = Math.floor(screenSizeValues[3]);

  var shiftDown = 0;
  if (scrOfY > 100) { shiftDown = scrOfY - 100 }

  bi.style.left = (posleft -  7 - 0        ) + 'px';
  bi.style.top  = (postop  + 40 + shiftDown) + 'px';
  }
}

function updateCompactBasket() {
  // Updates content of compact basket 'pop-up'
  var newBasket = document.getElementById('newBasket'); // The content of this div is updated by the response to the AJAX function basketUpdate
  var bi        = document.getElementById('basketInfo');
  if (!bi) { return }
  if (newBasket && newBasket.innerHTML) {
    if (newBasket.innerHTML == 'Updated currency') {
      // We are updating the currency and need to reload the page
      setTimeout('window.location.reload()', 250);
    }
    else {
      bi.innerHTML = shadowBox('<div class="basketInfo">' + newBasket.innerHTML + '</div>', skinJS_ShadowType, 0, '');
      newBasket.innerHTML = ''; // Blank this so we can check when we've got new content
      if (!hidingBasket) {
        hidingBasket = setTimeout('showBasket(0)', 10000);
      }
    }
  }
  else {
    setTimeout('updateCompactBasket()', 100);
    bi.innerHTML = shadowBox('<div class="basketInfo" style="width: 250px; height: 100px">Updating...</div>', skinJS_ShadowType, 0, '');
    basketPos();
    if (hidingBasket) {
      hidingBasket = clearTimeout(hidingBasket);
    }
  }
}

// AJAX - Send product e-mail to friend
function sendToFriendSubmit() {
var args = sendToFriendSubmit.arguments;
for (var i=0; i<args[0].length;i++) { args[0][i] = fnsplit(args[0][i]); }
var l = ajax.length;
ajax[l]= new pjx(args,"ajax_sendToFriend",args[2]);
ajax[l].url = 'cgi-bin/sendtofriend.cgi?' + ajax[l].url;
ajax[l].send2perl();
}

// AJAX - Show product
function showitem() {
var args = showitem.arguments;
for( var i=0; i<args[0].length;i++ ) { args[0][i] = fnsplit(args[0][i]); }
var l = ajax.length;
ajax[l]= new pjx(args,"showitem",args[2]);
ajax[l].url = 'cgi-bin/showproduct.cgi?' + ajax[l].url;
ajax[l].send2perl();
}

function si(result, coverFilter) {
// Show product details in results pane via AJAX
showitem(['search__'+document.getElementById('qs_results').value+'~'+result+'~'+skinJS_SiteCode], ['quicksearchresults']);

if (coverFilter) {
  // Move pane to the left to cover the filter controls (which we also dim)
  document.getElementById('QuickSearchControlsCell').style.opacity=0;
  document.getElementById('QuickSearchControlsCell').style.filter='alpha(opacity=0)';
  document.getElementById('quicksearchresults').innerHTML=''; // Prevent content being shown when we shift the element to the right
  document.getElementById('quicksearchresults').style.position='relative';
  document.getElementById('quicksearchresults').style.left='-260px'; // rax - Can we avoid hardcoding this?
  }

// Jump to top of QS Results - only if we're further down the page
findPos(document.getElementById('quicksearchresults'));
if (postop) { postop -= 20 }
else { postop = 200 }

var scrollTop = getScrollTop();
if (postop < scrollTop) { scrollTo(0,postop) }
}

// AJAX - Quick search
function quicksearch() {
  var args = quicksearch.arguments;
  for (var i=0; i<args[0].length;i++) { args[0][i] = fnsplit(args[0][i]); }
  var l = ajax.length;
  ajax[l]= new pjx(args,"quicksearch",args[2]);
  ajax[l].url = 'cgi-bin/doquicksearch.cgi?' + ajax[l].url;
  ajax[l].send2perl();
}

// QUICK SEARCH CONTROLS
var catcodes = new Array();
var brands = new Array();
var tags = new Array();
var priceranges = new Array();
var sizes = new Array();
var setsizes = new Array();
var soletypes = new Array();
var currenturl = ''; // Unset for non-quicksearch pages
var currentprice = '';    //
var currentsize = '';     // - NOTE: We won't need these if we do the mutli-select like we do for brands
var currentsoletype = ''; //
var currentTagByType = new Array(); // - We need to keep track of each 'type' of tag separately
var catbrands = new Array();
var cattags = new Array();
var catsizes = new Array();
var catprices = new Array();
var catsoletypes = new Array();

function doQuickSearch(result) {
// Submits search request via AJAX

// Jump to top of QS Controls - only if we're further down the page
findPos(document.getElementById('QSJump'));
if (postop) { postop -= 20 }
else { postop = 200 }
var scrollTop = getScrollTop();
if (postop < scrollTop) { scrollTo(0,postop) }

var updateElement = 'quicksearchresults';
if (skinJS_NewStyle) {
  updateElement = 'quickSearchUpdateResults';
  if (document.getElementById(updateElement)) { document.getElementById(updateElement).innerHTML = '' }
  }

if (skinJS_NewStyle) {
  var resultsDiv = document.getElementById('quicksearchresults');
  if (resultsDiv) {
    // Fade results grid to indicate transition
    resultsDiv.style.opacity = 0.5;
    resultsDiv.style.MozOpacity = 0.5;
    resultsDiv.style.filter = 'alpha(opacity=50)';
  }
}

quicksearch(
  ['search__'+
    getVal('qs_category')+'~'+
    getVal('qs_group')+'~'+
    getVal('qs_brand')+'~'+
    getVal('qs_text')+'~'+
    getVal('qs_size')+'~'+
    getVal('qs_pricerange')+'~'+
    getVal('set_minprice')+'~'+
    getVal('set_maxprice')+'~'+
    getVal('qs_pg')+'~'+
    getVal('qs_sort')+'~'+
    getVal('qs_soletype')+'~'+
    getVal('qs_so')+'~'+
    getVal('qs_pre')+'~'+
    getVal('qs_tags')+'~'+
    getVal('qs_coreSearch')+'~'+
    skinJS_SiteCode],
  [updateElement]
  );
if (result) {
  // Show selected product
  si(result)
  }
else if (skinJS_NewStyle) {
  // Listen for response and update results when we have the list
  updateChooserResults();
  }
else if (!skinJS_NewStyle) {
  // Make sure control and results elements are in their rightful positions
  if (document.getElementById('quicksearchresults')) {
    document.getElementById('quicksearchresults').innerHTML=''; // Prevent content being shown when we shift the element to the right
    document.getElementById('quicksearchresults').style.position='relative';
    document.getElementById('quicksearchresults').style.left='0px';
    }
  if (document.getElementById('QuickSearchControlsCell')) {
    document.getElementById('QuickSearchControlsCell').style.opacity=1;
    document.getElementById('QuickSearchControlsCell').style.filter='alpha(opacity=100)';
    }
  }
}

function info(text) {
  // DEVELOPMENT TOOL: Update contents of 'info' with supplied text
  var infoInput = document.getElementById('info');
  if (!infoInput) {
    infoInput = document.getElementById('search');
  }
  if (infoInput) { infoInput.value=text }
  else { alert(text) }
}

function hitCat(link, dosearch) {
// Updates category input and toggles category link on / off
var caton = '';
for(var i=1; i<catbrands.length; i++) {
  if (i == link) {
    document.getElementById('catlink'+i).className='qson';
    }
  else {
    document.getElementById('catlink'+i).className='qsoff';
    }
  }
if (link) {
  document.getElementById('qs_category').value=catcodes[link];
  }
else {
  document.getElementById('qs_category').value='';
  }

var brandstext = '';
if (!document.getElementById('qs_fixbrand').value) {
  // Get brands for this category
  brands.length = 0; // Blank current array
  var oldbrand = document.getElementById('qs_brand').value;
  document.getElementById('qs_brand').value='';
  if (catbrands[link]) {
    var setbrands = catbrands[link].split(',');
    for (var i = 0; i < setbrands.length; i++) {
      if (currenturl) {
        var onoff = 'off';
        if (setbrands[i] == oldbrand) {
          // Pre-select brand
          document.getElementById('qs_brand').value=oldbrand;
          onoff = 'on';
          }
        brandstext += '<a href="'+currenturl+'/brand-'+setbrands[i]+'" onclick="return hitBrand('+i+')" id="brandlink'+i+'" class="qs'+onoff+'">'+setbrands[i]+'</a> ';
        }
      else { brandstext += '<a href="javascript:hitBrand('+i+')" id="brandlink'+i+'" class="qsoff">'+setbrands[i]+'</a> ' }
      brands[i] = setbrands[i];
      }
    }
  }
document.getElementById('brands').innerHTML = brandstext;

var tagstext = '';
if (cattags[link]) {
  // Get tags for this category
  tags.length = 0; // Blank current array
  var oldtag = document.getElementById('qs_tags').value;
  var tagTitle = '';
  document.getElementById('qs_tags').value='';
  if (cattags[link]) {
    var settags = new Array();
    settags = cattags[link].split(',');
    for (var i = 0; i < settags.length; i++) {
      var tagData = new Array();
      tagData = settags[i].split(':');
      // TagType:TagText:TagID
      if (tagData.length < 2 || !tagData[0]) { continue }
      if (tagData[0] != tagTitle) {
        // New tag type - show as heading
        if (i > 0 && tagstext) {
          // Add horizontal rule
          tagstext += '</p></td></tr><tr><td colspan="2">'+skinJS_FilterHR+'</td></tr><tr><td>';
          }
        tagstext += '<p class="qsheader"><span class="qsTagType">' + (skinJS_SiteCode == 'LFC' ? 'By ' + tagData[0]+':' : tagData[0]) + '</span>';
        tagTitle = tagData[0];
        }
      tagData[1] = tagData[1].replace(/ /g, '&nbsp;');
      var onoff = 'off';
      if (settags[i] == oldtag) {
        // Pre-select tag
        document.getElementById('qs_tags').value=oldtag;
        onoff = 'on';
        currentTagByType[tagData[0]] = i;
        }
        tagstext += '<a href="javascript:hitTags('+i+')" id="taglink'+i+'" class="qs'+onoff+'">'+tagData[1]+'</a> ';
        if (tagData[0] == 'Player' || tagData[0] == 'Personalisation' || tagData[1].length > 15) {
          // Only show one tag per line - rax - we could generalise this
          tagstext += '<br />';
          }
      tags[i] = settags[i];
      }
    }
  tagstext = tagstext.replace(/^<br \/>/, ''); // Remove initial new line
  }

if (document.getElementById('resultsTags')) {
  document.getElementById('resultsTags').innerHTML = tagstext;
}

// Get sizes for this category
sizes.length = 0; // Blank current array
var oldsize = document.getElementById('qs_size').value;
document.getElementById('qs_size').value='';
var sizestext = '';
if (catsizes[link]) {
  setsizes = catsizes[link].split(',');
  for (var i = 0; i < setsizes.length; i++) {
    var showSize = setsizes[i].replace(/\.5/g, String.fromCharCode(189))
    var useShort = '';
    if (skinJS_NewStyle) { useShort = 'Short' }
    if (setsizes[i].match(/^.*: $/)) {
      if (skinJS_NewStyle && sizestext) { sizestext += '<br style="clear: both">' }
      sizestext += '<span class="qsheader" id="sizelink'+i+'">'+setsizes[i]+'</span>';
      if (skinJS_NewStyle) { sizestext += '<br />' }
      }
    else if (currenturl && setsizes[i]) {
      var onoff = 'off';
      var linksize = setsizes[i].replace(/&frac12;/g, '.5');
      if (linksize == oldsize) {
        // Pre-select size
        document.getElementById('qs_size').value=oldsize;
        onoff = 'on';
        currentsize = i;
        }
      sizestext += '<a href="'+currenturl+'/size-'+linksize+'" onclick="return hitSize('+i+')" id="sizelink'+i+'" class="qs'+onoff+useShort+'">'+showSize+'</a> ';
      }
    else if (setsizes[i]) {
      sizestext += '<a href="javascript:hitSize('+i+')" id="sizelink'+i+'" class="qsoff"'+useShort+'>'+showSize+'</a> ';
      }
    sizes[i] = setsizes[i];
    }
  }
if (!sizestext) { sizestext = '<span class="qslight">No sizes available for this category</span>' }
document.getElementById('sizes').innerHTML = sizestext;

// Get price ranges for this category
priceranges.length = 0; // Blank current array
var oldpricerange = document.getElementById('qs_pricerange').value;
if (!document.getElementById('qs_pricerange').value.match(/0\.01~/)) { document.getElementById('qs_pricerange').value='~' }
var setprices = new Array();
var pricestext = '';
if (catprices[link]) {
  setprices = catprices[link].split(',');
  var pricerange = new Array();
  for (var i = 0; i < setprices.length; i++) {
    pricerange = setprices[i].split('~');
    var showprice = '&nbsp;&pound;'+pricerange[0]+'<span style="padding: 0px 2px 0px 2px">-</span>&pound;'+pricerange[1]+'&nbsp;';
    if (currenturl) {
      var onoff = 'off';
      if (setprices[i] == oldpricerange) {
        // Pre-select price range
        document.getElementById('qs_pricerange').value=oldpricerange;
        onoff = 'on';
        currentprice = i;
        }
      pricestext += '<a href="'+currenturl+'/price-'+pricerange[0]+'-'+pricerange[1]+'" onclick="return hitPrice('+i+')" id="pricelink'+i+'" class="qs'+onoff+'">'+showprice+'</a> ';
      }
    else { pricestext += '<a href="javascript:hitPrice('+i+')" id="pricelink'+i+'" class="qsoff">'+showprice+'</a> ' }
    priceranges[i] = setprices[i];
    }
  }
if (document.getElementById('prices')) { document.getElementById('prices').innerHTML = pricestext }

// Get sole types for this category
soletypes.length = 0; // Blank current array
var oldsoletype = document.getElementById('qs_soletype').value;
document.getElementById('qs_soletype').value='';
var soletypestext = '';
if (catsoletypes[link]) {
  setsoletypes = catsoletypes[link].split(',');
  for (var i = 0; i < setsoletypes.length; i++) {
    if (!setsoletypes[i]) { break }
    if (currenturl && setsoletypes[i]) {
      var onoff = 'off';
      if (setsoletypes[i] == oldsoletype) {
        // Pre-select soletype
        document.getElementById('qs_soletype').value=oldsoletype;
        onoff = 'on';
        currentsoletype = i;
        }
      var linksoletype = setsoletypes[i].replace(/ /g, '-');
      soletypestext += '<a href="'+currenturl+'/soletype-'+linksoletype+'" onclick="return hitSoletype('+i+')" id="soletypelink'+i+'" class="qs'+onoff+'">'+setsoletypes[i]+'</a> ';
      }
    else if (setsoletypes[i]) { soletypestext += '<a href="javascript:hitSoletype('+i+')" id="soletypelink'+i+'" class="qsoff">'+setsoletypes[i]+'</a> ' }
    soletypes[i] = setsoletypes[i];
    }
  }
if (!soletypestext) { soletypestext = '<span class="qslight">No sole types available for this category</span>' }
document.getElementById('soletypes').innerHTML = soletypestext;

if (dosearch) {
  rePage(0);
  doQuickSearch(0);
  }
}

function hitBrand(link) {
// Updates brand input and toggles brand link on / off
var brandson = '';
var brandsoff = '';
if (link == -1) { for(var i=0; i<brands.length; i++) { document.getElementById('brandlink'+i).className='qsoff' } }
else {
  var linkele = document.getElementById('brandlink'+link);
  linkele.blur();
  if (linkele.className=='qson') { linkele.className='qsoff' }
  else { linkele.className='qson' }
  for(var i=0; i<brands.length; i++) {
    if (document.getElementById('brandlink'+i).className=='qson') {
      brandson += brands[i] + ',';
      if (brands[i] == 'Other') { brandson += brandsoff }
      }
    else { brandsoff += brands[i] + ';' }
    }
  }
document.getElementById('qs_brand').value = brandson;
rePage(0);
doQuickSearch(0);
if (currenturl && link != -1) { return false }
}

function hitSize(link) {
// Updates size input and toggles link on / off
  var classOn  = 'qson';
  var classOff = 'qsoff';
  if (skinJS_NewStyle) {
    classOn  += 'Short';
    classOff += 'Short';
    }
  var size = '';
  if (link == currentsize && currentsize.toString().length>0) {
    document.getElementById('sizelink'+link).blur();
    link = -2;
  }
  if (link < 0) {
    for (var i=0; i<sizes.length; i++) {
      if (document.getElementById('sizelink'+i).className==classOn) {
        document.getElementById('sizelink'+i).className=classOff
      }
    }
  currentsize = '';
  }
  else {
    for(var i=0; i<sizes.length; i++) {
      var linkele = document.getElementById('sizelink'+i);
      linkele.blur();
      if (i == link) { linkele.className=classOn; currentsize = i; }
      else if (!setsizes[i].match(/^.*: $/)) { linkele.className=classOff }
    }
  size = sizes[link];
  }
  document.getElementById('qs_size').value=size;
  rePage(0);
  doQuickSearch(0);
  if (currenturl && link != -1) { return false }
}

function hitPrice(link) {
// Updates price input and toggles range link on / off
var price = '~';
if (link == currentprice && currentprice.toString().length>0) { document.getElementById('pricelink'+link).blur(); link = -2; }
if (link < 0) { for(var i=0; i<priceranges.length; i++) { document.getElementById('pricelink'+i).className='qsoff' } currentprice = ''; }
else {
  for(var i=0; i<priceranges.length; i++) {
    var linkele = document.getElementById('pricelink'+i)
    linkele.blur();
    if (i == link) { linkele.className='qson'; currentprice = i; }
    else { linkele.className='qsoff' }
    }
  price = priceranges[link];
  }
document.getElementById('qs_pricerange').value=price;
rePage(0);
doQuickSearch(0);
if (currenturl && link != -1) { return false }
}

function slidePrice() {
// Updates price input according to slider
document.getElementById('qs_pricerange').value = document.getElementById('slideMin').value+'~'+document.getElementById('slideMax').value;
rePage(0);
doQuickSearch(0);
}

var slidePriceMin = 0;
var slidePriceMax = 0;
var updatePrices;

function updatePricesFromSlider() {
// Updates price input according to slider - is called each time the slider is activated
document.getElementById('qs_pricerange').value = document.getElementById('slideMin').value+'~'+document.getElementById('slideMax').value;
if (updatePrices) {
  // Cancel current timeout
  clearTimeout(updatePrices);
  }
updatePrices = setTimeout('slidePrice()', 1000);
}

function hitSoletype(link) {
// Updates soletype input and toggles link on / off
var soletype = '';
if (link == currentsoletype && currentsoletype.toString().length>0) { document.getElementById('soletypelink'+link).blur(); link = -2; }
if (link < 0) { for(var i=0; i<soletypes.length; i++) { document.getElementById('soletypelink'+i).className='qsoff' } currentsoletype = ''; }
else {
  for(var i=0; i<soletypes.length; i++) {
    var linkele = document.getElementById('soletypelink'+i);
    linkele.blur();
    if (i == link) { linkele.className='qson'; currentsoletype = i; }
    else { linkele.className='qsoff' }
    }
  soletype = soletypes[link];
  }
document.getElementById('qs_soletype').value=soletype;
rePage(0);
doQuickSearch(0);
if (currenturl && link != -1) { return false }
}

function qsSortBy(sort) {
// Updates sort
var qssorts = new Array('rank', 'price', 'brand', 'name');
if (!sort) { sort = 'rank' }
for(var i=0; i<qssorts.length; i++) {
  sortoff = 'sort' + qssorts[i].toString();
  if (!document.getElementById(sortoff)) { continue } // We don't necessarily have all sort methods in use
  if (sort == qssorts[i]) {
    document.getElementById(sortoff).className='qson';
    document.getElementById(sortoff).blur();
    }
  else {
    document.getElementById(sortoff).className='qsoff';
    }
  }
document.getElementById('qs_sort').value=sort;
rePage(0);
doQuickSearch(0);
}

function hitTags(link) {
// Updates product tag input and toggles link on / off
var tagson = '';
var linkTagType = '';
var toggleOff = 0;

if (link >= 0) {
  // Get tag type of requested tag
    linkTagType = tags[link].split(':')[0];
  if (link == currentTagByType[linkTagType] && currentTagByType[linkTagType].toString().length>0) {
    // Toggle current tag to 'off'
    document.getElementById('taglink'+link).blur();
    toggleOff = 1;
    currentTagByType[linkTagType] = -1;
    }
  }

if (link < 0) { for(var i=0; i<tags.length; i++) { document.getElementById('taglink'+i).className='qsoff' } }
else {
  for(var i=0; i<tags.length; i++) {
    var linkele = document.getElementById('taglink'+i);
    if (!linkele) { continue }
    linkele.blur();

    var tagType = tags[i].split(':')[0];
    if (linkTagType == tagType) {
      // Only change state of tags of the same type
      if (i == link && !toggleOff) { linkele.className='qson'; currentTagByType[linkTagType] = i; }
      else { linkele.className='qsoff' }
      }

    if (linkele.className=='qson') {
      tagson += tags[i] + ',';
      }
    }
  }
document.getElementById('qs_tags').value = tagson;
rePage(0);
doQuickSearch(0);
// if (currenturl && link != -1) { return false }
}

function rePage(pg) {
// Updates results page
if (document.getElementById('qs_fixpg').value==1) { return }
document.getElementById('qs_pg').value=pg;
if (pg) { doQuickSearch(0) }
}

var reloaddue = 0;

function reloadSearch(searchtext) {
// Reloads search controls
if (reloaddue) { reloaddue = clearTimeout(reloaddue) }
if (document.getElementById('qs_text').value == searchtext) { return }
reloaddue = setTimeout("top.location = 'http://" + skinJS_SiteURL + "/shop?search='+document.getElementById('qs_text').value", 1000);
}

function doReloadSearch() {
// AJAX - Reload search controls
var args = doReloadSearch.arguments;
for (var i=0; i<args[0].length; i++) { args[0][i] = fnsplit(args[0][i]) }
var l = ajax.length;
ajax[l]= new pjx(args,"qs_section",args[2]);
ajax[l].url = 'cgi-bin/doqscontrols.cgi?' + ajax[l].url;
ajax[l].send2perl();
}


// Video display functions
var curlight = '';

function showVideo(vidpid) {
// Shows product video in player on page
if (vidpid) { curlight = vidpid }
document.getElementById('light'+vidpid).style.display='block';
document.getElementById('fade').style.display='block';
moveVideo(vidpid);
hitMe('video:'+vidpid);
}

function hideVideo(vidpid) {
if (vidpid) { curlight = vidpid }
document.getElementById('light'+curlight).style.display='none';
document.getElementById('fade').style.display='none';
}

function moveVideo(vidpid) {
// Keeps video divs in centre of screen
if (vidpid) { curlight = vidpid }

var vidWidth = 427;
var vidHeight = 260;

var screenSizeValuesString = screenSize();
var screenSizeValues = new Array();
screenSizeValues = screenSizeValuesString.split(',');
var docWidth  = Math.floor(screenSizeValues[0]);
var docHeight = Math.floor(screenSizeValues[1]);
var scrOfX    = Math.floor(screenSizeValues[2]);
var scrOfY    = Math.floor(screenSizeValues[3]);

vidX = Math.floor(docWidth / 2 - vidWidth / 2 + scrOfX);
vidY = Math.floor(docHeight / 2 - vidHeight / 2 + scrOfY);

if (curlight && vidX && vidY) {
  document.getElementById('light'+curlight).style.left=vidX+'px';
  document.getElementById('light'+curlight).style.top=vidY+'px';
  }
document.getElementById('fade').style.top=scrOfY+'px';
}

function screenSize() {
  // Finds size and scroll position of browser window
  var docWidth = 0, docHeight = 0;
  if (typeof(window.innerWidth) == 'number') {
    // Non-IE
    docWidth = window.innerWidth;
    docHeight = window.innerHeight;
  }
  else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
    // IE 6+ in 'standards compliant mode'
    docWidth = document.documentElement.clientWidth;
    docHeight = document.documentElement.clientHeight;
  }
  else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
    // IE 4 compatible
    docWidth = document.body.clientWidth;
    docHeight = document.body.clientHeight;
  }

  var scrOfX = 0, scrOfY = 0;
  if (typeof(window.pageYOffset) == 'number') {
    // Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  }
  else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
    // DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  }
  else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
    // IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return(docWidth+','+docHeight+','+scrOfX+','+scrOfY);
}

function printBootSelector(brand, bootsize, maxprice, soletype) {
// rax - OLD SITE - get rid of this once NB Soccer Store is offline
// Soccer sites boot selector menu - rax: this hard-codes brands, we could do this dynamically
document.write('<form ="cgi-bin/lr.cgi" method="post" name="bootform">');
document.write('<input type="hidden" name="page" value="shop">');
document.write('<input type="hidden" name="skin" value="'+skinJS_SiteCode+'">');
document.write('<input type="hidden" name="cat" value="15">');
document.write('<input type="hidden" name="dosearch" value="1">');
document.write('<table cellpadding="5" cellspacing="0" border="0" width="215">');
document.write('<tr><td colspan="3" class="tabletop2">&nbsp;FIND FOOTBALL BOOTS</td></tr>');
document.write('<tr><td colspan="3" class="nav"><table cellpadding="2" cellspacing="0" border="0" width="205" class="nav">');
document.write('<tr><td>Brand:</td><td><select name="selectBrand" class="lowinput"><option value="">All brands');
document.write('<option>Adidas');
document.write('<option>Asics');
document.write('<option>Mitre');
document.write('<option>Mizuno');
document.write('<option>Nike');
document.write('<option>Puma');
document.write('</select></td></tr>');
document.write('<tr><td>Boot size:</td><td><select name="size" class="lowinput"><option value="">Select');
document.write('<option value="6">6');
document.write('<option value="6.5">6&frac12;');
document.write('<option value="7">7');
document.write('<option value="7.5">7&frac12;');
document.write('<option value="8">8');
document.write('<option value="8.5">8&frac12;');
document.write('<option value="9">9');
document.write('<option value="9.5">9&frac12;');
document.write('<option value="10">10');
document.write('<option value="10.5">10&frac12;');
document.write('<option value="11">11');
document.write('<option value="11.5">11&frac12;');
document.write('<option value="12">12');
document.write('<option value="12.5">12&frac12;');
document.write('<option value="13">13');
document.write('<option value="13.5">13&frac12;');
document.write('<option value="14">14');
document.write('<option value="14.5">14&frac12;');
document.write('<option value="15">15');
document.write('</select></td></tr>');
document.write('<tr><td>Price:</td><td><select name="maxprice" class="lowinput"><option value="">Select');
document.write('<option value="10">Up to £10');
document.write('<option value="20">Up to £20');
document.write('<option value="30">Up to £30');
document.write('<option value="40">Up to £40');
document.write('<option value="50">Up to £50');
document.write('<option value="75">Up to £75');
document.write('<option value="100">Up to £100');
document.write('</select></td></tr>');
document.write('<tr><td>Sole type:</td><td><select name="soletype" class="lowinput"><option value="">Select');
document.write('<option>Soft Ground');
document.write('<option>Firm Ground');
document.write('<option>Astro / 3G');
document.write('</select></td></tr>');
document.write('</table></td></tr>');
document.write('</table>');
document.write('<input type="image" src="images/nike-green-soccer/view0.gif" onmouseover="this.src=\'images/nike-green-soccer/view1.gif\';" onmouseout="this.src=\'images/nike-green-soccer/view0.gif\'" style="width:215px; height:25px; border:none;" class="clear"></form>');

if (brand) {
  for (var i = 0; i < bootform.selectBrand.length; i++) {
  if (bootform.selectBrand.options[i].text == brand) { bootform.selectBrand.selectedIndex=i; break; }
  }
}
if (bootsize) { bootform.size.selectedIndex=bootsize }
if (maxprice) { bootform.maxprice.selectedIndex=maxprice }
if (soletype) { bootform.soletype.selectedIndex=soletype }

return true;
}

function getScrollTop() {
// Find current scroll position (vertical only)
  var scrollTop = document.body.scrollTop;
  if (scrollTop == 0) {
    if (window.pageYOffset) {
      scrollTop = window.pageYOffset;
    }
    else {
      scrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
    }
  }
return scrollTop;
}

function getPersn(productId, size, colour, extraLink) {
  // Issues customer with confirmation that they are buying an un-personalised item, with forward to buy with personalisation
  var productDetails = '';
  if (size) {
    if (productDetails) { productDetails += ', ' }
    productDetails += 'Size: ' + size;
  }
  if (colour) {
    if (productDetails) { productDetails += ', ' }
    productDetails += 'Colour: ' + colour;
  }
  if (productDetails) {
    productDetails = ' (' + productDetails + ')';
  }
  var okWithNoPersn = confirm('You are buying this product ' + productDetails + '\nwithout any personalisation.\n\nClick \'OK\' to continue\nClick \'Cancel\' to buy with personalisation');
  if (okWithNoPersn) {
    // Continue with buying unpersonalised item
    return true;
  }
  else {
    // Go to personalisation page, with this product selected
    top.location='http://'+skinJS_SiteURL+'/persn&pid='+productId+'&size='+size+'&colour='+colour+extraLink;
    return false;
  }
}

function showIfUK(isUK, showId, submitForm) {
  // Show / hide
  var eleId = document.getElementById(showId);
  if (isUK == 'United Kingdom') { eleId.style.display = 'block' }
  else { eleId.style.display = 'none' }

  if (submitForm && isUK != 'United Kingdom') {
    var myForm = document.forms[submitForm];
    if (myForm) {
      myForm.submit();
    }
  }
}

function mousePos(e) {
// Put the mouse position relative to the document in mx and my
e = e || window.event;
if (e.pageX || e.pageY) {
  mx = e.pageX;
  my = e.pageY;
}
else if (e.clientX || e.clientY) {
  mx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
  my = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  }
}

function registerEventHandler(node, event, handler) {
if (typeof node.addEventListener == "function") { node.addEventListener(event, handler, false) }
else { node.attachEvent("on" + event, handler) }
}

// FUNCTIONS FOR NEW STYLE SITES (e.g. Soccer Site early 2011)

var currentMenuId;
var currentMenuTabClassName;
var menuStayOpen;
var menuCloser;

function menuOpen(id) {
  if (currentMenuId && currentMenuId == id) {
    // This menu is already open
    menuStayOpen = 1;
    return;
    }
  closeOpen();
  currentMenuId = id;
  var tab  = document.getElementById('tab' +id);
  currentMenuTabClassName = tab.className;
  var left;
  var right;

  megaMenuPos(id);
  var menu = document.getElementById('menu'+id);
  if (menu) {
    menu.style.visibility = 'visible';
    menuStayOpen = 1;
    menuCloser = setInterval('menuCheckClose('+id+')', 1000);
    if (skinJS_FlexTabs) {
      // Change the className here - not in the mouseOver
      left  = document.getElementById('l' +id);
      right = document.getElementById('r' +id);
      if (tab)   { tab.className   = 'navTFlexOn'  }
      if (left)  { left.className  = 'navTLeftOn'  }
      if (right) { right.className = 'navTRightOn' }
    }
  }
}

function menuClose(id) {
  // Close specified menu and unselect tab by changing its className
  if (!id) { return }
  var menu = document.getElementById('menu'+id);
  if (menu) {
    menu.style.visibility = 'hidden';
  }
  currentMenuId = '';
  if (currentMenuTabClassName) {
    var tab  = document.getElementById('tab' +id);
    tab.className = currentMenuTabClassName;
    currentMenuTabClassName = '';
  }
  if (skinJS_FlexTabs) {
    // Also change class of left and right images
    var left  = document.getElementById('l' +id);
    if (left)  { left.className  = 'navTLeft' }
    var right = document.getElementById('r' +id);
    if (right) { right.className = 'navTRight' }
  }
  if (menuCloser) {
    clearInterval(menuCloser);
  }
}

function menuCheckClose(id) {
  if (!id || menuStayOpen) { return }
  menuClose(id);
}

function thumbControls(productId,show) {
  // Show (/hide) thumbnail image controls for zooming
  var zoom = document.getElementById('tZ_'+productId);
  if (show) {
    zoom.style.visibility = 'visible';
  }
  else {
    zoom.style.visibility = 'hidden';
  }
}

var skimDiv = '';
var skimThumbID = '';

function setSkim(ProductID) {
// Assign product to skim and pre-load images
skimThumbID = ProductID;
loadSkimThumbs(ProductID);
}

function unsetSkim() {
// Un-assign product to skim and revert it to initial image
skim(0);
skimThumbID = '';
}

function skim(e) {
  // Perform skim
  if (!skimThumbID) { return }
  // Get thumbnail div and pic info
  var thumb = document.getElementById('th'+skimThumbID); // thumbnail image
  var skDiv = document.getElementById('sk'+skimThumbID); // div containing image
  var thumbs = new Array();
  thumbs = sT[skimThumbID].split(',');
  // Find positions of div and mouse
  findPos(skDiv);
  var offsetX = posleft;
  var relativeX = 0;
  if (e) {
    mousePos(e);
    relativeX = mx - offsetX;
  }
  var perThumb = (thumbs[0] / (thumbs.length - 1));
  var choice = 1 + Math.floor(relativeX / perThumb);
  if (choice < 1) { choice = 1 }
  if (thumbs[choice]) {
    var imageDetails = thumbs[choice].split(':');
    var src = skinJS_SiteURL + '/thumbnails_lg/'+imageDetails[0];
    if (src != thumb.src)
      {
      thumb.src=skinJS_SiteURL+'/images/mask.gif';
      thumb.src=src;
      thumb.width=imageDetails[1];
      thumb.height=imageDetails[2];
    }
  }
}

var sT = new Array(); // Skin thumbs
var pD = new Array(); // Product data
var zB = new Array(); // Zoom boxes

function activateSkim() {
skimDiv = document.getElementById('pageContent');
  if (skimDiv) {
    registerEventHandler(skimDiv, "mousemove", skim);
  }
}

function loadSkimThumbs(ProductID) {
  if (!skimDiv) { activateSkim() }
  if (document.images) {
  var preLoad = new Array();
  var thumbs = new Array();
  var preLoadIndex = 0;
  for(i=1; i<sT.length; i++) {
    if (!sT[i] || (ProductID && i != ProductID)) { continue }
    thumbs = sT[i].split(',');
    for(j=1; j<thumbs.length; j++) {
      // Ignore thumbs[0] as this is 'max-width'
      var imageDetails = thumbs[j].split(':');
      if (imageDetails[0]) {
        var src = skinJS_SiteURL + '/thumbnails_lg/'+imageDetails[0];
        preLoad[preLoadIndex]=new Image;
        preLoad[preLoadIndex].src=src;
        preLoadIndex++;
        }
      }
    }
  }
}

var currentZoom;

function thumbZoom(productId,show) {
  // Show thumbnail-page product image zoom
  if (!productId || (show && !zB[productId])) { return }
  var zoomBox = document.getElementById('zoomBox');
  if (!zoomBox) { return }
  if (show) {
    if (currentZoom) {
      thumbZoom(currentZoom,0);
      }
    currentZoom = productId;

    // Add content to zoom box
    var padding = 20; // For the 'big' shadow
    var layoutImages = '';
    var imageData = new Array();
    imageData = zB[productId].split(':');
    zoomBox.style.width  = (parseInt(imageData[0]) + 2 * padding) + 'px';
    zoomBox.style.height = (parseInt(imageData[1]) + 2 * padding) + 'px';
    var ord = '';
    if (imageData[2] > 1) { ord = '_' + imageData[2] }
    layoutImages += '<div align="center"><img src="products/'+productId+ord+'.jpg" width='+imageData[3]+' height='+imageData[4]+' id="mainpic" alt="" border="0"></div>';

    var altThumbs = '';
    if (imageData.length>=6) {
      // Show alternates
      var thumbs = new Array();
      thumbs = imageData[5].split(/,/);
      if (thumbs.length>1) {
        var thumbCells = '';
        for (var ti=0; ti < thumbs.length; ti+=5) {
          var tOrd = '';
          if (thumbs[ti] > 1) { tOrd = '_' + thumbs[ti] }
          thumbCells += '<td><div class="zoomThumbAltContainer">';
          thumbCells += '<div class="zoomThumbAlt" style="background-image: url(\'thumbnails_lg/'+productId+tOrd+'.jpg\'); width: '+thumbs[ti+1]+'px, height: '+thumbs[ti+2]+'px" onclick="changePic(\'mainpic\', '+productId+', '+thumbs[ti]+', '+thumbs[ti+3]+', '+thumbs[ti+4]+'); this.className=\'zoomThumbAltFade\'" onmouseover="changePic(\'mainpic\', '+productId+', '+thumbs[ti]+', '+thumbs[ti+3]+', '+thumbs[ti+4]+'); this.className=\'zoomThumbAltFade\'" onmouseout="this.className=\'zoomThumbAlt\'"></div>';
          if (skinJS_WithTicks) {
            thumbCells += '<img src="images/'+skinJS_PreImg+'tick-thumb-tl.gif" width="6" height="6" border="0" class="zThumbTickTL">';
            thumbCells += '<img src="images/'+skinJS_PreImg+'tick-thumb-tr.gif" width="6" height="6" border="0" class="zThumbTickTR">';
            thumbCells += '<img src="images/'+skinJS_PreImg+'tick-thumb-bl.gif" width="6" height="6" border="0" class="zThumbTickBL">';
            thumbCells += '<img src="images/'+skinJS_PreImg+'tick-thumb-br.gif" width="6" height="6" border="0" class="zThumbTickBR">';
          }
          thumbCells += '</div></td>';
          }
        altThumbs += thumbCells;
        }
      layoutImages += '<div align="center" style="padding-left: 8px"><table cellpadding="0" cellspacing="0" border="0"><tr>'+altThumbs+'</tr></table></div>';
      }

    zoomBox.innerHTML = shadowBox(layoutImages, skinJS_ShadowType, 0, ' bgcolor="#353535"');

    var zoomWidth = parseInt(zoomBox.style.width);
    var zoomHeight = parseInt(zoomBox.style.height);

    var screenSizeValuesString = screenSize();
    var screenSizeValues = new Array();
    screenSizeValues = screenSizeValuesString.split(',');
    var docWidth  = Math.floor(screenSizeValues[0]);
    var docHeight = Math.floor(screenSizeValues[1]);
    var scrOfX    = Math.floor(screenSizeValues[2]);
    var scrOfY    = Math.floor(screenSizeValues[3]);

    var zoomX = Math.floor(((docWidth - zoomWidth)   / 2) + scrOfX);
    var zoomY = Math.floor(((docHeight - zoomHeight) / 2) + scrOfY);

    zoomBox.style.visibility = 'visible';
    zoomBox.style.left = zoomX + 'px';
    zoomBox.style.top  = zoomY + 'px';
    showCloseIcon(zoomX, zoomY, zoomWidth);
    fadeBackground(1);
  }
  else {
    zoomBox.style.visibility = 'hidden';
    fadeBackground(0);
    currentZoom = '';
  }
}

var keepOpen;
function closeOpen() {
  // Closes any open menus / zoom boxes etc.
  if (keepOpen) { return }
  if (currentZoom) { thumbZoom(currentZoom, 0) }
  if (currentMenuId) { menuClose(currentMenuId) }
  closeLiveSearch();
  var bi = document.getElementById('basketInfo');
  if (bi) {
    bi.style.visibility = 'hidden';
  }
  var bb = document.getElementById('compactBasketButtons');
  if (bb) {
    bb.style.display = 'none';
  }
  var pn = document.getElementById('personalise');
  if (pn) {
    pn.style.visibility = 'hidden';
  }
  if (currentBox) {
    var box = document.getElementById(currentBox);
    if (box) {
      box.style.visibility = 'hidden';
      currentBox = '';
    }
  }
  var closeIcon = document.getElementById('closeIcon');
  if (closeIcon) {
    closeIcon.style.visibility = 'hidden';
  }
  fadeBackground(0);
}

var currentPanel = new Array();

function showPanel(linkDivId, panelDivId, panelContentId) {
// Show alternative content in specified element
if (currentPanel[panelDivId] == linkDivId) { return }
var linkDiv      = document.getElementById(linkDivId);
var panelDiv     = document.getElementById(panelDivId);
var panelContent = document.getElementById(panelContentId);
if (panelDiv && panelContent) {
  if (currentPanel[panelDivId]) {
    var currentLinkDiv = document.getElementById(currentPanel[panelDivId]);
    currentLinkDiv.className = currentLinkDiv.className.replace(/On$/, 'Off');
    }
  panelDiv.innerHTML = panelContent.innerHTML;
  linkDiv.className  = linkDiv.className.replace(/Off$/, 'On')
  currentPanel[panelDivId] = linkDivId;
  }
}

// Update form to add item to basket
var available = new Array();
// var inBasket  = new Array(); // rax - Could use this to keep track of what's already in the basket and count these as allocated
var addToCartSize = '';
var addToCartButton = 2; // 1:pre-order, 2:in-stock

function forCart(action,data,buyStatus) {
  var info = '&nbsp;';
  if (action == 'size') {
    if (addToCartSize) {
      document.getElementById('s:'+addToCartSize).className='orderButton';
    }
    addToCartSize = data;
    document.getElementById('s:'+addToCartSize).className='orderButtonSelected';
    document.getElementById('ba_Size').value=data;
  }
  var quantity = parseInt(document.getElementById('ba_Quantity').value);
  if (!quantity) { quantity = 1 }
  if (action == 'qty') {
    quantity += data;
  }
  if (quantity < 1) { quantity = 1 }
  var availableToAdd = available['s:'+addToCartSize];
  if (quantity > availableToAdd) {
    // Prevent adding more than we have in stock
    if (!availableToAdd) {
      info = 'This item is out of stock in size '+addToCartSize.replace(/\.5/g, '&frac12')+'.';
    }
    else {
      info = 'There ';
      if (availableToAdd == 1) { info += 'is' } else { info += 'are' }
      info += ' only '+availableToAdd+' of this item available in size '+addToCartSize.replace(/\.5/g, String.fromCharCode(189))+'.'
    }
    quantity = availableToAdd;
  }
  document.getElementById('ba_Quantity').value = quantity;
  if (!addToCartSize) {
    info = 'Please select a size to add this item to your cart';
  }
  else if (availableToAdd && !quantity) {
    info = 'Please specify a quantity to add this item to your cart';
  }
  updateOrderInfo(info);
  if (addToCartButton != buyStatus) {
    // Change add-to-order button
    addToCartButton = buyStatus;
    var button = document.getElementById('addToCartButton');
    if (button) {
      var src = 'add0.png';
      if (addToCartButton == 1) { src = 'add0pre.png' }
      button.src = 'images/' + src;
    }
  }
}

function canAdd(imageElement, onOff) {
  // Highlight add-to-cart button according to size selection
  if (addToCartSize) {
    if (onOff) {
      if (addToCartButton == 1) {
        // Pre-order
        imageElement.src = 'images/add1pre.png';
      }
      else {
        // Add to cart
        imageElement.src = 'images/add1.png';
      }
    }
    else {
      if (addToCartButton == 1) {
        // Pre-order
        imageElement.src = 'images/add0pre.png';
      }
      else {
        // Add to cart
        imageElement.src = 'images/add0.png';
      }
    }
  }
  else {
    imageElement.src = 'images/add0.png';
    if (onOff) {
      updateOrderInfo('Please select a size to add this item to your cart');
    }
    else {
      updateOrderInfo('');
    }
  }
}

function canPersn(imageElement, onOff) {
  // Highlight persn button according to existing details
  if (addToCartSize) {
    if (onOff) {
      imageElement.src = 'images/'+skinJS_PreImg+'personalise1.png';
    }
    else {
      imageElement.src = 'images/'+skinJS_PreImg+'personalise0.png';
    }
    var personalisation = getVal('ba_Personalisation');
    if (personalisation) {
      var showPersn = '';
      var persnOptions = document.getElementById('ba_Personalisation');
      var persnData = persnOptions.value.split(':');
      var type  = '';
      var text1 = '';
      var text2 = '';
      var crest = '';
      var terms = 0;
      if (text1) { showPersn += "'"+text1+"', " }
      if (text2) { showPersn += "'"+text2+"', " }
      if (crest) { showPersn += "with team crest, " }
      showPersn = showPersn.replace(/, $/, '');
      if (showPersn) {
        if (terms) { showPersn += " - terms accepted" }
        else { showPersn += " - <strong class=\"warning\">please accept terms</strong>" }
        showPersn = '<strong>Personalisation options:</strong> '+showPersn;
      }
      else {
        showPersn = 'Find out more and enter your details';
      }
      updateOrderInfo(showPersn);
    }
  }
  else {
    imageElement.src = 'images/'+skinJS_PreImg+'personalise0.png';
    if (onOff) {
      updateOrderInfo('Please select a size to personalise this item');
    }
    else {
      updateOrderInfo('');
    }
  }
}

function inBox(boxId, contentId, addShadow) {
  // Show content from one element in another element
  var box     = document.getElementById(boxId);
  var content = document.getElementById(contentId);
  if (box && content) {
    box.innerHTML = content.innerHTML;
    if (addShadow) {
      box.innerHTML = shadowBox('<div class="inBox">'+box.innerHTML+'</div>', skinJS_ShadowType, 0, '');
    }
    posBox(boxId);
  }
}

var currentBox;
function posBox(boxId) {
  // Centre content box
  closeOpen();
  fadeBackground(1);
  var box = document.getElementById(boxId);
  box.style.visibility = 'visible';
  currentBox = boxId;

  var screenSizeValuesString = screenSize();
  var screenSizeValues = new Array();
  screenSizeValues = screenSizeValuesString.split(',');

  var left = (screenSizeValues[0] / 2) - (parseInt(box.style.width)  / 2); // + screenSizeValues[2];
  var top  = (screenSizeValues[1] / 2) - (parseInt(box.style.height) / 2) + (1 * screenSizeValues[3]);
  box.style.left = left + 'px';
  box.style.top  = top  + 'px';

  showCloseIcon(left, top, parseInt(box.style.width));
}

function showCloseIcon(left, top, width) {
  // Add 'close' icon
  var closeIcon = document.getElementById('closeIcon');
  if (closeIcon) {
    closeIcon.style.visibility = 'visible';
    closeIcon.style.left = (left - 33 + width) + 'px';
    closeIcon.style.top  = (top  +  5        ) + 'px';
  }
}

function personaliseProduct() {
  // Add personalisation to item directly on product page (before adding to cart)
  if (!addToCartSize) {
    updateOrderInfo('<strong>Please select a size to personalise this item</strong>');
    return;
  }
  var pn = document.getElementById('personalise');
  var pb = document.getElementById('persnBox');
  if (!pn || !pb) { return }

  // We could clear any existing personalisation if we don't want to re-use it
  //var currentPersn = document.getElementById('ba_Personalisation').value;
  //document.getElementById('ba_Personalisation').value = '';

  pn.innerHTML = pb.innerHTML;
  acceptPersn('REFRESH');
  posBox('personalise');
}

function acceptPersn(action) {
  // Accept on-page personalisation - prompt for any further action needed
  var buttonText = '';
  var persnOptions = document.getElementById('ba_Personalisation');

  if (document.getElementById('persnSize')) {
    document.getElementById('persnSize').innerHTML = addToCartSize.replace(/\.5/g, String.fromCharCode(189));
  }

  // Get current options to see if we've already accepted the terms
  var persnData = persnOptions.value.split(':');
  var type  = '';
  var text1 = '';
  var text2 = '';
  var crest = '';
  var terms = 0;
  if (persnData.length>0) { type  = persnData[0] }
  if (persnData.length>1) { text1 = persnData[1] }
  if (persnData.length>2) { text2 = persnData[2] }
  if (persnData.length>3) { crest = persnData[3] }
  if (persnData.length>4) { terms = persnData[4] }

  if (action == 'UPDATE') {
    // Get data from inputs
    if (document.getElementById('pText1')) { text1 = document.getElementById('pText1').value }
    if (document.getElementById('pText2')) { text2 = document.getElementById('pText2').value }
//    if (document.getElementById('pCrest')) { crest = document.getElementById('pCrest').value } // rax - this will need to check 'checked'
  }
  else if (action == 'CONTINUE') {
    // Get data from inputs
    if (document.getElementById('pText1')) { text1 = document.getElementById('pText1').value }
    if (document.getElementById('pText2')) { text2 = document.getElementById('pText2').value }
//    if (document.getElementById('pCrest')) { crest = document.getElementById('pCrest').value } // rax - this will need to check 'checked'
    if (text1 || text2) {
      // We've got personalisation details
      if (terms == 1) {
        // Add personalisation to product, close personalisation box
        keepOpen = '';
        closeOpen();
        // Set data in form on product page
        persnOptions.value = type+':'+text1+':'+text2+':'+crest+':'+terms;
        // Add product to basket
        updateBasket();
      }
    }
  }
  else if (action == 'ACCEPTTERMS' || action == 'REFRESH') {
    // Set data in inputs
    if (document.getElementById('pText1')) { document.getElementById('pText1').value = text1 }
    if (document.getElementById('pText2')) { document.getElementById('pText2').value = text2 }
//    if (document.getElementById('pCrest')) { document.getElementById('pCrest').value = crest } // rax - this will need to set 'checked'
    if (terms == 1) {
      buttonText = 'ADD PERSONALISATION TO PRODUCT';
    }
    else if (text1 || text2 || crest) {
      buttonText = 'CONTINUE TO TERMS AND CONDITIONS';
    }
    else {
      buttonText = 'ENTER YOUR PERSONALISATION OPTIONS';
    }
  }

  if ((action == 'CONTINUE' || action == 'REFRESH') && (!text1 && !text2 && !crest)) {
    buttonText = 'ENTER YOUR PERSONALISATION OPTIONS';
  }
  else if (action == 'ACCEPTTERMS') {
    // Accept terms
    terms = 1;
    buttonText = 'ADD PERSONALISATION TO PRODUCT';
    if (action == 'ACCEPTTERMS' && (text1 || text2)) {
      // We've got everything ...close box
      keepOpen = '';
      closeOpen();
      // Set data in form on product page
      persnOptions.value = type+':'+text1+':'+text2+':'+crest+':'+terms;
      // ...add product to basket
      updateBasket();
    }
    else {
      // ...go back to details
      showPanel('selectDetails','persnContents','persnDetails');
      acceptPersn('REFRESH');
      buttonText = 'ADD PERSONALISATION TO PRODUCT';
    }
  }
  else if (action == 'CONTINUE') {
    // Show terms
    buttonText = 'CONTINUE TO TERMS AND CONDITIONS';
    showPanel('selectTerms','persnContents','persnTerms');
  }
  else if (action == 'UPDATE') {
    // Store data but take no further action
    if (text1 || text2 || crest) {
      buttonText = 'CONTINUE TO TERMS AND CONDITIONS';
      }
    else {
      buttonText = 'ENTER YOUR PERSONALISATION OPTIONS';
    }
  }
  var button = document.getElementById('acceptPersnButton');
  if (button) {
    button.innerHTML   = buttonText;
  }
  // Set data in form on product page
  persnOptions.value = type+':'+text1+':'+text2+':'+crest+':'+terms;
}

function noPersn() {
  // Cancel on-page personalisation
  document.getElementById('ba_Personalisation').value='';
  keepOpen='';
  closeOpen();
}

function megaMenuPos(id) {
  // Position megaMenu div - this will depend directly on the tab position
  if (!id) { return }
  var tabs  = document.getElementById('megaMenuTabs');
  var menu  = document.getElementById('menu'+id);
  var mmbr  = document.getElementById('mmbr'+id); // Bottom right corner shadow of menu
  var arrow = document.getElementById('mmArrow'+id); // Arrow
  if (menu) {
    findPos(tabs);
    var tabLeft = posleft;
    var tabWidth    = 127;
    var shiftRight  = (id - 1) * tabWidth;
    menu.style.left = (tabLeft + shiftRight)+'px';
    var wasLeft = (tabLeft + shiftRight);
    findPos(mmbr);
    var mmbrLeft  = posleft;
    var menuRight = mmbrLeft - 10 - tabLeft;
    if (menuRight > 1000) {
      // Re-position menu so that it doesn't overlap the content edge
      shiftRight += 1000 - menuRight;
      menu.style.left = (tabLeft + shiftRight)+'px';
      arrow.style.left = (45 - 1000 + menuRight)+'px';
      // IE doesn't get the hint, so repeat the process
      findPos(mmbr);
      mmbrLeft  = posleft;
      menuRight = mmbrLeft - 10 - tabLeft;
      if (menuRight > 1000) {
        shiftRight += 1000 - menuRight;
        menu.style.left = (tabLeft + shiftRight)+'px';
        arrow.style.left = (45 - 1000 + menuRight)+'px';
      }
    }
  }
}

function shadowBox(content, option, withTicks, contentBg) {
  // Shadow box - note this duplicates the Perl function found in printpage.cgi
  var tick = '';
  if (withTicks) { tick = '-tick' }
  var size = 10;
  if (option.match(/big\//)) { size = 19 }
  var boxed = '<table cellpadding="0" cellspacing="0" border="0">\n';
  boxed += '  <tr>';
  boxed += '    <td><img src="images/shadow/'+option+'tl'+tick+'.png" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '    <td background="images/shadow/'+option+'t.png"><img src="images/mask.gif" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '    <td><img src="images/shadow/'+option+'tr'+tick+'.png" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '  </tr>\n';
  boxed += '  <tr>\n';
  boxed += '    <td width='+size+' background="images/shadow/'+option+'l.png"><img src="images/mask.gif" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '    <td'+contentBg+'>'+content+'</td>\n';
  boxed += '    <td width='+size+' background="images/shadow/'+option+'r.png"><img src="images/mask.gif" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '  </tr>\n';
  boxed += '  <tr>\n';
  boxed += '    <td><img src="images/shadow/'+option+'bl'+tick+'.png" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '    <td background="images/shadow/'+option+'b.png"><img src="images/mask.gif" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '    <td><img src="images/shadow/'+option+'br'+tick+'.png" width='+size+' height='+size+' border="0"></td>\n';
  boxed += '  </tr>\n';
  boxed += '</table>\n';
  return boxed;
}

function fadeBackground(onOff) {
  // Shows or hides dark background (for lightbox effect)
  // - also reposition page background if necessary
  // - also checks width of site and amends corner promotional image, if any
  if (onOff == 'move') {
    // Re-position
    var screenSizeValuesString = screenSize();
    var screenSizeValues = new Array();
    screenSizeValues = screenSizeValuesString.split(',');
    var scrOfY    = Math.floor(screenSizeValues[3]);
    document.getElementById('fade').style.top = scrOfY + 'px';
    var pageBg = document.getElementById('bg');
    if (pageBg) {
      // Also move main page bg and alter width - allow padding for scrollbar according to OS
      var pageWidth = Math.floor(screenSizeValues[0]);
      var shiftLeft = 8;
      var lessWidth = 15;
      if (navigator.platform.match(/Win/i)) {
        shiftLeft = 0;
        lessWidth = 0;
      }
      var left = parseInt((pageWidth / 2) - (1800 / 2)) - shiftLeft;
      var width = pageWidth + (- left - lessWidth);
      pageBg.style.left = left + 'px';
      pageBg.style.width = width + 'px';
    }
    var cornerPromo = document.getElementById('cornerPromo');
    var cornerPromoSmall = document.getElementById('cornerPromoSmall');
    if (cornerPromo && cornerPromoSmall) {
      // Make sure we have enough width for the main image, if not, show the smaller one - raxx: don't hardcode the widths...
      var pageWidth = Math.floor(screenSizeValues[0]);
      var lessWidth = 15;
      if (navigator.platform.match(/Win/i)) {
        lessWidth = 0;
      }
      var width = pageWidth - lessWidth;
      if (width < 1100) {
        // Hide both divs
        cornerPromo.style.visibility='hidden';
        cornerPromoSmall.style.visibility='';
      }
      else if (width < 1300) {
        // Show smaller div
        cornerPromo.style.visibility='hidden';
        cornerPromoSmall.style.visibility='visible';
      }
      else {
        // Show larger (default) div
        cornerPromo.style.visibility='visible';
        cornerPromoSmall.style.visibility='hidden';
      }
    }
    if (currentBox) {
      posBox(currentBox);
    }
    if (currentZoom) {
      posBox('zoomBox');
    }
  }
  else if (onOff) {
    // Fade on
    document.getElementById('fade').style.display = 'block';
  }
  else {
    // Fade off
    document.getElementById('fade').style.display = 'none';
  }
}

// Home page banner-slider and background-fader - trigger them together for each transition
function startHomeSlider(slideCount) {
  // Set up cycle
  var homeSlider = setInterval('homeSliderGo()', 7000); // 6 seconds + 1 second for the transition
}

var homeSliderCurrent  = 1;
var homeSliderMaxSlide = 4; // raxx - Set this dynamically
function homeSliderGo(slideNumber) {
  // Progress to requested (or next) slide
  var justGoToNext;
  if (!slideNumber) {
    justGoToNext = 1;
    slideNumber = homeSliderCurrent + 1;
    if (slideNumber > homeSliderMaxSlide) {
      slideNumber = 1;
    }
    homeSliderCurrent = slideNumber;
  }
  if (justGoToNext) {
    $('#bannerSlider').data('AnythingSlider').goForward();
    $('.dumbCrossFade .dumbItem').dumbCrossFade('next');
    //info('Slide: next ('+slideNumber+')');
  }
  else {
    //info('Slide: '+slideNumber);
    $('#bannerSlider').anythingSlider(slideNumber);
    // rax - WE NEED TO FORCE THE BACKGROUND TO GO TO THE CORRECT SLIDE :: Can we use the event 'slide_begin' from within AnythingSlider as a trigger?

    var options = {
      'slideChange' : function(currentSlideIndex) {
        alert('The slide ' + currentSlideIndex + ' is currently showing');
      }
    };
    $('.dumbCrossFade .dumbItem').dumbCrossFade(options);

    var mySlides = $('.dumbCrossFade .dumbItem').dumbCrossFade();
    mySlides.stop(); // stops the transitions
    mySlides.start(); // starts the transitions
    mySlides.jump(slideNumber); // jumps to numbered slide (zero based)
    //info('Slide: '+slideNumber);
  }
}

function chkPersnForm() {
  // Check personalisation form has at least one option filled in, and that the terms have been accepted
  var error = '';
  var gotDetails = 0;

  if (persnform.size) {
    if (persnform.size.selectedIndex<1) { error += 'Please select your size\n' }
  }

  if (persnform.colour) {
    if (persnform.colour.selectedIndex<1) { error += 'Please select your colour\n' }
  }

  if (persnform.tonguetext) {
    if (persnform.tonguetext.value) { gotDetails++ }
  }

  if (persnform.sidetext) {
    if (persnform.sidetext.value) { gotDetails++ }
  }

  if (persnform.LFCCrest) {
    if (persnform.LFCCrest.checked) { gotDetails++ }
  }

  if (persnform.nametext) {
    if (persnform.nametext.value) { gotDetails++ }
  }

  if (persnform.numbertext) {
    if (persnform.numbertext.value) { gotDetails++ }
  }

  if (!gotDetails) { error += 'Please enter your personalisation options\n' }

  if (persnform.persnterms) {
    if (!persnform.persnterms.checked) { error += 'Please check the box to show you agree with these terms\n' }
  }

  if (persnform.beforeChristmas) {
    if (!persnform.beforeChristmas.checked) { error += 'Please check the box to show you understand that this item will not be delivered before Christmas\n' }
  }

  if (error) {
    alert(error);
    return false;
  }
  return true;
}

function chkChr(field, type) {
  // Perform character checking on input
  var current = field.value;
  var checked = current;
  if (type==1) {
    checked = checked.replace(/[^a-z0-9\.\-\' ]+/gi, '');
    if (current != checked) {
      field.value = checked;
      alert('Please enter only letters, apostrophes (\'), spaces, dots (.) and dashes (-) here');
    }
  }
  else if (type==2) {
    checked = checked.replace(/[^0-9]+/g, '');
    if (current != checked) {
      field.value = checked;
      alert('Please enter only numbers here');
    }
  }
  checked = checked.toUpperCase();
  if (current != checked) {
    field.value = checked;
  }
}

function chkSendToFriendForm(myForm, infoDivID) {
  // Check send-to-friend form has at least one option filled in, and that the terms have been accepted
  var error = '';

  if (myForm.productId) {
    if (!myForm.productId.value) { error += 'No product selected\n' }
  }
  if (myForm.yourName) {
    if (!myForm.yourName.value) { error += 'Please enter your name\n' }
  }
  if (myForm.yourEmail) {
    if (!myForm.yourEmail.value) { error += 'Please enter your e-mail address\n' }
  }
  if (myForm.friendName) {
    if (!myForm.friendName.value) { error += 'Please enter your friend\'s name\n' }
  }
  if (myForm.friendEmail) {
    if (!myForm.friendEmail.value) { error += 'Please enter your friend\'s e-mail address\n' }
  }

  var infoDiv = document.getElementById(infoDivID);
  if (error) {
    if (infoDiv) {
      infoDiv.innerHTML = '<p class="warning">' + error.replace(/\n/g, '<br />') + '</p>';
    }
    else {
      alert(error);
    }
    return false;
  }

  // We've got all we need, pass action to server via AJAX, update form fields
  sendToFriendSubmit(['stfData__' + skinJS_SiteCode + '~' + myForm.productId.value + '~' + myForm.yourName.value + '~' + myForm.yourEmail.value + '~' + myForm.friendName.value + '~' + myForm.friendEmail.value], ['stfInfo']);
  if (myForm.friendName) { myForm.friendName.value = '' }
  if (myForm.friendEmail) { myForm.friendEmail.value = '' }
  return false; // We don't actually need to submit the form
}

var onPause;
function pauseAction(delay, action) {
  // Delay action for given time (ms)
  if (onPause) {
    clearTimeout(onPause);
  }
  onPause = setTimeout(action, delay);
}

function layoutChooserProduct(ProductID) {
  // Lays out a product for the chooser
  var productData  = new Array();
  if (!pD[ProductID]) {
    return '';
  }
  productData      = pD[ProductID].split('~');
  var ProductName  = productData[0];
  var link         = productData[1];
  var cost         = productData[2];
  var thumbnail    = productData[3];
  var bulkprice    = productData[4];
  var specialOffer = productData[5];
  var newProduct   = productData[6];
  var preOrder     = productData[7];
  var personalise  = productData[8];
  var productDetails = '';
  productDetails += '<div class="thumbPic" id="tP_'+ProductName+'" onmouseover="thumbControls('+ProductID+',1); setSkim('+ProductID+')" onmouseout="thumbControls('+ProductID+',0); unsetSkim()">';
  productDetails += '  <a href="javascript:thumbZoom('+ProductID+',1)" id="tZ_'+ProductID+'" class="thumbMagnify"><img src="images/zoom.png" width="22" height="22" border="0"></a>';
  if (specialOffer == 1) {
    productDetails += '  <a href="'+link+'"><img src="images/flash-special-offer.png" class="flashTopRight" width="80" height="80" border="0"></a>';
  }
  else if (newProduct == 1) {
    productDetails += '  <a href="'+link+'"><img src="images/flash-new-product.png" class="flashTopRight" width="80" height="80" border="0"></a>';
  }
  if (preOrder == 1) {
    productDetails += '  <a href="'+link+'"><img src="images/flash-pre-order.png" class="flashBottomRight" width="80" height="80" border="0"></a>';
  }
  productDetails += '  <a href="'+link+'" class="nice">'+thumbnail+'</a>';
  productDetails += '</div>';
//  productDetails += '<div class="thumbContent" id="tC_'+ProductName+'" onclick="top.location=\''+link+'\'">';
  productDetails += '<div class="thumbContent" id="tC_'+ProductName+'">';
  productDetails += '  <a href="'+link+'"><img src="images/mask.gif" style="position: absolute; top: 0px; left: 0px" width="223" height="82" border="0" alt=""></a>';
  if (skinJS_WithTicks) {
    productDetails += '  <img src="images/'+skinJS_PreImg+'tick-thumb-tl.gif" width="6" height="6" border="0" class="thumbTickTL">';
    productDetails += '  <img src="images/'+skinJS_PreImg+'tick-thumb-tr.gif" width="6" height="6" border="0" class="thumbTickTR">';
    productDetails += '  <img src="images/'+skinJS_PreImg+'tick-thumb-bl.gif" width="6" height="6" border="0" class="thumbTickBL">';
    productDetails += '  <img src="images/'+skinJS_PreImg+'tick-thumb-br.gif" width="6" height="6" border="0" class="thumbTickBR">';
  }
  productDetails += '  <p class="thumbProductName">'+ProductName+'</p>';
  productDetails += '  <p class="thumbContentPrice">'+cost+'</p>';
  if (bulkprice) {
    productDetails += '  <a href="'+link+'"><img src="images/'+skinJS_PreImg+'flash-multi-buy.png" class="flashRightPrice" width="60" height="16" border="0"></a>';
  }
  else if (personalise == 2) {
    productDetails += '  <a href="'+link+'"><img src="images/'+skinJS_PreImg+'flash-free-id.png" class="flashRightPrice" width="60" height="16" border="0"></a>';
  }
  else if (personalise == 1) {
    productDetails += '  <a href="'+link+'"><img src="images/'+skinJS_PreImg+'flash-personalise.png" class="flashRightPrice" width="60" height="16" border="0"></a>';
  }
  productDetails += '</div>';
  return productDetails;
}

var currentResults = '';
var count = 0;
function updateChooserResults() {
  // Updates content of chooser results - i.e. lists products in grid
  var newResults = document.getElementById('newResults'); // The content of this div is updated by the response to the AJAX function doQuickSearch
  var gotResults = document.getElementById('gotResults'); // This is used as a check to ensure that the above has finished loading

  var updateElement = 'quicksearchresults';
  if (skinJS_NewStyle) { updateElement = 'quickSearchUpdateResults' }

  var resultsDiv = document.getElementById(updateElement);
  if (!resultsDiv) {
    // Nowhere to display results
    return;
  }
  var readyToUpdate = 0;
  if (newResults && gotResults) {
    if (gotResults.innerHTML == 1) {
       readyToUpdate = 1;
      gotResults.innerHTML = '';
    }
  }
  if (readyToUpdate == 1) {
    // Update results
    var showProducts = '';
    var pidList = newResults.innerHTML; // IE doesn't seem to maintain this if we don't take a copy here
    if (newResults.innerHTML.match(/^[\d\,]+/)) {
      showProducts = resultsGrid(newResults.innerHTML, 1);
    }
    else if (!newResults.innerHTML) {
      showProducts = '<p>No products match the selected options.</p>';
    }
    else {
      showProducts = newResults.innerHTML;
    }
    resultsDiv.innerHTML = showProducts;

    var finalResultsDiv = document.getElementById('quicksearchresults');
    if (finalResultsDiv) {
      // Show new results and un-fade grid
      finalResultsDiv.innerHTML = resultsDiv.innerHTML;
      finalResultsDiv.style.opacity = 1;
      finalResultsDiv.style.MozOpacity = 1;
      finalResultsDiv.style.filter='alpha(opacity=100)';
    }
    currentResults = pidList; // Used for pagination
    newResults.innerHTML = ''; // Blank current results list so we can check when we've got new content
    gotResults.innerHTML = '0';
    count = 0; // Re-set count ready for next update
  }
  else {
    // Try again shortly...
    count++;
    if (count<1000) {
      setTimeout('updateChooserResults()', 25);
    }
  }
}

function resultsPage(page) {
  // Show requested page of results - get list of ProductID's from global 'currentResults'
  var pageOfResults = resultsGrid(currentResults, page);
  var resultsDiv = document.getElementById('quicksearchresults');
  if (resultsDiv) {
    resultsDiv.innerHTML = pageOfResults;
  }
}

function resultsGrid(pidList, page) {
  // Layout products in grid from supplied list of ProductID's
  var pidsTemp = new Array();
  pidsTemp = pidList.split(',');

  // Strip out any ProductID's for which we have no data
  // We could prevent this happening by ensuring we don't return results for products we don't already have in the results from chooser.cgi
  // HOWEVER - note that the QuickSearch results caching actually benefits from the current practice of returning all products from a more generic query
  pidList = '';
  for (var i = 0; i <= pidsTemp.length; i++) {
    if (!pidsTemp[i] || !pD[pidsTemp[i]]) { continue }
    pidList += pidsTemp[i] + ',';
  }
  pidList = pidList.replace(/,$/, '');
  var pids = new Array();
  pids = pidList.split(',');

  if (!page) { page = 1 }
  var showProducts = '';

  var cols = 3; // _ Would be good to get these from skinned values
  var rows = 5; //
  var rpp = cols * rows; // Results per page will be cols x rows
  var col  = 1;
  var shownProducts = 0;

  var results = pids.length;
  if (!pids[0]) { results = 0 }
  var from = 1;
  var to = results;

  var pagelinks = '<p class="pagelinks">';
  if (!results)
    {
    pagelinks += 'No products match your options.';
    }
  else if (results == 1)
    {
    pagelinks += 'Showing 1 matching product';
    }
  else if (results <= rpp)
    {
    pagelinks += 'Showing all '+results+' products';
    }
  else if (page == 'all')
    {
    pagelinks += 'Showing all '+results+' products';
    }
  else if (results > rpp)
    {
    // Show page links (only show up to 5 links)
    to   = page * rpp;
    from = to - rpp + 1;
    if (to > results) { to = results }
    pagelinks += 'Showing '+from+'-'+to+' of '+results+' products - ';
    var onPage = 1;
    pagelinks += ' Page ';
    var pages = parseInt((results - 1) / rpp) + 1;
    var diff = 2;
    if (page == 2 || page + 1 == pages) { diff = 3 }
    else if (page <= 1 || page == pages) { diff = 4 }
    while (((onPage - 1) * rpp) < results)
      {
      if (pages <= 5 || Math.abs(onPage - page) <= diff)
        {
        if (onPage == page || (onPage == 1 && !page)) { pagelinks += '<span class="pgon">'+onPage+'</span> ' }
        else { pagelinks += '<a href="javascript:resultsPage('+onPage+')" class="pg">'+onPage+'</a> ' }
        }
      onPage++;
      }
    pagelinks += ' <a href="javascript:resultsPage(\'all\')" class="pg">Show All</a>';
    }
  pagelinks += '</p>';

  for (var i = from-1; i < to; i++) {
    if (!pids[i]) { continue }
    var productCell = layoutChooserProduct(pids[i]);
    if (!productCell) { continue }
    shownProducts++;
    if (col == 1) {
      showProducts += '<tr>';
    }
    showProducts += '<td>' + productCell + '</td>';
    col++;
    if (col > cols) {
      showProducts += '</tr>';
      col = 1;
    }
  }
  if (shownProducts <= cols) {
    // Show blank cells to maintain layout
    for(var i=col; i <= cols; i++) {
      showProducts += '<td><div class="thumbBlank">&nbsp;</div></td>';
    }
  }
  showProducts = '<table cellpadding="0" cellspacing="0" border="0" width="716">' + showProducts + '</table>';
  var showing = '';
  if (shownProducts == 0)      { showing = 'no matching products' }
  else if (shownProducts == 1) { showing = '1 matching product' }
  else                       { showing = pids.length + ' matching products' }

  if (results) { return pagelinks + showProducts + pagelinks }
  else { return pagelinks }
}


// AJAX - Update currency on server
function changeCurrency(currency) {
// Change the currency and reload the current page
doUpdateCurrency(['currencyData__' + currency], ['basketSummary']);
updateCompactBasket();
}

function doUpdateCurrency() {
var args = doUpdateCurrency.arguments;
for( var i=0; i<args[0].length;i++ ) { args[0][i] = fnsplit(args[0][i]); }
var l = ajax.length;
ajax[l]= new pjx(args,"ajax_basket",args[2]);
ajax[l].url = 'cgi-bin/currencyupdate.cgi?' + ajax[l].url;
ajax[l].send2perl();
}

var underTest = 0;
function printMegaMenus() {
  // Initialize Mega Menus
  for (var i=1; i<=8; i++) {
    printMegaMenu(i);
    if (underTest) { break }
  }
}

function printMegaMenu(menuId) {
  // Prints mega-menu directly onto page - i.e. do this at page load time so the menu is ready for use, NOT on demand when the menu is opened
  // Pulls content from separate script which is refreshed with arrays of menu items
  document.write('<div id="menu'+menuId+'" class="megaMenu" onmouseover="menuStayOpen=2" onmouseout="menuStayOpen=0">');
  document.write('<img src="images/'+skinJS_PreImg+'menuArrow.png" width="18" height="14" border="0" class="megaMenuArrow" id="mmArrow'+menuId+'">');
  document.write('<table cellpadding="0" cellspacing="0" border="0">');
  document.write('  <tr>');
  document.write('    <td><img src="images/shadow/faint/tl.png" width="10" height="10" border="0"></td>');
  document.write('    <td background="images/shadow/faint/t.png"><img src="images/mask.gif" width="10" height="10" border="0"></td>');
  document.write('    <td><img src="images/shadow/faint/tr.png" width="10" height="10" border="0"></td>');
  document.write('  </tr>');
  document.write('  <tr>');
  document.write('    <td width="10" background="images/shadow/faint/l.png"><img src="images/mask.gif" width="10" height="10" border="0"></td>');
  document.write('    <td class="megaMenuContent">');
  if (skinJS_WithTicks) {
    document.write('      <table cellpadding="0" cellspacing="0" border="0">');
    document.write('        <tr>');
    document.write('          <td><img src="images/'+skinJS_PreImg+'tick-tl.gif" width="6" height="6" border="0" class="menuTick"></td>');
    document.write('          <td><img src="images/mask.gif" width="6" height="6" border="0"></td>');
    document.write('          <td><img src="images/'+skinJS_PreImg+'tick-tr.gif" width="6" height="6" border="0" class="menuTick"></td>');
    document.write('        </tr>');
    document.write('        <tr>');
    document.write('          <td><img src="images/mask.gif" width="6" height="6" border="0"></td>');
    document.write('          <td>');
  }
  document.write('            <table cellpadding="0" cellspacing="0" border="0">');
  document.write('              <tr valign="top">');

  // Use global array
  var menuLines = '';
  var inDiv = 0;
  for (var i=0; i<megaMenuItems[menuId].length; i++) {
    var lineItems = new Array();
    lineItems = megaMenuLine(megaMenuItems[menuId][i], inDiv);
    menuLines += lineItems[0];
    inDiv = lineItems[1];
    if (underTest && i>=2) { break }
  }
  document.write(menuLines);

  document.write('              </tr>');
  document.write('            </table>');
  if (skinJS_WithTicks) {
    document.write('          </td>');
    document.write('          <td><img src="images/mask.gif" width="6" height="6" border="0"></td>');
    document.write('        </tr>');
    document.write('        <tr>');
    document.write('          <td><img src="images/'+skinJS_PreImg+'tick-bl.gif" width="6" height="6" border="0" class="menuTick"></td>');
    document.write('          <td><img src="images/mask.gif" width="6" height="6" border="0"></td>');
    document.write('          <td><img src="images/'+skinJS_PreImg+'tick-br.gif" width="6" height="6" border="0" class="menuTick"></td>');
    document.write('        </tr>');
    document.write('      </table>');
  }
  document.write('    </td>');
  document.write('    <td width="10" background="images/shadow/faint/r.png"><img src="images/mask.gif" width="10" height="10" border="0"></td>');
  document.write('  </tr>');
  document.write('  <tr>');
  document.write('    <td><img src="images/shadow/faint/bl.png" width="10" height="10" border="0"></td>');
  document.write('    <td background="images/shadow/faint/b.png"><img src="images/mask.gif" width="10" height="10" border="0"></td>');
  document.write('    <td><img src="images/shadow/faint/br.png" id="mmbr'+menuId+'" width="10" height="10" border="0"></td>');
  document.write('  </tr>');
  document.write('</table>');
  document.write('</div>');
}

function megaMenuLine(menuLine, inDiv) {
  // Outputs HTML for supplied menu item
  var menuItem = '';
  var itemData = [];
  itemData = menuLine.split(':');
  var text = itemData[0];
  var link = itemData[1];
  if (text == 'BLANKLINE') {
    menuItem += '&nbsp;<br />';
  }
  else if (text == 'sH' && link) {
    // Sub-heading
    menuItem += '<strong class="ffSubHeading">'+link+'</strong><br />';
  }
  else if (text == 'H' && link) {
    // Start new block
    if (inDiv)
      {
      // End current block
      menuItem += '</td>';
      }
    menuItem += '<td class="megaMenuContentBlock">';
    menuItem += '<strong class="ffHeading">'+link+'</strong><br />';
    inDiv = 1;
  }
  else {
    // Menu item
    menuItem += '<a href="'+link+'" class="mmLink">'+text+'</a><br />';
  }
  return[menuItem, inDiv];
}

function updateOrderInfo(info) {
  // Updates content of orderInfo div (if present)
  var orderInfo = document.getElementById('orderInfo');
  if (orderInfo) {
    if (!info) { info = '&nbsp;' }
    orderInfo.innerHTML = info;
  }
}

// Checkout functions, moved from Perl scripts
var warned = 0;

function checkBFPO() {
  // Checks if a BFPO postcode has been entered
  var orderForm = document.getElementById('orderForm');
  if (orderForm) {
    if (orderForm.addpostcode.value.match(/BFPO/i)) {
      if (!warned) {
        alert('BFPO Orders\n\nPlease leave country as United Kingdom\nfor correct carriage calculation.\n\nWe do not need to know where you are stationed');
        warned = 1;
      }
      orderForm.addcountry.selectedIndex = 0;
    }
  }
}

function checkOrder(limitTitleChoice, LFCCustomerFields, CustomerID, okForAlternateDeliery, checkBillingCountry, checkDeliveryCountry, checkDeliveryPostcode, checkoutStage) {
  // Checks form to see if we are missing any information or if we need to reload (e.g. for different shipping location)
  //
  // SAFARI SUBMISSION PROBLEMS - See: https://bugs.webkit.org/show_bug.cgi?id=13012
  
  // Single-page checkout (i.e. checkoutStage == 0) - account and address data - use checkoutStage = 2
  //if (!checkoutStage) { checkoutStage = 2 }
  
  // Stage 1 - No validation
  // Stage 2 - Account details, delivery address, billing address
  // Stage 3 - No validation
  // Stage 4 - Payment details
  var error = 'Order form not found.';
  var focusme = '';
  var orderForm = document.getElementById('orderForm');
  var del_addCountry = document.getElementById('del_addCountry');

  if (orderForm) {
    error = '';
    if (!checkoutStage || checkoutStage == 2) {
      var accountDetailsError  = '';
      var billingAddressError  = '';
      var deliveryAddressError = '';
    
      if (limitTitleChoice) {
        // Check for 'select' title
        var titleSelect = document.getElementById('title');
        if (titleSelect) {
          if (titleSelect.selectedIndex<1) { accountDetailsError += ' * Your title\n'; if (!focusme) { focusme = 'title' } }
        }
      }
      else {
        // Check for 'text' title
        if (!inputValue('title', '', 0)) { accountDetailsError += ' * Your title\n'; if (!focusme) { focusme = 'title' } }
      }
  
      if (!inputValue('firstname', '', 0)) { accountDetailsError += ' * Your first name\n'; if (!focusme) { focusme = 'title' } }
      if (!inputValue('surname', '', 0)) { accountDetailsError += ' * Your surname\n'; if (!focusme) { focusme = 'title' } }
      
      if (LFCCustomerFields) {
        // Test LFC required fields
        if (!orderForm.Gender[0].checked && !orderForm.Gender[1].checked) { accountDetailsError += ' * Your gender\n' }
        if (orderForm.DoB_Day.selectedIndex<1) { accountDetailsError += ' * Your day of birth\n'; if (!focusme) { focusme = 'DoB_Day' } }
        if (orderForm.DoB_Month.selectedIndex<1) { accountDetailsError += ' * Your month of birth\n'; if (!focusme) { focusme = 'DoB_Month' } }
        if (orderForm.DoB_Year.selectedIndex<1) { accountDetailsError += ' * Your year of birth\n'; if (!focusme) { focusme = 'DoB_Year' } }
      }
      
      if (!inputValue('phone', '', 0)) { accountDetailsError += ' * Your daytime phone number\n'; if (!focusme) { focusme = 'phone' } }
      if (!CustomerID) {
        // Check details for new customers
        if (!inputValue('password', '', 0)) {
          accountDetailsError += ' * Please enter a password\n'; if (!focusme) { focusme = 'password' }
        }
        else if (!inputValue('repeatpassword', '', 0)) {
          accountDetailsError += ' * Please repeat your password\n'; if (!focusme) { focusme = 'repeatpassword' }
        }
        else if (inputValue('password', '', 0) != inputValue('repeatpassword', '', 0)) {
          accountDetailsError += ' * Your passwords do not match\n'; if (!focusme) { focusme = 'repeatpassword' }
        }
        if (!inputValue('passwordreminder', '', 0)) {
          accountDetailsError += ' * Please enter a password reminder\n'; if (!focusme) { focusme = 'passwordreminder' }
        }
      }
      
      var needaddress = 0;
      if (!inputValue('addbuilding', '', 0)) { needaddress += 3; if (!focusme) { focusme = 'addbuilding' } }
      if (!inputValue('addstreet', '', 0)  ) { needaddress += 1; if (!focusme) { focusme = 'addstreet'   } }
      if (!inputValue('addtown', '', 0)    ) { needaddress += 1; if (!focusme) { focusme = 'addtown'     } }
      if (!inputValue('addcounty', '', 0)  ) { needaddress += 1; if (!focusme) { focusme = 'addcounty'   } }
      if (needaddress > 2) {
        billingAddressError += ' * Your full ' + (checkoutStage ? 'billing' : 'invoice') + ' address\n';
        if (checkoutStage) {
          if (!focusme) { focusme = 'del_addbuilding' }
          else if (focusme.match(/^add/)) { focusme = 'del_' + focusme }
        }
      }
      if (!inputValue('addpostcode', '', 0)) {
        billingAddressError += ' * Your postcode or ZIP code\n'; if (!focusme) { focusme = 'addpostcode' }
      }
      var reload = '';
      if (!checkoutStage) {
        // Check to see if we need to reload due to change of billing country
        if (checkBillingCountry) {
          if (orderForm.addcountry[orderForm.addcountry.selectedIndex].text != checkBillingCountry) {
            reload += ' * Invoice country has changed\n';
          }
        }
        else if (orderForm.addcountry[orderForm.addcountry.selectedIndex].text != 'United Kingdom') {
          reload += ' * Invoice country has changed\n';
        }
      }
      
      if (okForAlternateDeliery) {
        // Check delivery address fields
        var needdeladd = 0;
        var deliveryAddressID = inputValue('deladdid', '', 0); // This will be 'undefined' unless we're showing alternate addresses
        var notUsingBillingAddressForDelivery = 0;
        if (document.getElementById('useDeliveryAsBilling')) {
          // Staged checkout control exists
          notUsingBillingAddressForDelivery = !billingFromDelivery('get');
        }
        if ((deliveryAddressID && deliveryAddressID != 0) || notUsingBillingAddressForDelivery) {
          if (!inputValue('del_addreference', '', 0)) { deliveryAddressError += ' * Reference for this delivery address, e.g. "Work" or "Dad\'s house"\n'; if (!focusme) { focusme = 'del_addreference' } }
          if (!inputValue('del_addname',      '', 0)) { deliveryAddressError += ' * Name of person to whom delivery is to be made\n'; if (!focusme) { focusme = 'del_addname' } }
          if (!inputValue('del_addbuilding',  '', 0)) { needdeladd += 3; if (!focusme) { focusme = 'del_addbuilding' } }
          if (!inputValue('del_addstreet',    '', 0)) { needdeladd += 1; if (!focusme) { focusme = 'del_addstreet' } }
          if (!inputValue('del_addtown',      '', 0)) { needdeladd += 1; if (!focusme) { focusme = 'del_addtown' } }
          if (!inputValue('del_addcounty',    '', 0)) { needdeladd += 1; if (!focusme) { focusme = 'del_addcounty' } }
          if (needdeladd > 2) { deliveryAddressError += ' * Full delivery address\n' }
          if (!inputValue('del_addpostcode',  '', 0)) { deliveryAddressError += ' * Delivery address postcode\n'; if (!focusme) { focusme = 'del_addpostcode' } }
          if (!inputValue('del_addphone',     '', 0)) { deliveryAddressError += ' * Delivery phone number\n'; if (!focusme) { focusme = 'del_addphone' } }
        }
  
        if (!checkoutStage) {
          // Check to see if we need to reload due to change of delivery address
          if (checkDeliveryCountry) {
            if (g_changedDelAdd && orderForm.addcountry[del_addCountry.selectedIndex].text != checkDeliveryCountry) {
              reload += ' * Delivery country has changed\n';
            }
          }
          else if (g_changedDelAdd && orderForm.addcountry[del_addCountry.selectedIndex].text != 'United Kingdom') {
            reload += ' * Delivery country has changed\n';
          }
          if (g_changedDelAdd && orderForm.addcountry[del_addCountry.selectedIndex].text == 'United Kingdom' && orderForm.del_addpostcode.value != checkDeliveryPostcode) {
            reload += ' * Delivery postcode has changed\n';
          }
        }
      }
    
      // Combine error messages
      if (accountDetailsError) {
        accountDetailsError = '\n-- Your account details:\n' + accountDetailsError;
      }
      if (deliveryAddressError) {
        deliveryAddressError = '\n-- Your delivery address:\n' + deliveryAddressError;
      }
      if (billingAddressError) {
        billingAddressError = '\n-- Your ' + (checkoutStage ? 'billing' : 'invoice') + ' address:\n' + billingAddressError;
      }
      error = accountDetailsError;
      if (checkoutStage) {
        error += deliveryAddressError + billingAddressError;
      }
      else {
        error += billingAddressError + deliveryAddressError;
      }
    }
    if (!checkoutStage || checkoutStage == 4) {
      // Payment details stage
      var paymentchoice = inputValue('paymentchoice', '', 0);
      if (!paymentchoice) {
        var paymentDetailsError = '';
        var selectedCardType = '';
        if (!inputValue('cardname', '', 0)) { paymentDetailsError += ' * Your name as printed on the payment card\n'; if (!focusme) { focusme = 'cardname' } }
        var cardType = document.getElementById('cardType');
        if (cardType) {
          if (cardType.selectedIndex < 1) { paymentDetailsError += ' * The type of your payment card\n'; if (!focusme) { focusme = 'cardType' } }
          else { selectedCardType = cardType[cardType.selectedIndex].value }
        }
        else { paymentDetailsError += 'No card type selection.\n' }
        if (!inputValue('cardno', '', 0)  ) { paymentDetailsError += ' * The long card number\n';      if (!focusme) { focusme = 'cardno'   } }
        var expireMonth = document.getElementById('expireMonth');
        if (expireMonth) {
          if (expireMonth.selectedIndex<1) { paymentDetailsError += ' * The expiry month\n'; if (!focusme) { focusme = 'expiremonth' } }
        }
        else { paymentDetailsError += 'No card expiry month selection.\n' }
        var expireYear = document.getElementById('expireYear');
        if (expireYear) {
          if (expireYear.selectedIndex<1) { paymentDetailsError += ' * The expiry year\n'; if (!focusme) { focusme = 'expireyear' } }
        }
        else { paymentDetailsError += 'No card expiry year selection.\n' }
        if (!inputValue('securitynos', '', 0)) { paymentDetailsError += ' * The final 3 digits of the security number\non the back of the card\n'; if (!focusme) { focusme = 'securitynos' } }
        if (selectedCardType.match(/Switch|Maestro|Solo/)) {
          // Card-specific checks
          var soloError = '';
          var needMoreDetails = 1;
          var startMonth = document.getElementById('startMonth');
          if (startMonth) {
            if (startMonth.selectedIndex<1) { soloError += ' * The start month\n'; if (!focusme) { focusme = 'startmonth' } }
          }
          else { soloError += 'No card start month selection.\n' }
          var startYear = document.getElementById('startYear');
          if (startYear) {
            if (startYear.selectedIndex<1) { soloError += ' * The start year\n'; if (!focusme) { focusme = 'startyear' } }
          }
          else { soloError += 'No card start year selection.\n' }
          if (!soloError) { needMoreDetails = 0 }
          if (needMoreDetails) {
            if (!inputValue('cardissue', '', 0)) { soloError += ' * The card issue number\n'; if (!focusme) { focusme = 'cardissue' } }
          }
          if (soloError) { paymentDetailsError += soloError }
        }
        if (paymentDetailsError) {
          error += '\n-- Your payment card details:\n' + paymentDetailsError;
        }
      }
    }

    if (error) {
      alert('Please make sure that you fill in all information:\n\n' + error);
      if (focusme) { eval('orderForm.'+focusme+'.focus()') }
      return false;
    }
    
    if (reload) {
      // Warn customer then continue
      alert('We need to re-calculate your basket total because:\n\n' + reload);
      orderForm.reload.value = 1;
    }
    
    // alert('under test - true = false\n\n'+error); return false;
    
    // Disable submit button
    var submitButton = document.getElementById('orderFormSubmitButton');
    if (submitButton) {
      submitButton.disabled = true;
      }

    return true;
  }
  alert('Order form error.');
  return false;
}

var deladd = new Array();

var g_changedDelAdd = 0; // Track if we've dynamically changed the delivery address
var g_addid = 0;

function updateDelAdd(addid) {
  // Update delivery address from list of addresses
  var orderForm = document.getElementById('orderForm');
  var del_addCountry = document.getElementById('del_addCountry');
  if (addid == 0) {
    // Use invoice address
    inputValue('del_addreference', '', 1);
    inputValue('del_addname',      orderForm.title.value+' '+orderForm.firstname.value+' '+orderForm.surname.value, 1);
    inputValue('del_addbuilding',  orderForm.addbuilding.value, 1);
    inputValue('del_addstreet',    orderForm.addstreet.value, 1);
    inputValue('del_addtown',      orderForm.addtown.value, 1);
    inputValue('del_addcounty',    orderForm.addcounty.value, 1);
    inputValue('del_addpostcode',  orderForm.addpostcode.value, 1);
    inputValue('del_addphone',     orderForm.phone.value, 1);
    del_addCountry.selectedIndex = orderForm.addcountry.selectedIndex;
    billingFromDelivery('on');
    }
  else if (addid == -1) {
    // Create new delivery address
    inputValue('del_addreference', '', 1);
    inputValue('del_addname',      '', 1);
    inputValue('del_addbuilding',  '', 1);
    inputValue('del_addstreet',    '', 1);
    inputValue('del_addtown',      '', 1);
    inputValue('del_addcounty',    '', 1);
    inputValue('del_addpostcode',  '', 1);
    inputValue('del_addphone',     '', 1);
    del_addCountry.selectedIndex = 0;
    billingFromDelivery('off');
    }
  else {
    // Use stored address
    var address = new Array();
    address = deladd[addid].split('~');
    inputValue('del_addreference', address[0], 1);
    inputValue('del_addname',      address[1], 1);
    inputValue('del_addbuilding',  address[2], 1);
    inputValue('del_addstreet',    address[3], 1);
    inputValue('del_addtown',      address[4], 1);
    inputValue('del_addcounty',    address[5], 1);
    inputValue('del_addpostcode',  address[6], 1);
    inputValue('del_addphone',     address[8], 1);
    billingFromDelivery('off'); // Keep here as the following 'break' will prevent us running anything after it
    for(var i=0; i<del_addCountry.length; i++) {
      if (del_addCountry[i].text==address[7]) {
        del_addCountry.selectedIndex=i;
        break;
      }
    }
  }
g_changedDelAdd = 1;
g_addid = addid;
}

// Initialise arrays - we'll populate them on first use
var inputs  = new Array();
var selects = new Array();

function inputValue(fieldName, setValue, forceSet) {
  // Returns the value of the named form field
  // If passed setValue, sets the field value
  // If passed forceSet, sets the field value even if setValue is blank
  
  if (!inputs[0]) {
    // Populate input arrays
    inputs  = document.getElementsByTagName('input');
    selects = document.getElementsByTagName('select');
  }
  
  var returnValue;
  for (var i=0; i < inputs.length; i++) {
    if (inputs[i].getAttribute('name') == fieldName) {
      if (inputs[i].getAttribute('type') == 'text' || inputs[i].getAttribute('type') == 'hidden' || inputs[i].getAttribute('type') == 'password') {
        if (setValue || forceSet) {
          inputs[i].value = setValue;
        }
        returnValue = inputs[i].value;
        break;
      }
      else if (inputs[i].getAttribute('type') == 'checkbox' || inputs[i].getAttribute('type') == 'radio') {
        if (inputs[i].checked) {
          returnValue = inputs[i].value;
          break;
        }
      }
    }
  }
  return returnValue;
}

function validateStagedCheckout(stage) {
  // Pre-submission validation of staged checkout forms
  if (stage == 2) {
    // Validation for stage 2
    
    // Update billing address
    billingFromDelivery('set');
    checkBFPO();
  }
}

var g_billingAddress = new Array(); // Global array to be set before the following is called

function billingFromDelivery(action) {
  // Toggle setting of billing address from delivery address (or action to 'on' if action == 'on', or 'off' if action == 'off')
  var controlImage = document.getElementById('useDeliveryAsBilling');
  if (!controlImage) {
    return 0;
  }
  var addressFields = ['addBuilding', 'addStreet', 'addTown', 'addCounty', 'addPostcode'];
  var deliveryExtraFields = ['delAddReference', 'delAddName', 'delAddPhone'];
  if (controlImage) {
    var isSet = controlImage.src.match('-on') ? 1 : 0;
    if (action == 'get') {
      // Return current setting
      return isSet;
    }
    if      (action == 'on')  { isSet = 0 } // Force on
    else if (action == 'off') { isSet = 1 } // Force off
    else if (action == 'set') { isSet = 1 - isSet } // Keep current setting, update fields
    
    var addCountry     = document.getElementById('addCountry');
    var del_addCountry = document.getElementById('del_addCountry');

    var in_useBillingForDelivery = document.getElementById('in_useBillingForDelivery');
    if (isSet) {
      // Toggle to off:
      // - De-select control image
      controlImage.src = controlImage.src.replace(/-(on|off)/, '-off');
      // - Reset delivery country
      del_addCountry.selectedIndex = 0;
      for(var i=0; i < del_addCountry.length; i++) {
        if (del_addCountry[i].text == g_billingAddress[5]) {
          del_addCountry.selectedIndex=i;
          break;
        }
      }
      // - Enable delivery county control
      del_addCountry.disabled = false;
      // - Update extra delivery address fields by (re-)setting the delivery address to the current AddressID
      if ((!action || action == 'set') && g_addid && g_addid != -1) {
        updateDelAdd(g_addid);
      }
      // - Unset input ready for form submission
      in_useBillingForDelivery.value = '0';
    }
    else {
      // Toggle to on:
      // - Select control image
      controlImage.src = controlImage.src.replace(/-(on|off)/, '-on');
      // - Set billing county from delivery address
      del_addCountry.selectedIndex = addCountry.selectedIndex;
      // - Disable billing county control
      del_addCountry.disabled = true;
      // - Set input ready for form submission
      in_useBillingForDelivery.value = '1';
    }
    
    // Update delivery address - set to (existing) billing or delivery address according to isSet
    var arrayIndex = 0;
    for (var i = 0; i < addressFields.length; i++) {
      var billingAddressField  = document.getElementById(addressFields[i]);
      var deliveryAddressField = document.getElementById('del_' + addressFields[i]);
      if (billingAddressField) {
        if (!isSet) { deliveryAddressField.value = billingAddressField.value }
        deliveryAddressField.disabled  = isSet ? false : true;
        deliveryAddressField.className = isSet ? 'glowForce' : 'readonlyGlow';
      }
      arrayIndex++;
    }
    // Enable or disable extra delivery address fields
    for (var i = 0; i < deliveryExtraFields.length; i++) {
      var billingAddressExtraField = document.getElementById(deliveryExtraFields[i]);
      if (billingAddressExtraField) {
        billingAddressExtraField.disabled  = isSet ? false : true;
        billingAddressExtraField.className = isSet ? 'glowForce' : 'readonlyGlow';
        if (!isSet) {
          // Also blank extra fields...
          billingAddressExtraField.value = '';
        }
      }
    }
  }
}
