/**
* クロスフェードするロールオーバー処理
* rollover2.js
* Copyright (c) 2007 KAZUMiX
* http://d.hatena.ne.jp/KAZUMiX/20071017/rollover2
*
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
* 更新履歴
* 2009/06/02 ブラウザの「戻る」でフェード状態が残っている場合に対処
* 2007/10/17 公開
*/
(function(){
	// ページ遷移時に透明にする用
	var rolloverImages = [];

	function setRollOver2(){
		if(!document.images){return;}
		var imgs = document.images;
		var insert = [];
		for(var i=0,len=imgs.length; i<len; i++){
			var splitname = imgs[i].src.split('_on.');
			if(splitname[1]){
				var rolloverImg = document.createElement('img');
				rolloverImages.push(rolloverImg);
				rolloverImg.src = splitname[0]+'_over.'+splitname[1];
				var alpha = 0;
				rolloverImg.currentAlpha = alpha;
				rolloverImg.style.opacity = alpha/100;
				rolloverImg.style.filter = 'alpha(opacity='+alpha+')';
				rolloverImg.style.position = 'absolute';

				//ロールオーバー・アウト処理それぞれを設定
				addEvent(rolloverImg,'mouseover',function(){setFader(this,100);});
				addEvent(rolloverImg,'mouseout',function(){setFader(this,0);});

				// 後で追加するために追加場所と共に保存しておく
				// この時点で追加するとdocument.imagesが書き換わって不都合
				insert[insert.length] = {position:imgs[i],element:rolloverImg};
			}
		}
		// ↑で作ったロールオーバー画像を追加
		for(i=0,len=insert.length; i<len ;i++){
			var parent = insert[i].position.parentNode;
			parent.insertBefore(insert[i].element,insert[i].position);
		}

		// ページ遷移時にはフェード状態をクリアする
		addEvent(window,'beforeunload', clearRollover);
	}

	// 指定要素を指定透明度にするためのフェードアニメを設定する関数
	function setFader(targetObj,targetAlpha){
		targetObj.targetAlpha = targetAlpha;
		if(targetObj.currentAlpha==undefined){
			targetObj.currentAlpha = 100;
		}
		if(targetObj.currentAlpha==targetObj.targetAlpha){
			return;
		}
		if(!targetObj.fading){
			if(!targetObj.fader){
				targetObj.fader = fader;
			}
			targetObj.fading = true;
			targetObj.fader();
		}
	}

	// アルファ値をターゲット値に近づける関数
	// ターゲット値になったら終了
	function fader(){
		this.currentAlpha += (this.targetAlpha - this.currentAlpha)*0.2;
		if(Math.abs(this.currentAlpha-this.targetAlpha)<1){
			this.currentAlpha = this.targetAlpha;
			this.fading = false;
		}
		var alpha = parseInt(this.currentAlpha);
		this.style.opacity = alpha/100;
		this.style.filter = 'alpha(opacity='+alpha+')';
		if(this.fading){
			var scope = this;
			setTimeout(function(){fader.apply(scope)},30);
		}
	}

	// すべてのロールオーバー画像をを透明にする関数（遷移時用）
	function clearRollover(){
		for(var i=0,len=rolloverImages.length; i<len; i++){
			var image = rolloverImages[i];
			image.style.opacity = 0;
			image.style.filter = 'alpha(opacity=0)';
		}
	}

	// イベントを追加する関数
	function addEvent(eventTarget, eventName, func){
		if(eventTarget.addEventListener){
			// モダンブラウザ
			eventTarget.addEventListener(eventName, func, false);
		}else if(window.attachEvent){
			// IE
			eventTarget.attachEvent('on'+eventName, function(){func.apply(eventTarget);});
		}
	}

	addEvent(window,'load',setRollOver2);
})(); 

