/*****************************************************************/
/* Rainbow Links Version 1.03 (2003.9.20)                        */
/* Script updated by Dynamicdrive.com for IE6 (DOM)              */
/* Copyright (C) 1999-2001 TAKANASHI Mizuki                      */
/*                                                               */
/* Usage:                                                        */
/*  Insert '<script src="rainbow.js"></script>' into the BODY,   */
/*  Right After the <BODY> tag itself, --Before anything else.   */
/*  No need to add "onMouseover" and "onMouseout" attributes!!   */
/*                                                               */
/*  If you would like to add this effect to other non-text       */
/*  links, then add 'onmouseover="doRainbow(this);"' and         */
/*  'onmouseout="stopRainbow();"' to the target tags.            */
/*                                                               */
/* This Script works with DOM, IE4, Netscape6, Mozilla browsers, */
/* and above, only; But No Error will occur on other browsers.   */
/*****************************************************************/

//  Color Transmutation Setting (adjustable)
var rate = 20;  // value to control the rate of transmutation

//=====================================================================
//  Main routine
if (document.getElementById) window.onerror=new Function("return true")

var objActive;  // Object which the event occured in
var act  = 0;   // Flag to track the  action
var elmH = 0;   // Hue
var elmS = 128; // Saturation
var elmV = 255; // Value
var clrOrg;     // Color before the change
var TimrID;     // Timer ID

if (document.all) {
    document.onmouseover = doRainbowAnchor;
    document.onmouseout  = stopRainbowAnchor;
} else if (document.getElementById) {
    document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
    document.onmouseover = Mozilla_doRainbowAnchor;
    document.onmouseout  = Mozilla_stopRainbowAnchor;
}
//=====================================================================
// doRainbow ~ this function begins the color change.
function doRainbow(obj) {
    if (act == 0) {
        act = 1;
        if (obj) objActive = obj;
        else     objActive = event.srcElement;
        clrOrg = objActive.style.color;
        TimrID = setInterval("ChangeColor()",100);
    }
}
//=====================================================================
// stopRainbow ~ this function stops the color change.
function stopRainbow() {
    if (act) {
        objActive.style.color = clrOrg;
        clearInterval(TimrID);
        act = 0;
    }
}
//=====================================================================
// doRainbowAnchor ~ begin the color change of an anchor, Automatically
function doRainbowAnchor() {
    if (act == 0) {
        var obj = event.srcElement;
        while (obj.tagName != 'A' && obj.tagName != 'BODY') {
            obj = obj.parentElement;
            if (obj.tagName == 'A' || obj.tagName == 'BODY') break;
        }
        if (obj.tagName == 'A' && obj.href != '') {
            objActive = obj;
            clrOrg    = objActive.style.color;
            TimrID    = setInterval("ChangeColor()",100);
            act       = 1;
        }
    }
}
//=====================================================================
// stopRainbowAnchor ~ stop the Automatic color change of an anchor
function stopRainbowAnchor() {
    if (act) {
        if (objActive.tagName == 'A') {
            objActive.style.color = clrOrg;
            clearInterval(TimrID);
            act = 0;
        }
    }
}
//=====================================================================
// Mozilla_doRainbowAnchor (for Netscape6 and Mozilla browsers)
function Mozilla_doRainbowAnchor(e) {
    if (act == 0) {
        obj = e.target;
        while (obj.nodeName != 'A' && obj.nodeName != 'BODY') {
            obj = obj.parentNode;
            if (obj.nodeName == 'A' || obj.nodeName == 'BODY') break;
        }
        if (obj.nodeName == 'A' && obj.href != '') {
            objActive = obj;
            clrOrg    = obj.style.color;
            TimrID    = setInterval("ChangeColor()",100);
            act       = 1;
        }
    }
}
//=====================================================================
// Mozilla_stopRainbowAnchor (for Netscape6 and Mozilla browsers)
function Mozilla_stopRainbowAnchor(e) {
    if (act) {
        if (objActive.nodeName == 'A') {
            objActive.style.color = clrOrg;
            clearInterval(TimrID);
            act = 0;
        }
    }
}
//=====================================================================
// ChangeColor ~ this function initiates the color change.
function ChangeColor() {
    objActive.style.color = makeColor();
}
//=====================================================================
// makeColor ~ this function creates the rainbow colors.
function makeColor() {
    // Color Gamut (complete subset of colors) --to look like Rainbow
    // HSV (Hue,Saturation,brightnessValue) -to- RGB (Red,Green,Blue)
    if (elmS == 0) {
        elmR = elmV;  elmG = elmV;  elmB = elmV;
    } else {
        t1 = elmV;
        t2 = (255 - elmS) * elmV / 255;
        t3 = elmH % 60;
        t3 = (t1 - t2) * t3 / 60;

        if (elmH < 60) {
            elmR = t1;  elmB = t2;  elmG = t2 + t3;
        }
        else if (elmH < 120) {
            elmG = t1;  elmB = t2;  elmR = t1 - t3;
        }
        else if (elmH < 180) {
            elmG = t1;  elmR = t2;  elmB = t2 + t3;
        }
        else if (elmH < 240) {
            elmB = t1;  elmR = t2;  elmG = t1 - t3;
        }
        else if (elmH < 300) {
            elmB = t1;  elmG = t2;  elmR = t2 + t3;
        }
        else if (elmH < 360) {
            elmR = t1;  elmG = t2;  elmB = t1 - t3;
        }
        else {
            elmR = 0;   elmG = 0;   elmB = 0;
        }
    }
    elmR = Math.floor(elmR).toString(16);
    elmG = Math.floor(elmG).toString(16);
    elmB = Math.floor(elmB).toString(16);
    if (elmR.length == 1)    elmR = "0" + elmR;
    if (elmG.length == 1)    elmG = "0" + elmG;
    if (elmB.length == 1)    elmB = "0" + elmB;
    elmH = elmH + rate;
    if (elmH >= 360) elmH = 0;
    return '#' + elmR + elmG + elmB;
}