//-----------------------------------------------------------------------------
// Layer positioning.
//-----------------------------------------------------------------------------

function moveLayerTo(layer, x, y) {
  layer.style.left = x;
  layer.style.top  = y;
}

function moveLayerBy(layer, dx, dy) {
  layer.style.left = (parseInt(layer.style.left) + dx) + "px";
  layer.style.top = (parseInt(layer.style.top) + dy) + "px";
}

function getWidth(layer) {
  if (layer.style.pixelWidth){return layer.style.pixelWidth;}
  return layer.clientWidth;
}

function getHeight(layer) {
  if (layer.style.pixelHeight){return layer.style.pixelHeight;}
  return layer.clientHeight;
}

function getzIndex(layer) {
  return layer.style.zIndex;
}

function setzIndex(layer, z) {
  layer.style.zIndex = z;
}

//-----------------------------------------------------------------------------
// Layer clipping.
//-----------------------------------------------------------------------------

function clipLayer(layer, clipleft, cliptop, clipright, clipbottom) {
  layer.style.clip = 'rect(' + cliptop + 'px ' +  clipright + 'px ' + clipbottom + 'px ' + clipleft +'px)';
}

function getClipLeft(layer) {
  var clip = getClipValues(layer.style.clip);
  return (clip) ? clip[3] : 0;
}

function getClipTop(layer) {
  var clip = getClipValues(layer.style.clip);
  return (clip) ? clip[0] : 0;
}

function getClipRight(layer) {
  var clip = getClipValues(layer.style.clip);
  return (clip) ? clip[1] : layer.style.pixelWidth;
}

function getClipBottom(layer) {
  var clip = getClipValues(layer.style.clip);
  return (clip) ? clip[2] : layer.style.pixelHeight;
}

function getClipValues(str) {
  if (!str){return null;}
  var clip = new Array();

  // Parse out the clipping values
  var i = str.indexOf("(");
  clip[0] = parseInt(str.substring(i + 1, str.length), 10);
  i = str.indexOf(" ", i + 1);
  clip[1] = parseInt(str.substring(i + 1, str.length), 10);
  i = str.indexOf(" ", i + 1);
  clip[2] = parseInt(str.substring(i + 1, str.length), 10);
  i = str.indexOf(" ", i + 1);
  clip[3] = parseInt(str.substring(i + 1, str.length), 10);
  return clip;
}

//-----------------------------------------------------------------------------
// Layer scrolling.
//-----------------------------------------------------------------------------

function scrollLayerTo(layer, x, y) {
  var dx = getClipLeft(layer) - x;
  var dy = getClipTop(layer) - y;

  scrollLayerBy(layer, -dx, -dy);
}

function scrollLayerBy(layer, dx, dy) {
  var cl = getClipLeft(layer);
  var ct = getClipTop(layer);
  var cr = getClipRight(layer);
  var cb = getClipBottom(layer);
  clipLayer(layer, cl + dx, ct + dy, cr + dx, cb + dy);
  moveLayerBy(layer, -dx, -dy);
}

//-----------------------------------------------------------------------------
// utilities.
//-----------------------------------------------------------------------------
function getObject(name) {
  return document.getElementById(name);
}

function getImagePageLeft(img) {
  var x = 0;
  var obj =  img;

  while (obj.offsetParent != null) {
    x += obj.offsetLeft;
    obj = obj.offsetParent;
  }
  x += obj.offsetLeft;
  return x;
}

function getImagePageTop(img) {
  var y = 0;
  var obj =  img;

  while (obj.offsetParent != null) {
    y += obj.offsetTop;
    obj = obj.offsetParent;
  }
  y += obj.offsetTop;
  return y;
}
//-----------------------------------------------------------------------------
// Window and page properties.
//-----------------------------------------------------------------------------
function getPageWidth() {
  return document.body.scrollWidth;
}

function getPageHeight() {
  return document.body.scrollHeight;
}

function getPageScrollX() {
  return document.body.scrollLeft;
}

function getPageScrollY() {
  return document.body.scrollTop;
}

function Scroller(x, y, width, height, border, padding) {
  this.name = "";

  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
  this.border = border;
  this.padding = padding;

  this.items = new Array();
  this.created = false;

  // Set default colors.
  this.fgColor = "#000000";
  this.bgColor = "#ffffff";
  this.bdColor = "#000000";

  // Set default font.
  this.fontFace = "Verdana,Arial,Helvetica";
  this.fontSize = "3";
  
  // Set default scroll timing values.
  this.speed = 90;
  this.pauseTime = 2000;

  // Define methods.
  this.setColors = scrollerSetColors;
  this.setFont = scrollerSetFont;
  this.setSpeed = scrollerSetSpeed;
  this.setPause = scrollersetPause;
  this.addItem = scrollerAddItem;
  this.create = scrollerCreate;
  this.show = scrollerShow;
  this.hide = scrollerHide;
  this.moveTo = scrollerMoveTo;
  this.moveBy = scrollerMoveBy;
  this.getzIndex = scrollerGetzIndex;
  this.setzIndex = scrollerSetzIndex;
  this.stop = scrollerStop;
  this.start = scrollerStart;
}

//*****************************************************************************
// Scroller methods.
//*****************************************************************************

function scrollerSetColors(fgcolor, bgcolor, bdcolor) {
  if (!this.created) {
    this.fgColor = fgcolor;
    this.bgColor = bgcolor;
    this.bdColor = bdcolor;
  }
}

function scrollerSetFont(face, size) {
  if (!this.created) {
    this.fontFace = face;
    this.fontSize = size;
  }
}

function scrollerSetSpeed(pps) {
  if (!this.created){this.speed = pps;}
}

function scrollersetPause(ms) {
  if (!this.created){this.pauseTime = ms;}
}

function scrollerAddItem(str) {
  if (!this.created){this.items[this.items.length] = str;}
}

function scrollerCreate() {
  var start, end;
  var str;
  var i, j;
  var x, y;

  // On first scroller, start interval timer.
  if (scrollerList.length == 0)
    setInterval('scrollerGo()', scrollerInterval);
	  //if (this.name == "big") {countdown(this.pauseTime / 1000);}

  // Create the scroller only once.
  if (this.created){return;}
  this.created = true;

  // Copy first item to the end of the list, this lets us scroll from the last
  // defined item to the first without jumping.
  this.items[this.items.length] = this.items[0];

  // Set up HTML code for item text.
  start = '<table style="filter: progid:DXImageTransform.Microsoft.dropShadow( Color=#A5C384,offX=4,offY=4,positive=true);" border=0'
        + ' cellpadding=' + (this.padding + this.border)
        + ' cellspacing=0'
        + ' width=' + this.width
        + ' height=' + this.height + '>'
        + '<tr><td>'
        + '<font'
        + ' color="' + this.fgColor + '"'
        + ' face="' + this.fontFace + '"'
        + ' size=' + this.fontSize + '>';
  end   = '</font></td></tr></table>';

  // Build the layers.
  i = scrollerList.length;
  str = '<div id="scroller' + i + '_baseLayer"'
      + ' style="position:absolute;'
      + ' background:' + this.bdColor + ';'
      + ' width:' + this.width + 'px;'
      + ' height:' + this.height + 'px;'
      + ' overflow:hidden;'
      + ' visibility:hidden;">\n'
      + '<div id="scroller' + i + '_scrollLayer"'
      + ' style="position:absolute;'
      + ' background: ' + this.bgColor + ';'
      + ' width:' + this.width + 'px;'
      + ' height:' + (this.height * this.items.length) + 'px;'
      + ' visibility:inherit;">\n';
  for (j = 0; j < this.items.length; j++) {
    var counter = 'Bericht ';
    counter += (j == this.items.length-1) ? 1 : (j+1);
    counter += ' van ' + (this.items.length - 1) + ' | ';
    str += '<div id="scroller' + i + '_itemLayers' + j + '"'
        +  ' style="position:absolute;'
        +  ' width:' + this.width + 'px;'
        +  ' height:' + this.height + 'px;'
        +  ' visibility:inherit;">\n'
        +  start + counter + this.items[j] + end
        +  '</div>\n';
  }
  str += '</div>\n'
      +  '</div>\n';

  // Insert HTML code at end of page.
  var div = document.createElement("div");
  div.innerHTML = str;
  document.body.appendChild(div);

  // Get handles to each layer.
  this.baseLayer = getObject("scroller" + i + "_baseLayer");
  this.scrollLayer = getObject("scroller" + i + "_scrollLayer");
  this.itemLayers = new Array();
  for (j = 0; j < this.items.length; j++)
    this.itemLayers[j] = getObject("scroller" + i + "_itemLayers" + j);

  // Position and clip base and scroll layers.
  moveLayerTo(this.baseLayer, this.x, this.y);
  clipLayer(this.baseLayer, 0, 0, this.width, this.height);
  moveLayerTo(this.scrollLayer, this.border, this.border);
  clipLayer(this.scrollLayer, 0, 0,
            this.width - 2 * this.border, this.height - 2 * this.border);

  // Position and clip each item layer.
  x = 0;
  y = 0;
  for (i = 0; i < this.items.length; i++) {
    moveLayerTo(this.itemLayers[i], x, y);
    clipLayer(this.itemLayers[i], 0, 0, this.width, this.height);
    y += this.height;
  }

  // Set up scrolling parameters.
  this.stopped = false;
  this.currentY = 0;
  this.stepY = this.speed / (1000 / scrollerInterval);
  this.stepY = Math.min(this.height, this.stepY);
  this.nextY = this.height;
  this.maxY = this.height * (this.items.length - 1);
  this.paused = true;
  this.counter = 0;

  // Add to global list.
  scrollerList[scrollerList.length] = this;

  // Display it.
  //showLayer(this.baseLayer);
  this.baseLayer.style.visibility = "visible";
}

function scrollerShow() {
  if (this.created){this.baseLayer.style.visibility = "visible";}
}

function scrollerHide() {
  if (this.created){this.baseLayer.style.visibility = "hidden";}
}

function scrollerMoveTo(x, y) {
  if (this.created){moveLayerTo(this.baseLayer, x, y);}
}

function scrollerMoveBy(dx, dy) {
  if (this.created){moveLayerBy(this.baseLayer, dx, dy);}
}

function scrollerGetzIndex() {
  if (this.created){return(getzIndex(this.baseLayer));}
  return(0);
}

function scrollerSetzIndex(z) {
  if (this.created){setzIndex(this.baseLayer, z);}
}

function scrollerStart() {
  this.stopped = false;
}

function scrollerStop() {
  this.stopped = true;
}

//*****************************************************************************
// Code for scrolling.
//*****************************************************************************

// An array is used to hold a pointer to each scroller that is defined. The
// scrollerGo() function runs at regular intervals and updates each scroller
// in this list.

var scrollerList     = new Array();
var scrollerInterval = 20;

function scrollerGo() {
  var i;

  // Update each scroller object in the list.
  for (i = 0; i < scrollerList.length; i++) {
    // If stopped, skip.
    if (scrollerList[i].stopped);
    // If paused, update counter.
    else if (scrollerList[i].paused) {
      scrollerList[i].counter += scrollerInterval;
      if (scrollerList[i].counter > scrollerList[i].pauseTime)
        scrollerList[i].paused = false;
    }

    // Scroll it.
    else {
      scrollerList[i].currentY += scrollerList[i].stepY;
      // Pause it if the next item has scrolled into view.

      if (scrollerList[i].currentY >= scrollerList[i].nextY) {
        scrollerList[i].paused = true;
        scrollerList[i].counter = 0;
        scrollerList[i].currentY = scrollerList[i].nextY;
        scrollerList[i].nextY += scrollerList[i].height;
		    //if (scrollerList[i].name == "big") {countdown(scrollerList[i].pauseTime / 1000);} 
      }

      // When we reach the end, start over.
      if (scrollerList[i].currentY >= scrollerList[i].maxY) {
        scrollerList[i].currentY -= scrollerList[i].maxY;
        scrollerList[i].nextY = scrollerList[i].height;
		    //if (scrollerList[i].name == "big") {countdown(scrollerList[i].pauseTime / 1000);} 
      }
      scrollLayerTo(scrollerList[i].scrollLayer, 0, Math.round(scrollerList[i].currentY));
    }
  }
}

//*****************************************************************************
// Code to handle a window resize.
//*****************************************************************************

// These variables are used to determine if a resize event is a true one.
// Necessary due to a bug in older NS4 releases.

var origWidth;
var origHeight;

// Fix for resize bug.
window.onresize = scrollerReload;

function scrollerReload() {
  // Reload page in case of a browser resize. First make sure it's a true
  // resize.
  window.location.href = window.location.href;
}

