/*----------------------------------------------------------
fadein & fadeout
by Takayuki Miyauchi (THETA NETWORKS)

(例)
var fade = new Fade( object );
fade.fadein(); // フェードイン
fade.fadeout(); // フェードアウト
objectにはDOMオブジェクトまたはID属性を指定する

動作環境
    prototype.js（http://www.prototypejs.org/）

不具合他
    fadein及びfadeoutを行うオブジェクトは、
    cssのwidthプロパティなどで幅を指定しないと動作しない
    （IEのみ）
----------------------------------------------------------*/

var Fade = Class.create();

Fade.prototype = {

    reduce_opacity_by: 15,
    rate: 30,   // 15 fps

    initialize: function(element){
        if( $(element) ){
            this.obj = $(element);
        }else{
            this.obj = element;
        }
    },


    fadein: function( opacity ){
        var element = this.obj;
        if( !opacity ){
            opacity = 0;
        }
        if (element.filters) {
            try {
                element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
            } catch (e) {
                element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
            }
        } else {
            element.style.opacity = opacity / 100;
        }

        this._fadein( element, opacity );
    },


    _fadein: function( element, opacity ) {
        var reduce_opacity_by = this.reduce_opacity_by;
        var rate = this.rate;

        if (opacity < 100) {
            opacity += reduce_opacity_by;
            if (opacity > 100) opacity = 100;

            if (element.filters) {
                try {
                    element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
                } catch (e) {
                    element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
                }
            } else {
                element.style.opacity = opacity / 100;
            }
        }

        if (opacity < 100) {
            setTimeout( this._fadein.bind(this, element, opacity), rate);
        }
    },


    fadeout: function( opacity ){
        var element = this.obj;
        if( !opacity ){
            opacity = 100;
        }
        if (element.filters) {
            try {
                element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
            } catch (e) {
                element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
            }
        } else {
            element.style.opacity = opacity / 100;
        }

        this._fadeout( element, opacity );
    },


    _fadeout: function(element, opacity){
        var reduce_opacity_by = this.reduce_opacity_by;
        var rate = this.rate;

        if (opacity > 0) {
            opacity -= reduce_opacity_by;

            if (element.filters) {
                try {
                    element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
                } catch (e) {
                    element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
                }
            } else {
                element.style.opacity = opacity / 100;
            }
            setTimeout( this._fadeout.bind(this, element, opacity), rate);
        }

        if( opacity <= 0 ){
            element.style.display = 'none';
        }
    }

}


