/************************************************************************/
/* Rainbow Text Version 1.00											*/
/*																		*/
/* June 10, 1999														*/
/* Copyright (C) 1999 Mizuki Takanashi									*/
/* yu_chan@da.airnet.ne.jp												*/
/*----------------------------------------------------------------------*/
/* 使い方：目的のHTMLファイルに<script src="rainbow.js"></script>		*/
/*         などとして読み込ませるだけです。								*/
/*																		*/
/*         アンカー以外のタグも「onmouseover="doRainbow();"」と			*/
/*         「onmouseout="stopRainbow();"」を追加することで適用できます。*/
/************************************************************************/


////////////////////////////////////////////////////////////////////
// グローバル変数

var obj;		// イベントの発生したオブジェクト
var act = 0;	// 動作中チェック
var elmH = 0;	// Hue(色相)
var elmS = 128;	// Saturation(彩度)
var elmV = 255;	// Value(明度)
var rate = 20;	// 増分値
var clrOrg;		// 変更前の文字色
var TimerID;	// タイマー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;
}


//////////////////////////////////
// 色の変更開始
// 手動用

function doRainbow()
{
	if ( Browser && act != 1 ) {
		act = 1;
		obj = event.srcElement;
		clrOrg = obj.style.color;
		TimerID = setInterval("ChangeColor()",100);
	}
}


//////////////////////////////////
// 色の変更停止
// 手動用

function stopRainbow()
{
	if ( Browser && act != 0 ) {
		obj.style.color = clrOrg;
		clearInterval(TimerID);
		act = 0;
	}
}


//////////////////////////////////
// 色の変更開始
// アンカー自動用

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


//////////////////////////////////
// 色の変更停止
// アンカー自動用

function stopRainbowAnchor()
{
	if ( Browser && act != 0 ) {
		if ( obj.tagName == 'A' ) {
			obj.style.color = clrOrg;
			clearInterval(TimerID);
			act = 0;
		}
	}
}


//////////////////////////////////
// 色の変更

function ChangeColor()
{
	obj.style.color = makeColor();
}


//////////////////////////////////
// 色の生成

function makeColor()
{
	// 色相環を虹に見立てて変化させる
	// 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 = '#' + DtoH(elmR) + DtoH(elmG) + DtoH(elmB);

	elmH = elmH + rate;
	if ( elmH >= 360 )
		elmH = 0;

	return clrRGB;
}


//////////////////////////////////
// 10進数から16進数への変換

function DtoH(num,dk)
{
	if ( !dk )
		dk = 2;

	reh = '';

	for ( i=0; i<dk; i++ ) {
		if ( i != 0 )
			num = Math.floor(num / 16);

		dto = '0123456789abcdef'.charAt( Math.max(0,num % 16) );
		reh = dto + reh;
	}

	for ( i=reh.length; i<dk; i++ )
		reh = '0' + reh;

	return reh;
}
