//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;
}});
Fx.Scroll = new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(B, A) {
    this.element = this.subject = $(B);
    this.parent(A);
    var D = this.cancel.bind(this, false);
    if ($type(this.element) != "element") {
        this.element = $(this.element.getDocument().body);
    }
    var C = this.element;
    if (this.options.wheelStops) {
        this.addEvent("start", function() {
            C.addEvent("mousewheel", D);
        }, true);
        this.addEvent("complete", function() {
            C.removeEvent("mousewheel", D);
        }, true);
    }
},set:function() {
    var A = Array.flatten(arguments);
    this.element.scrollTo(A[0], A[1]);
},compute:function(E, D, C) {
    var B = [];
    var A = 2;
    A.times(function(F) {
        B.push(Fx.compute(E[F], D[F], C));
    });
    return B;
},start:function(C, H) {
    if (!this.check(arguments.callee, C, H)) {
        return this;
    }
    var E = this.element.getSize(),F = this.element.getScrollSize();
    var B = this.element.getScroll(),D = {x:C,y:H};
    for (var G in D) {
        var A = F[G] - E[G];
        if ($chk(D[G])) {
            D[G] = ($type(D[G]) == "number") ? D[G].limit(0, A) : A;
        } else {
            D[G] = B[G];
        }
        D[G] += this.options.offset[G];
    }
    return this.parent([B.x,B.y], [D.x,D.y]);
},toTop:function() {
    return this.start(false, 0);
},toLeft:function() {
    return this.start(0, false);
},toRight:function() {
    return this.start("right", false);
},toBottom:function() {
    return this.start(false, "bottom");
},toElement:function(B) {
    var A = $(B).getPosition(this.element);
    return this.start(A.x, A.y);
}});
Fx.Elements = new Class({Extends:Fx.CSS,initialize:function(B, A) {
    this.elements = this.subject = $$(B);
    this.parent(A);
},compute:function(G, H, I) {
    var C = {};
    for (var D in G) {
        var A = G[D],E = H[D],F = C[D] = {};
        for (var B in A) {
            F[B] = this.parent(A[B], E[B], I);
        }
    }
    return C;
},set:function(B) {
    for (var C in B) {
        var A = B[C];
        for (var D in A) {
            this.render(this.elements[C], D, A[D], this.options.unit);
        }
    }
    return this;
},start:function(C) {
    if (!this.check(arguments.callee, C)) {
        return this;
    }
    var H = {},I = {};
    for (var D in C) {
        var F = C[D],A = H[D] = {},G = I[D] = {};
        for (var B in F) {
            var E = this.prepare(this.elements[D], B, F[B]);
            A[B] = E.from;
            G[B] = E.to;
        }
    }
    return this.parent(H, I);
}});
var Drag = new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,modifiers:{x:"left",y:"top"}},initialize:function() {
    var B = Array.link(arguments, {options:Object.type,element:$defined});
    this.element = $(B.element);
    this.document = this.element.getDocument();
    this.setOptions(B.options || {});
    var A = $type(this.options.handle);
    this.handles = (A == "array" || A == "collection") ? $$(this.options.handle) : $(this.options.handle) || this.element;
    this.mouse = {now:{},pos:{}};
    this.value = {start:{},now:{}};
    this.selection = (Browser.Engine.trident) ? "selectstart" : "mousedown";
    this.bound = {start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};
    this.attach();
},attach:function() {
    this.handles.addEvent("mousedown", this.bound.start);
    return this;
},detach:function() {
    this.handles.removeEvent("mousedown", this.bound.start);
    return this;
},start:function(C) {
    if (this.options.preventDefault) {
        C.preventDefault();
    }
    this.fireEvent("beforeStart", this.element);
    this.mouse.start = C.page;
    var A = this.options.limit;
    this.limit = {x:[],y:[]};
    for (var D in this.options.modifiers) {
        if (!this.options.modifiers[D]) {
            continue;
        }
        if (this.options.style) {
            this.value.now[D] = this.element.getStyle(this.options.modifiers[D]).toInt();
        } else {
            this.value.now[D] = this.element[this.options.modifiers[D]];
        }
        if (this.options.invert) {
            this.value.now[D] *= -1;
        }
        this.mouse.pos[D] = C.page[D] - this.value.now[D];
        if (A && A[D]) {
            for (var B = 2; B--; B) {
                if ($chk(A[D][B])) {
                    this.limit[D][B] = $lambda(A[D][B])();
                }
            }
        }
    }
    if ($type(this.options.grid) == "number") {
        this.options.grid = {x:this.options.grid,y:this.options.grid};
    }
    this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});
    this.document.addEvent(this.selection, this.bound.eventStop);
},check:function(A) {
    if (this.options.preventDefault) {
        A.preventDefault();
    }
    var B = Math.round(Math.sqrt(Math.pow(A.page.x - this.mouse.start.x, 2) + Math.pow(A.page.y - this.mouse.start.y, 2)));
    if (B > this.options.snap) {
        this.cancel();
        this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});
        this.fireEvent("start", this.element).fireEvent("snap", this.element);
    }
},drag:function(A) {
    if (this.options.preventDefault) {
        A.preventDefault();
    }
    this.mouse.now = A.page;
    for (var B in this.options.modifiers) {
        if (!this.options.modifiers[B]) {
            continue;
        }
        this.value.now[B] = this.mouse.now[B] - this.mouse.pos[B];
        if (this.options.invert) {
            this.value.now[B] *= -1;
        }
        if (this.options.limit && this.limit[B]) {
            if ($chk(this.limit[B][1]) && (this.value.now[B] > this.limit[B][1])) {
                this.value.now[B] = this.limit[B][1];
            } else {
                if ($chk(this.limit[B][0]) && (this.value.now[B] < this.limit[B][0])) {
                    this.value.now[B] = this.limit[B][0];
                }
            }
        }
        if (this.options.grid[B]) {
            this.value.now[B] -= (this.value.now[B] % this.options.grid[B]);
        }
        if (this.options.style) {
            this.element.setStyle(this.options.modifiers[B], this.value.now[B] + this.options.unit);
        } else {
            this.element[this.options.modifiers[B]] = this.value.now[B];
        }
    }
    this.fireEvent("drag", this.element);
},cancel:function(A) {
    this.document.removeEvent("mousemove", this.bound.check);
    this.document.removeEvent("mouseup", this.bound.cancel);
    if (A) {
        this.document.removeEvent(this.selection, this.bound.eventStop);
        this.fireEvent("cancel", this.element);
    }
},stop:function(A) {
    this.document.removeEvent(this.selection, this.bound.eventStop);
    this.document.removeEvent("mousemove", this.bound.drag);
    this.document.removeEvent("mouseup", this.bound.stop);
    if (A) {
        this.fireEvent("complete", this.element);
    }
}});
Element.implement({makeResizable:function(A) {
    return new Drag(this, $merge({modifiers:{x:"width",y:"height"}}, A));
}});
Drag.Move = new Class({Extends:Drag,options:{droppables:[],container:false},initialize:function(C, B) {
    this.parent(C, B);
    this.droppables = $$(this.options.droppables);
    this.container = $(this.options.container);
    if (this.container && $type(this.container) != "element") {
        this.container = $(this.container.getDocument().body);
    }
    C = this.element;
    var D = C.getStyle("position");
    var A = (D != "static") ? D : "absolute";
    if (C.getStyle("left") == "auto" || C.getStyle("top") == "auto") {
        C.position(C.getPosition(C.offsetParent));
    }
    C.setStyle("position", A);
    this.addEvent("start", function() {
        this.checkDroppables();
    }, true);
},start:function(B) {
    if (this.container) {
        var D = this.element,J = this.container,E = J.getCoordinates(D.offsetParent),F = {},A = {};
        ["top","right","bottom","left"].each(function(K) {
            F[K] = J.getStyle("padding-" + K).toInt();
            A[K] = D.getStyle("margin-" + K).toInt();
        }, this);
        var C = D.offsetWidth + A.left + A.right,I = D.offsetHeight + A.top + A.bottom;
        var H = [E.left + F.left,E.right - F.right - C];
        var G = [E.top + F.top,E.bottom - F.bottom - I];
        this.options.limit = {x:H,y:G};
    }
    this.parent(B);
},checkAgainst:function(B) {
    B = B.getCoordinates();
    var A = this.mouse.now;
    return(A.x > B.left && A.x < B.right && A.y < B.bottom && A.y > B.top);
},checkDroppables:function() {
    var A = this.droppables.filter(this.checkAgainst, this).getLast();
    if (this.overed != A) {
        if (this.overed) {
            this.fireEvent("leave", [this.element,this.overed]);
        }
        if (A) {
            this.overed = A;
            this.fireEvent("enter", [this.element,A]);
        } else {
            this.overed = null;
        }
    }
},drag:function(A) {
    this.parent(A);
    if (this.droppables.length) {
        this.checkDroppables();
    }
},stop:function(A) {
    this.checkDroppables();
    this.fireEvent("drop", [this.element,this.overed]);
    this.overed = null;
    return this.parent(A);
}});
Element.implement({makeDraggable:function(A) {
    return new Drag.Move(this, A);
}});
Hash.Cookie = new Class({Extends:Cookie,options:{autoSave:true},initialize:function(B, A) {
    this.parent(B, A);
    this.load();
},save:function() {
    var A = JSON.encode(this.hash);
    if (!A || A.length > 4096) {
        return false;
    }
    if (A == "{}") {
        this.dispose();
    } else {
        this.write(A);
    }
    return true;
},load:function() {
    this.hash = new Hash(JSON.decode(this.read(), true));
    return this;
}});
Hash.Cookie.implement((function() {
    var A = {};
    Hash.each(Hash.prototype, function(C, B) {
        A[B] = function() {
            var D = C.apply(this.hash, arguments);
            if (this.options.autoSave) {
                this.save();
            }
            return D;
        };
    });
    return A;
})());
var Color = new Native({initialize:function(B, C) {
    if (arguments.length >= 3) {
        C = "rgb";
        B = Array.slice(arguments, 0, 3);
    } else {
        if (typeof B == "string") {
            if (B.match(/rgb/)) {
                B = B.rgbToHex().hexToRgb(true);
            } else {
                if (B.match(/hsb/)) {
                    B = B.hsbToRgb();
                } else {
                    B = B.hexToRgb(true);
                }
            }
        }
    }
    C = C || "rgb";
    switch (C) {case"hsb":var A = B;B = B.hsbToRgb();B.hsb = A;break;case"hex":B = B.hexToRgb(true);break;
    }
    B.rgb = B.slice(0, 3);
    B.hsb = B.hsb || B.rgbToHsb();
    B.hex = B.rgbToHex();
    return $extend(B, this);
}});
Color.implement({mix:function() {
    var A = Array.slice(arguments);
    var C = ($type(A.getLast()) == "number") ? A.pop() : 50;
    var B = this.slice();
    A.each(function(D) {
        D = new Color(D);
        for (var E = 0; E < 3; E++) {
            B[E] = Math.round((B[E] / 100 * (100 - C)) + (D[E] / 100 * C));
        }
    });
    return new Color(B, "rgb");
},invert:function() {
    return new Color(this.map(function(A) {
        return 255 - A;
    }));
},setHue:function(A) {
    return new Color([A,this.hsb[1],this.hsb[2]], "hsb");
},setSaturation:function(A) {
    return new Color([this.hsb[0],A,this.hsb[2]], "hsb");
},setBrightness:function(A) {
    return new Color([this.hsb[0],this.hsb[1],A], "hsb");
}});
function $RGB(C, B, A) {
    return new Color([C,B,A], "rgb");
}
function $HSB(C, B, A) {
    return new Color([C,B,A], "hsb");
}
function $HEX(A) {
    return new Color(A, "hex");
}
Array.implement({rgbToHsb:function() {
    var B = this[0],C = this[1],J = this[2];
    var G,F,H;
    var I = Math.max(B, C, J),E = Math.min(B, C, J);
    var K = I - E;
    H = I / 255;
    F = (I != 0) ? K / I : 0;
    if (F == 0) {
        G = 0;
    } else {
        var D = (I - B) / K;
        var A = (I - C) / K;
        var L = (I - J) / K;
        if (B == I) {
            G = L - A;
        } else {
            if (C == I) {
                G = 2 + D - L;
            } else {
                G = 4 + A - D;
            }
        }
        G /= 6;
        if (G < 0) {
            G++;
        }
    }
    return[Math.round(G * 360),Math.round(F * 100),Math.round(H * 100)];
},hsbToRgb:function() {
    var C = Math.round(this[2] / 100 * 255);
    if (this[1] == 0) {
        return[C,C,C];
    } else {
        var A = this[0] % 360;
        var E = A % 60;
        var F = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
        var D = Math.round((this[2] * (6000 - this[1] * E)) / 600000 * 255);
        var B = Math.round((this[2] * (6000 - this[1] * (60 - E))) / 600000 * 255);
        switch (Math.floor(A / 60)) {case 0:return[C,B,F];case 1:return[D,C,F];case 2:return[F,C,B];case 3:return[F,D,C];case 4:return[B,F,C];case 5:return[C,F,D];
        }
    }
    return false;
}});
String.implement({rgbToHsb:function() {
    var A = this.match(/\d{1,3}/g);
    return(A) ? hsb.rgbToHsb() : null;
},hsbToRgb:function() {
    var A = this.match(/\d{1,3}/g);
    return(A) ? A.hsbToRgb() : null;
}});
var Group = new Class({initialize:function() {
    this.instances = Array.flatten(arguments);
    this.events = {};
    this.checker = {};
},addEvent:function(B, A) {
    this.checker[B] = this.checker[B] || {};
    this.events[B] = this.events[B] || [];
    if (this.events[B].contains(A)) {
        return false;
    } else {
        this.events[B].push(A);
    }
    this.instances.each(function(C, D) {
        C.addEvent(B, this.check.bind(this, [B,C,D]));
    }, this);
    return this;
},check:function(C, A, B) {
    this.checker[C][B] = true;
    var D = this.instances.every(function(F, E) {
        return this.checker[C][E] || false;
    }, this);
    if (!D) {
        return;
    }
    this.checker[C] = {};
    this.events[C].each(function(E) {
        E.call(this, this.instances, A);
    }, this);
}});
var Asset = new Hash({javascript:function(F, D) {
    D = $extend({onload:$empty,document:document,check:$lambda(true)}, D);
    var B = new Element("script", {src:F,type:"text/javascript"});
    var E = D.onload.bind(B),A = D.check,G = D.document;
    delete D.onload;
    delete D.check;
    delete D.document;
    B.addEvents({load:E,readystatechange:function() {
        if (["loaded","complete"].contains(this.readyState)) {
            E();
        }
    }}).setProperties(D);
    if (Browser.Engine.webkit419) {
        var C = (function() {
            if (!$try(A)) {
                return;
            }
            $clear(C);
            E();
        }).periodical(50);
    }
    return B.inject(G.head);
},css:function(B, A) {
    return new Element("link", $merge({rel:"stylesheet",media:"screen",type:"text/css",href:B}, A)).inject(document.head);
},image:function(C, B) {
    B = $merge({onload:$empty,onabort:$empty,onerror:$empty}, B);
    var D = new Image();
    var A = $(D) || new Element("img");
    ["load","abort","error"].each(function(E) {
        var F = "on" + E;
        var G = B[F];
        delete B[F];
        D[F] = function() {
            if (!D) {
                return;
            }
            if (!A.parentNode) {
                A.width = D.width;
                A.height = D.height;
            }
            D = D.onload = D.onabort = D.onerror = null;
            G.delay(1, A, A);
            A.fireEvent(E, A, 1);
        };
    });
    D.src = A.src = C;
    if (D && D.complete) {
        D.onload.delay(1);
    }
    return A.setProperties(B);
},images:function(D, C) {
    C = $merge({onComplete:$empty,onProgress:$empty}, C);
    if (!D.push) {
        D = [D];
    }
    var A = [];
    var B = 0;
    D.each(function(F) {
        var E = new Asset.image(F, {onload:function() {
            C.onProgress.call(this, B, D.indexOf(F));
            B++;
            if (B == D.length) {
                C.onComplete();
            }
        }});
        A.push(E);
    });
    return new Elements(A);
}});
var Sortables = new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(A, B) {
    this.setOptions(B);
    this.elements = [];
    this.lists = [];
    this.idle = true;
    this.addLists($$($(A) || A));
    if (!this.options.clone) {
        this.options.revert = false;
    }
    if (this.options.revert) {
        this.effect = new Fx.Morph(null, $merge({duration:250,link:"cancel"}, this.options.revert));
    }
},attach:function() {
    this.addLists(this.lists);
    return this;
},detach:function() {
    this.lists = this.removeLists(this.lists);
    return this;
},addItems:function() {
    Array.flatten(arguments).each(function(A) {
        this.elements.push(A);
        var B = A.retrieve("sortables:start", this.start.bindWithEvent(this, A));
        (this.options.handle ? A.getElement(this.options.handle) || A : A).addEvent("mousedown", B);
    }, this);
    return this;
},addLists:function() {
    Array.flatten(arguments).each(function(A) {
        this.lists.push(A);
        this.addItems(A.getChildren());
    }, this);
    return this;
},removeItems:function() {
    var A = [];
    Array.flatten(arguments).each(function(B) {
        A.push(B);
        this.elements.erase(B);
        var C = B.retrieve("sortables:start");
        (this.options.handle ? B.getElement(this.options.handle) || B : B).removeEvent("mousedown", C);
    }, this);
    return $$(A);
},removeLists:function() {
    var A = [];
    Array.flatten(arguments).each(function(B) {
        A.push(B);
        this.lists.erase(B);
        this.removeItems(B.getChildren());
    }, this);
    return $$(A);
},getClone:function(B, A) {
    if (!this.options.clone) {
        return new Element("div").inject(document.body);
    }
    if ($type(this.options.clone) == "function") {
        return this.options.clone.call(this, B, A, this.list);
    }
    return A.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:A.getStyle("width")}).inject(this.list).position(A.getPosition(A.getOffsetParent()));
},getDroppables:function() {
    var A = this.list.getChildren();
    if (!this.options.constrain) {
        A = this.lists.concat(A).erase(this.list);
    }
    return A.erase(this.clone).erase(this.element);
},insert:function(C, B) {
    var A = "inside";
    if (this.lists.contains(B)) {
        this.list = B;
        this.drag.droppables = this.getDroppables();
    } else {
        A = this.element.getAllPrevious().contains(B) ? "before" : "after";
    }
    this.element.inject(B, A);
    this.fireEvent("sort", [this.element,this.clone]);
},start:function(B, A) {
    if (!this.idle) {
        return;
    }
    this.idle = false;
    this.element = A;
    this.opacity = A.get("opacity");
    this.list = A.getParent();
    this.clone = this.getClone(B, A);
    this.drag = new Drag.Move(this.clone, {snap:this.options.snap,container:this.options.constrain && this.element.getParent(),droppables:this.getDroppables(),onSnap:function() {
        B.stop();
        this.clone.setStyle("visibility", "visible");
        this.element.set("opacity", this.options.opacity || 0);
        this.fireEvent("start", [this.element,this.clone]);
    }.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)});
    this.clone.inject(this.element, "before");
    this.drag.start(B);
},end:function() {
    this.drag.detach();
    this.element.set("opacity", this.opacity);
    if (this.effect) {
        var A = this.element.getStyles("width", "height");
        var B = this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));
        this.effect.element = this.clone;
        this.effect.start({top:B.top,left:B.left,width:A.width,height:A.height,opacity:0.25}).chain(this.reset.bind(this));
    } else {
        this.reset();
    }
},reset:function() {
    this.idle = true;
    this.clone.destroy();
    this.fireEvent("complete", this.element);
},serialize:function() {
    var C = Array.link(arguments, {modifier:Function.type,index:$defined});
    var B = this.lists.map(function(D) {
        return D.getChildren().map(C.modifier || function(E) {
            return E.get("id");
        }, this);
    }, this);
    var A = C.index;
    if (this.lists.length == 1) {
        A = 0;
    }
    return $chk(A) && A >= 0 && A < this.lists.length ? B[A] : B;
}});
var Tips = new Class({Implements:[Events,Options],options:{onShow:function(A) {
    A.setStyle("visibility", "visible");
},onHide:function(A) {
    A.setStyle("visibility", "hidden");
},showDelay:100,hideDelay:100,className:null,offsets:{x:16,y:16},fixed:false},initialize:function() {
    var C = Array.link(arguments, {options:Object.type,elements:$defined});
    this.setOptions(C.options || null);
    this.tip = new Element("div").inject(document.body);
    if (this.options.className) {
        this.tip.addClass(this.options.className);
    }
    var B = new Element("div", {"class":"tip-top"}).inject(this.tip);
    this.container = new Element("div", {"class":"tip"}).inject(this.tip);
    var A = new Element("div", {"class":"tip-bottom"}).inject(this.tip);
    this.tip.setStyles({position:"absolute",top:0,left:0,visibility:"hidden"});
    if (C.elements) {
        this.attach(C.elements);
    }
},attach:function(A) {
    $$(A).each(function(D) {
        var G = D.retrieve("tip:title", D.get("title"));
        var F = D.retrieve("tip:text", D.get("rel") || D.get("href"));
        var E = D.retrieve("tip:enter", this.elementEnter.bindWithEvent(this, D));
        var C = D.retrieve("tip:leave", this.elementLeave.bindWithEvent(this, D));
        D.addEvents({mouseenter:E,mouseleave:C});
        if (!this.options.fixed) {
            var B = D.retrieve("tip:move", this.elementMove.bindWithEvent(this, D));
            D.addEvent("mousemove", B);
        }
        D.store("tip:native", D.get("title"));
        D.erase("title");
    }, this);
    return this;
},detach:function(A) {
    $$(A).each(function(C) {
        C.removeEvent("mouseenter", C.retrieve("tip:enter") || $empty);
        C.removeEvent("mouseleave", C.retrieve("tip:leave") || $empty);
        C.removeEvent("mousemove", C.retrieve("tip:move") || $empty);
        C.eliminate("tip:enter").eliminate("tip:leave").eliminate("tip:move");
        var B = C.retrieve("tip:native");
        if (B) {
            C.set("title", B);
        }
    });
    return this;
},elementEnter:function(B, A) {
    $A(this.container.childNodes).each(Element.dispose);
    var D = A.retrieve("tip:title");
    if (D) {
        this.titleElement = new Element("div", {"class":"tip-title"}).inject(this.container);
        this.fill(this.titleElement, D);
    }
    var C = A.retrieve("tip:text");
    if (C) {
        this.textElement = new Element("div", {"class":"tip-text"}).inject(this.container);
        this.fill(this.textElement, C);
    }
    this.timer = $clear(this.timer);
    this.timer = this.show.delay(this.options.showDelay, this);
    this.position((!this.options.fixed) ? B : {page:A.getPosition()});
},elementLeave:function(A) {
    $clear(this.timer);
    this.timer = this.hide.delay(this.options.hideDelay, this);
},elementMove:function(A) {
    this.position(A);
},position:function(D) {
    var B = window.getSize(),A = window.getScroll();
    var E = {x:this.tip.offsetWidth,y:this.tip.offsetHeight};
    var C = {x:"left",y:"top"};
    for (var F in C) {
        var G = D.page[F] + this.options.offsets[F];
        if ((G + E[F] - A[F]) > B[F]) {
            G = D.page[F] - this.options.offsets[F] - E[F];
        }
        this.tip.setStyle(C[F], G);
    }
},fill:function(A, B) {
    (typeof B == "string") ? A.set("html", B) : A.adopt(B);
},show:function() {
    this.fireEvent("show", this.tip);
},hide:function() {
    this.fireEvent("hide", this.tip);
}});
var SmoothScroll = new Class({Extends:Fx.Scroll,initialize:function(B, C) {
    C = C || document;
    var E = C.getDocument(),D = C.getWindow();
    this.parent(E, B);
    this.links = (this.options.links) ? $$(this.options.links) : $$(E.links);
    var A = D.location.href.match(/^[^#]*/)[0] + "#";
    this.links.each(function(G) {
        if (G.href.indexOf(A) != 0) {
            return;
        }
        var F = G.href.substr(A.length);
        if (F && $(F)) {
            this.useLink(G, F);
        }
    }, this);
    if (!Browser.Engine.webkit419) {
        this.addEvent("complete", function() {
            D.location.hash = this.anchor;
        }, true);
    }
},useLink:function(B, A) {
    B.addEvent("click", function(C) {
        this.anchor = A;
        this.toElement(A);
        C.stop();
    }.bind(this));
}});
var Slider = new Class({Implements:[Events,Options],options:{onTick:function(A) {
    if (this.options.snap) {
        A = this.toPosition(this.step);
    }
    this.knob.setStyle(this.property, A);
},snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(E, A, D) {
    this.setOptions(D);
    this.element = $(E);
    this.knob = $(A);
    this.previousChange = this.previousEnd = this.step = -1;
    this.element.addEvent("mousedown", this.clickedElement.bind(this));
    if (this.options.wheel) {
        this.element.addEvent("mousewheel", this.scrolledElement.bindWithEvent(this));
    }
    var F,B = {},C = {x:false,y:false};
    switch (this.options.mode) {case"vertical":this.axis = "y";this.property = "top";F = "offsetHeight";break;case"horizontal":this.axis = "x";
        this.property = "left";F = "offsetWidth";
    }
    this.half = this.knob[F] / 2;
    this.full = this.element[F] - this.knob[F] + (this.options.offset * 2);
    this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0;
    this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps;
    this.range = this.max - this.min;
    this.steps = this.options.steps || this.full;
    this.stepSize = Math.abs(this.range) / this.steps;
    this.stepWidth = this.stepSize * this.full / Math.abs(this.range);
    this.knob.setStyle("position", "relative").setStyle(this.property, -this.options.offset);
    C[this.axis] = this.property;
    B[this.axis] = [-this.options.offset,this.full - this.options.offset];
    this.drag = new Drag(this.knob, {snap:0,limit:B,modifiers:C,onDrag:this.draggedKnob.bind(this),onStart:this.draggedKnob.bind(this),onComplete:function() {
        this.draggedKnob();
        this.end();
    }.bind(this)});
    if (this.options.snap) {
        this.drag.options.grid = Math.ceil(this.stepWidth);
        this.drag.options.limit[this.axis][1] = this.full;
    }
},set:function(A) {
    if (!((this.range > 0) ^ (A < this.min))) {
        A = this.min;
    }
    if (!((this.range > 0) ^ (A > this.max))) {
        A = this.max;
    }
    this.step = Math.round(A);
    this.checkStep();
    this.end();
    this.fireEvent("tick", this.toPosition(this.step));
    return this;
},clickedElement:function(C) {
    var B = this.range < 0 ? -1 : 1;
    var A = C.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
    A = A.limit(-this.options.offset, this.full - this.options.offset);
    this.step = Math.round(this.min + B * this.toStep(A));
    this.checkStep();
    this.end();
    this.fireEvent("tick", A);
},scrolledElement:function(A) {
    var B = (this.options.mode == "horizontal") ? (A.wheel < 0) : (A.wheel > 0);
    this.set(B ? this.step - this.stepSize : this.step + this.stepSize);
    A.stop();
},draggedKnob:function() {
    var B = this.range < 0 ? -1 : 1;
    var A = this.drag.value.now[this.axis];
    A = A.limit(-this.options.offset, this.full - this.options.offset);
    this.step = Math.round(this.min + B * this.toStep(A));
    this.checkStep();
},checkStep:function() {
    if (this.previousChange != this.step) {
        this.previousChange = this.step;
        this.fireEvent("change", this.step);
    }
},end:function() {
    if (this.previousEnd !== this.step) {
        this.previousEnd = this.step;
        this.fireEvent("complete", this.step + "");
    }
},toStep:function(A) {
    var B = (A + this.options.offset) * this.stepSize / this.full * this.steps;
    return this.options.steps ? Math.round(B -= B % this.stepSize) : B;
},toPosition:function(A) {
    return(this.full * Math.abs(this.min - A)) / (this.steps * this.stepSize) - this.options.offset;
}});
var Scroller = new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(A, B) {
    this.element.scrollTo(A, B);
}},initialize:function(B, A) {
    this.setOptions(A);
    this.element = $(B);
    this.listener = ($type(this.element) != "element") ? $(this.element.getDocument().body) : this.element;
    this.timer = null;
    this.coord = this.getCoords.bind(this);
},start:function() {
    this.listener.addEvent("mousemove", this.coord);
},stop:function() {
    this.listener.removeEvent("mousemove", this.coord);
    this.timer = $clear(this.timer);
},getCoords:function(A) {
    this.page = (this.listener.get("tag") == "body") ? A.client : A.page;
    if (!this.timer) {
        this.timer = this.scroll.periodical(50, this);
    }
},scroll:function() {
    var B = this.element.getSize(),A = this.element.getScroll(),E = this.element.getPosition(),D = {x:0,y:0};
    for (var C in this.page) {
        if (this.page[C] < (this.options.area + E[C]) && A[C] != 0) {
            D[C] = (this.page[C] - this.options.area - E[C]) * this.options.velocity;
        } else {
            if (this.page[C] + this.options.area > (B[C] + E[C]) && B[C] + B[C] != A[C]) {
                D[C] = (this.page[C] - B[C] + this.options.area - E[C]) * this.options.velocity;
            }
        }
    }
    if (D.y || D.x) {
        this.fireEvent("change", [A.x + D.x,A.y + D.y]);
    }
}});
var Accordion = new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function() {
    var C = Array.link(arguments, {container:Element.type,options:Object.type,togglers:$defined,elements:$defined});
    this.parent(C.elements, C.options);
    this.togglers = $$(C.togglers);
    this.container = $(C.container);
    this.previous = -1;
    if (this.options.alwaysHide) {
        this.options.wait = true;
    }
    if ($chk(this.options.show)) {
        this.options.display = false;
        this.previous = this.options.show;
    }
    if (this.options.start) {
        this.options.display = false;
        this.options.show = false;
    }
    this.effects = {};
    if (this.options.opacity) {
        this.effects.opacity = "fullOpacity";
    }
    if (this.options.width) {
        this.effects.width = this.options.fixedWidth ? "fullWidth" : "offsetWidth";
    }
    if (this.options.height) {
        this.effects.height = this.options.fixedHeight ? "fullHeight" : "scrollHeight";
    }
    for (var B = 0,A = this.togglers.length; B < A; B++) {
        this.addSection(this.togglers[B], this.elements[B]);
    }
    this.elements.each(function(E, D) {
        if (this.options.show === D) {
            this.fireEvent("active", [this.togglers[D],E]);
        } else {
            for (var F in this.effects) {
                E.setStyle(F, 0);
            }
        }
    }, this);
    if ($chk(this.options.display)) {
        this.display(this.options.display);
    }
},addSection:function(E, C, G) {
    E = $(E);
    C = $(C);
    var F = this.togglers.contains(E);
    var B = this.togglers.length;
    this.togglers.include(E);
    this.elements.include(C);
    if (B && (!F || G)) {
        G = $pick(G, B - 1);
        E.inject(this.togglers[G], "before");
        C.inject(E, "after");
    } else {
        if (this.container && !F) {
            E.inject(this.container);
            C.inject(this.container);
        }
    }
    var A = this.togglers.indexOf(E);
    E.addEvent("click", this.display.bind(this, A));
    if (this.options.height) {
        C.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"});
    }
    if (this.options.width) {
        C.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"});
    }
    C.fullOpacity = 1;
    if (this.options.fixedWidth) {
        C.fullWidth = this.options.fixedWidth;
    }
    if (this.options.fixedHeight) {
        C.fullHeight = this.options.fixedHeight;
    }
    C.setStyle("overflow", "hidden");
    if (!F) {
        for (var D in this.effects) {
            C.setStyle(D, 0);
        }
    }
    return this;
},display:function(A) {
    A = ($type(A) == "element") ? this.elements.indexOf(A) : A;
    if ((this.timer && this.options.wait) || (A === this.previous && !this.options.alwaysHide)) {
        return this;
    }
    this.previous = A;
    var B = {};
    this.elements.each(function(E, D) {
        B[D] = {};
        var C = (D != A) || (this.options.alwaysHide && (E.offsetHeight > 0));
        this.fireEvent(C ? "background" : "active", [this.togglers[D],E]);
        for (var F in this.effects) {
            B[D][F] = C ? 0 : E[this.effects[F]];
        }
    }, this);
    return this.start(B);
}});
