/**
 * 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.5,
        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(){
        var a=(100-((this.overHang*100)/this.paddingEl.getSize().y));
        this.handleHeight=((a*this.parentEl.getSize().y)/100)-(this.scrollHandleTop.getSize().y+this.scrollHandleBottom.getSize().y);
        if((this.handleHeight+this.scrollHandleTop.getSize().y+this.scrollHandleBottom.getSize().y)>=this.scrollBar.getSize().y){
            this.handleHeight-=(this.scrollHandleTop.getSize().y+this.scrollHandleBottom.getSize().y)*2
        }
        if(this.scrollHandle.getStyle("min-height")&&this.handleHeight<parseFloat(this.scrollHandle.getStyle("min-height"))){
            this.handleHeight=parseFloat(this.scrollHandle.getStyle("min-height"))+this.scrollHandleBottom.getSize().y+this.scrollHandleTop.getSize().y
        }
        this.scrollHandle.setStyles({
            height: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))
    }
});
