// UTF-8
// クロスフェードするロールオーバー処理
// by KAZUMiX
// http://d.hatena.ne.jp/KAZUMiX/20071017/rollover2
//
// 2011.4.20 edited by fujimi
// imgタグだけではなく、inputタグにも機能するように改修
//
// 2011.4.22 edited by fujimi
// jQuery化

(function($){
    $(function(){
        $("a img, input[type=image]").each(function(e){
            var target = $(this);
            var splitname = this.src.split('_n.');
            if( splitname[1] ){
                var rolloverImg = target.attr('type') ? $('<input>').attr('type', 'image') : $('<img>');
                rolloverImg.attr('src', splitname[0]+'_o.'+splitname[1])
                           .css({"position": "absolute", "opacity":0})
                           .mouseup(faderEnd)
                           .hover(
                                function(){setFader(this,100);},
                                function(){setFader(this,0);}
                            )[0].currentAlpha = 0;
                target.before(rolloverImg);
            }
        }); 
    });

    // 指定要素を指定透明度にするためのフェードアニメを設定する関数
    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);
        }
    }

    // アルファ値を0にする
    function faderEnd(){
        this.currentAlpha = 0;
        this.fading = false;
        this.style.opacity = 0;
        this.style.filter = 'alpha(opacity=0)';
    }

})(jQuery);

