From 5d33775cf220ffded904eab89e386725626fc7cf Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 11:37:05 +0100
Subject: [PATCH 001/119] Trigger hideBar when scrolling is over
---
slimScroll.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/slimScroll.js b/slimScroll.js
index ba9d64f..1c198c4 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -183,6 +183,9 @@
//ensure bar is visible
showBar();
+
+ // trigger hide when scroll is stopped
+ hideBar();
}
var attachWheel = function()
From fa68775f4e6f218246633fb15023fbf685ae0cd7 Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 11:39:58 +0100
Subject: [PATCH 002/119] Added spaces after each inline comment start.
---
slimScroll.js | 70 +++++++++++++++++++++++++--------------------------
1 file changed, 35 insertions(+), 35 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 1c198c4..d9554c8 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -11,7 +11,7 @@
slimScroll: function(o) {
var ops = o;
- //do it for every element that matches selector
+ // do it for every element that matches selector
this.each(function(){
var isOverPanel, isOverBar, isDragg, queueHide, barHeight,
@@ -33,10 +33,10 @@
railColor = o.railColor || '#333',
railOpacity = o.railOpacity || 0.2;
- //used in event handlers and for better minification
+ // used in event handlers and for better minification
var me = $(this);
- //wrap content
+ // wrap content
var wrapper = $(divS).css({
position: 'relative',
overflow: 'hidden',
@@ -44,14 +44,14 @@
height: cheight
}).attr({ 'class': 'slimScrollDiv' });
- //update style for the div
+ // update style for the div
me.css({
overflow: 'hidden',
width: cwidth,
height: cheight
});
- //create scrollbar rail
+ // create scrollbar rail
var rail = $(divS).css({
width: size,
height: '100%',
@@ -64,7 +64,7 @@
zIndex: 90
});
- //create scrollbar
+ // create scrollbar
var bar = $(divS).attr({
'class': 'slimScrollBar ',
style: 'border-radius: ' + size
@@ -81,19 +81,19 @@
zIndex: 99
});
- //set position
+ // set position
var posCss = (position == 'right') ? { right: distance } : { left: distance };
rail.css(posCss);
bar.css(posCss);
- //wrap it
+ // wrap it
me.wrap(wrapper);
- //append to parent div
+ // append to parent div
me.parent().append(bar);
me.parent().append(rail);
- //make it draggable
+ // make it draggable
bar.draggable({
axis: 'y',
containment: 'parent',
@@ -101,26 +101,26 @@
stop: function() { isDragg = false; hideBar(); },
drag: function(e)
{
- //scroll content
+ // scroll content
scrollContent(0, $(this).position().top, false);
}
});
- //on rail over
+ // on rail over
rail.hover(function(){
showBar();
}, function(){
hideBar();
});
- //on bar over
+ // on bar over
bar.hover(function(){
isOverBar = true;
}, function(){
isOverBar = false;
});
- //show on parent mouseover
+ // show on parent mouseover
me.hover(function(){
isOverPanel = true;
showBar();
@@ -132,7 +132,7 @@
var _onWheel = function(e)
{
- //use mouse wheel only when mouse is over
+ // use mouse wheel only when mouse is over
if (!isOverPanel) { return; }
var e = e || window.event;
@@ -141,10 +141,10 @@
if (e.wheelDelta) { delta = -e.wheelDelta/120; }
if (e.detail) { delta = e.detail / 3; }
- //scroll content
+ // scroll content
scrollContent(delta, true);
- //stop window scroll
+ // stop window scroll
if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
if (!releaseScroll) { e.returnValue = false; }
}
@@ -155,19 +155,19 @@
if (isWheel)
{
- //move bar with mouse wheel
+ // move bar with mouse wheel
delta = bar.position().top + y * wheelStep;
- //move bar, make sure it doesn't go out
+ // move bar, make sure it doesn't go out
delta = Math.max(delta, 0);
var maxTop = me.outerHeight() - bar.outerHeight();
delta = Math.min(delta, maxTop);
- //scroll the scrollbar
+ // scroll the scrollbar
bar.css({ top: delta + 'px' });
}
- //calculate actual scroll amount
+ // calculate actual scroll amount
var percentScroll = parseInt(bar.position().top) / (me.outerHeight() - bar.outerHeight());
delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
@@ -178,10 +178,10 @@
bar.css({ top: offsetTop + 'px' });
}
- //scroll content
+ // scroll content
me.scrollTop(delta);
- //ensure bar is visible
+ // ensure bar is visible
showBar();
// trigger hide when scroll is stopped
@@ -201,28 +201,28 @@
}
}
- //attach scroll events
+ // attach scroll events
attachWheel();
var getBarHeight = function()
{
- //calculate scrollbar height and make sure it is not too small
+ // calculate scrollbar height and make sure it is not too small
barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
bar.css({ height: barHeight + 'px' });
}
- //set up initial height
+ // set up initial height
getBarHeight();
var showBar = function()
{
- //recalculate bar height
+ // recalculate bar height
getBarHeight();
clearTimeout(queueHide);
- //show only when required
+ // show only when required
if(barHeight >= me.outerHeight()) {
- //allow window scroll
+ // allow window scroll
releaseScroll = true;
return;
}
@@ -232,7 +232,7 @@
var hideBar = function()
{
- //only hide when options allow it
+ // only hide when options allow it
if (!alwaysVisible)
{
queueHide = setTimeout(function(){
@@ -245,24 +245,24 @@
}
}
- //check start position
+ // check start position
if (start == 'bottom')
{
- //scroll content to bottom
+ // scroll content to bottom
bar.css({ top: 'auto', bottom: 0 });
scrollContent(0, true);
}
else if (typeof start == 'object')
{
- //scroll content
+ // scroll content
scrollContent($(start).position().top, null, true);
- //make sure bar stays hidden
+ // make sure bar stays hidden
if (!alwaysVisible) { bar.hide(); }
}
});
- //maintain chainability
+ // maintain chainability
return this;
}
});
From c43781012c39c1c67bdf3d97bff4fc7d675ad062 Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 11:49:42 +0100
Subject: [PATCH 003/119] Defined slimScroll defaults options as recommended by
jQuery plugin authoring notes
see: http://docs.jquery.com/Plugins/Authoring#Defaults_and_Options
---
slimScroll.js | 537 ++++++++++++++++++++++++++------------------------
1 file changed, 277 insertions(+), 260 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index d9554c8..2f6df1b 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -7,268 +7,285 @@
*/
(function($) {
- jQuery.fn.extend({
- slimScroll: function(o) {
-
- var ops = o;
- // do it for every element that matches selector
- this.each(function(){
-
- var isOverPanel, isOverBar, isDragg, queueHide, barHeight,
- divS = '',
- minBarHeight = 30,
- releaseScroll = false,
- o = ops || {},
- wheelStep = parseInt(o.wheelStep) || 20,
- cwidth = o.width || 'auto',
- cheight = o.height || '250px',
- size = o.size || '7px',
- color = o.color || '#000',
- position = o.position || 'right',
- distance = o.distance || '1px',
- start = o.start || 'top',
- opacity = o.opacity || .4,
- alwaysVisible = o.alwaysVisible === true,
- railVisible = o.railVisible || false,
- railColor = o.railColor || '#333',
- railOpacity = o.railOpacity || 0.2;
-
- // used in event handlers and for better minification
- var me = $(this);
-
- // wrap content
- var wrapper = $(divS).css({
- position: 'relative',
- overflow: 'hidden',
- width: cwidth,
- height: cheight
- }).attr({ 'class': 'slimScrollDiv' });
-
- // update style for the div
- me.css({
- overflow: 'hidden',
- width: cwidth,
- height: cheight
- });
-
- // create scrollbar rail
- var rail = $(divS).css({
- width: size,
- height: '100%',
- position: 'absolute',
- top: 0,
- display: (alwaysVisible && railVisible) ? 'block' : 'none',
- 'border-radius': size,
- background: railColor,
- opacity: railOpacity,
- zIndex: 90
- });
-
- // create scrollbar
- var bar = $(divS).attr({
- 'class': 'slimScrollBar ',
- style: 'border-radius: ' + size
- }).css({
- background: color,
- width: size,
- position: 'absolute',
- top: 0,
- opacity: opacity,
- display: alwaysVisible ? 'block' : 'none',
- BorderRadius: size,
- MozBorderRadius: size,
- WebkitBorderRadius: size,
- zIndex: 99
- });
-
- // set position
- var posCss = (position == 'right') ? { right: distance } : { left: distance };
- rail.css(posCss);
- bar.css(posCss);
-
- // wrap it
- me.wrap(wrapper);
-
- // append to parent div
- me.parent().append(bar);
- me.parent().append(rail);
-
- // make it draggable
- bar.draggable({
- axis: 'y',
- containment: 'parent',
- start: function() { isDragg = true; },
- stop: function() { isDragg = false; hideBar(); },
- drag: function(e)
- {
- // scroll content
- scrollContent(0, $(this).position().top, false);
- }
- });
-
- // on rail over
- rail.hover(function(){
- showBar();
- }, function(){
- hideBar();
- });
-
- // on bar over
- bar.hover(function(){
- isOverBar = true;
- }, function(){
- isOverBar = false;
- });
-
- // show on parent mouseover
- me.hover(function(){
- isOverPanel = true;
- showBar();
- hideBar();
- }, function(){
- isOverPanel = false;
- hideBar();
- });
-
- var _onWheel = function(e)
- {
- // use mouse wheel only when mouse is over
- if (!isOverPanel) { return; }
-
- var e = e || window.event;
-
- var delta = 0;
- if (e.wheelDelta) { delta = -e.wheelDelta/120; }
- if (e.detail) { delta = e.detail / 3; }
-
- // scroll content
- scrollContent(delta, true);
-
- // stop window scroll
- if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
- if (!releaseScroll) { e.returnValue = false; }
- }
-
- var scrollContent = function(y, isWheel, isJump)
- {
- var delta = y;
-
- if (isWheel)
- {
- // move bar with mouse wheel
- delta = bar.position().top + y * wheelStep;
-
- // move bar, make sure it doesn't go out
- delta = Math.max(delta, 0);
- var maxTop = me.outerHeight() - bar.outerHeight();
- delta = Math.min(delta, maxTop);
-
- // scroll the scrollbar
- bar.css({ top: delta + 'px' });
- }
-
- // calculate actual scroll amount
- var percentScroll = parseInt(bar.position().top) / (me.outerHeight() - bar.outerHeight());
- delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
-
- if (isJump)
- {
- delta = y;
- var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
- bar.css({ top: offsetTop + 'px' });
- }
-
- // scroll content
- me.scrollTop(delta);
-
- // ensure bar is visible
- showBar();
+ jQuery.fn.extend({
+ slimScroll: function(options) {
+
+ var defaults = {
+ wheelStep : 20,
+ width : 'auto',
+ height : '250px',
+ size : '7px',
+ color: '#000',
+ position : 'right',
+ distance : '1px',
+ start : 'top',
+ opacity : .4,
+ alwaysVisible : true,
+ railVisible : false,
+ railColor : '#333',
+ railOpacity : '0.2'
+ };
+
+ var o = ops = $.extend( defaults , options );
+
+ // do it for every element that matches selector
+ this.each(function(){
+
+ var isOverPanel, isOverBar, isDragg, queueHide, barHeight,
+ divS = '',
+ minBarHeight = 30,
+ releaseScroll = false,
+ wheelStep = parseInt(o.wheelStep),
+ cwidth = o.width,
+ cheight = o.height,
+ size = o.size,
+ color = o.color,
+ position = o.position,
+ distance = o.distance,
+ start = o.start,
+ opacity = o.opacity,
+ alwaysVisible = o.alwaysVisible,
+ railVisible = o.railVisible,
+ railColor = o.railColor,
+ railOpacity = o.railOpacity;
+
+ // used in event handlers and for better minification
+ var me = $(this);
+
+ // wrap content
+ var wrapper = $(divS).css({
+ position: 'relative',
+ overflow: 'hidden',
+ width: cwidth,
+ height: cheight
+ }).attr({ 'class': 'slimScrollDiv' });
+
+ // update style for the div
+ me.css({
+ overflow: 'hidden',
+ width: cwidth,
+ height: cheight
+ });
+
+ // create scrollbar rail
+ var rail = $(divS).css({
+ width: size,
+ height: '100%',
+ position: 'absolute',
+ top: 0,
+ display: (alwaysVisible && railVisible) ? 'block' : 'none',
+ 'border-radius': size,
+ background: railColor,
+ opacity: railOpacity,
+ zIndex: 90
+ });
+
+ // create scrollbar
+ var bar = $(divS).attr({
+ 'class': 'slimScrollBar ',
+ style: 'border-radius: ' + size
+ }).css({
+ background: color,
+ width: size,
+ position: 'absolute',
+ top: 0,
+ opacity: opacity,
+ display: alwaysVisible ? 'block' : 'none',
+ BorderRadius: size,
+ MozBorderRadius: size,
+ WebkitBorderRadius: size,
+ zIndex: 99
+ });
+
+ // set position
+ var posCss = (position == 'right') ? { right: distance } : { left: distance };
+ rail.css(posCss);
+ bar.css(posCss);
+
+ // wrap it
+ me.wrap(wrapper);
+
+ // append to parent div
+ me.parent().append(bar);
+ me.parent().append(rail);
+
+ // make it draggable
+ bar.draggable({
+ axis: 'y',
+ containment: 'parent',
+ start: function() { isDragg = true; },
+ stop: function() { isDragg = false; hideBar(); },
+ drag: function(e)
+ {
+ // scroll content
+ scrollContent(0, $(this).position().top, false);
+ }
+ });
+
+ // on rail over
+ rail.hover(function(){
+ showBar();
+ }, function(){
+ hideBar();
+ });
+
+ // on bar over
+ bar.hover(function(){
+ isOverBar = true;
+ }, function(){
+ isOverBar = false;
+ });
+
+ // show on parent mouseover
+ me.hover(function(){
+ isOverPanel = true;
+ showBar();
+ hideBar();
+ }, function(){
+ isOverPanel = false;
+ hideBar();
+ });
+
+ var _onWheel = function(e)
+ {
+ // use mouse wheel only when mouse is over
+ if (!isOverPanel) { return; }
+
+ var e = e || window.event;
+
+ var delta = 0;
+ if (e.wheelDelta) { delta = -e.wheelDelta/120; }
+ if (e.detail) { delta = e.detail / 3; }
+
+ // scroll content
+ scrollContent(delta, true);
+
+ // stop window scroll
+ if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
+ if (!releaseScroll) { e.returnValue = false; }
+ }
+
+ var scrollContent = function(y, isWheel, isJump)
+ {
+ var delta = y;
+
+ if (isWheel)
+ {
+ // move bar with mouse wheel
+ delta = bar.position().top + y * wheelStep;
+
+ // move bar, make sure it doesn't go out
+ delta = Math.max(delta, 0);
+ var maxTop = me.outerHeight() - bar.outerHeight();
+ delta = Math.min(delta, maxTop);
+
+ // scroll the scrollbar
+ bar.css({ top: delta + 'px' });
+ }
+
+ // calculate actual scroll amount
+ var percentScroll = parseInt(bar.position().top) / (me.outerHeight() - bar.outerHeight());
+ delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
+
+ if (isJump)
+ {
+ delta = y;
+ var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
+ bar.css({ top: offsetTop + 'px' });
+ }
+
+ // scroll content
+ me.scrollTop(delta);
+
+ // ensure bar is visible
+ showBar();
// trigger hide when scroll is stopped
hideBar();
- }
-
- var attachWheel = function()
- {
- if (window.addEventListener)
- {
- this.addEventListener('DOMMouseScroll', _onWheel, false );
- this.addEventListener('mousewheel', _onWheel, false );
- }
- else
- {
- document.attachEvent("onmousewheel", _onWheel)
- }
- }
-
- // attach scroll events
- attachWheel();
-
- var getBarHeight = function()
- {
- // calculate scrollbar height and make sure it is not too small
- barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
- bar.css({ height: barHeight + 'px' });
- }
-
- // set up initial height
- getBarHeight();
-
- var showBar = function()
- {
- // recalculate bar height
- getBarHeight();
- clearTimeout(queueHide);
-
- // show only when required
- if(barHeight >= me.outerHeight()) {
- // allow window scroll
- releaseScroll = true;
- return;
- }
- bar.fadeIn('fast');
- if (railVisible) { rail.fadeIn('fast'); }
- }
-
- var hideBar = function()
- {
- // only hide when options allow it
- if (!alwaysVisible)
- {
- queueHide = setTimeout(function(){
- if (!isOverBar && !isDragg)
- {
- bar.fadeOut('slow');
- rail.fadeOut('slow');
- }
- }, 1000);
- }
- }
-
- // check start position
- if (start == 'bottom')
- {
- // scroll content to bottom
- bar.css({ top: 'auto', bottom: 0 });
- scrollContent(0, true);
- }
- else if (typeof start == 'object')
- {
- // scroll content
- scrollContent($(start).position().top, null, true);
-
- // make sure bar stays hidden
- if (!alwaysVisible) { bar.hide(); }
- }
- });
-
- // maintain chainability
- return this;
- }
- });
-
- jQuery.fn.extend({
- slimscroll: jQuery.fn.slimScroll
- });
+
+ }
+
+ var attachWheel = function()
+ {
+ if (window.addEventListener)
+ {
+ this.addEventListener('DOMMouseScroll', _onWheel, false );
+ this.addEventListener('mousewheel', _onWheel, false );
+ }
+ else
+ {
+ document.attachEvent("onmousewheel", _onWheel)
+ }
+ }
+
+ // attach scroll events
+ attachWheel();
+
+ var getBarHeight = function()
+ {
+ // calculate scrollbar height and make sure it is not too small
+ barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
+ bar.css({ height: barHeight + 'px' });
+ }
+
+ // set up initial height
+ getBarHeight();
+
+ var showBar = function()
+ {
+ // recalculate bar height
+ getBarHeight();
+ clearTimeout(queueHide);
+
+ // show only when required
+ if(barHeight >= me.outerHeight()) {
+ //allow window scroll
+ releaseScroll = true;
+ return;
+ }
+ bar.fadeIn('fast');
+ if (railVisible) { rail.fadeIn('fast'); }
+ }
+
+ var hideBar = function()
+ {
+ // only hide when options allow it
+ if (!alwaysVisible)
+ {
+ queueHide = setTimeout(function(){
+ if (!isOverBar && !isDragg)
+ {
+ bar.fadeOut('slow');
+ rail.fadeOut('slow');
+ }
+ }, 1000);
+ }
+ }
+
+ // check start position
+ if (start == 'bottom')
+ {
+ // scroll content to bottom
+ bar.css({ top: 'auto', bottom: 0 });
+ scrollContent(0, true);
+ }
+ else if (typeof start == 'object')
+ {
+ // scroll content
+ scrollContent($(start).position().top, null, true);
+
+ // make sure bar stays hidden
+ if (!alwaysVisible) { bar.hide(); }
+ }
+ });
+
+ // maintain chainability
+ return this;
+ }
+ });
+
+ jQuery.fn.extend({
+ slimscroll: jQuery.fn.slimScroll
+ });
})(jQuery);
\ No newline at end of file
From 93cd52549ea37a67ce2acadde0b893c17ab8fb5b Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 12:00:20 +0100
Subject: [PATCH 004/119] Added CSS class for the wrapper. Moved each class
name to settings.
---
slimScroll.js | 53 +++++++++++++++++++++++++++++----------------------
1 file changed, 30 insertions(+), 23 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 2f6df1b..06ef6c1 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -23,7 +23,10 @@
alwaysVisible : true,
railVisible : false,
railColor : '#333',
- railOpacity : '0.2'
+ railOpacity : '0.2',
+ railClass : 'slimScrollRail',
+ barClass : 'slimScrollBar',
+ wrapperClass : 'slimScrollDiv'
};
var o = ops = $.extend( defaults , options );
@@ -53,12 +56,14 @@
var me = $(this);
// wrap content
- var wrapper = $(divS).css({
- position: 'relative',
- overflow: 'hidden',
- width: cwidth,
- height: cheight
- }).attr({ 'class': 'slimScrollDiv' });
+ var wrapper = $(divS)
+ .addClass( o.wrapperClass )
+ .css({
+ position: 'relative',
+ overflow: 'hidden',
+ width: cwidth,
+ height: cheight
+ });
// update style for the div
me.css({
@@ -68,34 +73,36 @@
});
// create scrollbar rail
- var rail = $(divS).css({
- width: size,
- height: '100%',
- position: 'absolute',
- top: 0,
- display: (alwaysVisible && railVisible) ? 'block' : 'none',
- 'border-radius': size,
- background: railColor,
- opacity: railOpacity,
- zIndex: 90
- });
+ var rail = $(divS)
+ .addClass( o.railClass )
+ .css({
+ width: size,
+ height: '100%',
+ position: 'absolute',
+ top: 0,
+ display: (alwaysVisible && railVisible) ? 'block' : 'none',
+ 'border-radius': size,
+ background: railColor,
+ opacity: railOpacity,
+ zIndex: 90
+ });
// create scrollbar
- var bar = $(divS).attr({
- 'class': 'slimScrollBar ',
- style: 'border-radius: ' + size
- }).css({
+ var bar = $(divS)
+ .addClass( o.barClass )
+ .css({
background: color,
width: size,
position: 'absolute',
top: 0,
opacity: opacity,
display: alwaysVisible ? 'block' : 'none',
+ 'border-radius' : size,
BorderRadius: size,
MozBorderRadius: size,
WebkitBorderRadius: size,
zIndex: 99
- });
+ });
// set position
var posCss = (position == 'right') ? { right: distance } : { left: distance };
From 7543cdf2829d5fbe378b1f02d337162a524f6701 Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 12:24:37 +0100
Subject: [PATCH 005/119] Added a README
---
README.md | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 README.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..58a01c9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# What is slimScroll?
+
+slimScroll is a small jQuery plugin that transforms any div into a scrollable area with a nice scrollbar - similar to the one Facebook and Google started using in their products recently. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over. User can drag the scrollbar or use mouse-wheel to change the scroll value.
+
+Demo and more: [http://rocha.la/jQuery-slimScroll](http://rocha.la/jQuery-slimScroll)
+
+Copyright (c) 2011 Piotr Rochala (http://rocha.la)
+Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (ttp://www.opensource.org/licenses/gpl-license.php) licenses.
+
From ba8b5308049fa5f6504500799919f492dc333dee Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 12:25:47 +0100
Subject: [PATCH 006/119] Typo in README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 58a01c9..44d1b8f 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
slimScroll is a small jQuery plugin that transforms any div into a scrollable area with a nice scrollbar - similar to the one Facebook and Google started using in their products recently. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over. User can drag the scrollbar or use mouse-wheel to change the scroll value.
-Demo and more: [http://rocha.la/jQuery-slimScroll](http://rocha.la/jQuery-slimScroll)
+Demo and more: http://rocha.la/jQuery-slimScroll
Copyright (c) 2011 Piotr Rochala (http://rocha.la)
-Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (ttp://www.opensource.org/licenses/gpl-license.php) licenses.
+Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
From 46d7f3572c58831e7db649751b900f34391ab2c2 Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 23 Nov 2011 12:28:50 +0100
Subject: [PATCH 007/119] Re-uglified (minified) slimScroll
---
slimScroll.min.js | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 319efee..23d2c1f 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -3,6 +3,5 @@
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Version: 0.3.0
- *
- */
-(function(a){jQuery.fn.extend({slimScroll:function(c){var b=c;this.each(function(){var F,z,m,s,A,n="",C=30,y=false,t=b||{},u=parseInt(t.wheelStep)||20,B=t.width||"auto",w=t.height||"250px",r=t.size||"7px",x=t.color||"#000",K=t.position||"right",h=t.distance||"1px",k=t.start||"top",g=t.opacity||0.4,q=t.alwaysVisible===true,j=t.railVisible||false,i=t.railColor||"#333",v=t.railOpacity||0.2;var I=a(this);var l=a(n).css({position:"relative",overflow:"hidden",width:B,height:w}).attr({"class":"slimScrollDiv"});I.css({overflow:"hidden",width:B,height:w});var d=a(n).css({width:r,height:"100%",position:"absolute",top:0,display:(q&&j)?"block":"none","border-radius":r,background:i,opacity:v,zIndex:90});var D=a(n).attr({"class":"slimScrollBar ",style:"border-radius: "+r}).css({background:x,width:r,position:"absolute",top:0,opacity:g,display:q?"block":"none",BorderRadius:r,MozBorderRadius:r,WebkitBorderRadius:r,zIndex:99});var e=(K=="right")?{right:h}:{left:h};d.css(e);D.css(e);I.wrap(l);I.parent().append(D);I.parent().append(d);D.draggable({axis:"y",containment:"parent",start:function(){m=true},stop:function(){m=false;p()},drag:function(o){E(0,a(this).position().top,false)}});d.hover(function(){f()},function(){p()});D.hover(function(){z=true},function(){z=false});I.hover(function(){F=true;f();p()},function(){F=false;p()});var H=function(o){if(!F){return}var o=o||window.event;var L=0;if(o.wheelDelta){L=-o.wheelDelta/120}if(o.detail){L=o.detail/3}E(L,true);if(o.preventDefault&&!y){o.preventDefault()}if(!y){o.returnValue=false}};var E=function(Q,M,o){var P=Q;if(M){P=D.position().top+Q*u;P=Math.max(P,0);var O=I.outerHeight()-D.outerHeight();P=Math.min(P,O);D.css({top:P+"px"})}var N=parseInt(D.position().top)/(I.outerHeight()-D.outerHeight());P=N*(I[0].scrollHeight-I.outerHeight());if(o){P=Q;var L=P/I[0].scrollHeight*I.outerHeight();D.css({top:L+"px"})}I.scrollTop(P);f()};var G=function(){if(window.addEventListener){this.addEventListener("DOMMouseScroll",H,false);this.addEventListener("mousewheel",H,false)}else{document.attachEvent("onmousewheel",H)}};G();var J=function(){A=Math.max((I.outerHeight()/I[0].scrollHeight)*I.outerHeight(),C);D.css({height:A+"px"})};J();var f=function(){J();clearTimeout(s);if(A>=I.outerHeight()){y=true;return}D.fadeIn("fast");if(j){d.fadeIn("fast")}};var p=function(){if(!q){s=setTimeout(function(){if(!z&&!m){D.fadeOut("slow");d.fadeOut("slow")}},1000)}};if(k=="bottom"){D.css({top:"auto",bottom:0});E(0,true)}else{if(typeof k=="object"){E(a(k).position().top,null,true);if(!q){D.hide()}}}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ *
+ */(function(a){jQuery.fn.extend({slimScroll:function(b){var c={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!0,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},d=ops=a.extend(c,b);this.each(function(){var b,c,e,f,g,h="",i=30,j=!1,k=parseInt(d.wheelStep),l=d.width,m=d.height,n=d.size,p=d.color,q=d.position,r=d.distance,s=d.start,t=d.opacity,u=d.alwaysVisible,v=d.railVisible,w=d.railColor,x=d.railOpacity,y=a(this),z=a(h).addClass(d.wrapperClass).css({position:"relative",overflow:"hidden",width:l,height:m});y.css({overflow:"hidden",width:l,height:m});var A=a(h).addClass(d.railClass).css({width:n,height:"100%",position:"absolute",top:0,display:u&&v?"block":"none","border-radius":n,background:w,opacity:x,zIndex:90}),B=a(h).addClass(d.barClass).css({background:p,width:n,position:"absolute",top:0,opacity:t,display:u?"block":"none","border-radius":n,BorderRadius:n,MozBorderRadius:n,WebkitBorderRadius:n,zIndex:99}),C=q=="right"?{right:r}:{left:r};A.css(C),B.css(C),y.wrap(z),y.parent().append(B),y.parent().append(A),B.draggable({axis:"y",containment:"parent",start:function(){e=!0},stop:function(){e=!1,I()},drag:function(b){E(0,a(this).position().top,!1)}}),A.hover(function(){H()},function(){I()}),B.hover(function(){c=!0},function(){c=!1}),y.hover(function(){b=!0,H(),I()},function(){b=!1,I()});var D=function(a){if(!!b){var a=a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120),a.detail&&(c=a.detail/3),E(c,!0),a.preventDefault&&!j&&a.preventDefault(),j||(a.returnValue=!1)}},E=function(a,b,c){var d=a;if(b){d=B.position().top+a*k,d=Math.max(d,0);var e=y.outerHeight()-B.outerHeight();d=Math.min(d,e),B.css({top:d+"px"})}var f=parseInt(B.position().top)/(y.outerHeight()-B.outerHeight());d=f*(y[0].scrollHeight-y.outerHeight());if(c){d=a;var g=d/y[0].scrollHeight*y.outerHeight();B.css({top:g+"px"})}y.scrollTop(d),H(),I()},F=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",D,!1),this.addEventListener("mousewheel",D,!1)):document.attachEvent("onmousewheel",D)};F();var G=function(){g=Math.max(y.outerHeight()/y[0].scrollHeight*y.outerHeight(),i),B.css({height:g+"px"})};G();var H=function(){G(),clearTimeout(f);g>=y.outerHeight()?j=!0:(B.fadeIn("fast"),v&&A.fadeIn("fast"))},I=function(){u||(f=setTimeout(function(){!c&&!e&&(B.fadeOut("slow"),A.fadeOut("slow"))},1e3))};s=="bottom"?(B.css({top:"auto",bottom:0}),E(0,!0)):typeof s=="object"&&(E(a(s).position().top,null,!0),u||B.hide())});return this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 2537c81c1cafbd4ca2fbf2e95a7682609f49de0c Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Wed, 23 Nov 2011 22:40:16 +0000
Subject: [PATCH 008/119] Fixed alwaysVisible Flag. Increased version number.
Changed formatting of minified version.
---
slimScroll.js | 4 ++--
slimScroll.min.js | 9 +++++++--
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 06ef6c1..02d2de2 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.3.0
+ * Version: 0.4.0
*
*/
(function($) {
@@ -20,7 +20,7 @@
distance : '1px',
start : 'top',
opacity : .4,
- alwaysVisible : true,
+ alwaysVisible : false,
railVisible : false,
railColor : '#333',
railOpacity : '0.2',
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 23d2c1f..f4d0dde 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,6 +2,11 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.3.0
+ * Version: 0.4.0
*
- */(function(a){jQuery.fn.extend({slimScroll:function(b){var c={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!0,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},d=ops=a.extend(c,b);this.each(function(){var b,c,e,f,g,h="",i=30,j=!1,k=parseInt(d.wheelStep),l=d.width,m=d.height,n=d.size,p=d.color,q=d.position,r=d.distance,s=d.start,t=d.opacity,u=d.alwaysVisible,v=d.railVisible,w=d.railColor,x=d.railOpacity,y=a(this),z=a(h).addClass(d.wrapperClass).css({position:"relative",overflow:"hidden",width:l,height:m});y.css({overflow:"hidden",width:l,height:m});var A=a(h).addClass(d.railClass).css({width:n,height:"100%",position:"absolute",top:0,display:u&&v?"block":"none","border-radius":n,background:w,opacity:x,zIndex:90}),B=a(h).addClass(d.barClass).css({background:p,width:n,position:"absolute",top:0,opacity:t,display:u?"block":"none","border-radius":n,BorderRadius:n,MozBorderRadius:n,WebkitBorderRadius:n,zIndex:99}),C=q=="right"?{right:r}:{left:r};A.css(C),B.css(C),y.wrap(z),y.parent().append(B),y.parent().append(A),B.draggable({axis:"y",containment:"parent",start:function(){e=!0},stop:function(){e=!1,I()},drag:function(b){E(0,a(this).position().top,!1)}}),A.hover(function(){H()},function(){I()}),B.hover(function(){c=!0},function(){c=!1}),y.hover(function(){b=!0,H(),I()},function(){b=!1,I()});var D=function(a){if(!!b){var a=a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120),a.detail&&(c=a.detail/3),E(c,!0),a.preventDefault&&!j&&a.preventDefault(),j||(a.returnValue=!1)}},E=function(a,b,c){var d=a;if(b){d=B.position().top+a*k,d=Math.max(d,0);var e=y.outerHeight()-B.outerHeight();d=Math.min(d,e),B.css({top:d+"px"})}var f=parseInt(B.position().top)/(y.outerHeight()-B.outerHeight());d=f*(y[0].scrollHeight-y.outerHeight());if(c){d=a;var g=d/y[0].scrollHeight*y.outerHeight();B.css({top:g+"px"})}y.scrollTop(d),H(),I()},F=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",D,!1),this.addEventListener("mousewheel",D,!1)):document.attachEvent("onmousewheel",D)};F();var G=function(){g=Math.max(y.outerHeight()/y[0].scrollHeight*y.outerHeight(),i),B.css({height:g+"px"})};G();var H=function(){G(),clearTimeout(f);g>=y.outerHeight()?j=!0:(B.fadeIn("fast"),v&&A.fadeIn("fast"))},I=function(){u||(f=setTimeout(function(){!c&&!e&&(B.fadeOut("slow"),A.fadeOut("slow"))},1e3))};s=="bottom"?(B.css({top:"auto",bottom:0}),E(0,!0)):typeof s=="object"&&(E(a(s).position().top,null,!0),u||B.hide())});return this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(d){jQuery.fn.extend({slimScroll:function(l){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},l);this.each(function(){var m,n,o,u,p,q=!1,l=parseInt(a.wheelStep),g=a.width,v=a.height,f=a.size,z=a.color,A=a.position,w=a.distance,r=a.start,B=a.opacity,j=
+a.alwaysVisible,x=a.railVisible,C=a.railColor,D=a.railOpacity,b=d(this),E=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:v});b.css({overflow:"hidden",width:g,height:v});var h=d("").addClass(a.railClass).css({width:f,height:"100%",position:"absolute",top:0,display:j&&x?"block":"none","border-radius":f,background:C,opacity:D,zIndex:90}),c=d("").addClass(a.barClass).css({background:z,width:f,position:"absolute",top:0,opacity:B,
+display:j?"block":"none","border-radius":f,BorderRadius:f,MozBorderRadius:f,WebkitBorderRadius:f,zIndex:99}),g="right"==A?{right:w}:{left:w};h.css(g);c.css(g);b.wrap(E);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){o=!0},stop:function(){o=!1;i()},drag:function(){k(0,d(this).position().top,!1)}});h.hover(function(){s()},function(){i()});c.hover(function(){n=!0},function(){n=!1});b.hover(function(){m=!0;s();i()},function(){m=!1;i()});var t=function(a){if(m){var a=
+a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);k(b,!0);a.preventDefault&&!q&&a.preventDefault();if(!q)a.returnValue=!1}},k=function(a,d,f){var e=a;d&&(e=c.position().top+a*l,e=Math.max(e,0),d=b.outerHeight()-c.outerHeight(),e=Math.min(e,d),c.css({top:e+"px"}));e=parseInt(c.position().top)/(b.outerHeight()-c.outerHeight())*(b[0].scrollHeight-b.outerHeight());f&&(e=a,a=e/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(e);s();i()};(function(){window.addEventListener?
+(this.addEventListener("DOMMouseScroll",t,!1),this.addEventListener("mousewheel",t,!1)):document.attachEvent("onmousewheel",t)})();var y=function(){p=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:p+"px"})};y();var s=function(){y();clearTimeout(u);p>=b.outerHeight()?q=!0:(c.fadeIn("fast"),x&&h.fadeIn("fast"))},i=function(){j||(u=setTimeout(function(){!n&&!o&&(c.fadeOut("slow"),h.fadeOut("slow"))},1E3))};"bottom"==r?(c.css({top:"auto",bottom:0}),k(0,!0)):"object"==typeof r&&
+(k(d(r).position().top,null,!0),j||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 09400fc8a0c70e80555374f291088a48238d0440 Mon Sep 17 00:00:00 2001
From: Robin Komiwes
Date: Wed, 30 Nov 2011 14:57:03 +0100
Subject: [PATCH 009/119] bar.css('top') should be used instead of
bar.position().top
---
slimScroll.js | 6 +++---
slimScroll.min.js | 9 ++-------
2 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 02d2de2..a028466 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.0
+ * Version: 0.4.1
*
*/
(function($) {
@@ -179,7 +179,7 @@
if (isWheel)
{
// move bar with mouse wheel
- delta = bar.position().top + y * wheelStep;
+ delta = parseInt( bar.css('top') ) + y * wheelStep;
// move bar, make sure it doesn't go out
delta = Math.max(delta, 0);
@@ -191,7 +191,7 @@
}
// calculate actual scroll amount
- var percentScroll = parseInt(bar.position().top) / (me.outerHeight() - bar.outerHeight());
+ var percentScroll = parseInt( bar.css('top') ) / (me.outerHeight() - bar.outerHeight());
delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
if (isJump)
diff --git a/slimScroll.min.js b/slimScroll.min.js
index f4d0dde..4a86387 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,11 +2,6 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.0
+ * Version: 0.4.1
*
- */(function(d){jQuery.fn.extend({slimScroll:function(l){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},l);this.each(function(){var m,n,o,u,p,q=!1,l=parseInt(a.wheelStep),g=a.width,v=a.height,f=a.size,z=a.color,A=a.position,w=a.distance,r=a.start,B=a.opacity,j=
-a.alwaysVisible,x=a.railVisible,C=a.railColor,D=a.railOpacity,b=d(this),E=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:v});b.css({overflow:"hidden",width:g,height:v});var h=d("").addClass(a.railClass).css({width:f,height:"100%",position:"absolute",top:0,display:j&&x?"block":"none","border-radius":f,background:C,opacity:D,zIndex:90}),c=d("").addClass(a.barClass).css({background:z,width:f,position:"absolute",top:0,opacity:B,
-display:j?"block":"none","border-radius":f,BorderRadius:f,MozBorderRadius:f,WebkitBorderRadius:f,zIndex:99}),g="right"==A?{right:w}:{left:w};h.css(g);c.css(g);b.wrap(E);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){o=!0},stop:function(){o=!1;i()},drag:function(){k(0,d(this).position().top,!1)}});h.hover(function(){s()},function(){i()});c.hover(function(){n=!0},function(){n=!1});b.hover(function(){m=!0;s();i()},function(){m=!1;i()});var t=function(a){if(m){var a=
-a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);k(b,!0);a.preventDefault&&!q&&a.preventDefault();if(!q)a.returnValue=!1}},k=function(a,d,f){var e=a;d&&(e=c.position().top+a*l,e=Math.max(e,0),d=b.outerHeight()-c.outerHeight(),e=Math.min(e,d),c.css({top:e+"px"}));e=parseInt(c.position().top)/(b.outerHeight()-c.outerHeight())*(b[0].scrollHeight-b.outerHeight());f&&(e=a,a=e/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(e);s();i()};(function(){window.addEventListener?
-(this.addEventListener("DOMMouseScroll",t,!1),this.addEventListener("mousewheel",t,!1)):document.attachEvent("onmousewheel",t)})();var y=function(){p=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:p+"px"})};y();var s=function(){y();clearTimeout(u);p>=b.outerHeight()?q=!0:(c.fadeIn("fast"),x&&h.fadeIn("fast"))},i=function(){j||(u=setTimeout(function(){!n&&!o&&(c.fadeOut("slow"),h.fadeOut("slow"))},1E3))};"bottom"==r?(c.css({top:"auto",bottom:0}),k(0,!0)):"object"==typeof r&&
-(k(d(r).position().top,null,!0),j||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(a){jQuery.fn.extend({slimScroll:function(b){var c={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},d=ops=a.extend(c,b);this.each(function(){var b,c,e,f,g,h="",i=30,j=!1,k=parseInt(d.wheelStep),l=d.width,m=d.height,n=d.size,p=d.color,q=d.position,r=d.distance,s=d.start,t=d.opacity,u=d.alwaysVisible,v=d.railVisible,w=d.railColor,x=d.railOpacity,y=a(this),z=a(h).addClass(d.wrapperClass).css({position:"relative",overflow:"hidden",width:l,height:m});y.css({overflow:"hidden",width:l,height:m});var A=a(h).addClass(d.railClass).css({width:n,height:"100%",position:"absolute",top:0,display:u&&v?"block":"none","border-radius":n,background:w,opacity:x,zIndex:90}),B=a(h).addClass(d.barClass).css({background:p,width:n,position:"absolute",top:0,opacity:t,display:u?"block":"none","border-radius":n,BorderRadius:n,MozBorderRadius:n,WebkitBorderRadius:n,zIndex:99}),C=q=="right"?{right:r}:{left:r};A.css(C),B.css(C),y.wrap(z),y.parent().append(B),y.parent().append(A),B.draggable({axis:"y",containment:"parent",start:function(){e=!0},stop:function(){e=!1,I()},drag:function(b){E(0,a(this).position().top,!1)}}),A.hover(function(){H()},function(){I()}),B.hover(function(){c=!0},function(){c=!1}),y.hover(function(){b=!0,H(),I()},function(){b=!1,I()});var D=function(a){if(!!b){var a=a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120),a.detail&&(c=a.detail/3),E(c,!0),a.preventDefault&&!j&&a.preventDefault(),j||(a.returnValue=!1)}},E=function(a,b,c){var d=a;if(b){d=parseInt(B.css("top"))+a*k,d=Math.max(d,0);var e=y.outerHeight()-B.outerHeight();d=Math.min(d,e),B.css({top:d+"px"})}var f=parseInt(B.css("top"))/(y.outerHeight()-B.outerHeight());d=f*(y[0].scrollHeight-y.outerHeight());if(c){d=a;var g=d/y[0].scrollHeight*y.outerHeight();B.css({top:g+"px"})}y.scrollTop(d),H(),I()},F=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",D,!1),this.addEventListener("mousewheel",D,!1)):document.attachEvent("onmousewheel",D)};F();var G=function(){g=Math.max(y.outerHeight()/y[0].scrollHeight*y.outerHeight(),i),B.css({height:g+"px"})};G();var H=function(){G(),clearTimeout(f);g>=y.outerHeight()?j=!0:(B.fadeIn("fast"),v&&A.fadeIn("fast"))},I=function(){u||(f=setTimeout(function(){!c&&!e&&(B.fadeOut("slow"),A.fadeOut("slow"))},1e3))};s=="bottom"?(B.css({top:"auto",bottom:0}),E(0,!0)):typeof s=="object"&&(E(a(s).position().top,null,!0),u||B.hide())});return this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery)
\ No newline at end of file
From 1459a32001490885b126c5dc52dc8c9d7813fa67 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Tue, 6 Dec 2011 22:35:15 +0000
Subject: [PATCH 010/119] Fixed bug with start:'bottom' on webkit/ie.
---
slimScroll.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index a028466..f1edce8 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -273,7 +273,7 @@
if (start == 'bottom')
{
// scroll content to bottom
- bar.css({ top: 'auto', bottom: 0 });
+ bar.css({ top: me.outerHeight() - bar.outerHeight() });
scrollContent(0, true);
}
else if (typeof start == 'object')
From 0e12a320ddc695306a99138e30f16d4833de5c62 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Tue, 6 Dec 2011 22:36:39 +0000
Subject: [PATCH 011/119] Modified wheelStep to take under consideration the
length of the content so now passed value is a % of total length.
---
slimScroll.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index f1edce8..31d5b76 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -179,7 +179,7 @@
if (isWheel)
{
// move bar with mouse wheel
- delta = parseInt( bar.css('top') ) + y * wheelStep;
+ delta = parseInt(bar.css('top')) + y * wheelStep / 100 * bar.outerHeight();
// move bar, make sure it doesn't go out
delta = Math.max(delta, 0);
From bc85f2291135d770e1c7b012e6db718cdea42336 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Tue, 6 Dec 2011 23:09:39 +0000
Subject: [PATCH 012/119] Modified the code so mouse wheel is released when the
scrollbar reaches top or bottom of the scrollable area to simulate the
behaviour of natural HTML elements such as textarea or div with
overflow:auto;
Updated version number.
---
slimScroll.js | 15 ++++++++-------
slimScroll.min.js | 10 ++++++++--
2 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 31d5b76..64871c8 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.1
+ * Version: 0.4.3
*
*/
(function($) {
@@ -34,7 +34,7 @@
// do it for every element that matches selector
this.each(function(){
- var isOverPanel, isOverBar, isDragg, queueHide, barHeight,
+ var isOverPanel, isOverBar, isDragg, queueHide, barHeight, percentScroll,
divS = '',
minBarHeight = 30,
releaseScroll = false,
@@ -182,16 +182,15 @@
delta = parseInt(bar.css('top')) + y * wheelStep / 100 * bar.outerHeight();
// move bar, make sure it doesn't go out
- delta = Math.max(delta, 0);
var maxTop = me.outerHeight() - bar.outerHeight();
- delta = Math.min(delta, maxTop);
+ delta = Math.min(Math.max(delta, 0), maxTop);
// scroll the scrollbar
bar.css({ top: delta + 'px' });
}
// calculate actual scroll amount
- var percentScroll = parseInt( bar.css('top') ) / (me.outerHeight() - bar.outerHeight());
+ percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
if (isJump)
@@ -209,7 +208,6 @@
// trigger hide when scroll is stopped
hideBar();
-
}
var attachWheel = function()
@@ -243,7 +241,10 @@
// recalculate bar height
getBarHeight();
clearTimeout(queueHide);
-
+
+ // release wheel when bar reached top or bottom
+ releaseScroll = percentScroll == ~~ percentScroll;
+
// show only when required
if(barHeight >= me.outerHeight()) {
//allow window scroll
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 4a86387..3de19e7 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,6 +2,12 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.1
+ * Version: 0.4.3
*
- */(function(a){jQuery.fn.extend({slimScroll:function(b){var c={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},d=ops=a.extend(c,b);this.each(function(){var b,c,e,f,g,h="",i=30,j=!1,k=parseInt(d.wheelStep),l=d.width,m=d.height,n=d.size,p=d.color,q=d.position,r=d.distance,s=d.start,t=d.opacity,u=d.alwaysVisible,v=d.railVisible,w=d.railColor,x=d.railOpacity,y=a(this),z=a(h).addClass(d.wrapperClass).css({position:"relative",overflow:"hidden",width:l,height:m});y.css({overflow:"hidden",width:l,height:m});var A=a(h).addClass(d.railClass).css({width:n,height:"100%",position:"absolute",top:0,display:u&&v?"block":"none","border-radius":n,background:w,opacity:x,zIndex:90}),B=a(h).addClass(d.barClass).css({background:p,width:n,position:"absolute",top:0,opacity:t,display:u?"block":"none","border-radius":n,BorderRadius:n,MozBorderRadius:n,WebkitBorderRadius:n,zIndex:99}),C=q=="right"?{right:r}:{left:r};A.css(C),B.css(C),y.wrap(z),y.parent().append(B),y.parent().append(A),B.draggable({axis:"y",containment:"parent",start:function(){e=!0},stop:function(){e=!1,I()},drag:function(b){E(0,a(this).position().top,!1)}}),A.hover(function(){H()},function(){I()}),B.hover(function(){c=!0},function(){c=!1}),y.hover(function(){b=!0,H(),I()},function(){b=!1,I()});var D=function(a){if(!!b){var a=a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120),a.detail&&(c=a.detail/3),E(c,!0),a.preventDefault&&!j&&a.preventDefault(),j||(a.returnValue=!1)}},E=function(a,b,c){var d=a;if(b){d=parseInt(B.css("top"))+a*k,d=Math.max(d,0);var e=y.outerHeight()-B.outerHeight();d=Math.min(d,e),B.css({top:d+"px"})}var f=parseInt(B.css("top"))/(y.outerHeight()-B.outerHeight());d=f*(y[0].scrollHeight-y.outerHeight());if(c){d=a;var g=d/y[0].scrollHeight*y.outerHeight();B.css({top:g+"px"})}y.scrollTop(d),H(),I()},F=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",D,!1),this.addEventListener("mousewheel",D,!1)):document.attachEvent("onmousewheel",D)};F();var G=function(){g=Math.max(y.outerHeight()/y[0].scrollHeight*y.outerHeight(),i),B.css({height:g+"px"})};G();var H=function(){G(),clearTimeout(f);g>=y.outerHeight()?j=!0:(B.fadeIn("fast"),v&&A.fadeIn("fast"))},I=function(){u||(f=setTimeout(function(){!c&&!e&&(B.fadeOut("slow"),A.fadeOut("slow"))},1e3))};s=="bottom"?(B.css({top:"auto",bottom:0}),E(0,!0)):typeof s=="object"&&(E(a(s).position().top,null,!0),u||B.hide())});return this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery)
\ No newline at end of file
+ */
+(function(d){jQuery.fn.extend({slimScroll:function(n){var b=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},n);this.each(function(){var o,p,q,v,r,j,k=!1,n=parseInt(b.wheelStep),g=b.width,w=b.height,e=b.size,A=b.color,B=b.position,x=b.distance,s=b.start,C=b.opacity,
+l=b.alwaysVisible,y=b.railVisible,D=b.railColor,E=b.railOpacity,a=d(this),F=d("").addClass(b.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:w});a.css({overflow:"hidden",width:g,height:w});var h=d("").addClass(b.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:l&&y?"block":"none","border-radius":e,background:D,opacity:E,zIndex:90}),c=d("").addClass(b.barClass).css({background:A,width:e,position:"absolute",top:0,opacity:C,
+display:l?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),g="right"==B?{right:x}:{left:x};h.css(g);c.css(g);a.wrap(F);a.parent().append(c);a.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){q=!0},stop:function(){q=!1;i()},drag:function(){m(0,d(this).position().top,!1)}});h.hover(function(){t()},function(){i()});c.hover(function(){p=!0},function(){p=!1});a.hover(function(){o=!0;t();i()},function(){o=!1;i()});var u=function(a){if(o){var a=
+a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120);a.detail&&(c=a.detail/3);m(c,!0);a.preventDefault&&!k&&a.preventDefault();if(!k)a.returnValue=!1}},m=function(b,d,e){var f=b;d&&(f=parseInt(c.css("top"))+b*n/100*c.outerHeight(),d=a.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));j=parseInt(c.css("top"))/(a.outerHeight()-c.outerHeight());f=j*(a[0].scrollHeight-a.outerHeight());e&&(f=b,b=f/a[0].scrollHeight*a.outerHeight(),c.css({top:b+"px"}));a.scrollTop(f);t();
+i()};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",u,!1),this.addEventListener("mousewheel",u,!1)):document.attachEvent("onmousewheel",u)})();var z=function(){r=Math.max(a.outerHeight()/a[0].scrollHeight*a.outerHeight(),30);c.css({height:r+"px"})};z();var t=function(){z();clearTimeout(v);k=j==~~j;r>=a.outerHeight()?k=!0:(c.fadeIn("fast"),y&&h.fadeIn("fast"))},i=function(){l||(v=setTimeout(function(){!p&&!q&&(c.fadeOut("slow"),h.fadeOut("slow"))},1E3))};"bottom"==s?(c.css({top:a.outerHeight()-
+c.outerHeight()}),m(0,!0)):"object"==typeof s&&(m(d(s).position().top,null,!0),l||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From c8c5ff7ca6e2ec4cffcb156a1029432beebc8ae9 Mon Sep 17 00:00:00 2001
From: InspiredJW
Date: Wed, 28 Dec 2011 16:50:15 +0900
Subject: [PATCH 013/119] Immediate FadeIn without waiting for on-going FadeOut
Animation.
---
slimScroll.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 64871c8..ec13e5a 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -251,8 +251,8 @@
releaseScroll = true;
return;
}
- bar.fadeIn('fast');
- if (railVisible) { rail.fadeIn('fast'); }
+ bar.stop(true,true).fadeIn('fast');
+ if (railVisible) { rail.stop(true,true).fadeIn('fast'); }
}
var hideBar = function()
From 7217c933cbc487fcb9b3b7e0409ab86d61aeea23 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sun, 22 Jan 2012 21:42:24 +0000
Subject: [PATCH 014/119] Added package.json file for future compatiblity with
new jQuery plugins page.
---
package.json | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 package.json
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..c938706
--- /dev/null
+++ b/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "slimScroll",
+ "version": "0.4.4",
+ "title": "jQuery.slimScroll()",
+ "author": {
+ "name": "Piotr Rochala",
+ "url": "http://rocha.la/"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ },
+ {
+ "type": "GPL",
+ "url": "http://www.opensource.org/licenses/gpl-license.php"
+ }
+ ],
+ "dependencies": {
+ "jquery": ">1"
+ },
+ "description": "slimScroll is a small jQuery plugin that transforms any div into a scrollable area with a nice scrollbar - similar to the one Facebook and Google started using in their products recently. slimScroll doesn't occupy any visual space as it only appears on a user initiated mouse-over. User can drag the scrollbar or use mouse-wheel to change the scroll value.",
+ "keywords": [
+ "scrollbar",
+ "scroll",
+ "slimscroll",
+ "scrollable"
+ ],
+ "homepage": "http://rocha.la/jQuery-slimScroll",
+ "maintainers": [
+ {
+ "name": "Piotr Rochala",
+ "url": "https://github.com/rochal"
+ }
+ ],
+ "files": [
+ "slimScroll.min.js",
+ "slimScroll.js",
+ "index.min.html",
+ "index.htm",
+ "README.md",
+ "package.json"
+ ]
+}
\ No newline at end of file
From ef584dc71952b8246452452ac3c695ad980633ac Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sun, 22 Jan 2012 21:54:17 +0000
Subject: [PATCH 015/119] Re-enabled page scroll blocking when cursor is still
over the container and scrollbar reached top or bottom. This is still
configurable using resumePageScroll flag.
---
index.htm | 5 +++--
index.min.htm | 5 +++--
slimScroll.js | 10 ++++++----
slimScroll.min.js | 14 +++++++-------
4 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/index.htm b/index.htm
index 8666aa2..e9264e1 100644
--- a/index.htm
+++ b/index.htm
@@ -80,7 +80,7 @@
rail always visible test (rail color, opacity test)
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
rail always visible test (rail color, opacity test)
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
-
rail visible test
+
rail visible test, resumePageScroll true
@@ -176,7 +176,8 @@
rail visible test
});
$('#testrailvisible').slimscroll({
width: '300px',
- railVisible: true
+ railVisible: true,
+ resumePageScroll: true
});
$('#testrailalwaysvisible').slimscroll({
width: '300px',
diff --git a/slimScroll.js b/slimScroll.js
index 64871c8..b5e0315 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.3
+ * Version: 0.4.4
*
*/
(function($) {
@@ -26,7 +26,8 @@
railOpacity : '0.2',
railClass : 'slimScrollRail',
barClass : 'slimScrollBar',
- wrapperClass : 'slimScrollDiv'
+ wrapperClass : 'slimScrollDiv',
+ resumePageScroll: false
};
var o = ops = $.extend( defaults , options );
@@ -50,7 +51,8 @@
alwaysVisible = o.alwaysVisible,
railVisible = o.railVisible,
railColor = o.railColor,
- railOpacity = o.railOpacity;
+ railOpacity = o.railOpacity,
+ resumePageScroll = o.resumePageScroll;
// used in event handlers and for better minification
var me = $(this);
@@ -243,7 +245,7 @@
clearTimeout(queueHide);
// release wheel when bar reached top or bottom
- releaseScroll = percentScroll == ~~ percentScroll;
+ releaseScroll = resumePageScroll && percentScroll == ~~ percentScroll;
// show only when required
if(barHeight >= me.outerHeight()) {
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 3de19e7..89b3a2c 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,12 +2,12 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.3
+ * Version: 0.4.4
*
*/
-(function(d){jQuery.fn.extend({slimScroll:function(n){var b=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv"},n);this.each(function(){var o,p,q,v,r,j,k=!1,n=parseInt(b.wheelStep),g=b.width,w=b.height,e=b.size,A=b.color,B=b.position,x=b.distance,s=b.start,C=b.opacity,
-l=b.alwaysVisible,y=b.railVisible,D=b.railColor,E=b.railOpacity,a=d(this),F=d("").addClass(b.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:w});a.css({overflow:"hidden",width:g,height:w});var h=d("").addClass(b.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:l&&y?"block":"none","border-radius":e,background:D,opacity:E,zIndex:90}),c=d("").addClass(b.barClass).css({background:A,width:e,position:"absolute",top:0,opacity:C,
-display:l?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),g="right"==B?{right:x}:{left:x};h.css(g);c.css(g);a.wrap(F);a.parent().append(c);a.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){q=!0},stop:function(){q=!1;i()},drag:function(){m(0,d(this).position().top,!1)}});h.hover(function(){t()},function(){i()});c.hover(function(){p=!0},function(){p=!1});a.hover(function(){o=!0;t();i()},function(){o=!1;i()});var u=function(a){if(o){var a=
-a||window.event,c=0;a.wheelDelta&&(c=-a.wheelDelta/120);a.detail&&(c=a.detail/3);m(c,!0);a.preventDefault&&!k&&a.preventDefault();if(!k)a.returnValue=!1}},m=function(b,d,e){var f=b;d&&(f=parseInt(c.css("top"))+b*n/100*c.outerHeight(),d=a.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));j=parseInt(c.css("top"))/(a.outerHeight()-c.outerHeight());f=j*(a[0].scrollHeight-a.outerHeight());e&&(f=b,b=f/a[0].scrollHeight*a.outerHeight(),c.css({top:b+"px"}));a.scrollTop(f);t();
-i()};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",u,!1),this.addEventListener("mousewheel",u,!1)):document.attachEvent("onmousewheel",u)})();var z=function(){r=Math.max(a.outerHeight()/a[0].scrollHeight*a.outerHeight(),30);c.css({height:r+"px"})};z();var t=function(){z();clearTimeout(v);k=j==~~j;r>=a.outerHeight()?k=!0:(c.fadeIn("fast"),y&&h.fadeIn("fast"))},i=function(){l||(v=setTimeout(function(){!p&&!q&&(c.fadeOut("slow"),h.fadeOut("slow"))},1E3))};"bottom"==s?(c.css({top:a.outerHeight()-
-c.outerHeight()}),m(0,!0)):"object"==typeof s&&(m(d(s).position().top,null,!0),l||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+(function(d){jQuery.fn.extend({slimScroll:function(n){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",resumePageScroll:!1},n);this.each(function(){var o,p,q,v,r,j,k=!1,n=parseInt(a.wheelStep),g=a.width,w=a.height,e=a.size,A=a.color,B=a.position,x=a.distance,s=
+a.start,C=a.opacity,l=a.alwaysVisible,y=a.railVisible,D=a.railColor,E=a.railOpacity,F=a.resumePageScroll,b=d(this),G=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:w});b.css({overflow:"hidden",width:g,height:w});var h=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:l&&y?"block":"none","border-radius":e,background:D,opacity:E,zIndex:90}),c=d("").addClass(a.barClass).css({background:A,
+width:e,position:"absolute",top:0,opacity:C,display:l?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),g="right"==B?{right:x}:{left:x};h.css(g);c.css(g);b.wrap(G);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){q=!0},stop:function(){q=!1;i()},drag:function(){m(0,d(this).position().top,!1)}});h.hover(function(){t()},function(){i()});c.hover(function(){p=!0},function(){p=!1});b.hover(function(){o=
+!0;t();i()},function(){o=!1;i()});var u=function(a){if(o){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);m(b,!0);a.preventDefault&&!k&&a.preventDefault();if(!k)a.returnValue=!1}},m=function(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*n/100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));j=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=j*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*
+b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);t();i()};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",u,!1),this.addEventListener("mousewheel",u,!1)):document.attachEvent("onmousewheel",u)})();var z=function(){r=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:r+"px"})};z();var t=function(){z();clearTimeout(v);k=F&&j==~~j;r>=b.outerHeight()?k=!0:(c.fadeIn("fast"),y&&h.fadeIn("fast"))},i=function(){l||(v=setTimeout(function(){!p&&!q&&(c.fadeOut("slow"),
+h.fadeOut("slow"))},1E3))};"bottom"==s?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"object"==typeof s&&(m(d(s).position().top,null,!0),l||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 3e568c89238102d1fbba8a0d70925d5f7d8e6034 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sat, 11 Feb 2012 15:44:49 +0000
Subject: [PATCH 016/119] Renamed resumePageScroll to allowPageScroll.
---
slimScroll.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index b5e0315..f860ecb 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -27,7 +27,7 @@
railClass : 'slimScrollRail',
barClass : 'slimScrollBar',
wrapperClass : 'slimScrollDiv',
- resumePageScroll: false
+ allowPageScroll: false
};
var o = ops = $.extend( defaults , options );
@@ -52,7 +52,7 @@
railVisible = o.railVisible,
railColor = o.railColor,
railOpacity = o.railOpacity,
- resumePageScroll = o.resumePageScroll;
+ allowPageScroll = o.allowPageScroll;
// used in event handlers and for better minification
var me = $(this);
@@ -245,7 +245,7 @@
clearTimeout(queueHide);
// release wheel when bar reached top or bottom
- releaseScroll = resumePageScroll && percentScroll == ~~ percentScroll;
+ releaseScroll = allowPageScroll && percentScroll == ~~ percentScroll;
// show only when required
if(barHeight >= me.outerHeight()) {
From 686a818df75ba6f7113e7f7fc800f6011217f598 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sat, 11 Feb 2012 15:57:11 +0000
Subject: [PATCH 017/119] Added check to disable slimScroll binding on the same
element more than once.
---
slimScroll.js | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/slimScroll.js b/slimScroll.js
index f860ecb..a779c3e 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -57,6 +57,12 @@
// used in event handlers and for better minification
var me = $(this);
+ //ensure we are not binding it again
+ if (me.parent().hasClass('slimScrollDiv'))
+ {
+ return;
+ }
+
// wrap content
var wrapper = $(divS)
.addClass( o.wrapperClass )
From 162089f1574f3422a4489c2378e9c5b265af4348 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sat, 11 Feb 2012 17:20:52 +0000
Subject: [PATCH 018/119] Added support for setting the scroll value
externally.
Now $(slimscroll-enabled-element).slimScroll({ scroll: x });
will scroll by x pixels. It can be called on any element that has been
previously enabled to use slimscroll.
---
index.htm | 19 ++++++++++++++-----
index.min.htm | 19 ++++++++++++++-----
slimScroll.js | 27 ++++++++++++++++++++-------
slimScroll.min.js | 14 +++++++-------
4 files changed, 55 insertions(+), 24 deletions(-)
diff --git a/index.htm b/index.htm
index e9264e1..0d379d6 100644
--- a/index.htm
+++ b/index.htm
@@ -68,7 +68,7 @@
start at the element offsetTop test (multiple elements)
-
rail always visible test (rail color, opacity test)
+
rail always visible test (rail color, opacity test), external setting scroll value test
@@ -79,8 +79,10 @@
rail always visible test (rail color, opacity test)
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
start at the element offsetTop test (multiple elements)
-
rail always visible test (rail color, opacity test)
+
rail always visible test (rail color, opacity test), external setting scroll value test
@@ -79,8 +79,10 @@
rail always visible test (rail color, opacity test)
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
";
$('#noinitialcontent').slimScroll({
diff --git a/slimScroll.js b/slimScroll.js
index 1738882..601a0aa 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.4
+ * Version: 0.5.0
*
*/
(function($) {
@@ -27,7 +27,8 @@
railClass : 'slimScrollRail',
barClass : 'slimScrollBar',
wrapperClass : 'slimScrollDiv',
- allowPageScroll: false
+ allowPageScroll: false,
+ scroll: 0
};
var o = ops = $.extend( defaults , options );
@@ -52,7 +53,8 @@
railVisible = o.railVisible,
railColor = o.railColor,
railOpacity = o.railOpacity,
- allowPageScroll = o.allowPageScroll;
+ allowPageScroll = o.allowPageScroll,
+ scroll = o.scroll;
// used in event handlers and for better minification
var me = $(this);
@@ -60,6 +62,17 @@
//ensure we are not binding it again
if (me.parent().hasClass('slimScrollDiv'))
{
+ //check if we should scroll existing instance
+ if (scroll)
+ {
+ //find bar and rail
+ bar = me.parent().find('.slimScrollBar');
+ rail = me.parent().find('.slimScrollRail');
+
+ //scroll by given amount of pixels
+ scrollContent( me.scrollTop() + parseInt(scroll), false, true);
+ }
+
return;
}
@@ -180,7 +193,7 @@
if (!releaseScroll) { e.returnValue = false; }
}
- var scrollContent = function(y, isWheel, isJump)
+ function scrollContent(y, isWheel, isJump)
{
var delta = y;
@@ -234,7 +247,7 @@
// attach scroll events
attachWheel();
- var getBarHeight = function()
+ function getBarHeight()
{
// calculate scrollbar height and make sure it is not too small
barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
@@ -244,7 +257,7 @@
// set up initial height
getBarHeight();
- var showBar = function()
+ function showBar()
{
// recalculate bar height
getBarHeight();
@@ -263,7 +276,7 @@
if (railVisible) { rail.stop(true,true).fadeIn('fast'); }
}
- var hideBar = function()
+ function hideBar()
{
// only hide when options allow it
if (!alwaysVisible)
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 89b3a2c..4a928fb 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,12 +2,12 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.4.4
+ * Version: 0.5.0
*
*/
-(function(d){jQuery.fn.extend({slimScroll:function(n){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",resumePageScroll:!1},n);this.each(function(){var o,p,q,v,r,j,k=!1,n=parseInt(a.wheelStep),g=a.width,w=a.height,e=a.size,A=a.color,B=a.position,x=a.distance,s=
-a.start,C=a.opacity,l=a.alwaysVisible,y=a.railVisible,D=a.railColor,E=a.railOpacity,F=a.resumePageScroll,b=d(this),G=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:g,height:w});b.css({overflow:"hidden",width:g,height:w});var h=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:l&&y?"block":"none","border-radius":e,background:D,opacity:E,zIndex:90}),c=d("").addClass(a.barClass).css({background:A,
-width:e,position:"absolute",top:0,opacity:C,display:l?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),g="right"==B?{right:x}:{left:x};h.css(g);c.css(g);b.wrap(G);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){q=!0},stop:function(){q=!1;i()},drag:function(){m(0,d(this).position().top,!1)}});h.hover(function(){t()},function(){i()});c.hover(function(){p=!0},function(){p=!1});b.hover(function(){o=
-!0;t();i()},function(){o=!1;i()});var u=function(a){if(o){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);m(b,!0);a.preventDefault&&!k&&a.preventDefault();if(!k)a.returnValue=!1}},m=function(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*n/100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));j=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=j*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*
-b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);t();i()};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",u,!1),this.addEventListener("mousewheel",u,!1)):document.attachEvent("onmousewheel",u)})();var z=function(){r=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:r+"px"})};z();var t=function(){z();clearTimeout(v);k=F&&j==~~j;r>=b.outerHeight()?k=!0:(c.fadeIn("fast"),y&&h.fadeIn("fast"))},i=function(){l||(v=setTimeout(function(){!p&&!q&&(c.fadeOut("slow"),
-h.fadeOut("slow"))},1E3))};"bottom"==s?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"object"==typeof s&&(m(d(s).position().top,null,!0),l||c.hide())});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+(function(d){jQuery.fn.extend({slimScroll:function(o){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0},o);this.each(function(){function h(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*B/100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),
+f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));k=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=k*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);p();i()}function w(){q=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),o);c.css({height:q+"px"})}function p(){w();clearTimeout(x);l=C&&k==~~k;q>=b.outerHeight()?l=!0:(c.stop(!0,!0).fadeIn("fast"),y&&g.stop(!0,!0).fadeIn("fast"))}function i(){m||(x=setTimeout(function(){!r&&
+!s&&(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var t,r,s,x,q,k,o=30,l=!1,B=parseInt(a.wheelStep),j=a.width,z=a.height,e=a.size,D=a.color,E=a.position,A=a.distance,u=a.start,F=a.opacity,m=a.alwaysVisible,y=a.railVisible,G=a.railColor,H=a.railOpacity,C=a.allowPageScroll,n=a.scroll,b=d(this);if(b.parent().hasClass("slimScrollDiv"))n&&(c=b.parent().find(".slimScrollBar"),g=b.parent().find(".slimScrollRail"),h(b.scrollTop()+parseInt(n),!1,!0));else{n=d("").addClass(a.wrapperClass).css({position:"relative",
+overflow:"hidden",width:j,height:z});b.css({overflow:"hidden",width:j,height:z});var g=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:m&&y?"block":"none","border-radius":e,background:G,opacity:H,zIndex:90}),c=d("").addClass(a.barClass).css({background:D,width:e,position:"absolute",top:0,opacity:F,display:m?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),j="right"==E?{right:A}:{left:A};
+g.css(j);c.css(j);b.wrap(n);b.parent().append(c);b.parent().append(g);c.draggable({axis:"y",containment:"parent",start:function(){s=!0},stop:function(){s=!1;i()},drag:function(){h(0,d(this).position().top,!1)}});g.hover(function(){p()},function(){i()});c.hover(function(){r=!0},function(){r=!1});b.hover(function(){t=!0;p();i()},function(){t=!1;i()});var v=function(a){if(t){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);h(b,!0);a.preventDefault&&!l&&a.preventDefault();
+l||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)})();w();"bottom"==u?(c.css({top:b.outerHeight()-c.outerHeight()}),h(0,!0)):"object"==typeof u&&(h(d(u).position().top,null,!0),m||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 7212a181c99de9583a94025bd7552fa904b5bbd9 Mon Sep 17 00:00:00 2001
From: Umar Farooq Khawaja
Date: Wed, 13 Jun 2012 17:05:42 +0200
Subject: [PATCH 019/119] Provide a new option 'disableFadeOut', which keeps
the scrollbar visible as long as the mouse has not left the scrollable div.
---
slimScroll.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index 601a0aa..d7db99b 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -21,6 +21,7 @@
start : 'top',
opacity : .4,
alwaysVisible : false,
+ disableFadeOut: false,
railVisible : false,
railColor : '#333',
railOpacity : '0.2',
@@ -49,6 +50,7 @@
distance = o.distance,
start = o.start,
opacity = o.opacity,
+ disableFadeOut = o.disableFadeOut,
alwaysVisible = o.alwaysVisible,
railVisible = o.railVisible,
railColor = o.railColor,
@@ -282,7 +284,7 @@
if (!alwaysVisible)
{
queueHide = setTimeout(function(){
- if (!isOverBar && !isDragg)
+ if (!(disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
{
bar.fadeOut('slow');
rail.fadeOut('slow');
From 83bef518303b83117abe596af9060ad24beee492 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Wed, 12 Sep 2012 20:37:46 +0200
Subject: [PATCH 020/119] Added top/bottom notification events
Added events to notify when scrollbar reached top or bottom of the
parent container. $(container).bind('slimscroll') can be used to
subscribe to events.
---
index.htm | 11 ++++++++---
index.min.htm | 11 ++++++++---
slimScroll.js | 29 +++++++++++++++++++++--------
slimScroll.min.js | 14 +++++++-------
4 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/index.htm b/index.htm
index 0d379d6..0a24ff2 100644
--- a/index.htm
+++ b/index.htm
@@ -44,7 +44,7 @@
Facebook-like jQuery Scrollbar
-
start at the element offsetTop test
+
start at the element offsetTop test & top/bottom events
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
@@ -54,8 +54,9 @@
start at the element offsetTop test
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
-
start at the element offsetTop test (multiple elements)
+
start at the element offsetTop test (multiple elements) & disable fadeOut
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
start at the element offsetTop test & top/bottom events
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
@@ -54,8 +54,9 @@
start at the element offsetTop test
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
-
start at the element offsetTop test (multiple elements)
+
start at the element offsetTop test (multiple elements) & disable fadeOut
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
@@ -152,11 +153,15 @@
rail visible test, allowPageScroll true
height: '200px',
start: $('#testElement'),
alwaysVisible: true
+ }).bind('slimscroll', function(e, pos){
+ $('#test1aout').html($('#test1aout').html() + "Reached " + pos + " ");
});
+
$('#test1b').slimScroll({
height: '200px',
width: '400px',
- start: $('.blah:eq(1)')
+ start: $('.blah:eq(1)'),
+ disableFadeOut: true
});
$('#test2').slimScroll({
position: 'left',
diff --git a/slimScroll.js b/slimScroll.js
index d7db99b..8819f4a 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.5.0
+ * Version: 0.6.0
*
*/
(function($) {
@@ -32,12 +32,13 @@
scroll: 0
};
- var o = ops = $.extend( defaults , options );
+ var o = ops = $.extend(defaults, options);
// do it for every element that matches selector
this.each(function(){
- var isOverPanel, isOverBar, isDragg, queueHide, barHeight, percentScroll,
+ var isOverPanel, isOverBar, isDragg, queueHide,
+ barHeight, percentScroll, lastScroll,
divS = '',
minBarHeight = 30,
releaseScroll = false,
@@ -80,7 +81,7 @@
// wrap content
var wrapper = $(divS)
- .addClass( o.wrapperClass )
+ .addClass(o.wrapperClass)
.css({
position: 'relative',
overflow: 'hidden',
@@ -97,7 +98,7 @@
// create scrollbar rail
var rail = $(divS)
- .addClass( o.railClass )
+ .addClass(o.railClass)
.css({
width: size,
height: '100%',
@@ -112,7 +113,7 @@
// create scrollbar
var bar = $(divS)
- .addClass( o.barClass )
+ .addClass(o.barClass)
.css({
background: color,
width: size,
@@ -265,8 +266,20 @@
getBarHeight();
clearTimeout(queueHide);
- // release wheel when bar reached top or bottom
- releaseScroll = allowPageScroll && percentScroll == ~~ percentScroll;
+ // when bar reached top or bottom
+ if (percentScroll == ~~ percentScroll)
+ {
+ //release wheel
+ releaseScroll = allowPageScroll;
+
+ // publish approporiate event
+ if (lastScroll != percentScroll)
+ {
+ var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
+ me.trigger('slimscroll', msg);
+ }
+ }
+ lastScroll = percentScroll;
// show only when required
if(barHeight >= me.outerHeight()) {
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 4a928fb..001b37e 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,12 +2,12 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.5.0
+ * Version: 0.6.0
*
*/
-(function(d){jQuery.fn.extend({slimScroll:function(o){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0},o);this.each(function(){function h(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*B/100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),
-f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));k=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=k*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);p();i()}function w(){q=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),o);c.css({height:q+"px"})}function p(){w();clearTimeout(x);l=C&&k==~~k;q>=b.outerHeight()?l=!0:(c.stop(!0,!0).fadeIn("fast"),y&&g.stop(!0,!0).fadeIn("fast"))}function i(){m||(x=setTimeout(function(){!r&&
-!s&&(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var t,r,s,x,q,k,o=30,l=!1,B=parseInt(a.wheelStep),j=a.width,z=a.height,e=a.size,D=a.color,E=a.position,A=a.distance,u=a.start,F=a.opacity,m=a.alwaysVisible,y=a.railVisible,G=a.railColor,H=a.railOpacity,C=a.allowPageScroll,n=a.scroll,b=d(this);if(b.parent().hasClass("slimScrollDiv"))n&&(c=b.parent().find(".slimScrollBar"),g=b.parent().find(".slimScrollRail"),h(b.scrollTop()+parseInt(n),!1,!0));else{n=d("").addClass(a.wrapperClass).css({position:"relative",
-overflow:"hidden",width:j,height:z});b.css({overflow:"hidden",width:j,height:z});var g=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:m&&y?"block":"none","border-radius":e,background:G,opacity:H,zIndex:90}),c=d("").addClass(a.barClass).css({background:D,width:e,position:"absolute",top:0,opacity:F,display:m?"block":"none","border-radius":e,BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),j="right"==E?{right:A}:{left:A};
-g.css(j);c.css(j);b.wrap(n);b.parent().append(c);b.parent().append(g);c.draggable({axis:"y",containment:"parent",start:function(){s=!0},stop:function(){s=!1;i()},drag:function(){h(0,d(this).position().top,!1)}});g.hover(function(){p()},function(){i()});c.hover(function(){r=!0},function(){r=!1});b.hover(function(){t=!0;p();i()},function(){t=!1;i()});var v=function(a){if(t){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);h(b,!0);a.preventDefault&&!l&&a.preventDefault();
-l||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)})();w();"bottom"==u?(c.css({top:b.outerHeight()-c.outerHeight()}),h(0,!0)):"object"==typeof u&&(h(d(u).position().top,null,!0),m||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+(function(d){jQuery.fn.extend({slimScroll:function(p){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0},p);this.each(function(){function i(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*C/100*c.outerHeight(),d=b.outerHeight()-
+c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));g=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=g*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);q();j()}function w(){r=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),p);c.css({height:r+"px"})}function q(){w();clearTimeout(x);g==~~g&&(l=D,y!=g&&b.trigger("slimscroll",0==~~g?"top":"bottom"));y=g;r>=b.outerHeight()?l=!0:(c.stop(!0,!0).fadeIn("fast"),
+z&&h.stop(!0,!0).fadeIn("fast"))}function j(){m||(x=setTimeout(function(){if((!E||!n)&&!s&&!t)c.fadeOut("slow"),h.fadeOut("slow")},1E3))}var n,s,t,x,r,g,y,p=30,l=!1,C=parseInt(a.wheelStep),k=a.width,A=a.height,e=a.size,F=a.color,G=a.position,B=a.distance,u=a.start,H=a.opacity,E=a.disableFadeOut,m=a.alwaysVisible,z=a.railVisible,I=a.railColor,J=a.railOpacity,D=a.allowPageScroll,o=a.scroll,b=d(this);if(b.parent().hasClass("slimScrollDiv"))o&&(c=b.parent().find(".slimScrollBar"),h=b.parent().find(".slimScrollRail"),
+i(b.scrollTop()+parseInt(o),!1,!0));else{o=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:k,height:A});b.css({overflow:"hidden",width:k,height:A});var h=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:m&&z?"block":"none","border-radius":e,background:I,opacity:J,zIndex:90}),c=d("").addClass(a.barClass).css({background:F,width:e,position:"absolute",top:0,opacity:H,display:m?"block":"none","border-radius":e,
+BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),k="right"==G?{right:B}:{left:B};h.css(k);c.css(k);b.wrap(o);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){t=!0},stop:function(){t=!1;j()},drag:function(){i(0,d(this).position().top,!1)}});h.hover(function(){q()},function(){j()});c.hover(function(){s=!0},function(){s=!1});b.hover(function(){n=!0;q();j()},function(){n=!1;j()});var v=function(a){if(n){var a=a||window.event,b=0;a.wheelDelta&&
+(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);i(b,!0);a.preventDefault&&!l&&a.preventDefault();l||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)})();w();"bottom"==u?(c.css({top:b.outerHeight()-c.outerHeight()}),i(0,!0)):"object"==typeof u&&(i(d(u).position().top,null,!0),m||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 0508e3a31afd172c23635a19f7a8d0c962512495 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Sun, 30 Sep 2012 13:48:14 +0200
Subject: [PATCH 021/119] Updated to use latest versions of jQuery and jQuery
UI
---
index.htm | 4 ++--
index.min.htm | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/index.htm b/index.htm
index 0a24ff2..bcb7873 100644
--- a/index.htm
+++ b/index.htm
@@ -4,8 +4,8 @@
slimScroll demo
-
-
+
+
diff --git a/index.min.htm b/index.min.htm
index faf8e9f..cca2015 100644
--- a/index.min.htm
+++ b/index.min.htm
@@ -4,8 +4,8 @@
slimScroll demo
-
-
+
+
From 8a7b32748e1291cc346722d18d1361764ca5adfc Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Wed, 3 Oct 2012 21:26:07 +0200
Subject: [PATCH 022/119] Added support for scrolling on mobile devices
Tested on Samsung Galaxy Tab 2 and HTC Desire. Need to check iPad and
iPhone before tagging.
---
slimScroll.js | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index 8819f4a..ef7397c 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -37,7 +37,7 @@
// do it for every element that matches selector
this.each(function(){
- var isOverPanel, isOverBar, isDragg, queueHide,
+ var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
barHeight, percentScroll, lastScroll,
divS = '',
minBarHeight = 30,
@@ -177,6 +177,28 @@
hideBar();
});
+ // support for mobile
+ me.bind('touchstart', function(e,b){
+ if (e.originalEvent.touches.length)
+ {
+ // record where touch started
+ touchDif = e.originalEvent.touches[0].pageY;
+ }
+ });
+
+ me.bind('touchmove', function(e){
+ // prevent scrolling the page
+ e.originalEvent.preventDefault();
+ if (e.originalEvent.touches.length)
+ {
+ // see how far user swiped
+ var diff = (touchDif - e.originalEvent.touches[0].pageY) / -100;
+ // scroll content
+ scrollContent(diff, true);
+ }
+
+ });
+
var _onWheel = function(e)
{
// use mouse wheel only when mouse is over
From ac5c54bf5f8bcd90e9ed783444cada4352f7b19c Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Fri, 5 Oct 2012 10:55:48 +0200
Subject: [PATCH 023/119] Inverted direction of touch scroll
Added touchScrollStep flag to allow setting different sesitivity for
touch scroll as well as manual inversion of the touch scroll by setting
negative number.
Refctored code to remove duplication and decrese the size.
---
index.htm | 9 ++---
index.min.htm | 9 ++---
slimScroll.js | 86 +++++++++++++++++++----------------------------
slimScroll.min.js | 15 +++++----
4 files changed, 53 insertions(+), 66 deletions(-)
diff --git a/index.htm b/index.htm
index bcb7873..98fd18a 100644
--- a/index.htm
+++ b/index.htm
@@ -8,7 +8,6 @@
-
+
rail visible test, allowPageScroll true & mobile touch steo
@@ -97,7 +97,7 @@
rail visible test, allowPageScroll true
-
scrollbar on left test
+
scrollbar on left test & mobile large step
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
rail visible test, allowPageScroll true & mobile touch steo
@@ -97,7 +97,7 @@
rail visible test, allowPageScroll true
-
scrollbar on left test
+
scrollbar on left test & mobile large step
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
@@ -184,7 +184,8 @@
rail visible test, allowPageScroll true
$('#testrailvisible').slimscroll({
width: '300px',
railVisible: true,
- allowPageScroll: true
+ allowPageScroll: true,
+ touchScrollStep: 1000
});
$('#testrailalwaysvisible').slimscroll({
width: '300px',
diff --git a/slimScroll.js b/slimScroll.js
index ef7397c..6c981ea 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -2,7 +2,7 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.6.0
+ * Version: 0.6.5
*
*/
(function($) {
@@ -29,10 +29,11 @@
barClass : 'slimScrollBar',
wrapperClass : 'slimScrollDiv',
allowPageScroll: false,
- scroll: 0
+ scroll: 0,
+ touchScrollStep: 200
};
- var o = ops = $.extend(defaults, options);
+ var o = $.extend(defaults, options);
// do it for every element that matches selector
this.each(function(){
@@ -41,24 +42,8 @@
barHeight, percentScroll, lastScroll,
divS = '',
minBarHeight = 30,
- releaseScroll = false,
- wheelStep = parseInt(o.wheelStep),
- cwidth = o.width,
- cheight = o.height,
- size = o.size,
- color = o.color,
- position = o.position,
- distance = o.distance,
- start = o.start,
- opacity = o.opacity,
- disableFadeOut = o.disableFadeOut,
- alwaysVisible = o.alwaysVisible,
- railVisible = o.railVisible,
- railColor = o.railColor,
- railOpacity = o.railOpacity,
- allowPageScroll = o.allowPageScroll,
- scroll = o.scroll;
-
+ releaseScroll = false;
+
// used in event handlers and for better minification
var me = $(this);
@@ -85,29 +70,29 @@
.css({
position: 'relative',
overflow: 'hidden',
- width: cwidth,
- height: cheight
+ width: o.width,
+ height: o.height
});
// update style for the div
me.css({
overflow: 'hidden',
- width: cwidth,
- height: cheight
+ width: o.width,
+ height: o.height
});
// create scrollbar rail
var rail = $(divS)
.addClass(o.railClass)
.css({
- width: size,
+ width: o.size,
height: '100%',
position: 'absolute',
top: 0,
- display: (alwaysVisible && railVisible) ? 'block' : 'none',
- 'border-radius': size,
- background: railColor,
- opacity: railOpacity,
+ display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
+ 'border-radius': o.size,
+ background: o.railColor,
+ opacity: o.railOpacity,
zIndex: 90
});
@@ -115,21 +100,21 @@
var bar = $(divS)
.addClass(o.barClass)
.css({
- background: color,
- width: size,
+ background: o.color,
+ width: o.size,
position: 'absolute',
top: 0,
- opacity: opacity,
- display: alwaysVisible ? 'block' : 'none',
- 'border-radius' : size,
- BorderRadius: size,
- MozBorderRadius: size,
- WebkitBorderRadius: size,
+ opacity: o.opacity,
+ display: o.alwaysVisible ? 'block' : 'none',
+ 'border-radius' : o.size,
+ BorderRadius: o.size,
+ MozBorderRadius: o.size,
+ WebkitBorderRadius: o.size,
zIndex: 99
});
// set position
- var posCss = (position == 'right') ? { right: distance } : { left: distance };
+ var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };
rail.css(posCss);
bar.css(posCss);
@@ -192,12 +177,11 @@
if (e.originalEvent.touches.length)
{
// see how far user swiped
- var diff = (touchDif - e.originalEvent.touches[0].pageY) / -100;
+ var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
// scroll content
scrollContent(diff, true);
}
-
- });
+ });
var _onWheel = function(e)
{
@@ -225,7 +209,7 @@
if (isWheel)
{
// move bar with mouse wheel
- delta = parseInt(bar.css('top')) + y * wheelStep / 100 * bar.outerHeight();
+ delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
// move bar, make sure it doesn't go out
var maxTop = me.outerHeight() - bar.outerHeight();
@@ -292,7 +276,7 @@
if (percentScroll == ~~ percentScroll)
{
//release wheel
- releaseScroll = allowPageScroll;
+ releaseScroll = o.allowPageScroll;
// publish approporiate event
if (lastScroll != percentScroll)
@@ -310,16 +294,16 @@
return;
}
bar.stop(true,true).fadeIn('fast');
- if (railVisible) { rail.stop(true,true).fadeIn('fast'); }
+ if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }
}
function hideBar()
{
// only hide when options allow it
- if (!alwaysVisible)
+ if (!o.alwaysVisible)
{
queueHide = setTimeout(function(){
- if (!(disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
+ if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
{
bar.fadeOut('slow');
rail.fadeOut('slow');
@@ -329,19 +313,19 @@
}
// check start position
- if (start == 'bottom')
+ if (o.start == 'bottom')
{
// scroll content to bottom
bar.css({ top: me.outerHeight() - bar.outerHeight() });
scrollContent(0, true);
}
- else if (typeof start == 'object')
+ else if (typeof o.start == 'object')
{
// scroll content
- scrollContent($(start).position().top, null, true);
+ scrollContent($(o.start).position().top, null, true);
// make sure bar stays hidden
- if (!alwaysVisible) { bar.hide(); }
+ if (!o.alwaysVisible) { bar.hide(); }
}
});
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 001b37e..3a9b768 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -2,12 +2,13 @@
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
- * Version: 0.6.0
+ * Version: 0.6.5
*
*/
-(function(d){jQuery.fn.extend({slimScroll:function(p){var a=ops=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0},p);this.each(function(){function i(a,d,e){var f=a;d&&(f=parseInt(c.css("top"))+a*C/100*c.outerHeight(),d=b.outerHeight()-
-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));g=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=g*(b[0].scrollHeight-b.outerHeight());e&&(f=a,a=f/b[0].scrollHeight*b.outerHeight(),c.css({top:a+"px"}));b.scrollTop(f);q();j()}function w(){r=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),p);c.css({height:r+"px"})}function q(){w();clearTimeout(x);g==~~g&&(l=D,y!=g&&b.trigger("slimscroll",0==~~g?"top":"bottom"));y=g;r>=b.outerHeight()?l=!0:(c.stop(!0,!0).fadeIn("fast"),
-z&&h.stop(!0,!0).fadeIn("fast"))}function j(){m||(x=setTimeout(function(){if((!E||!n)&&!s&&!t)c.fadeOut("slow"),h.fadeOut("slow")},1E3))}var n,s,t,x,r,g,y,p=30,l=!1,C=parseInt(a.wheelStep),k=a.width,A=a.height,e=a.size,F=a.color,G=a.position,B=a.distance,u=a.start,H=a.opacity,E=a.disableFadeOut,m=a.alwaysVisible,z=a.railVisible,I=a.railColor,J=a.railOpacity,D=a.allowPageScroll,o=a.scroll,b=d(this);if(b.parent().hasClass("slimScrollDiv"))o&&(c=b.parent().find(".slimScrollBar"),h=b.parent().find(".slimScrollRail"),
-i(b.scrollTop()+parseInt(o),!1,!0));else{o=d("").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:k,height:A});b.css({overflow:"hidden",width:k,height:A});var h=d("").addClass(a.railClass).css({width:e,height:"100%",position:"absolute",top:0,display:m&&z?"block":"none","border-radius":e,background:I,opacity:J,zIndex:90}),c=d("").addClass(a.barClass).css({background:F,width:e,position:"absolute",top:0,opacity:H,display:m?"block":"none","border-radius":e,
-BorderRadius:e,MozBorderRadius:e,WebkitBorderRadius:e,zIndex:99}),k="right"==G?{right:B}:{left:B};h.css(k);c.css(k);b.wrap(o);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){t=!0},stop:function(){t=!1;j()},drag:function(){i(0,d(this).position().top,!1)}});h.hover(function(){q()},function(){j()});c.hover(function(){s=!0},function(){s=!1});b.hover(function(){n=!0;q();j()},function(){n=!1;j()});var v=function(a){if(n){var a=a||window.event,b=0;a.wheelDelta&&
-(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);i(b,!0);a.preventDefault&&!l&&a.preventDefault();l||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)})();w();"bottom"==u?(c.css({top:b.outerHeight()-c.outerHeight()}),i(0,!0)):"object"==typeof u&&(i(d(u).position().top,null,!0),m||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+(function(d){jQuery.fn.extend({slimScroll:function(m){var a=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},m);this.each(function(){function e(i,d,e){var f=i;d&&(f=parseInt(c.css("top"))+i*parseInt(a.wheelStep)/
+100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));g=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=g*(b[0].scrollHeight-b.outerHeight());e&&(f=i,i=f/b[0].scrollHeight*b.outerHeight(),c.css({top:i+"px"}));b.scrollTop(f);n();j()}function t(){p=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),m);c.css({height:p+"px"})}function n(){t();clearTimeout(u);g==~~g&&(k=a.allowPageScroll,v!=g&&b.trigger("slimscroll",0==~~g?"top":"bottom"));
+v=g;p>=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&h.stop(!0,!0).fadeIn("fast"))}function j(){a.alwaysVisible||(u=setTimeout(function(){if((!a.disableFadeOut||!l)&&!q&&!r)c.fadeOut("slow"),h.fadeOut("slow")},1E3))}var l,q,r,u,w,p,g,v,m=30,k=!1,b=d(this);if(b.parent().hasClass("slimScrollDiv"))scroll&&(c=b.parent().find(".slimScrollBar"),h=b.parent().find(".slimScrollRail"),e(b.scrollTop()+parseInt(scroll),!1,!0));else{var y=d("").addClass(a.wrapperClass).css({position:"relative",
+overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",width:a.width,height:a.height});var h=d("").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.size,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=d("").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none",
+"border-radius":a.size,BorderRadius:a.size,MozBorderRadius:a.size,WebkitBorderRadius:a.size,zIndex:99}),x="right"==a.position?{right:a.distance}:{left:a.distance};h.css(x);c.css(x);b.wrap(y);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){r=!0},stop:function(){r=!1;j()},drag:function(){e(0,d(this).position().top,!1)}});h.hover(function(){n()},function(){j()});c.hover(function(){q=!0},function(){q=!1});b.hover(function(){l=!0;n();j()},function(){l=
+!1;j()});b.bind("touchstart",function(a){a.originalEvent.touches.length&&(w=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){b.originalEvent.preventDefault();b.originalEvent.touches.length&&e((w-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0)});var s=function(a){if(l){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);e(b,!0);a.preventDefault&&!k&&a.preventDefault();k||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",
+s,!1),this.addEventListener("mousewheel",s,!1)):document.attachEvent("onmousewheel",s)})();t();"bottom"==a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),e(0,!0)):"object"==typeof a.start&&(e(d(a.start).position().top,null,!0),a.alwaysVisible||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 3a2306683c9a05eff4250a9b57633103d7540737 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Fri, 5 Oct 2012 10:59:15 +0200
Subject: [PATCH 024/119] Fixed typo on demo page
---
index.htm | 5 ++---
index.min.htm | 5 ++---
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/index.htm b/index.htm
index 98fd18a..6dff5ca 100644
--- a/index.htm
+++ b/index.htm
@@ -18,7 +18,6 @@
-
rail visible test, allowPageScroll true & mobile touch steo
+
rail visible test, allowPageScroll true & mobile touch step
@@ -97,7 +96,7 @@
rail visible test, allowPageScroll true & mobile touch steo
-
scrollbar on left test & mobile large step
+
scrollbar on left test
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
rail visible test, allowPageScroll true & mobile touch steo
+
rail visible test, allowPageScroll true & mobile touch step
@@ -97,7 +96,7 @@
rail visible test, allowPageScroll true & mobile touch steo
-
scrollbar on left test & mobile large step
+
scrollbar on left test
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
From b12f98dc13ffa483387658b98e9d3977d8cd44df Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 22:33:14 +0100
Subject: [PATCH 025/119] fixed error for programmatic scrolling (variable did
not refer to the options)
---
slimScroll.js | 4 ++--
slimScroll.min.js | 9 +--------
2 files changed, 3 insertions(+), 10 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 6c981ea..9e3632a 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -51,14 +51,14 @@
if (me.parent().hasClass('slimScrollDiv'))
{
//check if we should scroll existing instance
- if (scroll)
+ if (o.scroll)
{
//find bar and rail
bar = me.parent().find('.slimScrollBar');
rail = me.parent().find('.slimScrollRail');
//scroll by given amount of pixels
- scrollContent( me.scrollTop() + parseInt(scroll), false, true);
+ scrollContent( me.scrollTop() + parseInt(o.scroll), false, true);
}
return;
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 3a9b768..989726e 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,11 +4,4 @@
*
* Version: 0.6.5
*
- */
-(function(d){jQuery.fn.extend({slimScroll:function(m){var a=d.extend({wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},m);this.each(function(){function e(i,d,e){var f=i;d&&(f=parseInt(c.css("top"))+i*parseInt(a.wheelStep)/
-100*c.outerHeight(),d=b.outerHeight()-c.outerHeight(),f=Math.min(Math.max(f,0),d),c.css({top:f+"px"}));g=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());f=g*(b[0].scrollHeight-b.outerHeight());e&&(f=i,i=f/b[0].scrollHeight*b.outerHeight(),c.css({top:i+"px"}));b.scrollTop(f);n();j()}function t(){p=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),m);c.css({height:p+"px"})}function n(){t();clearTimeout(u);g==~~g&&(k=a.allowPageScroll,v!=g&&b.trigger("slimscroll",0==~~g?"top":"bottom"));
-v=g;p>=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&h.stop(!0,!0).fadeIn("fast"))}function j(){a.alwaysVisible||(u=setTimeout(function(){if((!a.disableFadeOut||!l)&&!q&&!r)c.fadeOut("slow"),h.fadeOut("slow")},1E3))}var l,q,r,u,w,p,g,v,m=30,k=!1,b=d(this);if(b.parent().hasClass("slimScrollDiv"))scroll&&(c=b.parent().find(".slimScrollBar"),h=b.parent().find(".slimScrollRail"),e(b.scrollTop()+parseInt(scroll),!1,!0));else{var y=d("").addClass(a.wrapperClass).css({position:"relative",
-overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",width:a.width,height:a.height});var h=d("").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.size,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=d("").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none",
-"border-radius":a.size,BorderRadius:a.size,MozBorderRadius:a.size,WebkitBorderRadius:a.size,zIndex:99}),x="right"==a.position?{right:a.distance}:{left:a.distance};h.css(x);c.css(x);b.wrap(y);b.parent().append(c);b.parent().append(h);c.draggable({axis:"y",containment:"parent",start:function(){r=!0},stop:function(){r=!1;j()},drag:function(){e(0,d(this).position().top,!1)}});h.hover(function(){n()},function(){j()});c.hover(function(){q=!0},function(){q=!1});b.hover(function(){l=!0;n();j()},function(){l=
-!1;j()});b.bind("touchstart",function(a){a.originalEvent.touches.length&&(w=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){b.originalEvent.preventDefault();b.originalEvent.touches.length&&e((w-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0)});var s=function(a){if(l){var a=a||window.event,b=0;a.wheelDelta&&(b=-a.wheelDelta/120);a.detail&&(b=a.detail/3);e(b,!0);a.preventDefault&&!k&&a.preventDefault();k||(a.returnValue=!1)}};(function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",
-s,!1),this.addEventListener("mousewheel",s,!1)):document.attachEvent("onmousewheel",s)})();t();"bottom"==a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),e(0,!0)):"object"==typeof a.start&&(e(d(a.start).position().top,null,!0),a.alwaysVisible||c.hide())}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function w(e,t,n){var i=e;if(t){i=parseInt(g.css("top"))+e*parseInt(r.wheelStep)/100*g.outerHeight();var s=d.outerHeight()-g.outerHeight();i=Math.min(Math.max(i,0),s),g.css({top:i+"px"})}f=parseInt(g.css("top"))/(d.outerHeight()-g.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();g.css({top:u+"px"})}d.scrollTop(i),x(),T()}function S(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),g.css({height:a+"px"})}function x(){S(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}g.stop(!0,!0).fadeIn("fast"),r.railVisible&&m.stop(!0,!0).fadeIn("fast")}function T(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(g.fadeOut("slow"),m.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){r.scrollBy&&(g=d.parent().find(".slimScrollBar"),m=d.parent().find(".slimScrollRail"),w(d.scrollTop()+parseInt(r.scroll),!1,!0));return}var v=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var m=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),g=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),y=r.position=="right"?{right:r.distance}:{left:r.distance};m.css(y),g.css(y),d.wrap(v),d.parent().append(g),d.parent().append(m),g.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,T()},drag:function(t){w(0,e(this).position().top,!1)}}),m.hover(function(){x()},function(){T()}),g.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,x(),T()},function(){t=!1,T()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;w(t,!0)}});var b=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),w(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},E=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",b,!1),this.addEventListener("mousewheel",b,!1)):document.attachEvent("onmousewheel",b)};E(),S(),r.start=="bottom"?(g.css({top:d.outerHeight()-g.outerHeight()}),w(0,!0)):typeof r.start=="object"&&(w(e(r.start).position().top,null,!0),r.alwaysVisible||g.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From c7c5b6698c127380c0a6de1d8db23dbff4dd8089 Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 22:47:36 +0100
Subject: [PATCH 026/119] extends scroll amount to be either absolute or
relative
---
slimScroll.js | 29 +++++++++++++++++++++++++++--
slimScroll.min.js | 2 +-
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 9e3632a..2581b8a 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -57,8 +57,33 @@
bar = me.parent().find('.slimScrollBar');
rail = me.parent().find('.slimScrollRail');
- //scroll by given amount of pixels
- scrollContent( me.scrollTop() + parseInt(o.scroll), false, true);
+ //scroll either by relative or absolute amount
+ var offset = 0;
+ var value = o.scroll;
+ if(typeof(value) == 'string')
+ {
+ if(value.charAt(1) == '=')
+ {
+ //can be one of '+=', '-='
+ offset = me.scrollTop();
+ var op = value.charAt(0);
+
+ value = parseInt(value.substr(2));
+
+ if(op == '-')
+ value *= -1;
+
+ offset += value;
+ }
+ else
+ {
+ offset = parseInt(value);
+ }
+ }
+ else
+ {
+ offset = value;
+ }
}
return;
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 989726e..3ef958c 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,4 +4,4 @@
*
* Version: 0.6.5
*
- */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function w(e,t,n){var i=e;if(t){i=parseInt(g.css("top"))+e*parseInt(r.wheelStep)/100*g.outerHeight();var s=d.outerHeight()-g.outerHeight();i=Math.min(Math.max(i,0),s),g.css({top:i+"px"})}f=parseInt(g.css("top"))/(d.outerHeight()-g.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();g.css({top:u+"px"})}d.scrollTop(i),x(),T()}function S(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),g.css({height:a+"px"})}function x(){S(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}g.stop(!0,!0).fadeIn("fast"),r.railVisible&&m.stop(!0,!0).fadeIn("fast")}function T(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(g.fadeOut("slow"),m.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){r.scrollBy&&(g=d.parent().find(".slimScrollBar"),m=d.parent().find(".slimScrollRail"),w(d.scrollTop()+parseInt(r.scroll),!1,!0));return}var v=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var m=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),g=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),y=r.position=="right"?{right:r.distance}:{left:r.distance};m.css(y),g.css(y),d.wrap(v),d.parent().append(g),d.parent().append(m),g.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,T()},drag:function(t){w(0,e(this).position().top,!1)}}),m.hover(function(){x()},function(){T()}),g.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,x(),T()},function(){t=!1,T()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;w(t,!0)}});var b=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),w(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},E=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",b,!1),this.addEventListener("mousewheel",b,!1)):document.attachEvent("onmousewheel",b)};E(),S(),r.start=="bottom"?(g.css({top:d.outerHeight()-g.outerHeight()}),w(0,!0)):typeof r.start=="object"&&(w(e(r.start).position().top,null,!0),r.alwaysVisible||g.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 16877fe08fd58b7f92dedba18c94646377bad2cd Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 22:58:20 +0100
Subject: [PATCH 027/119] fixed missing line to actually execute the scroll
---
slimScroll.js | 2 ++
slimScroll.min.js | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index 2581b8a..8342988 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -85,6 +85,8 @@
offset = value;
}
}
+
+ scrollContent( offset, false, true);
return;
}
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 3ef958c..4b5fd61 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,4 +4,4 @@
*
* Version: 0.6.5
*
- */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}x(v,!1,!0);return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From dcb908caea6a5a1a7bd6cb3c7128b4bf64d784c6 Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 22:58:20 +0100
Subject: [PATCH 028/119] fixed missing line to actually execute the scroll
---
slimScroll.js | 2 ++
slimScroll.min.js | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/slimScroll.js b/slimScroll.js
index 2581b8a..8342988 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -85,6 +85,8 @@
offset = value;
}
}
+
+ scrollContent( offset, false, true);
return;
}
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 3ef958c..4b5fd61 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,4 +4,4 @@
*
* Version: 0.6.5
*
- */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}x(v,!1,!0);return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 6c8f1c8cf646df62da3f247402e0937f7df0ac7f Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 23:09:37 +0100
Subject: [PATCH 029/119] fixed error with 0 values, more explicitely refer to
the newly passed options instead of the merged onesfixed error with 0 values,
more
---
slimScroll.js | 5 ++---
slimScroll.min.js | 2 +-
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index 8342988..db1c481 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -51,7 +51,7 @@
if (me.parent().hasClass('slimScrollDiv'))
{
//check if we should scroll existing instance
- if (o.scroll)
+ if ('scroll' in options)
{
//find bar and rail
bar = me.parent().find('.slimScrollBar');
@@ -84,10 +84,9 @@
{
offset = value;
}
+ scrollContent( offset, false, true);
}
- scrollContent( offset, false, true);
-
return;
}
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 4b5fd61..0ccbf7e 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,4 +4,4 @@
*
* Version: 0.6.5
*
- */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function x(e,t,n){var i=e;if(t){i=parseInt(w.css("top"))+e*parseInt(r.wheelStep)/100*w.outerHeight();var s=d.outerHeight()-w.outerHeight();i=Math.min(Math.max(i,0),s),w.css({top:i+"px"})}f=parseInt(w.css("top"))/(d.outerHeight()-w.outerHeight()),i=f*(d[0].scrollHeight-d.outerHeight());if(n){i=e;var u=i/d[0].scrollHeight*d.outerHeight();w.css({top:u+"px"})}d.scrollTop(i),C(),k()}function N(){a=Math.max(d.outerHeight()/d[0].scrollHeight*d.outerHeight(),h),w.css({height:a+"px"})}function C(){N(),clearTimeout(s);if(f==~~f){p=r.allowPageScroll;if(l!=f){var e=~~f==0?"top":"bottom";d.trigger("slimscroll",e)}}l=f;if(a>=d.outerHeight()){p=!0;return}w.stop(!0,!0).fadeIn("fast"),r.railVisible&&b.stop(!0,!0).fadeIn("fast")}function k(){r.alwaysVisible||(s=setTimeout(function(){(!r.disableFadeOut||!t)&&!n&&!i&&(w.fadeOut("slow"),b.fadeOut("slow"))},1e3))}var t,n,i,s,u,a,f,l,c="",h=30,p=!1,d=e(this);if(d.parent().hasClass("slimScrollDiv")){if(r.scroll){w=d.parent().find(".slimScrollBar"),b=d.parent().find(".slimScrollRail");var v=0,m=r.scroll;if(typeof m=="string")if(m.charAt(1)=="="){v=d.scrollTop();var g=m.charAt(0);m=parseInt(m.substr(2)),g=="-"&&(m*=-1),v+=m}else v=parseInt(m);else v=m}x(v,!1,!0);return}var y=e(c).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});d.css({overflow:"hidden",width:r.width,height:r.height});var b=e(c).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),w=e(c).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),E=r.position=="right"?{right:r.distance}:{left:r.distance};b.css(E),w.css(E),d.wrap(y),d.parent().append(w),d.parent().append(b),w.draggable({axis:"y",containment:"parent",start:function(){i=!0},stop:function(){i=!1,k()},drag:function(t){x(0,e(this).position().top,!1)}}),b.hover(function(){C()},function(){k()}),w.hover(function(){n=!0},function(){n=!1}),d.hover(function(){t=!0,C(),k()},function(){t=!1,k()}),d.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(u=e.originalEvent.touches[0].pageY)}),d.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(u-e.originalEvent.touches[0].pageY)/r.touchScrollStep;x(t,!0)}});var S=function(e){if(!t)return;var e=e||window.event,n=0;e.wheelDelta&&(n=-e.wheelDelta/120),e.detail&&(n=e.detail/3),x(n,!0),e.preventDefault&&!p&&e.preventDefault(),p||(e.returnValue=!1)},T=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",S,!1),this.addEventListener("mousewheel",S,!1)):document.attachEvent("onmousewheel",S)};T(),N(),r.start=="bottom"?(w.css({top:d.outerHeight()-w.outerHeight()}),x(0,!0)):typeof r.start=="object"&&(x(e(r.start).position().top,null,!0),r.alwaysVisible||w.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function T(e,t,n){var i=e;if(t){i=parseInt(E.css("top"))+e*parseInt(r.wheelStep)/100*E.outerHeight();var s=v.outerHeight()-E.outerHeight();i=Math.min(Math.max(i,0),s),E.css({top:i+"px"})}l=parseInt(E.css("top"))/(v.outerHeight()-E.outerHeight()),i=l*(v[0].scrollHeight-v.outerHeight());if(n){i=e;var u=i/v[0].scrollHeight*v.outerHeight();E.css({top:u+"px"})}v.scrollTop(i),k(),L()}function C(){f=Math.max(v.outerHeight()/v[0].scrollHeight*v.outerHeight(),p),E.css({height:f+"px"})}function k(){C(),clearTimeout(u);if(l==~~l){d=r.allowPageScroll;if(c!=l){var e=~~l==0?"top":"bottom";v.trigger("slimscroll",e)}}c=l;if(f>=v.outerHeight()){d=!0;return}E.stop(!0,!0).fadeIn("fast"),r.railVisible&&w.stop(!0,!0).fadeIn("fast")}function L(){r.alwaysVisible||(u=setTimeout(function(){(!r.disableFadeOut||!n)&&!i&&!s&&(E.fadeOut("slow"),w.fadeOut("slow"))},1e3))}var n,i,s,u,a,f,l,c,h="",p=30,d=!1,v=e(this);if(v.parent().hasClass("slimScrollDiv")){if("scroll"in t){E=v.parent().find(".slimScrollBar"),w=v.parent().find(".slimScrollRail");var m=0,g=r.scroll;if(typeof g=="string")if(g.charAt(1)=="="){m=v.scrollTop();var y=g.charAt(0);g=parseInt(g.substr(2)),y=="-"&&(g*=-1),m+=g}else m=parseInt(g);else m=g;T(m,!1,!0)}return}var b=e(h).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});v.css({overflow:"hidden",width:r.width,height:r.height});var w=e(h).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),E=e(h).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),S=r.position=="right"?{right:r.distance}:{left:r.distance};w.css(S),E.css(S),v.wrap(b),v.parent().append(E),v.parent().append(w),E.draggable({axis:"y",containment:"parent",start:function(){s=!0},stop:function(){s=!1,L()},drag:function(t){T(0,e(this).position().top,!1)}}),w.hover(function(){k()},function(){L()}),E.hover(function(){i=!0},function(){i=!1}),v.hover(function(){n=!0,k(),L()},function(){n=!1,L()}),v.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(a=e.originalEvent.touches[0].pageY)}),v.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(a-e.originalEvent.touches[0].pageY)/r.touchScrollStep;T(t,!0)}});var x=function(e){if(!n)return;var e=e||window.event,t=0;e.wheelDelta&&(t=-e.wheelDelta/120),e.detail&&(t=e.detail/3),T(t,!0),e.preventDefault&&!d&&e.preventDefault(),d||(e.returnValue=!1)},N=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",x,!1),this.addEventListener("mousewheel",x,!1)):document.attachEvent("onmousewheel",x)};N(),C(),r.start=="bottom"?(E.css({top:v.outerHeight()-E.outerHeight()}),T(0,!0)):typeof r.start=="object"&&(T(e(r.start).position().top,null,!0),r.alwaysVisible||E.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From 5aa9143c32917b68f01ecdd58a92335334b1602b Mon Sep 17 00:00:00 2001
From: Christian Heckl
Date: Wed, 31 Oct 2012 23:18:31 +0100
Subject: [PATCH 030/119] more bulletproofing
---
slimScroll.js | 4 ++--
slimScroll.min.js | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/slimScroll.js b/slimScroll.js
index e6d4362..ea95f53 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -51,7 +51,7 @@
if (me.parent().hasClass('slimScrollDiv'))
{
//check if we should scroll existing instance
- if ('scroll' in options)
+ if (options && ('scroll' in options))
{
//find bar and rail
bar = me.parent().find('.slimScrollBar');
@@ -84,7 +84,7 @@
{
offset = value;
}
- scrollContent( offset, false, true);
+ scrollContent( offset, false, true);
}
return;
diff --git a/slimScroll.min.js b/slimScroll.min.js
index 0ccbf7e..5a444df 100644
--- a/slimScroll.min.js
+++ b/slimScroll.min.js
@@ -4,4 +4,4 @@
*
* Version: 0.6.5
*
- */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function T(e,t,n){var i=e;if(t){i=parseInt(E.css("top"))+e*parseInt(r.wheelStep)/100*E.outerHeight();var s=v.outerHeight()-E.outerHeight();i=Math.min(Math.max(i,0),s),E.css({top:i+"px"})}l=parseInt(E.css("top"))/(v.outerHeight()-E.outerHeight()),i=l*(v[0].scrollHeight-v.outerHeight());if(n){i=e;var u=i/v[0].scrollHeight*v.outerHeight();E.css({top:u+"px"})}v.scrollTop(i),k(),L()}function C(){f=Math.max(v.outerHeight()/v[0].scrollHeight*v.outerHeight(),p),E.css({height:f+"px"})}function k(){C(),clearTimeout(u);if(l==~~l){d=r.allowPageScroll;if(c!=l){var e=~~l==0?"top":"bottom";v.trigger("slimscroll",e)}}c=l;if(f>=v.outerHeight()){d=!0;return}E.stop(!0,!0).fadeIn("fast"),r.railVisible&&w.stop(!0,!0).fadeIn("fast")}function L(){r.alwaysVisible||(u=setTimeout(function(){(!r.disableFadeOut||!n)&&!i&&!s&&(E.fadeOut("slow"),w.fadeOut("slow"))},1e3))}var n,i,s,u,a,f,l,c,h="",p=30,d=!1,v=e(this);if(v.parent().hasClass("slimScrollDiv")){if("scroll"in t){E=v.parent().find(".slimScrollBar"),w=v.parent().find(".slimScrollRail");var m=0,g=r.scroll;if(typeof g=="string")if(g.charAt(1)=="="){m=v.scrollTop();var y=g.charAt(0);g=parseInt(g.substr(2)),y=="-"&&(g*=-1),m+=g}else m=parseInt(g);else m=g;T(m,!1,!0)}return}var b=e(h).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});v.css({overflow:"hidden",width:r.width,height:r.height});var w=e(h).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),E=e(h).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),S=r.position=="right"?{right:r.distance}:{left:r.distance};w.css(S),E.css(S),v.wrap(b),v.parent().append(E),v.parent().append(w),E.draggable({axis:"y",containment:"parent",start:function(){s=!0},stop:function(){s=!1,L()},drag:function(t){T(0,e(this).position().top,!1)}}),w.hover(function(){k()},function(){L()}),E.hover(function(){i=!0},function(){i=!1}),v.hover(function(){n=!0,k(),L()},function(){n=!1,L()}),v.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(a=e.originalEvent.touches[0].pageY)}),v.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(a-e.originalEvent.touches[0].pageY)/r.touchScrollStep;T(t,!0)}});var x=function(e){if(!n)return;var e=e||window.event,t=0;e.wheelDelta&&(t=-e.wheelDelta/120),e.detail&&(t=e.detail/3),T(t,!0),e.preventDefault&&!d&&e.preventDefault(),d||(e.returnValue=!1)},N=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",x,!1),this.addEventListener("mousewheel",x,!1)):document.attachEvent("onmousewheel",x)};N(),C(),r.start=="bottom"?(E.css({top:v.outerHeight()-E.outerHeight()}),T(0,!0)):typeof r.start=="object"&&(T(e(r.start).position().top,null,!0),r.alwaysVisible||E.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
+ */(function(e){jQuery.fn.extend({slimScroll:function(t){var n={wheelStep:20,width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:"0.2",railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,scroll:0,touchScrollStep:200},r=e.extend(n,t);return this.each(function(){function T(e,t,n){var i=e;if(t){i=parseInt(E.css("top"))+e*parseInt(r.wheelStep)/100*E.outerHeight();var s=v.outerHeight()-E.outerHeight();i=Math.min(Math.max(i,0),s),E.css({top:i+"px"})}l=parseInt(E.css("top"))/(v.outerHeight()-E.outerHeight()),i=l*(v[0].scrollHeight-v.outerHeight());if(n){i=e;var u=i/v[0].scrollHeight*v.outerHeight();E.css({top:u+"px"})}v.scrollTop(i),k(),L()}function C(){f=Math.max(v.outerHeight()/v[0].scrollHeight*v.outerHeight(),p),E.css({height:f+"px"})}function k(){C(),clearTimeout(u);if(l==~~l){d=r.allowPageScroll;if(c!=l){var e=~~l==0?"top":"bottom";v.trigger("slimscroll",e)}}c=l;if(f>=v.outerHeight()){d=!0;return}E.stop(!0,!0).fadeIn("fast"),r.railVisible&&w.stop(!0,!0).fadeIn("fast")}function L(){r.alwaysVisible||(u=setTimeout(function(){(!r.disableFadeOut||!n)&&!i&&!s&&(E.fadeOut("slow"),w.fadeOut("slow"))},1e3))}var n,i,s,u,a,f,l,c,h="",p=30,d=!1,v=e(this);if(v.parent().hasClass("slimScrollDiv")){if(t&&"scroll"in t){E=v.parent().find(".slimScrollBar"),w=v.parent().find(".slimScrollRail");var m=0,g=r.scroll;if(typeof g=="string")if(g.charAt(1)=="="){m=v.scrollTop();var y=g.charAt(0);g=parseInt(g.substr(2)),y=="-"&&(g*=-1),m+=g}else m=parseInt(g);else m=g;T(m,!1,!0)}return}var b=e(h).addClass(r.wrapperClass).css({position:"relative",overflow:"hidden",width:r.width,height:r.height});v.css({overflow:"hidden",width:r.width,height:r.height});var w=e(h).addClass(r.railClass).css({width:r.size,height:"100%",position:"absolute",top:0,display:r.alwaysVisible&&r.railVisible?"block":"none","border-radius":r.size,background:r.railColor,opacity:r.railOpacity,zIndex:90}),E=e(h).addClass(r.barClass).css({background:r.color,width:r.size,position:"absolute",top:0,opacity:r.opacity,display:r.alwaysVisible?"block":"none","border-radius":r.size,BorderRadius:r.size,MozBorderRadius:r.size,WebkitBorderRadius:r.size,zIndex:99}),S=r.position=="right"?{right:r.distance}:{left:r.distance};w.css(S),E.css(S),v.wrap(b),v.parent().append(E),v.parent().append(w),E.draggable({axis:"y",containment:"parent",start:function(){s=!0},stop:function(){s=!1,L()},drag:function(t){T(0,e(this).position().top,!1)}}),w.hover(function(){k()},function(){L()}),E.hover(function(){i=!0},function(){i=!1}),v.hover(function(){n=!0,k(),L()},function(){n=!1,L()}),v.bind("touchstart",function(e,t){e.originalEvent.touches.length&&(a=e.originalEvent.touches[0].pageY)}),v.bind("touchmove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.touches.length){var t=(a-e.originalEvent.touches[0].pageY)/r.touchScrollStep;T(t,!0)}});var x=function(e){if(!n)return;var e=e||window.event,t=0;e.wheelDelta&&(t=-e.wheelDelta/120),e.detail&&(t=e.detail/3),T(t,!0),e.preventDefault&&!d&&e.preventDefault(),d||(e.returnValue=!1)},N=function(){window.addEventListener?(this.addEventListener("DOMMouseScroll",x,!1),this.addEventListener("mousewheel",x,!1)):document.attachEvent("onmousewheel",x)};N(),C(),r.start=="bottom"?(E.css({top:v.outerHeight()-E.outerHeight()}),T(0,!0)):typeof r.start=="object"&&(T(e(r.start).position().top,null,!0),r.alwaysVisible||E.hide())}),this}}),jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
\ No newline at end of file
From cc350e7cc6e3d067c600f61fe2ce89f5667301c8 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Mon, 7 Jan 2013 23:51:38 +1100
Subject: [PATCH 031/119] Support for automatically setting the height
of the scroll area to the parent element. Based on the original commit
b613f22a0383c65060a0798f65845b6f72a11ea3 @chrismi
---
slimScroll.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/slimScroll.js b/slimScroll.js
index 6c981ea..d23f7de 100644
--- a/slimScroll.js
+++ b/slimScroll.js
@@ -64,6 +64,9 @@
return;
}
+ // optionally set height to the parent's height
+ o.height = (o.height == 'auto') ? me.parent().innerHeight() : o.height;
+
// wrap content
var wrapper = $(divS)
.addClass(o.wrapperClass)
From e9e5e165d691c391edd7f564aeec6f21586782c6 Mon Sep 17 00:00:00 2001
From: "@rochal"
Date: Tue, 8 Jan 2013 23:15:59 +1100
Subject: [PATCH 032/119] scroll method refactoring, added detailed example
pages - Bumbed up version to 1.0.0 as this include few bigger changes. -
renamed plugin file to include jquery. prefix - replaced scroll() method with
scrollTo and scrollBy depending how scroll should be performed - included
prettify for syntax highlighting in the example pages
---
examples/chaining.html | 91 ++
examples/height-width.html | 112 ++
examples/libs/prettify/prettify.css | 52 +
examples/libs/prettify/prettify.js | 1477 +++++++++++++++++++++++++
index.htm => examples/main.html | 58 +-
examples/programmatic-scrolling.html | 147 +++
index.min.htm | 218 ----
slimScroll.js => jquery.slimscroll.js | 70 +-
jquery.slimscroll.min.js | 14 +
package.json | 11 +-
slimScroll.min.js | 7 -
11 files changed, 1959 insertions(+), 298 deletions(-)
create mode 100644 examples/chaining.html
create mode 100644 examples/height-width.html
create mode 100644 examples/libs/prettify/prettify.css
create mode 100644 examples/libs/prettify/prettify.js
rename index.htm => examples/main.html (96%)
create mode 100644 examples/programmatic-scrolling.html
delete mode 100644 index.min.htm
rename slimScroll.js => jquery.slimscroll.js (86%)
create mode 100644 jquery.slimscroll.min.js
delete mode 100644 slimScroll.min.js
diff --git a/examples/chaining.html b/examples/chaining.html
new file mode 100644
index 0000000..a32e3b5
--- /dev/null
+++ b/examples/chaining.html
@@ -0,0 +1,91 @@
+
+
+
+jquery.slimscroll - chaining
+
+
+
+
+
+
+
+
+
+
+
+
jQuery slimScroll
+
Facebook-style jQuery Scrollbar
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/height-width.html b/examples/height-width.html
new file mode 100644
index 0000000..937d241
--- /dev/null
+++ b/examples/height-width.html
@@ -0,0 +1,112 @@
+
+
+
+jquery.slimscroll - height / width
+
+
+
+
+
+
+
+
+
+
+
+
jQuery slimScroll
+
Facebook-style jQuery Scrollbar
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/libs/prettify/prettify.css b/examples/libs/prettify/prettify.css
new file mode 100644
index 0000000..400fd74
--- /dev/null
+++ b/examples/libs/prettify/prettify.css
@@ -0,0 +1,52 @@
+/* Pretty printing styles. Used with prettify.js. */
+
+/* SPAN elements with the classes below are added by prettyprint. */
+.pln { color: #000 } /* plain text */
+
+@media screen {
+ .str { color: #080 } /* string content */
+ .kwd { color: #008 } /* a keyword */
+ .com { color: #800 } /* a comment */
+ .typ { color: #606 } /* a type name */
+ .lit { color: #066 } /* a literal value */
+ /* punctuation, lisp open bracket, lisp close bracket */
+ .pun, .opn, .clo { color: #660 }
+ .tag { color: #008 } /* a markup tag name */
+ .atn { color: #606 } /* a markup attribute name */
+ .atv { color: #080 } /* a markup attribute value */
+ .dec, .var { color: #606 } /* a declaration; a variable name */
+ .fun { color: red } /* a function name */
+}
+
+/* Use higher contrast and text-weight for printable form. */
+@media print, projection {
+ .str { color: #060 }
+ .kwd { color: #006; font-weight: bold }
+ .com { color: #600; font-style: italic }
+ .typ { color: #404; font-weight: bold }
+ .lit { color: #044 }
+ .pun, .opn, .clo { color: #440 }
+ .tag { color: #006; font-weight: bold }
+ .atn { color: #404 }
+ .atv { color: #060 }
+}
+
+/* Put a border around prettyprinted code snippets. */
+pre.prettyprint { padding: 2px; border: 1px solid #888 }
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L5,
+li.L6,
+li.L7,
+li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,
+li.L3,
+li.L5,
+li.L7,
+li.L9 { background: #eee }
diff --git a/examples/libs/prettify/prettify.js b/examples/libs/prettify/prettify.js
new file mode 100644
index 0000000..037c26d
--- /dev/null
+++ b/examples/libs/prettify/prettify.js
@@ -0,0 +1,1477 @@
+// Copyright (C) 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+/**
+ * @fileoverview
+ * some functions for browser-side pretty printing of code contained in html.
+ *
+ *
+ * For a fairly comprehensive set of languages see the
+ * README
+ * file that came with this source. At a minimum, the lexer should work on a
+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+ * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk
+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+ *
+ * Usage:
+ *
include this source file in an html page via
+ * {@code }
+ *
define style rules. See the example page for examples.
+ *
mark the {@code
} and {@code } tags in your source with
+ * {@code class=prettyprint.}
+ * You can also use the (html deprecated) {@code } tag, but the pretty
+ * printer needs to do more substantial DOM manipulations to support that, so
+ * some css styles may not be preserved.
+ *
+ * That's it. I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in, but if you wish, you can add
+ * another class to the {@code
} or {@code } element to specify the
+ * language, as in {@code
}. Any class that
+ * starts with "lang-" followed by a file extension, specifies the file type.
+ * See the "lang-*.js" files in this directory for code that implements
+ * per-language file handlers.
+ *
+ * Change log:
+ * cbeust, 2006/08/22
+ *
+ * Java annotations (start with "@") are now captured as literals ("lit")
+ *
+ * @requires console
+ */
+
+// JSLint declarations
+/*global console, document, navigator, setTimeout, window */
+
+/**
+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+ * UI events.
+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
+ */
+window['PR_SHOULD_USE_CONTINUATION'] = true;
+
+(function () {
+ // Keyword lists for various languages.
+ // We use things that coerce to strings to make them compact when minified
+ // and to defeat aggressive optimizers that fold large string constants.
+ var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
+ var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
+ "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
+ "static,struct,switch,typedef,union,unsigned,void,volatile"];
+ var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
+ "new,operator,private,protected,public,this,throw,true,try,typeof"];
+ var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
+ "concept,concept_map,const_cast,constexpr,decltype," +
+ "dynamic_cast,explicit,export,friend,inline,late_check," +
+ "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
+ "template,typeid,typename,using,virtual,where"];
+ var JAVA_KEYWORDS = [COMMON_KEYWORDS,
+ "abstract,boolean,byte,extends,final,finally,implements,import," +
+ "instanceof,null,native,package,strictfp,super,synchronized,throws," +
+ "transient"];
+ var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
+ "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
+ "fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock," +
+ "object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed," +
+ "stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];
+ var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
+ "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
+ "true,try,unless,until,when,while,yes";
+ var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
+ "debugger,eval,export,function,get,null,set,undefined,var,with," +
+ "Infinity,NaN"];
+ var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
+ "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
+ "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
+ var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
+ "elif,except,exec,finally,from,global,import,in,is,lambda," +
+ "nonlocal,not,or,pass,print,raise,try,with,yield," +
+ "False,True,None"];
+ var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
+ "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
+ "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
+ "BEGIN,END"];
+ var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
+ "function,in,local,set,then,until"];
+ var ALL_KEYWORDS = [
+ CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
+ PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
+ var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;
+
+ // token style names. correspond to css classes
+ /**
+ * token style for a string literal
+ * @const
+ */
+ var PR_STRING = 'str';
+ /**
+ * token style for a keyword
+ * @const
+ */
+ var PR_KEYWORD = 'kwd';
+ /**
+ * token style for a comment
+ * @const
+ */
+ var PR_COMMENT = 'com';
+ /**
+ * token style for a type
+ * @const
+ */
+ var PR_TYPE = 'typ';
+ /**
+ * token style for a literal value. e.g. 1, null, true.
+ * @const
+ */
+ var PR_LITERAL = 'lit';
+ /**
+ * token style for a punctuation string.
+ * @const
+ */
+ var PR_PUNCTUATION = 'pun';
+ /**
+ * token style for a punctuation string.
+ * @const
+ */
+ var PR_PLAIN = 'pln';
+
+ /**
+ * token style for an sgml tag.
+ * @const
+ */
+ var PR_TAG = 'tag';
+ /**
+ * token style for a markup declaration such as a DOCTYPE.
+ * @const
+ */
+ var PR_DECLARATION = 'dec';
+ /**
+ * token style for embedded source.
+ * @const
+ */
+ var PR_SOURCE = 'src';
+ /**
+ * token style for an sgml attribute name.
+ * @const
+ */
+ var PR_ATTRIB_NAME = 'atn';
+ /**
+ * token style for an sgml attribute value.
+ * @const
+ */
+ var PR_ATTRIB_VALUE = 'atv';
+
+ /**
+ * A class that indicates a section of markup that is not code, e.g. to allow
+ * embedding of line numbers within code listings.
+ * @const
+ */
+ var PR_NOCODE = 'nocode';
+
+
+
+/**
+ * A set of tokens that can precede a regular expression literal in
+ * javascript
+ * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+ * has the full list, but I've removed ones that might be problematic when
+ * seen in languages that don't support regular expression literals.
+ *
+ *
Specifically, I've removed any keywords that can't precede a regexp
+ * literal in a syntactically legal javascript program, and I've removed the
+ * "in" keyword since it's not a keyword in many languages, and might be used
+ * as a count of inches.
+ *
+ *
The link a above does not accurately describe EcmaScript rules since
+ * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+ * very well in practice.
+ *
+ * @private
+ * @const
+ */
+var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
+
+// CAVEAT: this does not properly handle the case where a regular
+// expression immediately follows another since a regular expression may
+// have flags for case-sensitivity and the like. Having regexp tokens
+// adjacent is not valid in any language I'm aware of, so I'm punting.
+// TODO: maybe style special characters inside a regexp as punctuation.
+
+
+ /**
+ * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+ * matches the union of the sets of strings matched by the input RegExp.
+ * Since it matches globally, if the input strings have a start-of-input
+ * anchor (/^.../), it is ignored for the purposes of unioning.
+ * @param {Array.} regexs non multiline, non-global regexs.
+ * @return {RegExp} a global regex.
+ */
+ function combinePrefixPatterns(regexs) {
+ var capturedGroupIndex = 0;
+
+ var needToFoldCase = false;
+ var ignoreCase = false;
+ for (var i = 0, n = regexs.length; i < n; ++i) {
+ var regex = regexs[i];
+ if (regex.ignoreCase) {
+ ignoreCase = true;
+ } else if (/[a-z]/i.test(regex.source.replace(
+ /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+ needToFoldCase = true;
+ ignoreCase = false;
+ break;
+ }
+ }
+
+ var escapeCharToCodeUnit = {
+ 'b': 8,
+ 't': 9,
+ 'n': 0xa,
+ 'v': 0xb,
+ 'f': 0xc,
+ 'r': 0xd
+ };
+
+ function decodeEscape(charsetPart) {
+ var cc0 = charsetPart.charCodeAt(0);
+ if (cc0 !== 92 /* \\ */) {
+ return cc0;
+ }
+ var c1 = charsetPart.charAt(1);
+ cc0 = escapeCharToCodeUnit[c1];
+ if (cc0) {
+ return cc0;
+ } else if ('0' <= c1 && c1 <= '7') {
+ return parseInt(charsetPart.substring(1), 8);
+ } else if (c1 === 'u' || c1 === 'x') {
+ return parseInt(charsetPart.substring(2), 16);
+ } else {
+ return charsetPart.charCodeAt(1);
+ }
+ }
+
+ function encodeEscape(charCode) {
+ if (charCode < 0x20) {
+ return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+ }
+ var ch = String.fromCharCode(charCode);
+ if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
+ ch = '\\' + ch;
+ }
+ return ch;
+ }
+
+ function caseFoldCharset(charSet) {
+ var charsetParts = charSet.substring(1, charSet.length - 1).match(
+ new RegExp(
+ '\\\\u[0-9A-Fa-f]{4}'
+ + '|\\\\x[0-9A-Fa-f]{2}'
+ + '|\\\\[0-3][0-7]{0,2}'
+ + '|\\\\[0-7]{1,2}'
+ + '|\\\\[\\s\\S]'
+ + '|-'
+ + '|[^-\\\\]',
+ 'g'));
+ var groups = [];
+ var ranges = [];
+ var inverse = charsetParts[0] === '^';
+ for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+ var p = charsetParts[i];
+ if (/\\[bdsw]/i.test(p)) { // Don't muck with named groups.
+ groups.push(p);
+ } else {
+ var start = decodeEscape(p);
+ var end;
+ if (i + 2 < n && '-' === charsetParts[i + 1]) {
+ end = decodeEscape(charsetParts[i + 2]);
+ i += 2;
+ } else {
+ end = start;
+ }
+ ranges.push([start, end]);
+ // If the range might intersect letters, then expand it.
+ // This case handling is too simplistic.
+ // It does not deal with non-latin case folding.
+ // It works for latin source code identifiers though.
+ if (!(end < 65 || start > 122)) {
+ if (!(end < 65 || start > 90)) {
+ ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+ }
+ if (!(end < 97 || start > 122)) {
+ ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+ }
+ }
+ }
+ }
+
+ // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+ // -> [[1, 12], [14, 14], [16, 17]]
+ ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); });
+ var consolidatedRanges = [];
+ var lastRange = [NaN, NaN];
+ for (var i = 0; i < ranges.length; ++i) {
+ var range = ranges[i];
+ if (range[0] <= lastRange[1] + 1) {
+ lastRange[1] = Math.max(lastRange[1], range[1]);
+ } else {
+ consolidatedRanges.push(lastRange = range);
+ }
+ }
+
+ var out = ['['];
+ if (inverse) { out.push('^'); }
+ out.push.apply(out, groups);
+ for (var i = 0; i < consolidatedRanges.length; ++i) {
+ var range = consolidatedRanges[i];
+ out.push(encodeEscape(range[0]));
+ if (range[1] > range[0]) {
+ if (range[1] + 1 > range[0]) { out.push('-'); }
+ out.push(encodeEscape(range[1]));
+ }
+ }
+ out.push(']');
+ return out.join('');
+ }
+
+ function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+ // Split into character sets, escape sequences, punctuation strings
+ // like ('(', '(?:', ')', '^'), and runs of characters that do not
+ // include any of the above.
+ var parts = regex.source.match(
+ new RegExp(
+ '(?:'
+ + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set
+ + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape
+ + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape
+ + '|\\\\[0-9]+' // a back-reference or octal escape
+ + '|\\\\[^ux0-9]' // other escape sequence
+ + '|\\(\\?[:!=]' // start of a non-capturing group
+ + '|[\\(\\)\\^]' // start/emd of a group, or line start
+ + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters
+ + ')',
+ 'g'));
+ var n = parts.length;
+
+ // Maps captured group numbers to the number they will occupy in
+ // the output or to -1 if that has not been determined, or to
+ // undefined if they need not be capturing in the output.
+ var capturedGroups = [];
+
+ // Walk over and identify back references to build the capturedGroups
+ // mapping.
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ var p = parts[i];
+ if (p === '(') {
+ // groups are 1-indexed, so max group index is count of '('
+ ++groupIndex;
+ } else if ('\\' === p.charAt(0)) {
+ var decimalValue = +p.substring(1);
+ if (decimalValue && decimalValue <= groupIndex) {
+ capturedGroups[decimalValue] = -1;
+ }
+ }
+ }
+
+ // Renumber groups and reduce capturing groups to non-capturing groups
+ // where possible.
+ for (var i = 1; i < capturedGroups.length; ++i) {
+ if (-1 === capturedGroups[i]) {
+ capturedGroups[i] = ++capturedGroupIndex;
+ }
+ }
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ var p = parts[i];
+ if (p === '(') {
+ ++groupIndex;
+ if (capturedGroups[groupIndex] === undefined) {
+ parts[i] = '(?:';
+ }
+ } else if ('\\' === p.charAt(0)) {
+ var decimalValue = +p.substring(1);
+ if (decimalValue && decimalValue <= groupIndex) {
+ parts[i] = '\\' + capturedGroups[groupIndex];
+ }
+ }
+ }
+
+ // Remove any prefix anchors so that the output will match anywhere.
+ // ^^ really does mean an anchored match though.
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+ }
+
+ // Expand letters to groups to handle mixing of case-sensitive and
+ // case-insensitive patterns if necessary.
+ if (regex.ignoreCase && needToFoldCase) {
+ for (var i = 0; i < n; ++i) {
+ var p = parts[i];
+ var ch0 = p.charAt(0);
+ if (p.length >= 2 && ch0 === '[') {
+ parts[i] = caseFoldCharset(p);
+ } else if (ch0 !== '\\') {
+ // TODO: handle letters in numeric escapes.
+ parts[i] = p.replace(
+ /[a-zA-Z]/g,
+ function (ch) {
+ var cc = ch.charCodeAt(0);
+ return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+ });
+ }
+ }
+ }
+
+ return parts.join('');
+ }
+
+ var rewritten = [];
+ for (var i = 0, n = regexs.length; i < n; ++i) {
+ var regex = regexs[i];
+ if (regex.global || regex.multiline) { throw new Error('' + regex); }
+ rewritten.push(
+ '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+ }
+
+ return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+ }
+
+
+ /**
+ * Split markup into a string of source code and an array mapping ranges in
+ * that string to the text nodes in which they appear.
+ *
+ *
+ * where #1 is a reference to the {@code "print "} text node above, and so
+ * on for the other text nodes.
+ *
+ *
+ *
+ * The {@code} spans array is an array of pairs. Even elements are the start
+ * indices of substrings, and odd elements are the text nodes (or BR elements)
+ * that contain the text for those substrings.
+ * Substrings continue until the next index or the end of the source.
+ *
+ *
+ * @param {Node} node an HTML DOM subtree containing source-code.
+ * @return {Object} source code and the text nodes in which they occur.
+ */
+ function extractSourceSpans(node) {
+ var nocode = /(?:^|\s)nocode(?:\s|$)/;
+
+ var chunks = [];
+ var length = 0;
+ var spans = [];
+ var k = 0;
+
+ var whitespace;
+ if (node.currentStyle) {
+ whitespace = node.currentStyle.whiteSpace;
+ } else if (window.getComputedStyle) {
+ whitespace = document.defaultView.getComputedStyle(node, null)
+ .getPropertyValue('white-space');
+ }
+ var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
+
+ function walk(node) {
+ switch (node.nodeType) {
+ case 1: // Element
+ if (nocode.test(node.className)) { return; }
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ walk(child);
+ }
+ var nodeName = node.nodeName;
+ if ('BR' === nodeName || 'LI' === nodeName) {
+ chunks[k] = '\n';
+ spans[k << 1] = length++;
+ spans[(k++ << 1) | 1] = node;
+ }
+ break;
+ case 3: case 4: // Text
+ var text = node.nodeValue;
+ if (text.length) {
+ if (!isPreformatted) {
+ text = text.replace(/[ \t\r\n]+/g, ' ');
+ } else {
+ text = text.replace(/\r\n?/g, '\n'); // Normalize newlines.
+ }
+ // TODO: handle tabs here?
+ chunks[k] = text;
+ spans[k << 1] = length;
+ length += text.length;
+ spans[(k++ << 1) | 1] = node;
+ }
+ break;
+ }
+ }
+
+ walk(node);
+
+ return {
+ sourceCode: chunks.join('').replace(/\n$/, ''),
+ spans: spans
+ };
+ }
+
+
+ /**
+ * Apply the given language handler to sourceCode and add the resulting
+ * decorations to out.
+ * @param {number} basePos the index of sourceCode within the chunk of source
+ * whose decorations are already present on out.
+ */
+ function appendDecorations(basePos, sourceCode, langHandler, out) {
+ if (!sourceCode) { return; }
+ var job = {
+ sourceCode: sourceCode,
+ basePos: basePos
+ };
+ langHandler(job);
+ out.push.apply(out, job.decorations);
+ }
+
+ var notWs = /\S/;
+
+ /**
+ * Given an element, if it contains only one child element and any text nodes
+ * it contains contain only space characters, return the sole child element.
+ * Otherwise returns undefined.
+ *
+ * This is meant to return the CODE element in {@code
} when
+ * there is a single child element that contains all the non-space textual
+ * content, but not to return anything where there are multiple child elements
+ * as in {@code
......
} or when there
+ * is textual content.
+ */
+ function childContentWrapper(element) {
+ var wrapper = undefined;
+ for (var c = element.firstChild; c; c = c.nextSibling) {
+ var type = c.nodeType;
+ wrapper = (type === 1) // Element Node
+ ? (wrapper ? element : c)
+ : (type === 3) // Text Node
+ ? (notWs.test(c.nodeValue) ? element : wrapper)
+ : wrapper;
+ }
+ return wrapper === element ? undefined : wrapper;
+ }
+
+ /** Given triples of [style, pattern, context] returns a lexing function,
+ * The lexing function interprets the patterns to find token boundaries and
+ * returns a decoration list of the form
+ * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+ * where index_n is an index into the sourceCode, and style_n is a style
+ * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to
+ * all characters in sourceCode[index_n-1:index_n].
+ *
+ * The stylePatterns is a list whose elements have the form
+ * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+ *
+ * Style is a style constant like PR_PLAIN, or can be a string of the
+ * form 'lang-FOO', where FOO is a language extension describing the
+ * language of the portion of the token in $1 after pattern executes.
+ * E.g., if style is 'lang-lisp', and group 1 contains the text
+ * '(hello (world))', then that portion of the token will be passed to the
+ * registered lisp handler for formatting.
+ * The text before and after group 1 will be restyled using this decorator
+ * so decorators should take care that this doesn't result in infinite
+ * recursion. For example, the HTML lexer rule for SCRIPT elements looks
+ * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match
+ * '
+
+
+
+
+
+
+
+
+
+
jQuery slimScroll
+
Facebook-style jQuery Scrollbar
+
-
-
-
-
-
-
-
-
jQuery slimScroll
-
Facebook-like jQuery Scrollbar
-
chainability & always visible & start at the bottom test & small mouse wheel step
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
-
+
+
+
rail visible test, allowPageScroll true & mobile touch step
@@ -135,9 +142,8 @@
rail visible test, allowPageScroll true & mobile touch step
scrollbar should not appear here
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed diam sem, imperdiet at mollis vestibulum, bibendum id purus. Aliquam molestie, leo sed molestie condimentum, massa enim lobortis massa, in vulputate diam lorem quis justo. Nullam nec dignissim mi. In non varius nibh. Proin et eros nisi, eu vulputate libero. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis ultricies augue id risus dapibus blandit.
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
-
Integer malesuada molestie dolor sit amet viverra. Mauris nec urna lorem. Integer commodo feugiat ligula eget fermentum. In in tellus a risus convallis pellentesque. Cras non faucibus est. Morbi sagittis risus mollis nisl mollis ac mattis mi volutpat. Vivamus ac rutrum elit. Suspendisse semper orci vitae sapien sollicitudin mattis.
-
+
+
+
+
+
+
+
+
+
+
+
jQuery slimScroll
+
Facebook-style jQuery Scrollbar
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.
+
Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.
+
Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.
+
Nullam scelerisque facilisis pretium. Vivamus lectus leo, commodo ac sagittis ac, dictum a mi. Donec quis massa ut libero malesuada commodo in et risus. Fusce nunc dolor, aliquet vel rutrum in, molestie sit amet massa. Aliquam suscipit, justo a commodo condimentum, enim sapien fringilla ante, sed lobortis orci lectus in ante. Donec vel interdum est. Donec placerat cursus lacus, eu ultricies nisl tincidunt a. Fusce libero risus, sagittis eleifend iaculis aliquet, condimentum vitae diam. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin leo purus, sodales a venenatis luctus, faucibus ac enim. Sed id metus ac sem lobortis pretium. Mauris faucibus tempor scelerisque. Nunc vulputate interdum tortor, non tincidunt dui condimentum eget. Aenean in porttitor velit. Nam accumsan rhoncus risus id consectetur.