/******************************************************************************
* 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>'
end   = '</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;
}
