Element.addMethods({
    phaseIn: function(element,param){
        param = param || {};
        var elem = element;
        var d = param.duration || 0.4;
        var transition = param.transition || Effect.Transitions.sinoidal; // 0〜1の間を入れるんだよ
        var afterFinish = param.afterFinish || function(){};
        var max_opacity = param.max_opacity || 1;
        var style = param.style;

        var flamerate = 6;// 動作周波数
        var interval = d * 1000 / flamerate; // 実際の動作インターバル

        var cnt = 0;
        var  n = 0; // transitionに渡す値
        var dn = 1 / flamerate; // nの増加分
        elem.setOpacity(n);
        if(!elem.visible()){elem.show()}
        elem.setStyle(style);
        var phaseIn = (function(elem,afterFinish){
            return function(){
                if(++cnt < flamerate){
                    elem.setOpacity(max_opacity * transition(n));
                    n+= dn;
                    setTimeout(arguments.callee,interval);
                }else{
                    elem.setOpacity(max_opacity);
                    afterFinish();
                }
            }
        })(elem,afterFinish);
        phaseIn();
    },
    phaseOut: function(element,param){
        var elem = element;
        var d = param.duration || 0.4;
        var transition = param.transition || Effect.Transitions.sinoidal; // 0〜1の間を入れるんだよ
        var afterFinish = param.afterFinish || function(){};
        var min_opacity = param.min_opacity || 0;

        var flamerate = 6;// 動作周波数
        var interval = d * 1000 / flamerate; // 実際の動作インターバル

        var opacity = elem.getOpacity();
        var cnt = 0;
        var  n = 0; // transitionに渡す値
        var dn = 1 / flamerate; // nの増加分
        var phaseOut = (function(elem,afterFinish){
            return function(){
                if(++cnt < flamerate){
                    elem.setOpacity(opacity - opacity * transition(n));
                    n+= dn;
                    setTimeout(arguments.callee,interval);
                }else{
                    elem.setOpacity(min_opacity);
                    elem.setStyle({zIndex: -100});
                    afterFinish();
                }
            }
        })(elem,afterFinish);
        phaseOut();
    }
})