// Check for browser and version
var g_fBrowser = 0;
var navName = navigator.appName;
var navVer  = parseFloat(navigator.appVersion);

if (document.all) {
    // Microsoft Internet Explorer 5 or compatible
    g_fBrowser = 2;
} else if (document.getElementById) {
    // Netscape 6 or DOM compatible browser
    g_fBrowser = 3;
} else if (document.layers) {
    // Netscape 4 or compatible
    g_fBrowser = 1;
} else {
    // Sometimes Netscape 4 reaches here. So, make sure it still works.
    if (navName == "Netscape" && navVer >= 4) {
        g_fBrowser = 1;
    } else {
        // unknown and not supported
        g_fBrowser = 0;
    }
}
// End of check

// Global variables
var DynFaderList = new Array();     // List of Dynamic Faders
// End of Global variables

// Create a hex convertor array (Dex2Hex[])
var hexbase= new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
var value=0;
var Dec2Hex=new Array();
for (x=0; x<16; x++){
    for (y=0; y<16; y++){
        Dec2Hex[value]= hexbase[x] + hexbase[y];
        value++;
    }
}
// End of create a hex convertor array (Dex2Hex[])

// Combine RGB colour 
function RGB(r, g, b)
{
    return ((r&0xFF)<<16) + ((g&0xFF)<<8) + (b&0xFF);
}

// Convert RGB colour from string to numeric
function StrRGB2Num(color)
{
    var temp;
    temp = color;
    return Number('0x'+temp.substr(1,temp.length));
}

// Convert RGB colour to string base
function RGB2STR(rgbcolor)
{
    return Dec2Hex[rgbcolor>>16] + Dec2Hex[(rgbcolor>>8)&0xFF] + Dec2Hex[rgbcolor&0xFF];
}

// Find layer
function findLayer(name, doc)
{
    if (document.layers) {
        var i, layer;
    
        for (i = 0; i < doc.layers.length; i++) {
            layer = doc.layers[i];
            if (layer.name == name) return layer;
            if (layer.document.layers.length > 0) {
                layer = findLayer(name, layer.document);
                if (layer != null) return layer;
            }
        }
    }
    return null;
}

// Change the HTML text
function changeHTMLText(element, newText, object)
{
    if (document.all) {
        // Microsoft Internet Explorer 5 or compatible
        element.innerHTML = newText;
    } else if (document.getElementById) {
        // Netscape 6 or DOM compatible browser
        rng = document.createRange();
        rng.setStartBefore(element);
        htmlFrag = rng.createContextualFragment(newText);
        while (element.hasChildNodes()) element.removeChild(element.lastChild);
        element.appendChild(htmlFrag);
    } else if (document.layers) {
        // Netscape 4 or compatible
        strTemp = '<DIV CLASS="' + object.name + '">' + newText + '</DIV>';
        
        element.document.open();
        element.document.fgColor = object.curcolor & 0xFFFFFF;      
        element.document.writeln(strTemp);
        element.document.close();
    }
}

function insertPlaceHolder(strName, width, height, align, bgcolor, border, bordercolor)
{
    if (String(width)  =="undefined") var width   = "100%";
    if (String(height) =="undefined") var height  = 100;
    if (String(align)  =="undefined") var align   = "left";
    if (String(bgcolor)=="undefined") var bgcolor = "";
    if (String(border) =="undefined") var border  = 0;
    if (String(bordercolor)=="undefined") var bordercolor = "";
    
    if (g_fBrowser == 0) {
        document.writeln("Browser not supported");
        return;
    }

    switch(g_fBrowser) {
    case 1:
        document.writeln(
            '<TABLE ALIGN="' + align + '" CELLSPACING="0" CELLPADDING="0" BORDER="' + border + '" BORDERCOLOR="' + bordercolor + '">' +
            '<TR><TD>' +
            '<ILAYER NAME="' + strName + '" BGCOLOR="' + bgcolor + '" VISIBILITY="inherit">' +
            '<LAYER NAME="Content" WIDTH=' + width + ' HEIGHT=' + height + ' VISIBILITY="inherit">' +
            '</LAYER>' +
            '</ILAYER>' +
            '</TD></TR>' +
            '</TABLE>'
        );
        break;

    case 2:
    case 3:
        document.writeln(
            '<DIV ALIGN=' + align + '>' +
            '<DIV ID="'+strName+'" STYLE="width:' + width +'; height:' + height + '; overflow:hidden; background:'+bgcolor+'; border-style:outset; border-width:'+border+'; border-color:'+bordercolor+'">' +
            '<DIV ID="'+strName+'Content" STYLE="position:relative; width:100%;">' +
            '</DIV>' +
            '</DIV>' +
            '</DIV>'
        );
        break;
    }
}

function DynFader()
{
    this.name;
    this.width;
    this.height;
    this.contentHeight;
    this.offset  = 20;
    this.curXPos = 0;
    this.curYPos = -this.offset;
    this.curPos = 0;
    this.midYPos = 0;
    this.ydir = 1;
    this.xdir = 0;

    this.placeholder;
    this.content;
    this.text = new Array();
    this.curText = -1;
    
    this.loop = -1;
    this.paused = true;
    this.started = false;
    this.pauseInterval = 0;
    this.pauseTextInterval = 0;
    this.curpauseInterval = 0;
    this.fgcolor  = 0x000000;
    this.bgcolor  = 0xFFFFFF;
    this.dfcolor  = 0;
    this.curdfcolor  = 0;
    this.curcolor = 0;
    this.dfRed   = 0;
    this.dfGreen = 0;
    this.dfBlue  = 0;
    
    this.isFade = false;
    
    // Define methods
    this.addText = DynFaderAddText;
    this.attachPlaceHolder = DynFaderAttachPlaceHolder;
    this.setTextColor = DynFaderSetTextColor;
    this.start = DynFaderStart;
    this.stop = DynFaderStop;
    this.beginFade = DynFaderBeginFade;
    this.calcColorDif = DynFaderCalcColorDif;
    this.getColorDif = DynFaderGetColorDif;
    this.setFont = DynFaderSetFont;
    this.setFontSize = DynFaderSetFontSize;
    this.setBackground = DynFaderSetBackground;
    this.setDirection = DynFaderSetDirection;
    this.setSpeed = DynFaderSpeed;
    this.setPauseMidInterval = DynFaderSetPauseMidInterval;
    this.setPauseTextInterval = DynFaderSetPauseTextInterval;
    this.getContentHeight = DynFaderGetContentHeight;
    this.setLoop = DynFaderSetLoop;
    this.setGlow = DynFaderSetGlow;
    
    DynFaderList[DynFaderList.length] = this;
}

function DynFaderAddText(newText)
{
    this.text[this.text.length] = newText;
}

function DynFaderAttachPlaceHolder(strPlaceHolder)
{
    switch(g_fBrowser) {
    case 1:
        this.name = strPlaceHolder;
        this.placeholder = findLayer(strPlaceHolder, document);
        this.content = this.placeholder.document.Content;
        this.width   = this.placeholder.clip.width;
        this.height  = this.placeholder.clip.height;
        this.content.top = this.curYPos;
        break;
        
    case 2:
        this.placeholder = eval('document.all.' + strPlaceHolder);
        this.content = eval('document.all.' + strPlaceHolder+'Content');
        this.width   = this.placeholder.style.pixelWidth;
        this.height  = this.placeholder.style.pixelHeight;
        this.content.style.pixelTop = this.curYPos;
        break;
        
    case 3:
        this.placeholder = document.getElementById(strPlaceHolder);
        this.content = document.getElementById(strPlaceHolder+'Content');
        this.width   = parseInt(this.placeholder.style.width);
        this.height  = parseInt(this.placeholder.style.height);
        this.content.style.top = this.curYPos;

        break;
    }
}

function DynFaderSetTextColor(r, g, b)
{
    this.fgcolor = RGB(r, g, b);
    switch(g_fBrowser) {
    case 1:
        this.content.document.fgColor = this.fgcolor;
        break;
        
    case 2:
        this.content.style.color = this.fgcolor;
        break;

    case 3:
        this.content.style.color = "#" + RGB2STR(this.fgcolor);
        break;
    }
}

function DynFaderSetTextColor(strColor)
{
    if (isNaN(strColor)) this.fgcolor = StrRGB2Num(strColor);
    this.curcolor = this.fgcolor;
    switch(g_fBrowser) {
    case 1:
        this.content.document.fgColor = this.color;
        break;
        
    case 2:
        this.content.style.color = this.fgcolor;
        break;

    case 3:
        this.content.style.color = "#" + RGB2STR(this.fgcolor);
        break;
    }
}

function DynFaderStart()
{
    if (this.ydir > 0) {
        this.curYPos = this.height + 1;
    } else {
        this.curYPos = -this.getContentHeight() - 1;
    }
    this.started = true;
}

function DynFaderStop()
{
    this.started = false;
}

function DynFaderBeginFade()
{
    this.calcColorDif();
    this.isFade = true;
    this.start();
}

function DynFaderCalcColorDif()
{
    switch(g_fBrowser) {
    case 1:
        this.bgcolor = this.placeholder.bgColor;
        if (this.bgcolor == null) this.bgcolor = StrRGB2Num(document.bgColor);
        break;

    case 2:
    case 3:
        this.bgcolor = StrRGB2Num(this.placeholder.style.backgroundColor);
        if (isNaN(this.bgcolor)) this.bgcolor = StrRGB2Num(document.bgColor);
        break;
    }

    this.dfRed   = ((this.bgcolor>>16) - (this.fgcolor>>16));
    this.dfGreen = (((this.bgcolor>>8)&0xFF) - ((this.fgcolor>>8)&0xFF));
    this.dfBlue  = ((this.bgcolor&0xFF) - (this.fgcolor&0xFF));
    this.curcolor = this.bgcolor;
}

function DynFaderGetColorDif(steps)
{
    steps  += this.height;
    steps >>= 1;
    steps  /= Math.abs(this.ydir);
    this.curdfcolor = this.dfcolor = -(((this.dfRed/steps)<<16) + ((this.dfGreen/steps)<<8) + (this.dfBlue/steps));
}

function DynFaderSetFont(fontfamily, fontweight, textalign)
{
    switch(g_fBrowser) {
    case 1:
        if (fontfamily) document.classes[this.name].all.fontFamily = fontfamily;
        if (fontweight) document.classes[this.name].all.fontWeight = fontweight;
        if (textalign)  document.classes[this.name].all.textAlign = textalign;
        break;
        
    case 2:
    case 3:
        if (fontfamily) this.content.style.fontFamily = fontfamily;
        if (fontweight) this.content.style.fontWeight = fontweight;
        if (textalign)  this.content.style.textAlign  = textalign;
        break;
    }
}

function DynFaderSetFontSize(fontsize)
{
    // Unit is required for Netscape 6
    if (!isNaN(fontsize)) fontsize += 'pt';

    switch(g_fBrowser) {
    case 1:
        if (fontsize) document.classes[this.name].all.fontSize = fontsize;
        break;
        
    case 2:
        this.content.style.fontSize = fontsize;
        break;

    case 3:
        this.content.style.fontSize = fontsize;
        break;
    }
}

function DynFaderSetBackground(image)
{
    switch(g_fBrowser) {
    case 1:
        this.placeholder.background.src = image;
        break;
        
    case 2:
    case 3:
        this.placeholder.style.backgroundImage = 'url('+image+')';
        break;
    }
}

function DynFaderSetDirection(iDir)
{
    switch(iDir) {
    case 0:
        this.ydir = Math.abs(this.ydir);
        break;
        
    case 1:
        this.ydir = -Math.abs(this.ydir);
        break;
        
    default:
        this.ydir = Math.abs(this.ydir);
    }
}

function DynFaderSpeed(Speed)
{
    if (this.ydir > 0) {
        this.ydir = Math.abs(Speed);
    } else {
        this.ydir = -Math.abs(Speed);
    }
}

function DynFaderSetPauseMidInterval(time)
{
    this.pauseInterval = Math.abs(time);
}

function DynFaderSetPauseTextInterval(time)
{
    this.pauseTextInterval = Math.abs(time);
}

function DynFaderGetContentHeight()
{
    switch(g_fBrowser) {
    case 1:
        this.contentHeight = this.content.document.height;
        break;

    case 2:
        this.contentHeight = this.content.clientHeight;
        break;

    case 3:
        this.contentHeight = this.content.offsetHeight;
        break;
    }
    return this.contentHeight;
}

function DynFaderSetLoop(loops)
{
    this.loop = loops;
}

function DynFaderSetGlow(strength, glowColor, fgColor)
{
    switch(g_fBrowser) {
    case 1:
        break;
        
    case 2:
        if (String(fgColor) != "undefined") this.setTextColor(fgColor);
        this.content.style.filter = "glow(color="+glowColor+",strength="+strength+")";
        break;

    case 3:
        break;
    }
}

// Scrolling section
function ScrollFader()
{
    var fader;
    if (String(DynFaderList[0]) == "undefined") return;
    
    for (var i in DynFaderList) {
        fader = DynFaderList[i];
        if (fader.started == false) continue;
        if (fader.paused) {
            if (fader.curpauseInterval-- <= 0) {
                fader.paused = false;
            }
        } else {
            fader.curYPos += fader.ydir;
//          fader.curXPos += fader.xdir;
            
            if (fader.curYPos == fader.midYPos) {
                if (fader.pauseInterval) {
                    fader.curpauseInterval = fader.pauseInterval;
                    fader.paused = true;
                }
                fader.curYPos = (fader.height - fader.contentHeight) >> 1;
                if (fader.isFade) {
                    fader.curdfcolor = -fader.dfcolor;
                    fader.curcolor = fader.fgcolor;
                }
            } 

            if (fader.isFade) {
                // Change text colour
                switch(g_fBrowser) {
                case 1:
                    if (fader.curText >= 0) {
                        changeHTMLText(fader.content, fader.text[fader.curText], fader);
                    }
                    break;

                case 2:
                    fader.content.style.color = fader.curcolor;
                    break;
                    
                case 3:
                    fader.content.style.color = "#" + RGB2STR(fader.curcolor);
                    break;
                }
                
                fader.curcolor+= fader.curdfcolor;
            }
            
            if (fader.curYPos > fader.height || fader.curYPos < -fader.contentHeight) {
                // Prepare for next text
                if (++fader.curText > fader.text.length - 1) {
                    // End of text array reached
                    fader.curText = 0;

                    if (--fader.loop == 0) {
                        // Last loop reached
                        fader.stop();
                        
                    }
                }

                // Rewrite the text
                switch(g_fBrowser) {
                case 1:
                    fader.content.top = fader.height;
                    break;
                
                case 2:
                    fader.content.style.pixelTop = fader.height;
                    
                case 3:
                    fader.content.style.top = fader.height;
                    break;
                }
                changeHTMLText(fader.content, fader.text[fader.curText], fader);

                
                // Reset values
                fader.getContentHeight();
                
                if (fader.isFade) {
                    fader.getColorDif(fader.contentHeight);
                    fader.curcolor = fader.bgcolor;
                }
                if (fader.ydir > 0) {
                    fader.midYPos = ((fader.height - fader.contentHeight) >> 1) + fader.contentHeight;
                    fader.midYPos = (Math.round(fader.midYPos / fader.ydir) * fader.ydir) - fader.contentHeight;
                    fader.curYPos = -fader.contentHeight;
                } else {
                    fader.midYPos = ((fader.height - fader.contentHeight) >> 1) + fader.height;
                    fader.midYPos = (Math.round(fader.midYPos / fader.ydir) * fader.ydir) - fader.height;
                    fader.curYPos = fader.height;
                }

                if (fader.pauseTextInterval) {
                    fader.curpauseInterval = fader.pauseTextInterval;
                    fader.paused = true;
                }
            }
        
            // Scroll text
            switch(g_fBrowser) {
            case 1:
                fader.content.top = fader.curYPos;
                break;
                
            case 2:
                fader.content.style.pixelTop = fader.curYPos;
                break;

            case 3:
                fader.content.style.top = fader.curYPos;
                break;
            }
        }
    }
}

// Start timer
var g_timerID;

if (g_fBrowser == 1) {
    var g_winWidth;
    var g_winHeight;

    g_winWidth  = window.innerWidth;
    g_winHeight = window.innerHeight;
    window.captureEvents(Event.RESIZE);
    window.onResize = FaderReload;
}

setTimeout('FaderStart()', 600);

function FaderStart()
{
    g_timerID = setInterval(ScrollFader, 20);
    window.onUnload = FaderUnload;
}

function FaderUnload(e)
{
    clearInterval(g_timerID);
    return window.routeEvent(e);
}

function FaderReload(e)
{
    if (g_winWidth == window.innerWidth && g_winHeight == window.innerHeight) return;
    this.location.href = this.location.href;
    this.focus();

    return window.routeEvent(e);;
}


