/******************************************************************************

* scroller.js                                                                 *

*                                                                             *

* Copyright 1999 by Mike Hall.                                                *

* Visit http://www.dynamicdrive.com                                           *

* Last update: July 21st, '02 by Dynamic Drive for NS6 functionality.         *

*                                                                             *

* Allows you to create scrolling displays on a page. Multiple scrollers can   *

* be defined, each with it's own parameters and list of items. Item text can  *

* include basic HTML tags, including links and images.                        *

* Note: requires dhtmllib.js.                                                 *

******************************************************************************/



//*****************************************************************************

// Scroller constructor.

//*****************************************************************************



function Scroller(x, y, width, height, border, padding) {



  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 = "Arial,Helvetica";

  this.fontSize = "2";



  // Set default scroll timing values.



  this.speed = 50;

  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) {

    alert("Scroller Error: Scroller has already been created.");

    return;

  }

  this.fgColor = fgcolor;

  this.bgColor = bgcolor;

  this.bdColor = bdcolor;

}



function scrollerSetFont(face, size) {



  if (this.created) {

    alert("Scroller Error: Scroller has already been created.");

    return;

  }

  this.fontFace = face;

  this.fontSize = size;

}



function scrollerSetSpeed(pps) {



  if (this.created) {

    alert("Scroller Error: Scroller has already been created.");

    return;

  }

  this.speed = pps;

}



function scrollersetPause(ms) {



  if (this.created) {

    alert("Scroller Error: Scroller has already been created.");

    return;

  }

  this.pauseTime = ms;

}



function scrollerAddItem(str) {



  if (this.created) {

    alert("Scroller Error: Scroller has already been created.");

    return;

  }

  this.items[this.items.length] = str;

}



function scrollerCreate() {



  var start, end;

  var str;

  var i, j;

  var x, y;



  if (!isMinNS4 && !ie && !dom)

    return;



  // On first scroller, start interval timer.



  if (scrollerList.length == 0)

    setInterval('scrollerGo()', scrollerInterval);



  // Create the scroller only once.



  if (this.created) {

    alert("Scroller Error: Scroller has already been 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 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.



  if (isMinNS4) {

    this.baseLayer = new Layer(this.width);

    this.scrollLayer = new Layer(this.width, this.baseLayer);

    this.scrollLayer.visibility = "inherit";

    this.itemLayers = new Array();

    for (i = 0; i < this.items.length; i++) {

      this.itemLayers[i] = new Layer(this.width, this.scrollLayer);

      this.itemLayers[i].document.open();

      this.itemLayers[i].document.writeln(start + this.items[i] + end);

      this.itemLayers[i].document.close();

      this.itemLayers[i].visibility = "inherit";

    }



    // Set background colors.



    setBgColor(this.baseLayer, this.bdColor);

    setBgColor(this.scrollLayer, this.bgColor);

  }



  if (ie||dom) {

    i = scrollerList.length;

    str = '<div id="scroller' + i + '_baseLayer"'

        + ' style="position:absolute;'

        + ' background-color:' + this.bdColor + ';'

        + ' width:' + this.width + 'px;'

        + ' height:' + this.height + 'px;'

        + ' overflow:hidden;'

        + ' visibility:hidden;">\n'

        + '<div id="scroller' + i + '_scrollLayer"'

        + ' style="position:absolute;'

        + ' background-color: ' + this.bgColor + ';'

        + ' width:' + this.width + 'px;'

        + ' height:' + (this.height * this.items.length) + 'px;'

        + ' visibility:inherit;">\n';

    for (j = 0; j < this.items.length; j++) {

      str += '<div id="scroller' + i + '_itemLayers' + j + '"'

          +  ' style="position:absolute;'

          +  ' width:' + this.width + 'px;'

          +  ' height:' + this.height + 'px;'

          +  ' visibility:inherit;">\n'

          +  start + this.items[j] + end

          +  '</div>\n';

    }

    str += '</div>\n'

        +  '</div>\n';



    // Insert HTML code at end of page. For IE4, need to scroll window to

    // end of page, insert and scroll back to correct bug.



    if (!(ie&&window.print)) {

      x = getPageScrollX();

      y = getPageScrollY();

      window.scrollTo(getPageWidth(), getPageHeight());

    }

    if (ie)

    document.all.tempholder.innerHTML=str

    else if (dom)

    document.getElementById("tempholder").innerHTML=str

//EDIT HERE//////////////////////////////////////////////////////////////////////////////

    if (!(ie&&window.print))

      window.scrollTo(x, y);



    // Get handles to each layer.



    this.baseLayer = getLayer("scroller" + i + "_baseLayer");

    this.scrollLayer = getLayer("scroller" + i + "_scrollLayer");

    this.itemLayers = new Array();

    for (j = 0; j < this.items.length; j++)

      this.itemLayers[j] = getLayer("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);

}



function scrollerShow() {



  if (this.created)



    showLayer(this.baseLayer);

}



function scrollerHide() {



  if (this.created)

    hideLayer(this.baseLayer);

}



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));

  else

    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;

      }



      // 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;

      }



      scrollLayerTo(scrollerList[i].scrollLayer,

                    0, Math.round(scrollerList[i].currentY),

                    false);

    }

  }

}



//*****************************************************************************

// 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.



if (isMinNS4) {

  origWidth  = window.innerWidth;

  origHeight = window.innerHeight;

}

window.onresize = scrollerReload;



function scrollerReload() {



  // Reload page in case of a browser resize. First make sure it's a true

  // resize.



  if (isMinNS4 && origWidth == window.innerWidth && origHeight == window.innerHeight)

    return;

  window.location.href = window.location.href;

}

