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





* scroller.js                                                                 *





*                                                                             *





* Copyright 1999 by Mike Hall.                                                *





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





* Last update: December 1, 1999.                                              *





*                                                                             *





* 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 && !isMinIE4)





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





    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 (!isMinIE5) {





      x = getPageScrollX();





      y = getPageScrollY();





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





    }





    document.body.insertAdjacentHTML("beforeEnd", str);





    if (!isMinIE5)





      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;





}





