/**
 * MooScroll beta [for mootools 1.2]
 * @author Jason J. Jaeger | greengeckodesign.com
 * @version 0.59
 * @license MIT-style License
 *			Permission is hereby granted, free of charge, to any person obtaining a copy
 *			of this software and associated documentation files (the "Software"), to deal
 *			in the Software without restriction, including without limitation the rights
 *			to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *			copies of the Software, and to permit persons to whom the Software is
 *			furnished to do so, subject to the following conditions:
 *	
 *			The above copyright notice and this permission notice shall be included in
 *			all copies or substantial portions of the Software.
 *	
 *			THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *			IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *			FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *			AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *			LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *			OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *			THE SOFTWARE.
 **/
var MooScroll = new Class({
    Implements: Options,
    options: {
        selector: ".scroll",
        increment: 30,
        upBtnClass: "upBtn",
        downBtnClass: "downBtn",
        scrollBarClass: "scrollBar",
        scrollHandleClass: "scrollHandle",
        scrollHandleBGClass: "scrollHandleBG",
        scrollHandleTopClass: "scrollHandleTop",
        scrollHandleMiddleClass: "scrollHandleMiddle",
        scrollHandleBottomClass: "scrollHandleBottom",
        scrollControlsYClass: "scrollControlsY",
        handleOpacity: 1,
        handleActiveOpacity: 0.85,
        disabledOpacity: 0,
        fullWindowMode: false,
        smoothMooScroll: {
            toAnchor: true,
            toMooScrollArea: true
        },
        restrictedBrowsers: [Browser.Engine.presto925, Browser.Platform.ipod, Browser.Engine.webkit419]
    },
    initialize: function (a) {
        if (this.options.restrictedBrowsers.contains(true)) {
           // return
        }
        this.setOptions(a);
        this.mooScrollAreas = [];
        this.windowFxScroll = new Fx.Scroll(document.window, {
            wait: false
        });
        $(document.body).getElements(this.options.selector).each(function (c, b) {
            var d = new MooScrollArea(this.options, c, this.windowFxScroll);
            this.mooScrollAreas.include(d);
            if (this.options.smoothMooScroll.toAnchor || this.options.smoothMooScroll.toMooScrollArea) {
                this.smoothMooScroll = new SmoothMooScroll({
                    toAnchor: this.options.smoothMooScroll.toAnchor,
                    toMooScrollArea: this.options.smoothMooScroll.toMooScrollArea
                }, d.contentEl, this.windowFxScroll)
            }
        }.bind(this))
    },
    loadContent: function (a) {
        this.mooScrollAreas.each(function (c, b) {
            c.loadContent(a)
        })
    },
    refresh: function () {
        this.mooScrollAreas.each(function (b, a) {
            b.refresh()
        })
    },
    setSlider: function (a) {
        this.mooScrollAreas.each(function (c, b) {
            c.setSlider(a)
        })
    }
});
var MooScrollArea = new Class({
    Implements: Options,
    initialize: function (a, b, c) {
        this.windowFxScroll = c;
        this.setOptions(a);
        this.parentEl = b.setProperty("rel", "MooScrollArea");
        this.viewPort = {
            x: $(window).getSize().x,
            y: $(window).getSize().y
        };
        this.parentElPadding = this.parentEl.getStyles("padding-top", "padding-right", "padding-bottom", "padding-left");
        this.paddingHeight = parseFloat(this.parentEl.getStyle("padding-top")) + parseFloat(this.parentEl.getStyle("padding-bottom"));
        this.paddingWidth = parseFloat(this.parentEl.getStyle("padding-left")) + parseFloat(this.parentEl.getStyle("padding-right"));
        this.contentEl = new Element("div", {
            "class": "contentEl"
        }).adopt(this.parentEl.getChildren()).inject(this.parentEl, "top");
        this.parentEl.setStyle("overflow", "hidden").setStyles({
            padding: 0,
            width: parseFloat(this.parentEl.getStyle("width")) + this.paddingWidth,
            height: parseFloat(this.parentEl.getStyle("height")) + this.paddingHeight
        });
        this.borderHeight = parseFloat(this.parentEl.getStyle("border-top-width")) + parseFloat(this.parentEl.getStyle("border-bottom-width"));
        this.contentEl.setStyles({
            height: this.parentEl.getSize().y - this.borderHeight,
            overflow: "hidden",
            padding: 0
        });
        this.paddingEl = new Element("div", {
            "class": "paddingEl"
        }).adopt(this.contentEl.getChildren()).inject(this.contentEl, "top").setStyles(this.parentElPadding);
        if (this.options.fullWindowMode) {
            $(document).getElement("html").setStyle("overflow", "hidden");
            this.parentEl.setStyles({
                height: "100%",
                width: "100%",
                position: "absolute"
            });
            this.contentEl.setStyles({
                height: "100%",
                width: "100%",
                position: "absolute"
            })
        }
        this.scrollControlsYWrapper = new Element("div", {
            "class": this.options.scrollControlsYClass
        }).inject(this.parentEl, "bottom");
        this.upBtn = new Element("div", {
            "class": this.options.upBtnClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.downBtn = new Element("div", {
            "class": this.options.downBtnClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.scrollBar = new Element("div", {
            "class": this.options.scrollBarClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.scrollHandle = new Element("div", {
            "class": this.options.scrollHandleClass
        }).inject(this.scrollBar, "inside");
        this.scrollHandleTop = new Element("div", {
            "class": this.options.scrollHandleTopClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleBG = new Element("div", {
            "class": this.options.scrollHandleBGClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleMiddle = new Element("div", {
            "class": this.options.scrollHandleMiddleClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleBottom = new Element("div", {
            "class": this.options.scrollHandleBottomClass
        }).inject(this.scrollHandle, "inside");
        this.coverUp = new Element("div").inject(this.scrollControlsYWrapper, "bottom");
        this.fixIE6CSSbugs();
        this.overHang = this.paddingEl.getSize().y - this.parentEl.getSize().y;
        this.setHandleHeight();
        if (this.overHang <= 0) {
            this.greyOut();
            return
        }
        this.initSlider();
        this.parentEl.addEvents({
            mousewheel: function (d) {
                d = new Event(d).stop();
                if (d.wheel > 0) {
                    this.scrollUp(true)
                } else {
                    if (d.wheel < 0) {
                        this.scrollDown(true)
                    }
                }
            }.bind(this),
            keydown: function (d) {
                if (d.key === "up") {
                    d = new Event(d).stop();
                    this.scrollUp(true)
                } else {
                    if (d.key === "down" || d.key === "space") {
                        d = new Event(d).stop();
                        this.scrollDown(true)
                    }
                }
            }.bind(this),
            click: function (d) {
                this.hasFocus = true;
                this.hasFocusTimeout = (function () {
                    $clear(this.hasFocusTimeout);
                    this.hasFocus = true
                }.bind(this)).delay(50)
            }.bind(this)
        });
        this.contentEl.addEvents({
            scroll: function (d) {
                this.slider.set(this.contentEl.getScroll().y)
            }.bind(this)
        });
        this.scrollHandle.addEvents({
            mousedown: function (d) {
                this.scrollHandle.addClass(this.options.scrollHandleClass + "-Active").setStyle("opacity", this.options.handleActiveOpacity)
            }.bind(this)
        });
        document.addEvents({
            mouseup: function (d) {
                this.scrollHandle.removeClass(this.options.scrollHandleClass + "-Active").setStyle("opacity", this.options.handleOpacity);
                this.upBtn.removeClass(this.options.upBtnClass + "-Active");
                this.downBtn.removeClass(this.options.downBtnClass + "-Active")
            }.bind(this),
            keydown: function (d) {
                if ((this.hasFocus || this.options.fullWindowMode) && (d.key === "down" || d.key === "space" || d.key === "up")) {
                    this.parentEl.fireEvent("keydown", d)
                }
            }.bind(this),
            click: function (d) {
                this.hasFocus = false
            }.bind(this)
        });
        window.addEvent("resize", function () {
            $clear(this.refreshTimeout);
            if (this.options.fullWindowMode) {
                this.refreshTimeout = (function () {
                    $clear(this.refreshTimeout);
                    if (this.viewPort.x != $(window).getSize().x || this.viewPort.y != $(window).getSize().y) {
                        this.refresh();
                        this.viewPort.x = $(window).getSize().x;
                        this.viewPort.y = $(window).getSize().y
                    }
                }.bind(this)).delay(250)
            }
        }.bind(this));
        this.upBtn.addEvents({
            mousedown: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval);
                this.upInterval = this.scrollUp.periodical(10, this);
                this.upBtn.addClass(this.options.upBtnClass + "-Active")
            }.bind(this),
            mouseup: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this),
            mouseout: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this)
        });
        this.downBtn.addEvents({
            mousedown: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval);
                this.downInterval = this.scrollDown.periodical(10, this);
                this.downBtn.addClass(this.options.downBtnClass + "-Active")
            }.bind(this),
            mouseup: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this),
            mouseout: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this)
        })
    },
    initSlider: function () {
        this.slider = new Slider(this.scrollBar, this.scrollHandle, {
            range: [0, Math.round(this.overHang)],
            mode: "vertical",
            onChange: function (a, b) {
                this.contentEl.scrollTo(0, a);
                this.webKitKludge(a)
            }.bind(this)
        }).set(0)
    },
    webKitKludge: function (a) {
        if (!Browser.Engine.webkit) {
            return
        }
        if (this.step > a) {
            this.step = a;
            return
        }
        $clear(this.sliderTimeout);
        this.sliderTimeout = (function () {
            $clear(this.sliderTimeout);
            var b = (1 * this.paddingEl.getSize().y) / 100;
            if ((b + a) >= this.overHang) {
                if (this.paddingElTopMargin == null) {
                    this.paddingElTopMargin = parseFloat(this.paddingEl.getStyle("margin-top"))
                }
                this.paddingEl.setStyle("margin-top", this.paddingElTopMargin - b);
                if (!this.scrollHandleTopMargin) {
                    this.scrollHandleTopMargin = parseFloat(this.scrollHandle.getStyle("margin-top"))
                }
                this.scrollHandle.setStyle("margin-top", this.scrollHandleTopMargin + 2);
                this.contentEl.scrollTo(0, this.overHang);
                this.step = this.overHang
            } else {
                this.paddingEl.setStyle("margin-top", this.paddingElTopMargin);
                this.scrollHandle.setStyle("margin-top", this.scrollHandleTopMargin);
                this.contentEl.scrollTo(0, a);
                this.step = a
            }
        }.bind(this)).delay(10)
    },
    scrollUp: function (a) {
        var b = this.contentEl.getScroll().y - 30;
        this.slider.set(b);
        if (this.contentEl.getScroll().y <= 0 && a) {
            document.window.scrollTo(0, document.window.getScroll().y - this.options.increment)
        }
    },
    scrollDown: function (c) {
        var d = this.contentEl.getScroll().y + this.options.increment;
        this.slider.set(d);
        var a = (1 * this.paddingEl.getSize().y) / 100;
        var b = (this.paddingEl.getSize().y - this.parentEl.getSize().y) <= (this.contentEl.getScroll().y + a);
        if (b && c) {
            document.window.scrollTo(0, document.window.getScroll().y + this.options.increment)
        }
    },
    fixIE6CSSbugs: function () {
        if (Browser.Engine.trident4) {
            this.parentEl.setStyle("height", this.parentEl.getStyle("height"));
            this.contentEl.setStyle("height", this.parentEl.getStyle("height"));
            var c = this.scrollBar.getStyle("top").toInt();
            var a = this.scrollBar.getStyle("bottom").toInt();
            var b = this.parentEl.getSize().y - this.borderHeight;
            this.scrollControlsYWrapper.setStyles({
                height: b
            });
            this.scrollBar.setStyles({
                height: b - c - a
            })
        }
    },
    setHandleHeight: function () {
        
        this.scrollHandle.setStyles({
            height: 1//this.handleHeight
        })
    },
    greyOut: function () {
        this.scrollHandle.setStyles({
            display: "none"
        });
        this.upBtn.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.scrollControlsYWrapper.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.downBtn.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.scrollBar.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.coverUp.setStyles({
            display: "block",
            position: "absolute",
            background: "white",
            opacity: 0.01,
            right: "0",
            top: "0",
            width: "100%",
            height: this.scrollControlsYWrapper.getSize().y
        })
    },
    unGrey: function () {
        this.scrollHandle.setStyles({
            display: "block",
            height: "auto"
        });
        this.scrollControlsYWrapper.setStyles({
            opacity: 1
        });
        this.upBtn.setStyles({
            opacity: 1
        });
        this.downBtn.setStyles({
            opacity: 1
        });
        this.scrollBar.setStyles({
            opacity: 1
        });
        this.coverUp.setStyles({
            display: "none",
            width: 0,
            height: 0
        });
        this.setHandleHeight()
    },
    loadContent: function (a) {
        this.slider.set(0);
        this.paddingEl.empty().set("html", a);
        this.refresh()
    },
    refresh: function () {
        var a = Math.round(((100 * this.step) / this.overHang));
        if (this.options.fullWindowMode) {
            var b = $(window).getSize();
            this.parentEl.setStyles({
                width: "100%",
                height: "100%"
            })
        }
        this.fixIE6CSSbugs();
        this.overHang = this.paddingEl.getSize().y - this.parentEl.getSize().y;
        this.setHandleHeight();
        if (this.overHang <= 0) {
            this.greyOut();
            return
        } else {
            this.unGrey()
        }
        this.scrollHandle.removeEvents();
        var c = Math.round((a * this.overHang) / 100);
        this.initSlider();
        this.slider.set(c);
        if (Browser.Engine.trident4) {
            this.scrollHandleBG.setStyle("height", "0").setStyle("height", "100%")
        }
        if (this.options.smoothMooScroll.toAnchor || this.options.smoothMooScroll.toMooScrollArea) {
            this.smoothMooScroll = new SmoothMooScroll({
                toAnchor: this.options.smoothMooScroll.toAnchor,
                toMooScrollArea: this.options.smoothMooScroll.toMooScrollArea
            }, this.contentEl, this.windowFxScroll)
        }
    },
    setSlider: function (a) {
        if (a == "top") {
            this.slider.set(0)
        } else {
            if (a == "bottom") {
                this.slider.set("100%")
            } else {
                this.slider.set(a)
            }
        }
    }
});
var SmoothMooScroll = new Class({
    Extends: Fx.Scroll,
    initialize: function (b, c, d) {
        this.setOptions(b);
        this.windowFxScroll = d;
        this.context = c;
        c = c || document;
        this.context = c;
        var f = c.getDocument(),
            e = c.getWindow();
        this.parent(c, b);
        this.links = (this.options.links) ? $$(this.options.links) : $$(f.links);
        var a = e.location.href.match(/^[^#]*/)[0] + "#";
        this.links.each(function (h) {
            if (h.href.indexOf(a) != 0) {
                return
            }
            var g = h.href.substr(a.length);
            if (g && $(g) && $(g).getParents().contains($(this.context))) {
                this.useLink(h, g, true)
            } else {
                if (g && $(g) && !this.inMooScrollArea($(g))) {
                    this.useLink(h, g, false)
                }
            }
        }, this);
        if (!Browser.Engine.webkit419) {
            this.addEvent("complete", function () {
                e.location.hash = this.anchor
            }, true)
        }
    },
    inMooScrollArea: function (a) {
        return a.getParents().filter(function (c, b) {
            return c.match("[rel=MooScrollArea]")
        }).length > 0
    },
    putAnchorInAddressBar: function (a) {
        window.location.href = "#" + a
    },
    useLink: function (b, a, c) {
        b.removeEvents("click");
        b.addEvent("click", function (d) {
            if (!a || !$(a)) {
                return
            }
            this.anchor = a;
            if (c) {
                if (this.options.toMooScrollArea && this.options.toAnchor) {
                    this.windowFxScroll.toElement(this.context.getParent()).chain(function (f, e) {
                        this.toElement(a).chain(function () {
                            this.putAnchorInAddressBar(a)
                        }.bind(this))
                    }.bind(this))
                } else {
                    if (this.options.toMooScrollArea) {
                        this.windowFxScroll.toElement(this.context.getParent()).chain(function () {
                            this.putAnchorInAddressBar(a)
                        }.bind(this))
                    } else {
                        if (this.options.toAnchor) {
                            this.toElement(a).chain(function () {
                                this.putAnchorInAddressBar(a)
                            }.bind(this))
                        }
                    }
                }
            } else {
                this.windowFxScroll.toElement(a).chain(function () {
                    this.putAnchorInAddressBar(a)
                }.bind(this))
            }
            d.stop()
        }.bind(this))
    }
});/**
 * MooScroll beta [for mootools 1.2]
 * @author Jason J. Jaeger | greengeckodesign.com
 * @version 0.59
 * @license MIT-style License
 *			Permission is hereby granted, free of charge, to any person obtaining a copy
 *			of this software and associated documentation files (the "Software"), to deal
 *			in the Software without restriction, including without limitation the rights
 *			to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *			copies of the Software, and to permit persons to whom the Software is
 *			furnished to do so, subject to the following conditions:
 *	
 *			The above copyright notice and this permission notice shall be included in
 *			all copies or substantial portions of the Software.
 *	
 *			THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *			IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *			FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *			AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *			LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *			OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *			THE SOFTWARE.
 **/
var MooScroll = new Class({
    Implements: Options,
    options: {
        selector: ".scroll",
        increment: 10,
        upBtnClass: "upBtn",
        downBtnClass: "downBtn",
        scrollBarClass: "scrollBar",
        scrollHandleClass: "scrollHandle",
        scrollHandleBGClass: "scrollHandleBG",
        scrollHandleTopClass: "scrollHandleTop",
        scrollHandleMiddleClass: "scrollHandleMiddle",
        scrollHandleBottomClass: "scrollHandleBottom",
        scrollControlsYClass: "scrollControlsY",
        handleOpacity: 1,
        handleActiveOpacity: 0.85,
        disabledOpacity: 0,
        fullWindowMode: false,
        smoothMooScroll: {
            toAnchor: true,
            toMooScrollArea: true
        },
        restrictedBrowsers: [Browser.Engine.presto925, Browser.Platform.ipod, Browser.Engine.webkit419]
    },
    initialize: function (a) {
        if (this.options.restrictedBrowsers.contains(true)) {
            return
        }
        this.setOptions(a);
        this.mooScrollAreas = [];
        this.windowFxScroll = new Fx.Scroll(document.window, {
            wait: false
        });
        $(document.body).getElements(this.options.selector).each(function (c, b) {
            var d = new MooScrollArea(this.options, c, this.windowFxScroll);
            this.mooScrollAreas.include(d);
            if (this.options.smoothMooScroll.toAnchor || this.options.smoothMooScroll.toMooScrollArea) {
                this.smoothMooScroll = new SmoothMooScroll({
                    toAnchor: this.options.smoothMooScroll.toAnchor,
                    toMooScrollArea: this.options.smoothMooScroll.toMooScrollArea
                }, d.contentEl, this.windowFxScroll)
            }
        }.bind(this))
    },
    loadContent: function (a) {
        this.mooScrollAreas.each(function (c, b) {
            c.loadContent(a)
        })
    },
    refresh: function () {
        this.mooScrollAreas.each(function (b, a) {
            b.refresh()
        })
    },
    setSlider: function (a) {
        this.mooScrollAreas.each(function (c, b) {
            c.setSlider(a)
        })
    }
});
var MooScrollArea = new Class({
    Implements: Options,
    initialize: function (a, b, c) {
        this.windowFxScroll = c;
        this.setOptions(a);
        this.parentEl = b.setProperty("rel", "MooScrollArea");
        this.viewPort = {
            x: $(window).getSize().x,
            y: $(window).getSize().y
        };
        this.parentElPadding = this.parentEl.getStyles("padding-top", "padding-right", "padding-bottom", "padding-left");
        this.paddingHeight = parseFloat(this.parentEl.getStyle("padding-top")) + parseFloat(this.parentEl.getStyle("padding-bottom"));
        this.paddingWidth = parseFloat(this.parentEl.getStyle("padding-left")) + parseFloat(this.parentEl.getStyle("padding-right"));
        this.contentEl = new Element("div", {
            "class": "contentEl"
        }).adopt(this.parentEl.getChildren()).inject(this.parentEl, "top");
        this.parentEl.setStyle("overflow", "hidden").setStyles({
            padding: 0,
            width: parseFloat(this.parentEl.getStyle("width")) + this.paddingWidth,
            height: parseFloat(this.parentEl.getStyle("height")) + this.paddingHeight
        });
        this.borderHeight = parseFloat(this.parentEl.getStyle("border-top-width")) + parseFloat(this.parentEl.getStyle("border-bottom-width"));
        this.contentEl.setStyles({
            height: this.parentEl.getSize().y - this.borderHeight,
            overflow: "hidden",
            padding: 0
        });
        this.paddingEl = new Element("div", {
            "class": "paddingEl"
        }).adopt(this.contentEl.getChildren()).inject(this.contentEl, "top").setStyles(this.parentElPadding);
        if (this.options.fullWindowMode) {
            $(document).getElement("html").setStyle("overflow", "hidden");
            this.parentEl.setStyles({
                height: "100%",
                width: "100%",
                position: "absolute"
            });
            this.contentEl.setStyles({
                height: "100%",
                width: "100%",
                position: "absolute"
            })
        }
        this.scrollControlsYWrapper = new Element("div", {
            "class": this.options.scrollControlsYClass
        }).inject(this.parentEl, "bottom");
        this.upBtn = new Element("div", {
            "class": this.options.upBtnClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.downBtn = new Element("div", {
            "class": this.options.downBtnClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.scrollBar = new Element("div", {
            "class": this.options.scrollBarClass
        }).inject(this.scrollControlsYWrapper, "bottom");
        this.scrollHandle = new Element("div", {
            "class": this.options.scrollHandleClass
        }).inject(this.scrollBar, "inside");
        this.scrollHandleTop = new Element("div", {
            "class": this.options.scrollHandleTopClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleBG = new Element("div", {
            "class": this.options.scrollHandleBGClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleMiddle = new Element("div", {
            "class": this.options.scrollHandleMiddleClass
        }).inject(this.scrollHandle, "inside");
        this.scrollHandleBottom = new Element("div", {
            "class": this.options.scrollHandleBottomClass
        }).inject(this.scrollHandle, "inside");
        this.coverUp = new Element("div").inject(this.scrollControlsYWrapper, "bottom");
        this.fixIE6CSSbugs();
        this.overHang = this.paddingEl.getSize().y - this.parentEl.getSize().y;
        this.setHandleHeight();
        if (this.overHang <= 0) {
            this.greyOut();
            return
        }
        this.initSlider();
        this.parentEl.addEvents({
            mousewheel: function (d) {
                d = new Event(d).stop();
                if (d.wheel > 0) {
                    this.scrollUp(true)
                } else {
                    if (d.wheel < 0) {
                        this.scrollDown(true)
                    }
                }
            }.bind(this),
            keydown: function (d) {
                if (d.key === "up") {
                    d = new Event(d).stop();
                    this.scrollUp(true)
                } else {
                    if (d.key === "down" || d.key === "space") {
                        d = new Event(d).stop();
                        this.scrollDown(true)
                    }
                }
            }.bind(this),
            click: function (d) {
                this.hasFocus = true;
                this.hasFocusTimeout = (function () {
                    $clear(this.hasFocusTimeout);
                    this.hasFocus = true
                }.bind(this)).delay(50)
            }.bind(this)
        });
        this.contentEl.addEvents({
            scroll: function (d) {
                this.slider.set(this.contentEl.getScroll().y)
            }.bind(this)
        });
        this.scrollHandle.addEvents({
            mousedown: function (d) {
                this.scrollHandle.addClass(this.options.scrollHandleClass + "-Active").setStyle("opacity", this.options.handleActiveOpacity)
            }.bind(this)
        });
        document.addEvents({
            mouseup: function (d) {
                this.scrollHandle.removeClass(this.options.scrollHandleClass + "-Active").setStyle("opacity", this.options.handleOpacity);
                this.upBtn.removeClass(this.options.upBtnClass + "-Active");
                this.downBtn.removeClass(this.options.downBtnClass + "-Active")
            }.bind(this),
            keydown: function (d) {
                if ((this.hasFocus || this.options.fullWindowMode) && (d.key === "down" || d.key === "space" || d.key === "up")) {
                    this.parentEl.fireEvent("keydown", d)
                }
            }.bind(this),
            click: function (d) {
                this.hasFocus = false
            }.bind(this)
        });
        window.addEvent("resize", function () {
            $clear(this.refreshTimeout);
            if (this.options.fullWindowMode) {
                this.refreshTimeout = (function () {
                    $clear(this.refreshTimeout);
                    if (this.viewPort.x != $(window).getSize().x || this.viewPort.y != $(window).getSize().y) {
                        this.refresh();
                        this.viewPort.x = $(window).getSize().x;
                        this.viewPort.y = $(window).getSize().y
                    }
                }.bind(this)).delay(250)
            }
        }.bind(this));
        this.upBtn.addEvents({
            mousedown: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval);
                this.upInterval = this.scrollUp.periodical(10, this);
                this.upBtn.addClass(this.options.upBtnClass + "-Active")
            }.bind(this),
            mouseup: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this),
            mouseout: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this)
        });
        this.downBtn.addEvents({
            mousedown: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval);
                this.downInterval = this.scrollDown.periodical(10, this);
                this.downBtn.addClass(this.options.downBtnClass + "-Active")
            }.bind(this),
            mouseup: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this),
            mouseout: function (d) {
                $clear(this.upInterval);
                $clear(this.downInterval)
            }.bind(this)
        })
    },
    initSlider: function () {
        this.slider = new Slider(this.scrollBar, this.scrollHandle, {
            range: [0, Math.round(this.overHang)],
            mode: "vertical",
            onChange: function (a, b) {
                this.contentEl.scrollTo(0, a);
                this.webKitKludge(a)
            }.bind(this)
        }).set(0)
    },
    webKitKludge: function (a) {
        if (!Browser.Engine.webkit) {
            return
        }
        if (this.step > a) {
            this.step = a;
            return
        }
        $clear(this.sliderTimeout);
        this.sliderTimeout = (function () {
            $clear(this.sliderTimeout);
            var b = (1 * this.paddingEl.getSize().y) / 100;
            if ((b + a) >= this.overHang) {
                if (this.paddingElTopMargin == null) {
                    this.paddingElTopMargin = parseFloat(this.paddingEl.getStyle("margin-top"))
                }
                this.paddingEl.setStyle("margin-top", this.paddingElTopMargin - b);
                if (!this.scrollHandleTopMargin) {
                    this.scrollHandleTopMargin = parseFloat(this.scrollHandle.getStyle("margin-top"))
                }
                this.scrollHandle.setStyle("margin-top", this.scrollHandleTopMargin + 2);
                this.contentEl.scrollTo(0, this.overHang);
                this.step = this.overHang
            } else {
                this.paddingEl.setStyle("margin-top", this.paddingElTopMargin);
                this.scrollHandle.setStyle("margin-top", this.scrollHandleTopMargin);
                this.contentEl.scrollTo(0, a);
                this.step = a
            }
        }.bind(this)).delay(10)
    },
    scrollUp: function (a) {
        var b = this.contentEl.getScroll().y - 30;
        this.slider.set(b);
        if (this.contentEl.getScroll().y <= 0 && a) {
            document.window.scrollTo(0, document.window.getScroll().y - this.options.increment)
        }
    },
    scrollDown: function (c) {
        var d = this.contentEl.getScroll().y + this.options.increment;
        this.slider.set(d);
        var a = (1 * this.paddingEl.getSize().y) / 100;
        var b = (this.paddingEl.getSize().y - this.parentEl.getSize().y) <= (this.contentEl.getScroll().y + a);
        if (b && c) {
            document.window.scrollTo(0, document.window.getScroll().y + this.options.increment)
        }
    },
    fixIE6CSSbugs: function () {
        if (Browser.Engine.trident4) {
            this.parentEl.setStyle("height", this.parentEl.getStyle("height"));
            this.contentEl.setStyle("height", this.parentEl.getStyle("height"));
            var c = this.scrollBar.getStyle("top").toInt();
            var a = this.scrollBar.getStyle("bottom").toInt();
            var b = this.parentEl.getSize().y - this.borderHeight;
            this.scrollControlsYWrapper.setStyles({
                height: b
            });
            this.scrollBar.setStyles({
                height: b - c - a
            })
        }
    },
    setHandleHeight: function () {
        
        this.scrollHandle.setStyles({
            height: 1//this.handleHeight
        })
    },
    greyOut: function () {
        this.scrollHandle.setStyles({
            display: "none"
        });
        this.upBtn.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.scrollControlsYWrapper.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.downBtn.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.scrollBar.setStyles({
            opacity: this.options.disabledOpacity
        });
        this.coverUp.setStyles({
            display: "block",
            position: "absolute",
            background: "white",
            opacity: 0.01,
            right: "0",
            top: "0",
            width: "100%",
            height: this.scrollControlsYWrapper.getSize().y
        })
    },
    unGrey: function () {
        this.scrollHandle.setStyles({
            display: "block",
            height: "auto"
        });
        this.scrollControlsYWrapper.setStyles({
            opacity: 1
        });
        this.upBtn.setStyles({
            opacity: 1
        });
        this.downBtn.setStyles({
            opacity: 1
        });
        this.scrollBar.setStyles({
            opacity: 1
        });
        this.coverUp.setStyles({
            display: "none",
            width: 0,
            height: 0
        });
        this.setHandleHeight()
    },
    loadContent: function (a) {
        this.slider.set(0);
        this.paddingEl.empty().set("html", a);
        this.refresh()
    },
    refresh: function () {
        var a = Math.round(((100 * this.step) / this.overHang));
        if (this.options.fullWindowMode) {
            var b = $(window).getSize();
            this.parentEl.setStyles({
                width: "100%",
                height: "100%"
            })
        }
        this.fixIE6CSSbugs();
        this.overHang = this.paddingEl.getSize().y - this.parentEl.getSize().y;
        this.setHandleHeight();
        if (this.overHang <= 0) {
            this.greyOut();
            return
        } else {
            this.unGrey()
        }
        this.scrollHandle.removeEvents();
        var c = Math.round((a * this.overHang) / 100);
        this.initSlider();
        this.slider.set(c);
        if (Browser.Engine.trident4) {
            this.scrollHandleBG.setStyle("height", "0").setStyle("height", "100%")
        }
        if (this.options.smoothMooScroll.toAnchor || this.options.smoothMooScroll.toMooScrollArea) {
            this.smoothMooScroll = new SmoothMooScroll({
                toAnchor: this.options.smoothMooScroll.toAnchor,
                toMooScrollArea: this.options.smoothMooScroll.toMooScrollArea
            }, this.contentEl, this.windowFxScroll)
        }
    },
    setSlider: function (a) {
        if (a == "top") {
            this.slider.set(0)
        } else {
            if (a == "bottom") {
                this.slider.set("100%")
            } else {
                this.slider.set(a)
            }
        }
    }
});
var SmoothMooScroll = new Class({
    Extends: Fx.Scroll,
    initialize: function (b, c, d) {
        this.setOptions(b);
        this.windowFxScroll = d;
        this.context = c;
        c = c || document;
        this.context = c;
        var f = c.getDocument(),
            e = c.getWindow();
        this.parent(c, b);
        this.links = (this.options.links) ? $$(this.options.links) : $$(f.links);
        var a = e.location.href.match(/^[^#]*/)[0] + "#";
        this.links.each(function (h) {
            if (h.href.indexOf(a) != 0) {
                return
            }
            var g = h.href.substr(a.length);
            if (g && $(g) && $(g).getParents().contains($(this.context))) {
                this.useLink(h, g, true)
            } else {
                if (g && $(g) && !this.inMooScrollArea($(g))) {
                    this.useLink(h, g, false)
                }
            }
        }, this);
        if (!Browser.Engine.webkit419) {
            this.addEvent("complete", function () {
                e.location.hash = this.anchor
            }, true)
        }
    },
    inMooScrollArea: function (a) {
        return a.getParents().filter(function (c, b) {
            return c.match("[rel=MooScrollArea]")
        }).length > 0
    },
    putAnchorInAddressBar: function (a) {
        window.location.href = "#" + a
    },
    useLink: function (b, a, c) {
        b.removeEvents("click");
        b.addEvent("click", function (d) {
            if (!a || !$(a)) {
                return
            }
            this.anchor = a;
            if (c) {
                if (this.options.toMooScrollArea && this.options.toAnchor) {
                    this.windowFxScroll.toElement(this.context.getParent()).chain(function (f, e) {
                        this.toElement(a).chain(function () {
                            this.putAnchorInAddressBar(a)
                        }.bind(this))
                    }.bind(this))
                } else {
                    if (this.options.toMooScrollArea) {
                        this.windowFxScroll.toElement(this.context.getParent()).chain(function () {
                            this.putAnchorInAddressBar(a)
                        }.bind(this))
                    } else {
                        if (this.options.toAnchor) {
                            this.toElement(a).chain(function () {
                                this.putAnchorInAddressBar(a)
                            }.bind(this))
                        }
                    }
                }
            } else {
                this.windowFxScroll.toElement(a).chain(function () {
                    this.putAnchorInAddressBar(a)
                }.bind(this))
            }
            d.stop()
        }.bind(this))
    }
});
