function getElementsByClassName(oElm, strTagName, strClassName)
{
  var arrElements = (strTagName == "*" && document.all) ? document.all : oElm.getElementsByTagName(strTagName);
  var arrReturnElements = new Array();
  
  strClassName = strClassName.replace(/\-/g, "\\-");
  var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
  var oElement;

  for (var i = 0; i < arrElements.length; i++)
    {
      oElement = arrElements[i];
      
      if (oRegExp.test(oElement.className))
        arrReturnElements.push(oElement);
    }

  return (arrReturnElements)
}

function getOffset(el)
{
  var _x = 0;
  var _y = 0;
  
  while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop))
    {
      _x += el.offsetLeft - el.scrollLeft;
      _y += el.offsetTop - el.scrollTop;
      el = el.offsetParent;
    }

  return { top: _y, left: _x };
}

var YOffsets = new Array();

window.onload = function(e)
{
  // build a list of Y offsets for each article
  daygroups = getElementsByClassName(document, "div", "daygroup");

  for (i = 0; i < daygroups.length; i++)
    {
      // add the top of the daygroup
      YOffsets.push(getOffset(daygroups[i]).top);

      channelgroups = getElementsByClassName(daygroups[i], "div", "channelgroup");
      // take all channelgroups
      for (j = 0; j < channelgroups.length; j++)
        {
	  if (j != 0) // don't push the first one
            YOffsets.push(getOffset(channelgroups[j]).top);

          entrygroups = getElementsByClassName (channelgroups[j], "div", "entrygroup");

          // take all entrygroups bar the first one
          for (k = 1; k < entrygroups.length; k++)
            YOffsets.push(getOffset(entrygroups[k]).top);
        }
    }

  // YOffsets.length should == 60
}

window.onkeydown = function(evt)
{
  var e = window.event ? event : evt;

  // require Ctrl
  if (!e.ctrlKey)
    return true;

  switch (e.keyCode)
    {
      case 40: // down
        // we go forwards
        for (i = 0; i < YOffsets.length; i++)
          {
            if (window.pageYOffset < YOffsets[i])
              {
                window.scrollTo(0, YOffsets[i]);
                break;
              }
          }

        return false;

      case 38: // up
        // we go back
        for (i = YOffsets.length - 1; i >= 0; i--)
          {
            if (window.pageYOffset > YOffsets[i])
              {
                window.scrollTo(0, YOffsets[i]);
                break;
              }
          }

        return false;

      default:
        return true;
    }
}

