/* * Custom Adaptive Scrolling * author: Stepych - http://csscode.ru * Website: https://github.com/exewebru/scroll * version: 1.0 * */function Scroll(e,t){var n=this;if(typeof e=="object")var t=e,e=e.horizontal?".scroll-horizontal":".scroll";else if(!e)var e=".scroll";var r=$(e);n.dott=[];n.touch=!1;n.border=[!0,!0];n.config=$.extend({cls:["scroll-wrap","scroll-pane","scroll-track","scroll-drag"],drag_old:!1,step:2,start:!1,horizontal:!1,iDeviceSupport:!0},t);if(!n.config.iDeviceSupport)if(window.navigator.userAgent.indexOf("iPhone")!==-1||window.navigator.userAgent.indexOf("iPad")!==-1||window.navigator.userAgent.indexOf("iPod")!==-1){r.css("overflow","auto");return}if("ontouchstart"in window){r.addClass("touch");n.config.start=!0;n.touch=!0}n.config.horizontal?n.tracking={scrollWidth:null,paneWidth:null,dragWidth:null,dragLeft:0,dragRight:null}:n.tracking={scrollHeight:null,paneHeight:null,dragHeight:null,dragTop:0,dragBot:null};r.trigger("scrolling.init",{node:r,config:n.config,tracking:n.tracking});$("body").on("mouseenter.scroll",e,function(e){$(this).trigger("scrolling.mouseenter",{node:this,config:n.config,events:e,tracking:n.tracking})});$("body").on("mouseleave.scroll",e,function(e){$(this).trigger("scrolling.mouseleave",{node:this,config:n.config,events:e,tracking:n.tracking})});$("body").on("mouseover.scroll touchstart",e,function(t){function o(){var e=r.find("> ."+n.config.cls[0]),i=r.find("> ."+n.config.cls[2]),s=e.find("> ."+n.config.cls[1]),o=i.children();if(n.config.horizontal){n.tracking.scrollWidth=r.width();var u=s.children(),a=s.width();u.each(function(e,t){var n=$(t).width();n>a&&(a=n)});s.width(a);n.tracking.paneWidth=a;n.tracking.dragWidth=n.tracking.paneWidth/n.tracking.scrollWidth;n.tracking.dragWidth=Math.round(n.tracking.scrollWidth/n.tracking.dragWidth);if(!(n.tracking.scrollWidthn.dott[0]?i=-1:i=1:u>n.dott[1]?i=-1:i=1;t=i*n.config.step*2}if(t){if(n.config.horizontal){r.scrollLeft(t+r.scrollLeft());var f=n.tracking.paneWidth/n.tracking.scrollWidth,l=n.tracking.paneWidth-n.tracking.scrollWidth,c=s.position().left;c=Math.round(-c/f);o.css("margin-left",c+"px")}else{r.scrollTop(t+r.scrollTop());var h=n.tracking.paneHeight/n.tracking.scrollHeight,l=n.tracking.paneHeight-n.tracking.scrollHeight,c=s.position().top;c=Math.round(-c/h);o.css("margin-top",c+"px")}n.dragPosition(c);r.parent().trigger("scrolling.scroll",{node:this,config:n.config,events:e,tracking:n.tracking});if(n.config.horizontal){if(r.scrollLeft()===0)return;if(r.scrollLeft()===l)return}else{if(r.scrollTop()===0)return;if(r.scrollTop()===l)return}return!1}})}function u(){r.addClass("runned");if(n.config.drag_old)var e='
'+n.config.drag_old+"
";else var e='
'+"
";r.wrapInner('
');r.append(e);r.css("overflow","hidden");var i=r.find("."+n.config.cls[0]);i.scrollTop(0);i.scrollLeft(0);r.trigger("scrolling.scroll",{node:r,config:n.config,events:t,tracking:n.tracking});r.trigger("scrolling.create",{node:r,config:n.config,events:t,tracking:n.tracking});o()}t.preventDefault();var r=$(this),i=r.find("> ."+n.config.cls[0]).length,s=$(t.target).parents(e).length;if(n.touch){if(t.originalEvent!==undefined&&t.originalEvent.touches!==undefined){t.originalEvent.pageX=t.originalEvent.touches[0].pageX;t.originalEvent.pageY=t.originalEvent.touches[0].pageY}else t.originalEvent==undefined&&(t.originalEvent={pageX:r.offset().left,pageY:r.offset().top});n.dott[0]=t.originalEvent.pageX;n.dott[1]=t.originalEvent.pageY}s>1&&(r=r.find(t.target).closest(e));i?o():u()});$("body").on("scrolling.set",e,function(e){var t=$(this),r=t.find(">."+n.config.cls[0]),i=r.next().find(">."+n.config.cls[3]),s=r.find(">."+n.config.cls[1]),o={X:e.scrollX||0,Y:e.scrollY||0,duration:e.duration||0,easing:e.easing||"swing"},u=function(e,t){var n=s.position()[e],o=r[t](),u=s[t]()/o;n=Math.round(-n/u);i.css("margin-"+e,n+"px")};window.getSelection&&window.getSelection().removeAllRanges();if(o.X){if(o.X.indexOf("+")!=-1){o.X=~~o.X.match(/[0-9]+/)[0];o.X=r.scrollTop()+o.X}else if(o.X.indexOf("-")!=-1){o.X=~~o.X.match(/[0-9]+/)[0];o.X=r.scrollTop()-o.X}r.animate({scrollLeft:~~o.X},{queue:!1,easing:o.easing,duration:~~o.duration,step:function(e,n){u("left","width");t.trigger("scrolling.scroll")}})}if(o.Y){if(o.Y.indexOf("+")!=-1){o.Y=~~o.Y.match(/[0-9]+/)[0];o.Y=r.scrollTop()+o.Y}else if(o.Y.indexOf("-")!=-1){o.Y=~~o.Y.match(/[0-9]+/)[0];o.Y=r.scrollTop()-o.Y}r.animate({scrollTop:~~o.Y},{queue:!1,easing:o.easing,duration:~~o.duration,step:function(){u("top","height");t.trigger("scrolling.scroll")}})}});$("body").on("mouseout.scroll touchend",e,function(e){$(this).removeClass("hover");$(this).find("."+n.config.cls[0]).off("mousewheel.scroll DOMMouseScroll.scroll");$(this).trigger("scrolling.mouseout",{node:this,config:n.config,events:e,tracking:n.tracking})});$("body").on({mousedown:function(e){var t=$(e.target),r=t.hasClass(n.config.cls[3])?t:t.closest("."+n.config.cls[3]).length?t.closest("."+n.config.cls[3]):!1;if(!r)return;var i=r.parent().parent(),s,o,u=null;i.addClass("mousedown");-[1]||i.attr("unselectable","on");$("html").attr("onselectstart","return false").addClass("user-select-none");var a=n.config.horizontal?r.width():r.height(),f=i.children().children().filter("."+n.config.cls[1]),l=i.children().filter("."+n.config.cls[0]),c=n.config.horizontal?l.width():l.height(),h=n.config.horizontal?i.offset().left:i.offset().top,p=c-a;$("body").on("mousemove.scroll",function(e){e.preventDefault();window.getSelection&&window.getSelection().removeAllRanges();var t=n.config.horizontal?e.pageX:e.pageY,o=parseInt(n.config.horizontal?r.css("margin-left"):r.css("margin-top")),d=t-h;s==null&&(s=d-o);var v=d-s,m=o+a;if(v<0)v=0;else if(m>=c){v=p;u==null&&(u=d);u>d&&(v-=1)}n.config.horizontal?r.css("margin-left",v+"px"):r.css("margin-top",v+"px");n.config.horizontal?l.scrollLeft(v*f.width()/c):l.scrollTop(v*f.height()/c);n.dragPosition(v);i.trigger("scrolling.mousemove",{node:this,config:n.config,events:e,tracking:n.tracking});i.trigger("scrolling.scroll",{node:this,config:n.config,events:e,tracking:n.tracking})});r.parent().parent().trigger("scrolling.mousedown",{node:this,config:n.config,events:e,tracking:n.tracking})},mouseup:function(e){$(this).trigger("scrolling.mouseup",{node:this,config:n.config,events:e,tracking:n.tracking})}},e);$("body").on("mouseup",function(e){r.removeClass("mousedown");-[1]||$(this).removeAttr("unselectable");$("html").removeAttr("onselectstart").removeClass("user-select-none");$(this).off("mousemove.scroll")});if(n.config.start){r.trigger("mouseover").trigger("mouseout");n.touch&&r.trigger("touchstart")}r.trigger("scrolling.inited",{node:r,config:n.config,tracking:n.tracking})};