diff -r 000000000000 -r ca1b8c0fbe35 integ/js/jquery.mCustomScrollbar.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/integ/js/jquery.mCustomScrollbar.js Tue Apr 02 12:45:17 2013 +0200
@@ -0,0 +1,722 @@
+/*
+== malihu jquery custom scrollbars plugin ==
+version: 2.1
+author: malihu (http://manos.malihu.gr)
+plugin home: http://manos.malihu.gr/jquery-custom-content-scroller
+*/
+(function($){
+ var methods={
+ init:function(options){
+ var defaults={
+ set_width:false, /*optional element width: boolean, pixels, percentage*/
+ set_height:false, /*optional element height: boolean, pixels, percentage*/
+ horizontalScroll:false, /*scroll horizontally: boolean*/
+ scrollInertia:550, /*scrolling inertia: integer (milliseconds)*/
+ scrollEasing:"easeOutCirc", /*scrolling easing: string*/
+ mouseWheel:"auto", /*mousewheel support and velocity: boolean, "auto", integer*/
+ autoDraggerLength:true, /*auto-adjust scrollbar dragger length: boolean*/
+ scrollButtons:{ /*scroll buttons*/
+ enable:false, /*scroll buttons support: boolean*/
+ scrollType:"continuous", /*scroll buttons scrolling type: "continuous", "pixels"*/
+ scrollSpeed:20, /*scroll buttons continuous scrolling speed: integer*/
+ scrollAmount:40 /*scroll buttons pixels scroll amount: integer (pixels)*/
+ },
+ advanced:{
+ updateOnBrowserResize:true, /*update scrollbars on browser resize (for layouts based on percentages): boolean*/
+ updateOnContentResize:false, /*auto-update scrollbars on content resize (for dynamic content): boolean*/
+ autoExpandHorizontalScroll:false /*auto-expand width for horizontal scrolling: boolean*/
+ },
+ callbacks:{
+ onScroll:function(){}, /*user custom callback function on scroll event*/
+ onTotalScroll:function(){}, /*user custom callback function on scroll end reached event*/
+ onTotalScrollOffset:0 /*scroll end reached offset: integer (pixels)*/
+ }
+ },
+ options=$.extend(true,defaults,options);
+ /*check for touch device*/
+ $(document).data("mCS-is-touch-device",false);
+ if(is_touch_device()){
+ $(document).data("mCS-is-touch-device",true);
+ }
+ function is_touch_device(){
+ return !!("ontouchstart" in window) ? 1 : 0;
+ }
+ return this.each(function(){
+ var $this=$(this);
+ /*set element width/height, create markup for custom scrollbars, add classes*/
+ if(options.set_width){
+ $this.css("width",options.set_width);
+ }
+ if(options.set_height){
+ $this.css("height",options.set_height);
+ }
+ if(!$(document).data("mCustomScrollbar-index")){
+ $(document).data("mCustomScrollbar-index","1");
+ }else{
+ var mCustomScrollbarIndex=parseInt($(document).data("mCustomScrollbar-index"));
+ $(document).data("mCustomScrollbar-index",mCustomScrollbarIndex+1);
+ }
+ $this.wrapInner("
").addClass("mCustomScrollbar _mCS_"+$(document).data("mCustomScrollbar-index"));
+ var mCustomScrollBox=$this.children(".mCustomScrollBox");
+ if(options.horizontalScroll){
+ mCustomScrollBox.addClass("mCSB_horizontal").wrapInner("");
+ var mCSB_h_wrapper=mCustomScrollBox.children(".mCSB_h_wrapper");
+ mCSB_h_wrapper.wrapInner("").children(".mCSB_container").css({"width":mCSB_h_wrapper.children().outerWidth(),"position":"relative"}).unwrap();
+ }else{
+ mCustomScrollBox.wrapInner("");
+ }
+ var mCSB_container=mCustomScrollBox.children(".mCSB_container");
+ if(!$(document).data("mCS-is-touch-device")){ /*not touch device - apply custom scrollbars functionality*/
+ mCSB_container.after("");
+ var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"),
+ mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"),
+ mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger");
+ if(options.horizontalScroll){
+ mCSB_dragger.data("minDraggerWidth",mCSB_dragger.width());
+ }else{
+ mCSB_dragger.data("minDraggerHeight",mCSB_dragger.height());
+ }
+ if(options.scrollButtons.enable){
+ if(options.horizontalScroll){
+ mCSB_scrollTools.prepend("").append("");
+ }else{
+ mCSB_scrollTools.prepend("").append("");
+ }
+ }
+ /*mCustomScrollBox scrollTop and scrollLeft is always 0 to prevent browser focus scrolling*/
+ mCustomScrollBox.bind("scroll",function(){
+ mCustomScrollBox.scrollTop(0).scrollLeft(0);
+ });
+ /*store element options and update element*/
+ $this.data({
+ "horizontalScroll":options.horizontalScroll,
+ "scrollInertia":options.scrollInertia,
+ "scrollEasing":options.scrollEasing,
+ "mouseWheel":options.mouseWheel,
+ "autoDraggerLength":options.autoDraggerLength,
+ "scrollButtons-enable":options.scrollButtons.enable,
+ "scrollButtons-scrollType":options.scrollButtons.scrollType,
+ "scrollButtons-scrollSpeed":options.scrollButtons.scrollSpeed,
+ "scrollButtons-scrollAmount":options.scrollButtons.scrollAmount,
+ "autoExpandHorizontalScroll":options.advanced.autoExpandHorizontalScroll,
+ "onScroll-Callback":options.callbacks.onScroll,
+ "onTotalScroll-Callback":options.callbacks.onTotalScroll,
+ "onTotalScroll-Offset":options.callbacks.onTotalScrollOffset
+ }).mCustomScrollbar("update");
+ /*window resize fn (for layouts based on percentages)*/
+ if(options.advanced.updateOnBrowserResize){
+ var mCSB_resizeTimeout;
+ $(window).resize(function(){
+ if(mCSB_resizeTimeout){
+ clearTimeout(mCSB_resizeTimeout);
+ }
+ mCSB_resizeTimeout=setTimeout(function(){
+ $this.mCustomScrollbar("update");
+ },150);
+ });
+ }
+ }else{ /*is touch device*/
+ /*check for mobile os/browser not supporting overflow:auto (Android 2.xx)*/
+ var ua=navigator.userAgent;
+ if(ua.indexOf("Android")!=-1){
+ var androidversion=parseFloat(ua.slice(ua.indexOf("Android")+8));
+ if(androidversion<3){
+ touchScroll("mCSB_"+$(document).data("mCustomScrollbar-index")); /*non overflow:auto fn*/
+ }else{
+ mCustomScrollBox.css({"overflow":"auto","-webkit-overflow-scrolling":"touch"});
+ }
+ }else{
+ mCustomScrollBox.css({"overflow":"auto","-webkit-overflow-scrolling":"touch"});
+ }
+ mCSB_container.addClass("mCS_no_scrollbar mCS_touch");
+ $this.data({
+ "horizontalScroll":options.horizontalScroll,
+ "scrollInertia":options.scrollInertia,
+ "scrollEasing":options.scrollEasing,
+ "autoExpandHorizontalScroll":options.advanced.autoExpandHorizontalScroll,
+ "onScroll-Callback":options.callbacks.onScroll,
+ "onTotalScroll-Callback":options.callbacks.onTotalScroll,
+ "onTotalScroll-Offset":options.callbacks.onTotalScrollOffset
+ });
+ mCustomScrollBox.scroll(function(){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container); /*user custom callback functions*/
+ });
+ /*non overflow:auto fn
+ (source: http://chris-barr.com/index.php/entry/scrolling_a_overflowauto_element_on_a_touch_screen_device/)*/
+ function touchScroll(id){
+ var el=document.getElementById(id),
+ scrollStartPosY=0,
+ scrollStartPosX=0;
+ document.getElementById(id).addEventListener("touchstart",function(event){
+ scrollStartPosY=this.scrollTop+event.touches[0].pageY;
+ scrollStartPosX=this.scrollLeft+event.touches[0].pageX;
+ /*event.preventDefault(); // Keep this remarked so you can click on buttons and links in the div*/
+ },false);
+ document.getElementById(id).addEventListener("touchmove",function(event){
+ /*These if statements allow the full page to scroll (not just the div) if they are
+ at the top of the div scroll or the bottom of the div scroll
+ The -5 and +5 below are in case they are trying to scroll the page sideways
+ but their finger moves a few pixels down or up. The event.preventDefault() function
+ will not be called in that case so that the whole page can scroll.*/
+ if((this.scrollTopscrollStartPosY+5))
+ event.preventDefault();
+ if((this.scrollLeftscrollStartPosX+5))
+ event.preventDefault();
+ this.scrollTop=scrollStartPosY-event.touches[0].pageY;
+ this.scrollLeft=scrollStartPosX-event.touches[0].pageX;
+ },false);
+ }
+ }
+ /*content resize fn (for dynamically generated content)*/
+ if(options.advanced.updateOnContentResize){
+ var mCSB_onContentResize;
+ if(options.horizontalScroll){
+ var mCSB_containerOldSize=mCSB_container.outerWidth();
+ if(is_touch_device()){
+ /*disable iOS webkit inertia for smooth scrolling*/
+ mCustomScrollBox.css({"-webkit-overflow-scrolling":"auto"});
+ }
+ }else{
+ var mCSB_containerOldSize=mCSB_container.outerHeight();
+ }
+ mCSB_onContentResize=setInterval(function(){
+ if(options.horizontalScroll){
+ if(options.advanced.autoExpandHorizontalScroll){
+ mCSB_container.css({"position":"absolute","width":"auto"}).wrap("").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap();
+ }
+ var mCSB_containerNewSize=mCSB_container.outerWidth();
+ }else{
+ var mCSB_containerNewSize=mCSB_container.outerHeight();
+ }
+ if(mCSB_containerNewSize!=mCSB_containerOldSize){
+ $this.mCustomScrollbar("update");
+ mCSB_containerOldSize=mCSB_containerNewSize;
+ }
+ },300);
+ }
+ });
+ },
+ update:function(){
+ var $this=$(this),
+ mCustomScrollBox=$this.children(".mCustomScrollBox"),
+ mCSB_container=mCustomScrollBox.children(".mCSB_container");
+ if(!$(document).data("mCS-is-touch-device")){
+ mCSB_container.removeClass("mCS_no_scrollbar");
+ }
+ var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"),
+ mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"),
+ mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger");
+ if($this.data("horizontalScroll")){
+ var mCSB_buttonLeft=mCSB_scrollTools.children(".mCSB_buttonLeft"),
+ mCSB_buttonRight=mCSB_scrollTools.children(".mCSB_buttonRight"),
+ mCustomScrollBoxW=mCustomScrollBox.width();
+ if($this.data("autoExpandHorizontalScroll")){
+ mCSB_container.css({"position":"absolute","width":"auto"}).wrap("").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap();
+ }
+ var mCSB_containerW=mCSB_container.outerWidth();
+ }else{
+ var mCSB_buttonUp=mCSB_scrollTools.children(".mCSB_buttonUp"),
+ mCSB_buttonDown=mCSB_scrollTools.children(".mCSB_buttonDown"),
+ mCustomScrollBoxH=mCustomScrollBox.height(),
+ mCSB_containerH=mCSB_container.outerHeight();
+ }
+ if(mCSB_containerH>mCustomScrollBoxH && !$this.data("horizontalScroll") && !$(document).data("mCS-is-touch-device")){ /*content needs vertical scrolling*/
+ mCSB_scrollTools.css("display","block");
+ var mCSB_draggerContainerH=mCSB_draggerContainer.height();
+ /*auto adjust scrollbar dragger length analogous to content*/
+ if($this.data("autoDraggerLength")){
+ var draggerH=Math.round(mCustomScrollBoxH/mCSB_containerH*mCSB_draggerContainerH),
+ minDraggerH=mCSB_dragger.data("minDraggerHeight");
+ if(draggerH<=minDraggerH){ /*min dragger height*/
+ mCSB_dragger.css({"height":minDraggerH});
+ }else if(draggerH>=mCSB_draggerContainerH-10){ /*max dragger height*/
+ var mCSB_draggerContainerMaxH=mCSB_draggerContainerH-10;
+ mCSB_dragger.css({"height":mCSB_draggerContainerMaxH});
+ }else{
+ mCSB_dragger.css({"height":draggerH});
+ }
+ mCSB_dragger.children(".mCSB_dragger_bar").css({"line-height":mCSB_dragger.height()+"px"});
+ }
+ var mCSB_draggerH=mCSB_dragger.height(),
+ /*calculate and store scroll amount*/
+ scrollAmount=(mCSB_containerH-mCustomScrollBoxH)/(mCSB_draggerContainerH-mCSB_draggerH);
+ $this.data("scrollAmount",scrollAmount);
+ /*add scrolling*/
+ $this.mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight);
+ /*scroll*/
+ var mCSB_containerP=Math.abs(Math.round(mCSB_container.position().top));
+ $this.mCustomScrollbar("scrollTo",mCSB_containerP,{callback:false});
+ }else if(mCSB_containerW>mCustomScrollBoxW && $this.data("horizontalScroll") && !$(document).data("mCS-is-touch-device")){ /*content needs horizontal scrolling*/
+ mCSB_scrollTools.css("display","block");
+ var mCSB_draggerContainerW=mCSB_draggerContainer.width();
+ /*auto adjust scrollbar dragger length analogous to content*/
+ if($this.data("autoDraggerLength")){
+ var draggerW=Math.round(mCustomScrollBoxW/mCSB_containerW*mCSB_draggerContainerW),
+ minDraggerW=mCSB_dragger.data("minDraggerWidth");
+ if(draggerW<=minDraggerW){ /*min dragger height*/
+ mCSB_dragger.css({"width":minDraggerW});
+ }else if(draggerW>=mCSB_draggerContainerW-10){ /*max dragger height*/
+ var mCSB_draggerContainerMaxW=mCSB_draggerContainerW-10;
+ mCSB_dragger.css({"width":mCSB_draggerContainerMaxW});
+ }else{
+ mCSB_dragger.css({"width":draggerW});
+ }
+ }
+ var mCSB_draggerW=mCSB_dragger.width(),
+ /*calculate and store scroll amount*/
+ scrollAmount=(mCSB_containerW-mCustomScrollBoxW)/(mCSB_draggerContainerW-mCSB_draggerW);
+ $this.data("scrollAmount",scrollAmount);
+ /*add scrolling*/
+ $this.mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight);
+ /*scroll*/
+ var mCSB_containerP=Math.abs(Math.round(mCSB_container.position().left));
+ $this.mCustomScrollbar("scrollTo",mCSB_containerP,{callback:false});
+ }else{ /*content does not need scrolling*/
+ /*unbind events, reset content position, hide scrollbars, remove classes*/
+ mCustomScrollBox.unbind("mousewheel");
+ mCustomScrollBox.unbind("focusin");
+ if($this.data("horizontalScroll")){
+ mCSB_dragger.add(mCSB_container).css("left",0);
+ }else{
+ mCSB_dragger.add(mCSB_container).css("top",0);
+ }
+ mCSB_scrollTools.css("display","none");
+ mCSB_container.addClass("mCS_no_scrollbar");
+ }
+ },
+ scrolling:function(mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight){
+ var $this=$(this);
+ /*drag scrolling*/
+ if(!mCSB_dragger.hasClass("ui-draggable")){ /*apply drag function once*/
+ if($this.data("horizontalScroll")){
+ var draggableAxis="x";
+ }else{
+ var draggableAxis="y";
+ }
+ mCSB_dragger.draggable({
+ axis:draggableAxis,
+ containment:"parent",
+ drag:function(event,ui){
+ $this.mCustomScrollbar("scroll");
+ mCSB_dragger.addClass("mCSB_dragger_onDrag");
+ },
+ stop:function(event,ui){
+ mCSB_dragger.removeClass("mCSB_dragger_onDrag");
+ }
+ });
+ }
+ mCSB_draggerContainer.unbind("click").bind("click",function(e){
+ if($this.data("horizontalScroll")){
+ var mouseCoord=(e.pageX-mCSB_draggerContainer.offset().left);
+ if(mouseCoord(mCSB_dragger.position().left+mCSB_dragger.width())){
+ var scrollToPos=mouseCoord;
+ if(scrollToPos>=mCSB_draggerContainer.width()-mCSB_dragger.width()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.width()-mCSB_dragger.width();
+ }
+ mCSB_dragger.css("left",scrollToPos);
+ $this.mCustomScrollbar("scroll");
+ }
+ }else{
+ var mouseCoord=(e.pageY-mCSB_draggerContainer.offset().top);
+ if(mouseCoord(mCSB_dragger.position().top+mCSB_dragger.height())){
+ var scrollToPos=mouseCoord;
+ if(scrollToPos>=mCSB_draggerContainer.height()-mCSB_dragger.height()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.height()-mCSB_dragger.height();
+ }
+ mCSB_dragger.css("top",scrollToPos);
+ $this.mCustomScrollbar("scroll");
+ }
+ }
+ });
+ /*mousewheel scrolling*/
+ if($this.data("mouseWheel")){
+ var mousewheelVel=$this.data("mouseWheel");
+ if($this.data("mouseWheel")==="auto"){
+ mousewheelVel=8; /*default mousewheel velocity*/
+ /*check for safari browser on mac osx to lower mousewheel velocity*/
+ var os=navigator.userAgent;
+ if(os.indexOf("Mac")!=-1 && os.indexOf("Safari")!=-1 && os.indexOf("AppleWebKit")!=-1 && os.indexOf("Chrome")==-1){
+ mousewheelVel=1;
+ }
+ }
+ mCustomScrollBox.unbind("mousewheel").bind("mousewheel",function(event,delta){
+ event.preventDefault();
+ var vel=Math.abs(delta*mousewheelVel);
+ if($this.data("horizontalScroll")){
+ var posX=mCSB_dragger.position().left-(delta*vel);
+ mCSB_dragger.css("left",posX);
+ if(mCSB_dragger.position().left<0){
+ mCSB_dragger.css("left",0);
+ }
+ var mCSB_draggerContainerW=mCSB_draggerContainer.width(),
+ mCSB_draggerW=mCSB_dragger.width();
+ if(mCSB_dragger.position().left>mCSB_draggerContainerW-mCSB_draggerW){
+ mCSB_dragger.css("left",mCSB_draggerContainerW-mCSB_draggerW);
+ }
+ }else{
+ var posY=mCSB_dragger.position().top-(delta*vel);
+ mCSB_dragger.css("top",posY);
+ if(mCSB_dragger.position().top<0){
+ mCSB_dragger.css("top",0);
+ }
+ var mCSB_draggerContainerH=mCSB_draggerContainer.height(),
+ mCSB_draggerH=mCSB_dragger.height();
+ if(mCSB_dragger.position().top>mCSB_draggerContainerH-mCSB_draggerH){
+ mCSB_dragger.css("top",mCSB_draggerContainerH-mCSB_draggerH);
+ }
+ }
+ $this.mCustomScrollbar("scroll");
+ });
+ }
+ /*buttons scrolling*/
+ if($this.data("scrollButtons-enable")){
+ if($this.data("scrollButtons-scrollType")==="pixels"){ /*scroll by pixels*/
+ var pixelsScrollTo;
+ if($.browser.msie && parseInt($.browser.version)<9){ /*stupid ie8*/
+ $this.data("scrollInertia",0);
+ }
+ if($this.data("horizontalScroll")){
+ mCSB_buttonRight.add(mCSB_buttonLeft).unbind("click mousedown mouseup mouseout",mCSB_buttonRight_stop,mCSB_buttonLeft_stop);
+ /*scroll right*/
+ mCSB_buttonRight.bind("click",function(e){
+ e.preventDefault();
+ if(!mCSB_container.is(":animated")){
+ pixelsScrollTo=Math.abs(mCSB_container.position().left)+$this.data("scrollButtons-scrollAmount");
+ $this.mCustomScrollbar("scrollTo",pixelsScrollTo);
+ }
+ });
+ /*scroll left*/
+ mCSB_buttonLeft.bind("click",function(e){
+ e.preventDefault();
+ if(!mCSB_container.is(":animated")){
+ pixelsScrollTo=Math.abs(mCSB_container.position().left)-$this.data("scrollButtons-scrollAmount");
+ if(mCSB_container.position().left>=-$this.data("scrollButtons-scrollAmount")){
+ pixelsScrollTo="left";
+ }
+ $this.mCustomScrollbar("scrollTo",pixelsScrollTo);
+ }
+ });
+ }else{
+ mCSB_buttonDown.add(mCSB_buttonUp).unbind("click mousedown mouseup mouseout",mCSB_buttonDown_stop,mCSB_buttonUp_stop);
+ /*scroll down*/
+ mCSB_buttonDown.bind("click",function(e){
+ e.preventDefault();
+ if(!mCSB_container.is(":animated")){
+ pixelsScrollTo=Math.abs(mCSB_container.position().top)+$this.data("scrollButtons-scrollAmount");
+ $this.mCustomScrollbar("scrollTo",pixelsScrollTo);
+ }
+ });
+ /*scroll up*/
+ mCSB_buttonUp.bind("click",function(e){
+ e.preventDefault();
+ if(!mCSB_container.is(":animated")){
+ pixelsScrollTo=Math.abs(mCSB_container.position().top)-$this.data("scrollButtons-scrollAmount");
+ if(mCSB_container.position().top>=-$this.data("scrollButtons-scrollAmount")){
+ pixelsScrollTo="top";
+ }
+ $this.mCustomScrollbar("scrollTo",pixelsScrollTo);
+ }
+ });
+ }
+ }else{ /*continuous scrolling*/
+ if($this.data("horizontalScroll")){
+ mCSB_buttonRight.add(mCSB_buttonLeft).unbind("click mousedown mouseup mouseout",mCSB_buttonRight_stop,mCSB_buttonLeft_stop);
+ /*scroll right*/
+ var mCSB_buttonScrollRight,
+ mCSB_draggerContainerW=mCSB_draggerContainer.width(),
+ mCSB_draggerW=mCSB_dragger.width();
+ mCSB_buttonRight.bind("mousedown",function(e){
+ e.preventDefault();
+ var draggerScrollTo=mCSB_draggerContainerW-mCSB_draggerW;
+ mCSB_buttonScrollRight=setInterval(function(){
+ var scrollToSpeed=Math.abs(mCSB_dragger.position().left-draggerScrollTo)*(100/$this.data("scrollButtons-scrollSpeed"));
+ mCSB_dragger.stop().animate({left:draggerScrollTo},scrollToSpeed,"linear");
+ $this.mCustomScrollbar("scroll");
+ },20);
+ });
+ var mCSB_buttonRight_stop=function(e){
+ e.preventDefault();
+ clearInterval(mCSB_buttonScrollRight);
+ mCSB_dragger.stop();
+ }
+ mCSB_buttonRight.bind("mouseup mouseout",mCSB_buttonRight_stop);
+ /*scroll left*/
+ var mCSB_buttonScrollLeft;
+ mCSB_buttonLeft.bind("mousedown",function(e){
+ e.preventDefault();
+ var draggerScrollTo=0;
+ mCSB_buttonScrollLeft=setInterval(function(){
+ var scrollToSpeed=Math.abs(mCSB_dragger.position().left-draggerScrollTo)*(100/$this.data("scrollButtons-scrollSpeed"));
+ mCSB_dragger.stop().animate({left:draggerScrollTo},scrollToSpeed,"linear");
+ $this.mCustomScrollbar("scroll");
+ },20);
+ });
+ var mCSB_buttonLeft_stop=function(e){
+ e.preventDefault();
+ clearInterval(mCSB_buttonScrollLeft);
+ mCSB_dragger.stop();
+ }
+ mCSB_buttonLeft.bind("mouseup mouseout",mCSB_buttonLeft_stop);
+ }else{
+ mCSB_buttonDown.add(mCSB_buttonUp).unbind("click mousedown mouseup mouseout",mCSB_buttonDown_stop,mCSB_buttonUp_stop);
+ /*scroll down*/
+ var mCSB_buttonScrollDown,
+ mCSB_draggerContainerH=mCSB_draggerContainer.height(),
+ mCSB_draggerH=mCSB_dragger.height();
+ mCSB_buttonDown.bind("mousedown",function(e){
+ e.preventDefault();
+ var draggerScrollTo=mCSB_draggerContainerH-mCSB_draggerH;
+ mCSB_buttonScrollDown=setInterval(function(){
+ var scrollToSpeed=Math.abs(mCSB_dragger.position().top-draggerScrollTo)*(100/$this.data("scrollButtons-scrollSpeed"));
+ mCSB_dragger.stop().animate({top:draggerScrollTo},scrollToSpeed,"linear");
+ $this.mCustomScrollbar("scroll");
+ },20);
+ });
+ var mCSB_buttonDown_stop=function(e){
+ e.preventDefault();
+ clearInterval(mCSB_buttonScrollDown);
+ mCSB_dragger.stop();
+ }
+ mCSB_buttonDown.bind("mouseup mouseout",mCSB_buttonDown_stop);
+ /*scroll up*/
+ var mCSB_buttonScrollUp;
+ mCSB_buttonUp.bind("mousedown",function(e){
+ e.preventDefault();
+ var draggerScrollTo=0;
+ mCSB_buttonScrollUp=setInterval(function(){
+ var scrollToSpeed=Math.abs(mCSB_dragger.position().top-draggerScrollTo)*(100/$this.data("scrollButtons-scrollSpeed"));
+ mCSB_dragger.stop().animate({top:draggerScrollTo},scrollToSpeed,"linear");
+ $this.mCustomScrollbar("scroll");
+ },20);
+ });
+ var mCSB_buttonUp_stop=function(e){
+ e.preventDefault();
+ clearInterval(mCSB_buttonScrollUp);
+ mCSB_dragger.stop();
+ }
+ mCSB_buttonUp.bind("mouseup mouseout",mCSB_buttonUp_stop);
+ }
+ }
+ }
+ /*scrolling on element focus (e.g. via TAB key)*/
+ mCustomScrollBox.unbind("focusin").bind("focusin",function(){
+ mCustomScrollBox.scrollTop(0).scrollLeft(0);
+ var focusedElem=$(document.activeElement);
+ if(focusedElem.is("input,textarea,select,button,a[tabindex],area,object")){
+ if($this.data("horizontalScroll")){
+ var mCSB_containerX=mCSB_container.position().left,
+ focusedElemX=focusedElem.position().left,
+ mCustomScrollBoxW=mCustomScrollBox.width(),
+ focusedElemW=focusedElem.outerWidth();
+ if(mCSB_containerX+focusedElemX>=0 && mCSB_containerX+focusedElemX<=mCustomScrollBoxW-focusedElemW){
+ /*just focus...*/
+ }else{ /*scroll, then focus*/
+ var moveDragger=focusedElemX/$this.data("scrollAmount");
+ if(moveDragger>=mCSB_draggerContainer.width()-mCSB_dragger.width()){ /*max dragger position is bottom*/
+ moveDragger=mCSB_draggerContainer.width()-mCSB_dragger.width();
+ }
+ mCSB_dragger.css("left",moveDragger);
+ $this.mCustomScrollbar("scroll");
+ }
+ }else{
+ var mCSB_containerY=mCSB_container.position().top,
+ focusedElemY=focusedElem.position().top,
+ mCustomScrollBoxH=mCustomScrollBox.height(),
+ focusedElemH=focusedElem.outerHeight();
+ if(mCSB_containerY+focusedElemY>=0 && mCSB_containerY+focusedElemY<=mCustomScrollBoxH-focusedElemH){
+ /*just focus...*/
+ }else{ /*scroll, then focus*/
+ var moveDragger=focusedElemY/$this.data("scrollAmount");
+ if(moveDragger>=mCSB_draggerContainer.height()-mCSB_dragger.height()){ /*max dragger position is bottom*/
+ moveDragger=mCSB_draggerContainer.height()-mCSB_dragger.height();
+ }
+ mCSB_dragger.css("top",moveDragger);
+ $this.mCustomScrollbar("scroll");
+ }
+ }
+ }
+ });
+ },
+ scroll:function(updated){
+ var $this=$(this),
+ mCSB_dragger=$this.find(".mCSB_dragger"),
+ mCSB_container=$this.find(".mCSB_container"),
+ mCustomScrollBox=$this.find(".mCustomScrollBox");
+ if($this.data("horizontalScroll")){
+ var draggerX=mCSB_dragger.position().left,
+ targX=-draggerX*$this.data("scrollAmount"),
+ thisX=mCSB_container.position().left,
+ posX=Math.round(thisX-targX);
+ }else{
+ var draggerY=mCSB_dragger.position().top,
+ targY=-draggerY*$this.data("scrollAmount"),
+ thisY=mCSB_container.position().top,
+ posY=Math.round(thisY-targY);
+ }
+ if($.browser.webkit){ /*fix webkit zoom and jquery animate*/
+ var screenCssPixelRatio=(window.outerWidth-8)/window.innerWidth,
+ isZoomed=(screenCssPixelRatio<.98 || screenCssPixelRatio>1.02);
+ }
+ if($this.data("scrollInertia")===0 || isZoomed){
+ if($this.data("horizontalScroll")){
+ mCSB_container.css("left",targX);
+ }else{
+ mCSB_container.css("top",targY);
+ }
+ if(!updated){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container); /*user custom callback functions*/
+ }
+ }else{
+ if($this.data("horizontalScroll")){
+ mCSB_container.stop().animate({left: "-="+posX},$this.data("scrollInertia"),$this.data("scrollEasing"),function(){
+ if(!updated){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container); /*user custom callback functions*/
+ }
+ });
+ }else{
+ mCSB_container.stop().animate({top: "-="+posY},$this.data("scrollInertia"),$this.data("scrollEasing"),function(){
+ if(!updated){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container); /*user custom callback functions*/
+ }
+ });
+ }
+ }
+ },
+ scrollTo:function(scrollTo,options){
+ var defaults={
+ moveDragger:false,
+ callback:true
+ },
+ options=$.extend(defaults,options),
+ $this=$(this),
+ scrollToPos,
+ mCustomScrollBox=$this.find(".mCustomScrollBox"),
+ mCSB_container=mCustomScrollBox.children(".mCSB_container");
+ if(!$(document).data("mCS-is-touch-device")){
+ var mCSB_draggerContainer=$this.find(".mCSB_draggerContainer"),
+ mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger");
+ }
+ var targetPos;
+ if(scrollTo){
+ if(typeof(scrollTo)==="number"){ /*if integer, scroll by number of pixels*/
+ if(options.moveDragger){ /*scroll dragger*/
+ scrollToPos=scrollTo;
+ }else{ /*scroll content by default*/
+ targetPos=scrollTo;
+ scrollToPos=Math.round(targetPos/$this.data("scrollAmount"));
+ }
+ }else if(typeof(scrollTo)==="string"){ /*if string, scroll by element position*/
+ var target;
+ if(scrollTo==="top"){ /*scroll to top*/
+ target=0;
+ }else if(scrollTo==="bottom" && !$this.data("horizontalScroll")){ /*scroll to bottom*/
+ target=mCSB_container.outerHeight()-mCustomScrollBox.height();
+ }else if(scrollTo==="left"){ /*scroll to left*/
+ target=0;
+ }else if(scrollTo==="right" && $this.data("horizontalScroll")){ /*scroll to right*/
+ target=mCSB_container.outerWidth()-mCustomScrollBox.width();
+ }else if(scrollTo==="first"){ /*scroll to first element position*/
+ target=$this.find(".mCSB_container").find(":first");
+ }else if(scrollTo==="last"){ /*scroll to last element position*/
+ target=$this.find(".mCSB_container").find(":last");
+ }else{ /*scroll to element position*/
+ target=$this.find(scrollTo);
+ }
+ if(target.length===1){ /*if such unique element exists, scroll to it*/
+ if($this.data("horizontalScroll")){
+ targetPos=target.position().left;
+ }else{
+ targetPos=target.position().top;
+ }
+ if($(document).data("mCS-is-touch-device")){
+ scrollToPos=targetPos;
+ }else{
+ scrollToPos=Math.ceil(targetPos/$this.data("scrollAmount"));
+ }
+ }else{
+ scrollToPos=target;
+ }
+ }
+ /*scroll to*/
+ if($(document).data("mCS-is-touch-device")){ /*is touch device*/
+ if($this.data("horizontalScroll")){
+ mCustomScrollBox.stop().animate({scrollLeft:scrollToPos},$this.data("scrollInertia"),$this.data("scrollEasing"),function(){
+ if(options.callback){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container);
+ }
+ });
+ }else{
+ mCustomScrollBox.stop().animate({scrollTop:scrollToPos},$this.data("scrollInertia"),$this.data("scrollEasing"),function(){
+ if(options.callback){
+ $this.mCustomScrollbar("callbacks",mCustomScrollBox,mCSB_container);
+ }
+ });
+ }
+ }else{ /*not touch device*/
+ if($this.data("horizontalScroll")){
+ if(scrollToPos>=mCSB_draggerContainer.width()-mCSB_dragger.width()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.width()-mCSB_dragger.width();
+ }
+ mCSB_dragger.css("left",scrollToPos);
+ }else{
+ if(scrollToPos>=mCSB_draggerContainer.height()-mCSB_dragger.height()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.height()-mCSB_dragger.height();
+ }
+ mCSB_dragger.css("top",scrollToPos);
+ }
+ if(options.callback){
+ $this.mCustomScrollbar("scroll");
+ }else{
+ $this.mCustomScrollbar("scroll",true);
+ }
+ }
+
+ }
+ },
+ callbacks:function(mCustomScrollBox,mCSB_container){
+ var $this=$(this);
+ if(!$(document).data("mCS-is-touch-device")){ /*not touch device*/
+ if($this.data("horizontalScroll")){
+ var mCSB_containerX=Math.round(mCSB_container.position().left);
+ if(mCSB_containerX<0 && mCSB_containerX<=mCustomScrollBox.width()-mCSB_container.outerWidth()+$this.data("onTotalScroll-Offset")){
+ $this.data("onTotalScroll-Callback").call();
+ }else{
+ $this.data("onScroll-Callback").call();
+ }
+ }else{
+ var mCSB_containerY=Math.round(mCSB_container.position().top);
+ if(mCSB_containerY<0 && mCSB_containerY<=mCustomScrollBox.height()-mCSB_container.outerHeight()+$this.data("onTotalScroll-Offset")){
+ $this.data("onTotalScroll-Callback").call();
+ }else{
+ $this.data("onScroll-Callback").call();
+ }
+ }
+ }else{ /*is touch device*/
+ if($this.data("horizontalScroll")){
+ var mCustomScrollBoxX=Math.round(mCustomScrollBox.scrollLeft());
+ if(mCustomScrollBoxX>0 && mCustomScrollBoxX>=mCSB_container.outerWidth()-$this.width()-$this.data("onTotalScroll-Offset")){
+ $this.data("onTotalScroll-Callback").call();
+ }else{
+ $this.data("onScroll-Callback").call();
+ }
+ }else{
+ var mCustomScrollBoxY=Math.round(mCustomScrollBox.scrollTop());
+ if(mCustomScrollBoxY>0 && mCustomScrollBoxY>=mCSB_container.outerHeight()-$this.height()-$this.data("onTotalScroll-Offset")){
+ $this.data("onTotalScroll-Callback").call();
+ }else{
+ $this.data("onScroll-Callback").call();
+ }
+ }
+ }
+ }
+ }
+ $.fn.mCustomScrollbar=function(method){
+ if(methods[method]){
+ return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
+ }else if(typeof method==="object" || !method){
+ return methods.init.apply(this,arguments);
+ }else{
+ $.error("Method "+method+" does not exist");
+ }
+ };
+})(jQuery);
\ No newline at end of file