//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

Fx.Slide = new Class({
    Extends: Fx,
    options: {
        mode: "vertical"
    },
    initialize: function(B, A){
        this.addEvent("complete", function(){
            this.open = (this.wrapper["offset" + this.layout.capitalize()] != 0);
            if (this.open && Browser.Engine.webkit419) {
                this.element.dispose().inject(this.wrapper);
            }
        }, true);
        this.element = this.subject = $(B);
        this.parent(A);
        var C = this.element.retrieve("wrapper");
        this.wrapper = C || new Element("div", {
            styles: $extend(this.element.getStyles("margin", "position"), {
                overflow: "hidden"
            })
        }).wraps(this.element);
        this.element.store("wrapper", this.wrapper).setStyle("margin", 0);
        this.now = [];
        this.open = true;
    },
    vertical: function(){
        this.margin = "margin-top";
        this.layout = "height";
        this.offset = this.element.offsetHeight;
    },
    horizontal: function(){
        this.margin = "margin-left";
        this.layout = "width";
        this.offset = this.element.offsetWidth;
    },
    set: function(A){
        this.element.setStyle(this.margin, A[0]);
        this.wrapper.setStyle(this.layout, A[1]);
        return this;
    },
    compute: function(E, D, C){
        var B = [];
        var A = 2;
        A.times(function(F){
            B[F] = Fx.compute(E[F], D[F], C);
        });
        return B;
    },
    start: function(B, E){
        if (!this.check(arguments.callee, B, E)) {
            return this;
        }
        this[E || this.options.mode]();
        var D = this.element.getStyle(this.margin).toInt();
        var C = this.wrapper.getStyle(this.layout).toInt();
        var A = [[D, C], [0, this.offset]];
        var G = [[D, C], [-this.offset, 0]];
        var F;
        switch (B) {
            case "in":
                F = A;
                break;
            case "out":
                F = G;
                break;
            case "toggle":
                F = (this.wrapper["offset" + this.layout.capitalize()] == 0) ? A : G;
        }
        return this.parent(F[0], F[1]);
    },
    slideIn: function(A){
        return this.start("in", A);
    },
    slideOut: function(A){
        return this.start("out", A);
    },
    hide: function(A){
        this[A || this.options.mode]();
        this.open = false;
        return this.set([-this.offset, 0]);
    },
    show: function(A){
        this[A || this.options.mode]();
        this.open = true;
        return this.set([0, this.offset]);
    },
    toggle: function(A){
        return this.start("toggle", A);
    }
});
Element.Properties.slide = {
    set: function(B){
        var A = this.retrieve("slide");
        if (A) {
            A.cancel();
        }
        return this.eliminate("slide").store("slide:options", $extend({
            link: "cancel"
        }, B));
    },
    get: function(A){
        if (A || !this.retrieve("slide")) {
            if (A || !this.retrieve("slide:options")) {
                this.set("slide", A);
            }
            this.store("slide", new Fx.Slide(this, this.retrieve("slide:options")));
        }
        return this.retrieve("slide");
    }
};
Element.implement({
    slide: function(D, E){
        D = D || "toggle";
        var B = this.get("slide"), A;
        switch (D) {
            case "hide":
                B.hide(E);
                break;
            case "show":
                B.show(E);
                break;
            case "toggle":
                var C = this.retrieve("slide:flag", B.open);
                B[(C) ? "slideOut" : "slideIn"](E);
                this.store("slide:flag", !C);
                A = true;
                break;
            default:
                B.start(D, E);
        }
        if (!A) {
            this.eliminate("slide:flag");
        }
        return this;
    }
});

