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

/* Rainbow Link Version 1.00 (1999.6.10)                                */

/*                                                                      */

/* Copyright (C) 1999-2001 TAKANASHI Mizuki                             */

/* takanasi@hamal.freemail.ne.jp                                        */

/*----------------------------------------------------------------------*/

/* Read it somehow even if my English text is a little wrong! ;-)       */

/*                                                                      */

/* Usage:                                                               */

/*  Insert '<script src="rainbow.js"></script>' into the BODY section,  */

/*  right after the BODY tag itself, before anything else.              */

/*  You don't need to add "onMouseover" and "onMouseout" attributes!!   */

/*                                                                      */

/*  If you'd like to add effect to other texts(not link texts), then    */

/*  add 'onmouseover="doRainbow();"' and 'onmouseout="stopRainbow();"'  */

/*  to the target tags.                                                 */

/*                                                                      */

/* This Script works with IE4 and above only, but no error occurs on    */

/* other browsers.                                                      */

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





////////////////////////////////////////////////////////////////////

// Setting



var rate = 20;  // Increase amount(The degree of the transmutation)





////////////////////////////////////////////////////////////////////

// Main routine



var obj;        // The object which event occured in

var act = 0;    // Flag during the action

var elmH = 0;   // Hue

var elmS = 128; // Saturation

var elmV = 255; // Value

var clrOrg;     // A color before the change

var TimerID;    // Timer ID





if (navigator.appName.indexOf("Microsoft",0) != -1 && parseInt(navigator.appVersion) >= 4) {

    Browser = true;

} else {

    Browser = false;

}



if (Browser) {

    document.onmouseover = doRainbowAnchor;

    document.onmouseout = stopRainbowAnchor;

}





//=============================================================================

// doRainbow

//  This function begins to change a color.

//=============================================================================

function doRainbow()

{

    if (Browser && act != 1) {

        act = 1;

        obj = event.srcElement;

        clrOrg = obj.style.color;

        TimerID = setInterval("ChangeColor()",100);

    }

}





//=============================================================================

// stopRainbow

//  This function stops to change a color.

//=============================================================================

function stopRainbow()

{

    if (Browser && act != 0) {

        obj.style.color = clrOrg;

        clearInterval(TimerID);

        act = 0;

    }

}





//=============================================================================

// doRainbowAnchor

//  This function begins to change a color. (of a anchor, automatically)

//=============================================================================

function doRainbowAnchor()

{

    if (Browser && act != 1) {

        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 != '') {

            act = 1;

            clrOrg = obj.style.color;

            TimerID = setInterval("ChangeColor()",100);

        }

    }

}





//=============================================================================

// stopRainbowAnchor

//  This function stops to change a color. (of a anchor, automatically)

//=============================================================================

function stopRainbowAnchor()

{

    if (Browser && act != 0) {

        if (obj.tagName == 'A') {

            obj.style.color = clrOrg;

            clearInterval(TimerID);

            act = 0;

        }

    }

}





//=============================================================================

// Change Color

//  This function changes a color actually.

//=============================================================================

function ChangeColor()

{

    obj.style.color = makeColor();

}





//=============================================================================

// makeColor

//  This function makes rainbow colors.

//=============================================================================

function makeColor()

{

    // Don't you think Color Gamut to look like Rainbow?



    // HSVtoRGB

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

    elmG = Math.floor(elmG);

    elmB = Math.floor(elmB);



    clrRGB = '#' + elmR.toString(16) + elmG.toString(16) + elmB.toString(16);



    elmH = elmH + rate;

    if (elmH >= 360)

        elmH = 0;



    return clrRGB;

}

