// featured products scrolling list
// copyright 2010 Leisure Time Inc
// uses focus.js, addEvent.js, domReady.js

featlist_areas = {};

function featlist_reglist(featlist, featscroll) {
  var featarea = firstkid(featscroll, 'div');
  if (!featarea) return;
  var products = allkids(featarea, 'div', 'pr');
  if (!products.length) return;
  var prodWidth = products[0].offsetWidth;
  var pageWidth = featscroll.offsetWidth;
  var prodPerPage = Math.floor(pageWidth / prodWidth);
  var nPages = Math.ceil(products.length / prodPerPage);
  pageWidth = prodWidth * prodPerPage;
  if (nPages < 2) return;

  var areainfo = {
    'pagewidth': pageWidth,
    'npages': nPages,
    'x': prodWidth,
    'xtarget': 0
  };

  featscroll.id = featlist.id + '_spane';
  var prevButton = makeEl('a', {'class': 'btn prev'});
  prevButton.appendChild(makeEl('img', {'alt': 'previous', 'src': base_href+'g/featprev200.png'}));
  var nextButton = makeEl('a', {'class': 'btn next'});
  nextButton.appendChild(makeEl('img', {'alt': 'next', 'src': base_href+'g/featnext200.png'}));
  addEvent(prevButton, 'click', featlist_mkscrollby(featlist.id, -1));
  prevButton.style.visibility = 'hidden';
  addEvent(nextButton, 'click', featlist_mkscrollby(featlist.id, 1));
  
  featlist.insertBefore(prevButton, featscroll);
  if (featscroll.nextSibling) {
    featlist.insertBefore(nextButton, featscroll.nextSibling);
  } else {
    featlist.appendChild(nextButton);
  }

  featlist_areas[featlist.id] = areainfo;
}

function featlist_mkdostep(id) {
  var f = function() {
    var areainfo = featlist_areas[id];
    if (!areainfo.pagewidth) return;
    var el = document.getElementById(id);
    var featscroll = el ? firstkid(el, 'div', 'featscroll') : null;
    var featarea = el ? firstkid(featscroll, 'div') : null;
    if (!featarea) return;
    var distLeft = areainfo.x - areainfo.xtarget;
    if (distLeft == 0) return;
    
    // 2010-05-19: Using setTimeout instead of setInterval because
    // Safari for Mac OS X appears to forget setInterval tasks when
    // coming back to this page through the back button
    window.setTimeout(f, 30);

    if (Math.abs(distLeft) < 4) {
      distLeft = 0;
    } else if (Math.abs(distLeft) < 8) {
      distLeft /= 2;
    } else if (distLeft > -32 && distLeft < 0) {
      distLeft += 8;
    } else if (distLeft > 0 && distLeft < 32) {
      distLeft -= 8;
    } else {
      distLeft = distLeft * 3 / 4;
    }
    areainfo.x = areainfo.xtarget + distLeft;
    featarea.style.left = '-'+Math.round(areainfo.x)+"px";
  };
  return f;
}

function featlist_mkscrollby(id, pageoffset) {
  return function() {
    var ar = featlist_areas[id];
    if (!ar) return;
    ar.xtarget += ar.pagewidth * pageoffset;
    var maxscroll = ar.pagewidth * (ar.npages - 1)
    var rvis = 'visible';
    var lvis = 'visible';
    if (ar.xtarget >= maxscroll) {
      ar.xtarget = maxscroll;
      rvis = 'hidden';
    }
    if (ar.xtarget <= 0) {
      ar.xtarget = 0;
      lvis = 'hidden';
    }
    featlist_mkdostep(id)();
    var featlist = document.getElementById(id);
    var featscroll = featlist ? firstkid(featlist, 'div', 'featscroll') : null;
    var l = featlist ? firstkid(featlist, 'a', 'prev') : null;
    var r = featlist ? firstkid(featlist, 'a', 'next') : null;
    if (l && l.style) l.style.visibility = lvis;
    if (r && r.style) r.style.visibility = rvis;
  };
}

function featlist_init() {
  if (!document.getElementById
      || !document.getElementsByTagName) return;

  var autogenid = 0;
  var divs = document.getElementsByTagName('div');
  for (var i = 0; i < divs.length; ++i) {
    // It has to be 1. a div, 2. of the right class, and 3. with
    // child nodes.
    var div = divs[i];
    if (!hasClass(div, 'featlist')) continue;
    kid = firstkid(div, 'div', 'featscroll');
    if (!kid) continue;

    if (!div.id) {
      // If the div has no id, assign one.
      autogenid += 1;
      div.id = 'featlist_' + autogenid;
    }
    featlist_reglist(div, kid);
  }
}

domReady(featlist_init);


