var DisplayEffect = function(args){ this.init(args); };
DisplayEffect.prototype = {
    init: function(args){
        this.trigger = $(args["trigger"]);
        this.target = $(args["target"]);
        this.openMsg = args["open_msg"] || "全て表示";
        this.closeMsg = args["close_msg"] || "閉じる";

        if(this.trigger) Event.observe(this.trigger, 'click', this.execute.bindAsEventListener(this));


    },
    execute: function(event){
        if(this.active){ return; };
        this.active = true;

        if(!this.target.visible()){
            this.open(this.target);
            this.trigger.innerHTML = this.closeMsg;
        }else{
            this.close(this.target);
            this.trigger.innerHTML = this.openMsg;
        }
    },
    open: function(targetObj){
        var self = this;

        var period = 100;
        var interval = 10;
        var times = Math.floor(period / interval)

        targetObj.style.overflow = 'hidden';
        var dimensions = Element.getDimensions(targetObj);
        var end_height = dimensions['height'];

        targetObj.style.display = 'none';
        targetObj.style.height = 0 + 'px';

        var  i = 0;
        var timer;
        now_h = 0;
        var funcRef = function() {
            i ++;
            now_h += Math.floor( end_height / times );
            targetObj.style.height = now_h + 'px';
            targetObj.style.display = 'block';
            // fix
            if(i >= times) {
                targetObj.style.height = end_height + 'px';
                clearInterval(timer);
                self.active = false;
            }
        }
        timer = setInterval(funcRef, interval);
    },
    close: function(targetObj){
        var self = this;

        var period = 100;
        var interval = 10;
        var times = Math.floor(period / interval)

        targetObj.style.overflow = 'hidden';
        var dimensions = Element.getDimensions(targetObj);
        var start_height = dimensions['height'];

        var i = 0;
        var timer;
        now_h = start_height;
        var funcRef = function() {
            i ++;
            now_h -= Math.floor( start_height / times );
            targetObj.style.height = now_h + 'px';
            targetObj.style.display = 'block';
            // fix
            if(i >= times) {
                targetObj.style.display = 'none';
                targetObj.style.height = start_height + 'px';
                clearInterval(timer);
                self.active = false;
            }
        }
        timer = setInterval(funcRef, interval);
    }
}
