
(function(){function Scrollbar(options){if(!options.element){throw new Error("You must specify property 'element' in options at a minimum.");}
YAHOO.lang.augmentObject(options,{alwaysShow:false});this.options=options;this.objects={element:SM.util.$$$(options.element)};this.storage=document.createDocumentFragment();if(!Scrollbar.objects.container||options.alwaysShow){Scrollbar.init(options.alwaysShow?this:null);}
if(this.objects.element.sizzle){if(this.objects.element.length>1){if(window.console&&window.console.log){window['console'].log(['The SM.widget.Scrollbar constructor takes Sizzle objects, arrays or selector ','strings a valid parameter for the required element parameter. However these ','advanced selectors can match more than one element as you have here. I recommend ','you replace your object instantiation with SM.widget.Scrollbar.addTo(). This ','works in almost the exact same manner as what you\'re doing now with the exception ','that it calls the constructor for each element and returns a list of constructed ','Scrollbar instances.'].join(''));}}
this.objects.element=this.objects.element[0];}
var id=this.objects.element.id||YAHOO.util.Dom.generateId(this.objects.element);this.objects.element.style.overflow="hidden";this.onVisible=new YAHOO.util.CustomEvent('visible',this);if(this.options.onVisible){this.onVisible.subscribe(this.options.onVisible);}
this.onHidden=new YAHOO.util.CustomEvent('hidden',this);if(this.options.onHidden){this.onHidden.subscribe(this.options.onHidden);}
this.onUpdate=new YAHOO.util.CustomEvent('update',this);if(this.options.onUpdate){this.onUpdate.subscribe(this.options.onUpdate);}
var instanceCount=0;for(var i in Scrollbar.instances){instanceCount++;}
if(instanceCount===0){YAHOO.util.Event.on(window,'resize',Scrollbar.pageResize);}
if(this.options.zIndex&&this.objects.container){this.objects.container.css({zIndex:this.options.zIndex});}
Scrollbar.instances[id]={element:this.objects.element,scrollbar:this};this.nested=[];for(var i in Scrollbar.instances){var thisOne=Scrollbar.instances[i];thisOne.scrollbar.nested.splice(0,thisOne.scrollbar.nested.length);for(var j in Scrollbar.instances){var thatOne=Scrollbar.instances[j];if(YAHOO.util.Dom.isAncestor(thisOne.element,thatOne.element)){thisOne.scrollbar.nested.push(thatOne.scrollbar);thatOne.scrollbar.isNested=true;}}
if(thisOne.scrollbar.nested.length){thisOne.scrollbar.onUpdate.subscribe(Scrollbar.clipNested);}else{thisOne.scrollbar.onUpdate.unsubscribe(Scrollbar.clipNested);}}
YAHOO.util.Event.on(this.objects.element,'mousemove',function(event,instance){Scrollbar.updateUI(instance);},this);if(this.options.alwaysShow){YAHOO.util.Event.onDOMReady(function(){if(Scrollbar.checkNeed(this.objects.element)){Scrollbar.show(this);}else{Scrollbar.hide(this);}
Scrollbar.watchVisibleContent(this);},null,this);}else{Scrollbar.hide(null);}}
Scrollbar.prototype={objects:null,storage:null,options:null,onVisible:null,onHidden:null,nested:null,isNested:false,hide:function(){Scrollbar.hide(this.objects.container?this:this.objects.element.id);},show:function(){Scrollbar.show(this.objects.container?this:this.objects.element.id);},reposition:function(){Scrollbar.reposition(this.objects.container?this:this.objects.element.id);},update:function(){if(Scrollbar.checkNeed(this.objects.element)){Scrollbar.updateUI(this.objects.container?this:this.objects.element.id);Scrollbar.reposition(this.objects.container?this:this.objects.element.id);}else{this.hide();}},getObjects:function(){if(this.options.alwaysShow){return this.objects;}else{return Scrollbar.objects;}},getEl:function(){return this.getObjects().container;}};YAHOO.lang.augmentObject(Scrollbar,{timeout:-1,instances:{},objects:{container:null,thumb:null,upButton:null,downButton:null,track:null,scrollBar:null},activeElement:null,activeScrollbar:null,sharedElements:true,region:null,dragdrop:null,dragging:false,storage:document.createDocumentFragment(),TEMPLATE:['<div class="scrollContainer">','<div class="scrollBar">','<div class="scrollBg">','<div class="scrollThumb">','<div class="top"></div>','<div class="bottom"></div>','</div>','</div>','<div class="scrollUp"></div>','<div class="scrollDown"></div>','</div>','</div>'].join(''),addTo:function(selector_array_or_sizzleObj,options){var elements=SM.util.$$$(selector_array_or_sizzleObj,true);var results=[];elements.each(function(){var instanceOpts={element:this};YAHOO.lang.augmentObject(instanceOpts,options||{});results.push(new Scrollbar(instanceOpts));});return results;},init:function(instance){var target=instance?instance.objects:Scrollbar.objects;var ddtarget=instance?instance.objects:Scrollbar;var storage=instance?instance.storage:Scrollbar.storage;target.container=Sizzle.DOM(Scrollbar.TEMPLATE);target.thumb=Sizzle('div.scrollThumb',target.container);target.upButton=Sizzle('div.scrollUp',target.container);target.downButton=Sizzle('div.scrollDown',target.container);target.track=Sizzle('div.scrollBg',target.container);target.scrollBar=Sizzle('div.scrollBar',target.container);target.container.appendTo(storage);Sizzle('.top',target.thumb).css({top:'0px',left:'0px'});Sizzle('.bottom',target.thumb).css({bottom:(YAHOO.env.ua.ie<7?'-1px':'0px'),left:'0px'});YAHOO.util.Event.on(target.container,'selectstart',function(){return false;});YAHOO.util.Dom.generateId(target.container);Sizzle.data(target.container,'instanceId',instance?instance.objects.element.id:null);if(!YAHOO.env.ua.ie){target.container.css({opacity:.9});}
target.scrollBar.css({left:0,paddingLeft:0});ddtarget.dragdrop=new YAHOO.util.DD(target.thumb[0]);ddtarget.dragdrop.on('startDragEvent',Scrollbar.b4StartDrag,instance);ddtarget.dragdrop.on('endDragEvent',Scrollbar.endDrag,instance);ddtarget.dragdrop.on('dragEvent',Scrollbar.drag,instance);Scrollbar.enableButtons(false,instance);YAHOO.util.Event.on(document.body,'mousemove',Scrollbar.onMouseMove);YAHOO.util.Event.on(target.track,'click',Scrollbar.scrollToClick);},b4StartDrag:function(event,instance){Scrollbar.dragging=true;var target=instance?instance.objects:Scrollbar.objects;var ddtarget=instance?instance.objects:Scrollbar;var metrics=Scrollbar.metrics(instance);var thumbTop=SM.util.css(target.thumb,'location');ddtarget.dragdrop.setXConstraint(0,0);ddtarget.dragdrop.setYConstraint(thumbTop.y,metrics.maxOffset-thumbTop.y);ddtarget.dragdrop.resetConstraints();},drag:function(event,instance){var target=instance?instance.objects:Scrollbar.objects;var ddtarget=instance?instance.objects:Scrollbar;var dd=ddtarget.dragdrop;var metrics=Scrollbar.metrics(instance);var total=metrics.element.sHeight-metrics.element.oHeight;var nuTop=((dd.lastPageY-dd.minY)/(dd.maxY-dd.minY))*total;Scrollbar.activeElement.scrollTop=nuTop;(instance||Scrollbar.activeScrollbar).onUpdate.fire();},endDrag:function(event,instance){Scrollbar.dragging=false;},enableButtons:function(actuallyTurnThemOff,instance){var Event=YAHOO.util.Event;var operation=actuallyTurnThemOff?'removeListener':'addListener';var target=instance?instance.objects:Scrollbar.objects;Event[operation](target.upButton,'mouseup',Scrollbar.stopScroll,"up");Event[operation](target.upButton,'mouseout',Scrollbar.stopScroll,"up");Event[operation](target.upButton,'mousedown',Scrollbar.startScroll,"up");Event[operation](target.downButton,'mouseup',Scrollbar.stopScroll,"down");Event[operation](target.downButton,'mouseout',Scrollbar.stopScroll,"down");Event[operation](target.downButton,'mousedown',Scrollbar.startScroll,"down");if(actuallyTurnThemOff){clearTimeout(Scrollbar.timeout);Scrollbar.timeout=-1;}},startScroll:function(event,button){Scrollbar.mouseDown=true;Scrollbar.doScroll(event,button);},doScroll:function(event,button){var target=!Scrollbar.sharedElements?Scrollbar.activeScrollbar.objects:Scrollbar.objects;if(Scrollbar.timeout===-1&&Scrollbar.mouseDown){Scrollbar.timeout=setTimeout(function(){Scrollbar.doScroll(event,button);},100);return;}
if(!Scrollbar.activeElement||!Scrollbar.mouseDown){clearTimeout(Scrollbar.timeout);Scrollbar.timeout=-1;return;}
var scrollBy=button==="up"?-30:30;Scrollbar.activeElement.scrollTop+=scrollBy;Scrollbar.updateUI(Scrollbar.activeScrollbar);Scrollbar.timeout=setTimeout(function(){Scrollbar.doScroll(event,button);},100);},stopScroll:function(event,button){Scrollbar.mouseDown=false;YAHOO.util.Event.stopEvent(event);clearTimeout(Scrollbar.timeout);Scrollbar.timeout=-1;},scrollToClick:function(event){var Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;var target=Event.getTarget(event);if(!Dom.hasClass(target,'scrollBg')){return;}
var container=Sizzle(target.parentNode.parentNode);var scrollbar=Scrollbar.instances[Sizzle.data(container,'instanceId')].scrollbar;var objects=scrollbar.options.alwaysShow?scrollbar.objects:Scrollbar.objects;var metrics=Scrollbar.metrics(scrollbar);var xy=Event.getXY(event);var thxy=objects.thumb.offset();var above=xy[1]<thxy.top;var scrollBy=YAHOO.env.ua.ie<8?60:30;scrollbar.objects.element.scrollTop+=(above?-scrollBy:scrollBy);scrollbar.update();Event.stopEvent(event);},metrics:function(instance){var objects=instance&&instance.options.alwaysShow?instance.objects:Scrollbar.objects;var element=instance?instance.objects.element:Scrollbar.activeElement;var sTop=element.scrollTop;var cHeight=element.clientHeight;var oHeight=element.offsetHeight;var sHeight=Math.max(element.scrollHeight,oHeight);var sUpHeight=objects.upButton.attr('offsetHeight');var sDownHeight=objects.downButton.attr('offsetHeight');var sMin=(oHeight-sUpHeight-sDownHeight)*0.15;var sMax=(oHeight-sUpHeight-sDownHeight)*0.65;var sliderHeight=Math.min(Math.max(Math.floor(sHeight/(sHeight-oHeight)*100),sMin),sMax);var maxOffset=oHeight-sUpHeight-sDownHeight-sliderHeight;var offset=Math.min(((sTop/(sHeight-cHeight))*maxOffset),maxOffset);return{minOffset:sUpHeight,maxOffset:maxOffset,offset:offset,sliderHeight:sliderHeight,element:{sTop:sTop,sHeight:sHeight,oHeight:oHeight,cHeight:cHeight}};},updateUI:function(instance){var target=instance&&!Scrollbar.sharedElements?instance.objects:Scrollbar.objects;if(!Scrollbar.activeElement||!target||!target.upButton){return;}
var metrics=Scrollbar.metrics(instance);target.thumb.css({top:metrics.offset||0,left:0})
target.thumb.css({height:metrics.sliderHeight});if(instance){for(var i=0;i<instance.nested.length;i++){instance.nested[i].update();}}
(instance||Scrollbar.activeScrollbar).onUpdate.fire();},reposition:function(instance){var target=typeof instance!=='string'?instance.objects:Scrollbar.objects;var storage=typeof instance!=='string'?instance.storage:Scrollbar.storage;var element=typeof instance!=='string'?target.element:Scrollbar.instances[instance].element;var scrollbar=typeof instance!=='string'?instance:Scrollbar.instances[instance].scrollbar;var shared=target===Scrollbar.objects;if(!Scrollbar.checkNeed(element)){return;}
var sContent=Sizzle(element);var sParent=Sizzle(sContent.attr('offsetParent'));var pxy=SM.util.css(sParent,['size','location']);var sxy=SM.util.css(target.container,['size']);var xy=SM.util.css(sContent,['size','location']);var offset=sContent.offset();var ieleft=(YAHOO.env.ua.ie>0&&YAHOO.env.ua.ie<8)?-5:2;var trbl={t:offset.top,l:(offset.left+xy.offset.w)-(pxy.scroll.l||0),h:xy.offset.h};target.container.css({position:'absolute',top:trbl.t,left:trbl.l+ieleft,height:trbl.h});},show:function(instance){var target=typeof instance!=='string'?instance.objects:Scrollbar.objects;var storage=typeof instance!=='string'?instance.storage:Scrollbar.storage;var element=typeof instance!=='string'?target.element:Scrollbar.instances[instance].element;var scrollbar=typeof instance!=='string'?instance:Scrollbar.instances[instance].scrollbar;var shared=target===Scrollbar.objects;if(!Scrollbar.checkNeed(element)){return;}
var sContent=Sizzle(element);var sParent=Sizzle(sContent.attr('offsetParent'));var pxy=SM.util.css(sParent,['size','location']);var sxy=SM.util.css(target.container,['size']);var xy=SM.util.css(sContent,['size','location']);var offset=sContent.offset();var ieleft=(YAHOO.env.ua.ie>0&&YAHOO.env.ua.ie<8)?-5:2;var trbl={t:offset.top,l:(offset.left+xy.offset.w)-(pxy.scroll.l||0),h:xy.offset.h};target.container.css({position:'absolute',top:trbl.t,left:trbl.l+ieleft,height:trbl.h});if(scrollbar.options.zIndex){target.container.css({zIndex:scrollbar.options.zIndex});}
Sizzle.data(target.container,'instanceId',element.id);Scrollbar.activeElement=element;Scrollbar.activeScrollbar=scrollbar;Scrollbar.sharedElements=shared;Scrollbar.listenForWheel(false,shared?null:instance);Sizzle(document.body).append(storage);Scrollbar.updateUI(shared?null:instance);scrollbar.onVisible.fire();},hide:function(instance){var target=instance?instance.objects:Scrollbar.objects;var storage=instance?instance.storage:Scrollbar.storage;var scrollbar=null;if(!target.container||storage.childNodes.length||Scrollbar.dragging||Scrollbar.mouseDown||Scrollbar.scrolling){return;}
if(Sizzle.data(target.container,'instanceId')){scrollbar=Scrollbar.instances[Sizzle.data(target.container,'instanceId')].scrollbar;}
Scrollbar.listenForWheel(true,instance);target.container.appendTo(storage);Sizzle.data(target.container,'instanceId',null);Scrollbar.activeElement=null;Scrollbar.activeScrollbar=null;Scrollbar.sharedElements=true;if(scrollbar){scrollbar.onHidden.fire();}},all:{hide:function(){for(var i in SM.widget.Scrollbar.instances){SM.widget.Scrollbar.instances[i].scrollbar.hide();}},reposition:function(){for(var i in SM.widget.Scrollbar.instances){SM.widget.Scrollbar.instances[i].scrollbar.reposition();}},udpate:function(){for(var i in SM.widget.Scrollbar.instances){SM.widget.Scrollbar.instances[i].scrollbar.udpate();}}},listenForWheel:function(remove){var DOMTarget,DOMEvent,Event=YAHOO.util.Event;if(Event.isIE){DOMTarget=document;DOMEvent='mousewheel';}else if(Event.isSafari){DOMTarget=window;DOMEvent='mousewheel';}else{DOMTarget=window;DOMEvent='DOMMouseScroll';}
Event.purgeElement(DOMTarget,false,DOMEvent);if(!remove){Event.on(DOMTarget,DOMEvent,Scrollbar.handleMouseWheel);}},handleMouseWheel:function(event){var targetObj=Scrollbar.activeElement;var instance=Scrollbar.activeScrollbar;if(!targetObj){return;}
var Dom=YAHOO.util.Dom;var Event=YAHOO.util.Event;var storage=Scrollbar.sharedElements?Scrollbar.storage:instance.storage;var event=Event.getEvent(event);var eventTarget=Event.getTarget(event);var multiplier=15;var vis=!storage.childNodes.length;var scrollOffset=2;if(YAHOO.env.ua.ie>0&&YAHOO.env.ua.ie<7){scrollOffset=240;}else if(YAHOO.env.ua.ie>=7&&YAHOO.env.ua.ie<8){scrollOffset=240;}else if(YAHOO.env.ua.ie>=8){scrollOffset=800;}else if(YAHOO.env.ua.webkit){scrollOffset=30;}
if(vis&&(eventTarget===targetObj||Dom.isAncestor(targetObj,eventTarget))){Event.stopEvent(event);var wheelDelta=(event.wheelDelta?-(event.wheelDelta):event.detail)/scrollOffset;var scrollBy=Math.floor(wheelDelta*multiplier);if(scrollBy){Scrollbar.scrolling=true;targetObj.scrollTop+=scrollBy;Scrollbar.updateUI(Scrollbar.sharedElements?null:instance);Scrollbar.scrolling=false;}}},checkNeed:function(element){return element.offsetHeight>0&&element.offsetWidth>0&&element.scrollHeight>element.clientHeight;},onMouseMove:function(event){if(Scrollbar.dragging){return;}
var Dom=YAHOO.util.Dom;var Event=YAHOO.util.Event;var x=event.clientX;var y=event.clientY;var overone=false;var exists=false;var instance=null;var instanceId=null;var targetEl=Event.getTarget(event);var useTarget=null;for(var i in Scrollbar.instances){var _scrollbar=Scrollbar.instances[i].scrollbar;var _element=Scrollbar.instances[i].element;var _target=_scrollbar.options.alwaysShow?_scrollbar.objects:Scrollbar.objects;if(_element&&_element.scrollTop>0&&!Scrollbar.checkNeed(_element)){_element.scrollTop=0;exists=false;}
if(_element===targetEl||Dom.isAncestor(_element,targetEl)){useTarget=_element;instance=_scrollbar.options.alwaysShow?_scrollbar:null;instanceId=i;exists=true;Scrollbar.activeElement=_element;Scrollbar.activeScrollbar=_scrollbar;Scrollbar.sharedElements=!_scrollbar.options.alwaysShow;break;}
if(Dom.isAncestor(_target.container[0],targetEl)&&Sizzle.data(_target.container,'instanceId')){instanceId=Sizzle.data(_target.container,'instanceId');useTarget=Scrollbar.instances[instanceId].element;instance=Scrollbar.instances[instanceId].scrollbar.objects.container?Scrollbar.instances[instanceId].scrollbar:null;exists=true;break;}}
var target=instance?instance.objects:Scrollbar.objects;var storage=instance?instance.storage:Scrollbar.storage;var inScrollbar=target.container?Dom.isAncestor(target.container[0],targetEl):false;if(!exists){if(!storage.childNodes.length){Scrollbar.hide(instance);}
Scrollbar.activeScrollbar=null;Scrollbar.activeElement=null;Scrollbar.sharedElements=true;return;}
Scrollbar.activeElement=Scrollbar.instances[instanceId].element;Scrollbar.activeScrollbar=Scrollbar.instances[instanceId].scrollbar;Scrollbar.sharedElements=!Scrollbar.activeScrollbar.options.alwaysShow;Sizzle.data(target.container,'instanceId',Scrollbar.activeElement.id);if(instance&&instance.options.alwaysShow){if(Scrollbar.checkNeed(instance.objects.element)){Scrollbar.show(instance);}else{Scrollbar.hide(instance);}}else{if(!storage.childNodes.length&&(!Scrollbar.activeElement||(Scrollbar.activeElement!==useTarget&&!inScrollbar))){Scrollbar.hide(Scrollbar.activeScrollbar||null);}
if(Scrollbar.checkNeed(useTarget)){Scrollbar.show(instance||instanceId);}}},pageResize:function(event){for(var i in Scrollbar.instances){var scrollbar=Scrollbar.instances[i].scrollbar;var element=Scrollbar.instances[i].element;var alwaysShow=scrollbar.options.alwaysShow;if(!alwaysShow){Scrollbar.hide(null);}else{Scrollbar.show(scrollbar);}}},uaMatch:function(ua){if(!ua){ua=navigator.userAgent;}
ua=ua.toLowerCase();var match=/(webkit)[ \/]([\w.]+)/.exec(ua)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua)||/(msie) ([\w.]+)/.exec(ua)||!/compatible/.test(ua)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(ua)||[];return{browser:match[1]||"",version:match[2]||"0"};},watchVisibleContent:function(instance){var uaMatch=Scrollbar.uaMatch();if(uaMatch.browser=='mozilla'||(uaMatch.browser=='webkit'&&parseFloat(uaMatch.version)>=312)){YAHOO.util.Event.on(document.body,'DOMSubtreeModified',function(event){var busy=Scrollbar.scrolling||Scrollbar.dragging||Scrollbar.mouseDown;if(!busy){if(event.MODIFICATION&&Scrollbar.checkNeed(this.objects.element)){Scrollbar.show(this);}
else if(event.ADDITION||event.REMOVAL){Scrollbar.show(this);}}},null,instance);}else if(uaMatch.browser=='msie'){}else{alert('Unsupported browser for Scrollbar.watchVisibleContent');}},clipNested:function(){for(var i=0;i<this.nested.length;i++){var self=this.nested[i];var bar=self.getEl()[0];var element=self.objects.element;var parent=this.objects.element;var eBox=SM.util.box(element);var pBox=SM.util.box(parent);var vis=eBox.pageBottom>pBox.pageTop||eBox.pageTop<pBox.pageBottom;if(!Scrollbar.checkNeed(element)||!vis){self.getEl().css('clip','rect(0px 0px 0px 0px)');Scrollbar.hide(self);continue;}
if(!/relative|absolute/i.exec(parent.style.position)){parent.style.position='relative';}
var elRegion=YAHOO.util.Dom.getRegion(element);var parRegion=YAHOO.util.Dom.getRegion(parent);var intersect=elRegion.intersect(parRegion);if(intersect){if(eBox.pageTop<pBox.pageTop){var top=pBox.pageTop-eBox.pageTop;var btm=element.offsetHeight;}
else{var top=0;var btm=intersect.height;}}
else{var top=0;var btm=0;}
var clip=[top+'px','100px',btm+'px','0px'];bar.style.clip='rect('+clip.join(' ')+')';self.update();}}});((window.SM=window.SM||{}).widget=SM.widget||{}).Scrollbar=Scrollbar;})();