Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: Evangenieur/hvid.io
base: 76a59c13a7
...
head fork: Evangenieur/hvid.io
compare: b029e09b11
  • 14 commits
  • 27 files changed
  • 0 commit comments
  • 2 contributors
Showing with 1,796 additions and 1,721 deletions.
  1. +5 −7 lib/child_launcher.coffee
  2. +6 −1 lib/video_platforms.coffee
  3. +1 −1  package.json
  4. 0  public/javascripts/{canvasloader.js → canvasloader.min.js}
  5. +144 −156 public/javascripts/hvidio.js
  6. +0 −1,104 public/javascripts/iscroll.js
  7. +6 −0 public/javascripts/jquery.hotkeys.min.js
  8. +874 −0 public/javascripts/jquery.mcustomscrollbar.js
  9. +99 −0 public/javascripts/jquery.mcustomscrollbar.min.js
  10. 0  public/javascripts/{jquery.js → jquery.min.js}
  11. +18 −0 public/javascripts/jquery.mousewheel.min.js
  12. +11 −0 public/javascripts/jquery.timeago.min.js
  13. +6 −0 public/javascripts/jquery.ui.min.js
  14. +7 −2 public/javascripts/live-search.coffee
  15. +15 −5 public/javascripts/live-search.js
  16. 0  public/javascripts/{underscore.js → underscore.min.js}
  17. +246 −0 public/stylesheets/animated.min.css
  18. +0 −144 public/stylesheets/elements.less
  19. +208 −0 public/stylesheets/jquery.mcustomscrollbar.css
  20. +20 −0 public/stylesheets/jquery.mcustomscrollbar.min.css
  21. 0  public/stylesheets/mixins.less
  22. +43 −115 public/stylesheets/style.css
  23. +52 −156 public/stylesheets/style.less
  24. +23 −5 server.coffee
  25. +2 −16 views/index.jade
  26. +9 −8 views/layout.jade
  27. +1 −1  workers/twitter_search_worker.coffee
View
12 lib/child_launcher.coffee
@@ -10,17 +10,17 @@ fork = (file, args) ->
"'#{v}'"
else
v
- console.log inputs_arr
+ #console.log inputs_arr
spawned = spawn "coffee", inputs_arr
spawned.stdin.setEncoding('utf8')
spawned.stdout.setEncoding('utf8')
spawned.send = (obj) ->
- console.log spawned.stdin.write
+ #console.log spawned.stdin.write
spawned.stdin.write JSON.stringify obj
spawned.on_message = (cb) ->
spawned.stdout.on "data", (msg) ->
- console.log "parent got message", arguments
+ #console.log "parent got message", arguments
try
cb JSON.parse(msg.toString())
catch e
@@ -30,7 +30,5 @@ fork = (file, args) ->
module.exports = (file, opts, cb) ->
console.log "forking", file, opts
forked = fork file, opts
- forked.on_message (obj) ->
- cb obj
- forked.on "exit", ->
- console.log "Exited"
+ forked.on_message opts.message
+ forked.on "exit", opts.exit
View
7 lib/video_platforms.coffee
@@ -109,7 +109,8 @@ module.exports = me =
if err
deferred.reject err
- metas = cheerio.load(body)('meta')
+ doc = cheerio.load(body)
+ metas = doc('meta')
vdo_meta = {}
_(metas).each (m) ->
@@ -117,6 +118,10 @@ module.exports = me =
vdo_meta.title = m.attribs.content
if m.attribs.property? and m.attribs.property.match /og:image/
vdo_meta.thumbnail = m.attribs.content
+
+ unless vdo_meta.title
+ vdo_meta.title = doc("title").text()
+
deferred.resolve vdo_meta
View
2  package.json
@@ -1,6 +1,6 @@
{
"name": "hvid.io",
- "version": "0.0.0-22",
+ "version": "0.0.0-24",
"description": "RealTime Video Search Twitter / Facebook / GooglePlus",
"main": "server.coffee",
"scripts": {
View
0  public/javascripts/canvasloader.js → public/javascripts/canvasloader.min.js
File renamed without changes
View
300 public/javascripts/hvidio.js
@@ -1,29 +1,14 @@
(function() {
- var loader, socket, scroll
+ var loader, socket, scroller,
$main = $('#main'),
$form = $('#form'),
- $list = $('#video-list'),
$keyword = $('#keyword'),
$results = $('#results'),
- $hashtags = $('#hashtags'),
$player = $('#player'),
$close = $('#close'),
- $up = $('#up'),
- $down = $('#down'),
$header = $('#header'),
$clickjack = $('#clickjack');
- var urlify = function (str) {
- return str.replace(/\s/g, '_')
- .replace(/:/g, '-')
- .replace(/\\/g, '-')
- .replace(/\//g, '-')
- .replace(/[^a-zA-Z0-9\-_]+/g, '')
- .replace(/-{2,}/g, '-')
- .toLowerCase();
- }
-
-
window.hvidio = {
init: function() {
@@ -48,18 +33,9 @@
// socket
socket = io.connect("http://"+window.location.host);
socket.on("connect", function() {
- console.log("CONNECTED");
Search.com_init(socket);
});
- // hashtags
- $hashtags.on('click', 'a', function(e) {
- $keyword.val($keyword.val());
- $form.submit();
-
- e.preventDefault();
- });
-
// toggle main window
$clickjack.on('click', function(e) {
hvidio.show();
@@ -68,7 +44,8 @@
e.preventDefault();
});
- $close.on('click', function(e) {
+ //$close.on('click', function(e) {
+ $main.on('click', function(e) {
hvidio.hide();
e.stopPropagation();
@@ -80,8 +57,10 @@
});
$results.on('click', '.play', function(e) {
- hvidio.play($(this).attr('href')).hide();
+ //hvidio.play($(this).attr('href')).hide();
+ hvidio.play($(this).attr('href'));
+ //e.stopPropagation();
e.preventDefault();
});
@@ -89,28 +68,14 @@
$(this).closest('.video').find('.video-people').fadeIn();
e.preventDefault();
+ return false;
});
$results.on('click', '.video-people', function(e) {
$(this).fadeOut();
e.preventDefault();
- });
-
- $results.on('click', '#up', function(e) {
- var h = $results.find('li').outerHeight(true);
-
- scroll.scrollTo(0, (scroll.y + h), 100);
-
- e.preventDefault();
- });
-
- $results.on('click', '#down', function(e) {
- var h = $results.find('li').outerHeight(true);
-
- scroll.scrollTo(0, (scroll.y - h), 100);
-
- e.preventDefault();
+ return false;
});
$(window).on('resize', function() {
@@ -127,79 +92,74 @@
e.preventDefault();
});
- //keyCodes
- if (navigator.userAgent.match(/GoogleTv/)) {
- $(document).bind('keydown', "play", function(e){
- hvidio.hide();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "pause", function(e){
- hvidio.show();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "stop", function(e){
- hvidio.show();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "right", function(e){
- //hvidio.next();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "left", function(e){
- //hvidio.prev();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "fastforward", function(e){
- //hvidio.next();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "rewind", function(e){
- //hvidio.prev();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- $(document).bind('keydown', "esc", function(e){
- hvidio.show();
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- }
+ //keyCodes
+ $(document).bind('keydown', function(e) {
+ var tag = e.target.tagName.toLowerCase();
+ if (tag != 'input' && tag != 'textarea') {
+ switch (e.keyCode) {
+ case 27: // esc
+ hvidio.toggle();
+ e.preventDefault();
+ break;
+ case 37: // left arrow
+ hvidio.prev();
+ e.preventDefault();
+ break;
+ case 38: // up arrow
+ hvidio.prev();
+ e.preventDefault();
+ break;
+ case 39: // right arrow
+ hvidio.next();
+ e.preventDefault();
+ break;
+ case 40: // down arrow
+ hvidio.next();
+ e.preventDefault();
+ break;
+ case 9: // tab
+ hvidio.show();
+ $keyword.focus().select();
+ e.preventDefault();
+ break;
+ }
+ }
+ });
$main.addClass('bounceIn');
return this;
},
+ initScroller: function(force) {
+ if (!scroller || force) {
+ $results.mCustomScrollbar();
+ scroller = true;
+ } else {
+ $results.mCustomScrollbar("update");
+ }
+
+ return this;
+ },
+
search: function(keyword) {
if (keyword) {
+ this.keyword = keyword;
+ console.log(this);
+
hvidio.loading(true);
hvidio.fetch(keyword, function(data) {
- console.log("PASSE PAR LA CALLBACK");
$main.addClass('large');
hvidio.templatize('#videosTemplate', { search: urlify(keyword), videos: data }, '#results');
-
- hvidio.initScroll();
- hvidio.loading(false);
+ //hvidio.loading(false);
hvidio.play(data[0].embed);
+ hvidio.initScroller(true);
+
$close.fadeIn(5000);
});
}
@@ -207,60 +167,19 @@
return this;
},
- initScroll: function() {
- var toggleButtons = function(scroll) {
- if (scroll.y == scroll.maxScrollY) {
- $('#down').hide();
- } else {
- $('#down').show();
- }
-
- if (scroll.y == 0) {
- $('#up').hide();
- } else {
- $('#up').show();
- }
- }
- if (scroll) {
- scroll.refresh();
- } else {
- scroll = new iScroll('results', {
- scrollbarClass: 'myScrollbar',
- fadeScrollbar: true,
- hideScrollbar: false,
- vScroll: true,
- vScrollbar: true,
- snap: 'li',
- useTransition: true,
- bounce: false,
- onRefresh: function() {
- toggleButtons(this);
- },
- onScrollEnd: function () {
- toggleButtons(this);
- }
- });
- }
+ order: function(videos) {
+ console.log("order", videos, this.keyword, $('#results'));
+ hvidio.templatize('#videosTemplate', { search: urlify(this.keyword), videos: videos }, '#results');
+ hvidio.loading(false);
+ hvidio.play(videos[0].embed);
+ hvidio.initScroller(true);
+ $close.fadeIn(5000);
},
-
fetch: function(keyword, callback) {
+ var self = this;
- search = Search(keyword)/*.when(20, function() {
- callback(
- _(this.videos_by_posts()).map(function(video) {
- video.msg = video.msgs[0];
- video.id = hvidio.convertId(video.id);
- // video.score = _.reduce(video.msgs, function(memo, num) {
- // return (memo + (num.votes + 1)) || 1;
- // }, 0);
- video.score = video.msgs.length;
-
- video.date = video.msgs[0].post_date;
- return video;
- })
- );
-
- })*/.on("video.new", function() {
+ search = Search(keyword)
+ .on("video.new", function() {
var pos;
this.msg = this.msgs[0];
this.id = hvidio.convertId(this.id);
@@ -290,8 +209,9 @@
$mylist.append($html);
+ hvidio.initScroller();
+
$html.css('visibility','visible').hide().fadeIn('slow');
- hvidio.initScroll();
}
}).on("video.update", function() {
@@ -308,8 +228,15 @@
var msg = this.msgs[this.msgs.length - 1];
var html = hvidio.templatize('#messageTemplate', { msg: msg });
- //console.log(html);
+
$people.prepend($(html).hide().fadeIn());
+ }).on("finished", function() {
+ console.log("FINISHED");
+ hvidio.loading(false);
+ self.order(
+ search.videos_by_date()
+ //search.videos_by_posts()
+ );
});
return this;
@@ -336,6 +263,7 @@
},
loading: function(bool) {
+ //console.log("loader", loader);
if (bool) {
loader.show();
} else {
@@ -345,8 +273,17 @@
return this;
},
+ toggle: function() {
+ if ($main.is(':visible')) {
+ hvidio.hide();
+ } else {
+ hvidio.show();
+ }
+
+ return this;
+ },
+
show: function() {
- //$main.show();
$main.removeClass('bounceIn fadeOutUp fadeOutDown');
$main.addClass('fadeInUp').show();;
@@ -354,7 +291,6 @@
},
hide: function() {
- //$main.hide();
$main.removeClass('bounceIn fadeOutUp fadeOutDown');
$main.addClass('fadeOutDown');
setTimeout(function() { $main.hide() }, 500);
@@ -378,26 +314,78 @@
$results.find('a[href="'+ embed +'"]').closest('.video').addClass('current');
if (embed.indexOf("?") == -1) {
- embed += "?"
+ embed += "?";
} else {
- embed += "&"
+ embed += "&";
}
- embed += "wmode=transparent&autoplay=1&autohide=1"
+ embed += "wmode=transparent&autoplay=1&autohide=1";
$player.attr('src', embed);
return this;
},
+ jump: function(index) {
+ var embed = $('.video').eq(index).find('.play').attr('href');
+
+ hvidio.play(embed);
+ },
+
+ next: function() {
+ var index = $('.current').index('.video');
+
+ index++;
+
+ if (index > $('.video').size() - 1) {
+ index = 0;
+ $results.mCustomScrollbar("scrollTo", 0);
+ }
+
+ hvidio.jump(index);
+ },
+
+ prev: function() {
+ var index = $('.current').index('.video');
+
+ index--;
+
+ if (index < 0) {
+ index = $('.video').size() - 1;
+
+ $results.mCustomScrollbar("scrollTo", 20000);
+ }
+
+ hvidio.jump(index);
+ },
+
resize: function() {
+ // Adjusts result div height
var mh = $main.height(),
hh = $header.outerHeight();
$results.outerHeight(mh - hh - 20);
+
+ // Adjusts/centers result list
+ var mw = $main.width(),
+ ew = $results.find('li').outerWidth(true),
+ rw = (Math.floor(mw / ew)) * ew;
+
+ $results.find('.video-list').width(rw);
}
}
// Extra scripts
+
+ var urlify = function (str) {
+ return str.replace(/\s/g, '_')
+ .replace(/:/g, '-')
+ .replace(/\\/g, '-')
+ .replace(/\//g, '-')
+ .replace(/[^a-zA-Z0-9\-_]+/g, '')
+ .replace(/-{2,}/g, '-')
+ .toLowerCase();
+ }
+
var _underscore_template = _.template;
_.template = function(str, data) {
return _underscore_template(
View
1,104 public/javascripts/iscroll.js
@@ -1,1104 +0,0 @@
-/*!
- * iScroll v4.2.5 ~ Copyright (c) 2012 Matteo Spinelli, http://cubiq.org
- * Released under MIT license, http://cubiq.org/license
- */
-(function(window, doc){
-var m = Math,
- dummyStyle = doc.createElement('div').style,
- vendor = (function () {
- var vendors = 't,webkitT,MozT,msT,OT'.split(','),
- t,
- i = 0,
- l = vendors.length;
-
- for ( ; i < l; i++ ) {
- t = vendors[i] + 'ransform';
- if ( t in dummyStyle ) {
- return vendors[i].substr(0, vendors[i].length - 1);
- }
- }
-
- return false;
- })(),
- cssVendor = vendor ? '-' + vendor.toLowerCase() + '-' : '',
-
- // Style properties
- transform = prefixStyle('transform'),
- transitionProperty = prefixStyle('transitionProperty'),
- transitionDuration = prefixStyle('transitionDuration'),
- transformOrigin = prefixStyle('transformOrigin'),
- transitionTimingFunction = prefixStyle('transitionTimingFunction'),
- transitionDelay = prefixStyle('transitionDelay'),
-
- // Browser capabilities
- isAndroid = (/android/gi).test(navigator.appVersion),
- isIDevice = (/iphone|ipad/gi).test(navigator.appVersion),
- isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
-
- has3d = prefixStyle('perspective') in dummyStyle,
- hasTouch = 'ontouchstart' in window && !isTouchPad,
- hasTransform = vendor !== false,
- hasTransitionEnd = prefixStyle('transition') in dummyStyle,
-
- RESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize',
- START_EV = hasTouch ? 'touchstart' : 'mousedown',
- MOVE_EV = hasTouch ? 'touchmove' : 'mousemove',
- END_EV = hasTouch ? 'touchend' : 'mouseup',
- CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup',
- TRNEND_EV = (function () {
- if ( vendor === false ) return false;
-
- var transitionEnd = {
- '' : 'transitionend',
- 'webkit' : 'webkitTransitionEnd',
- 'Moz' : 'transitionend',
- 'O' : 'otransitionend',
- 'ms' : 'MSTransitionEnd'
- };
-
- return transitionEnd[vendor];
- })(),
-
- nextFrame = (function() {
- return window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(callback) { return setTimeout(callback, 1); };
- })(),
- cancelFrame = (function () {
- return window.cancelRequestAnimationFrame ||
- window.webkitCancelAnimationFrame ||
- window.webkitCancelRequestAnimationFrame ||
- window.mozCancelRequestAnimationFrame ||
- window.oCancelRequestAnimationFrame ||
- window.msCancelRequestAnimationFrame ||
- clearTimeout;
- })(),
-
- // Helpers
- translateZ = has3d ? ' translateZ(0)' : '',
-
- // Constructor
- iScroll = function (el, options) {
- var that = this,
- i;
-
- that.wrapper = typeof el == 'object' ? el : doc.getElementById(el);
- that.wrapper.style.overflow = 'hidden';
- that.scroller = that.wrapper.children[0];
-
- // Default options
- that.options = {
- hScroll: true,
- vScroll: true,
- x: 0,
- y: 0,
- bounce: true,
- bounceLock: false,
- momentum: true,
- lockDirection: true,
- useTransform: true,
- useTransition: false,
- topOffset: 0,
- checkDOMChanges: false, // Experimental
- handleClick: true,
-
- // Scrollbar
- hScrollbar: true,
- vScrollbar: true,
- fixedScrollbar: isAndroid,
- hideScrollbar: isIDevice,
- fadeScrollbar: isIDevice && has3d,
- scrollbarClass: '',
-
- // Zoom
- zoom: false,
- zoomMin: 1,
- zoomMax: 4,
- doubleTapZoom: 2,
- wheelAction: 'scroll',
-
- // Snap
- snap: false,
- snapThreshold: 1,
-
- // Events
- onRefresh: null,
- onBeforeScrollStart: function (e) { e.preventDefault(); },
- onScrollStart: null,
- onBeforeScrollMove: null,
- onScrollMove: null,
- onBeforeScrollEnd: null,
- onScrollEnd: null,
- onTouchEnd: null,
- onDestroy: null,
- onZoomStart: null,
- onZoom: null,
- onZoomEnd: null
- };
-
- // User defined options
- for (i in options) that.options[i] = options[i];
-
- // Set starting position
- that.x = that.options.x;
- that.y = that.options.y;
-
- // Normalize options
- that.options.useTransform = hasTransform && that.options.useTransform;
- that.options.hScrollbar = that.options.hScroll && that.options.hScrollbar;
- that.options.vScrollbar = that.options.vScroll && that.options.vScrollbar;
- that.options.zoom = that.options.useTransform && that.options.zoom;
- that.options.useTransition = hasTransitionEnd && that.options.useTransition;
-
- // Helpers FIX ANDROID BUG!
- // translate3d and scale doesn't work together!
- // Ignoring 3d ONLY WHEN YOU SET that.options.zoom
- if ( that.options.zoom && isAndroid ){
- translateZ = '';
- }
-
- // Set some default styles
- that.scroller.style[transitionProperty] = that.options.useTransform ? cssVendor + 'transform' : 'top left';
- that.scroller.style[transitionDuration] = '0';
- that.scroller.style[transformOrigin] = '0 0';
- if (that.options.useTransition) that.scroller.style[transitionTimingFunction] = 'cubic-bezier(0.33,0.66,0.66,1)';
-
- if (that.options.useTransform) that.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px)' + translateZ;
- else that.scroller.style.cssText += ';position:absolute;top:' + that.y + 'px;left:' + that.x + 'px';
-
- if (that.options.useTransition) that.options.fixedScrollbar = true;
-
- that.refresh();
-
- that._bind(RESIZE_EV, window);
- that._bind(START_EV);
- if (!hasTouch) {
- if (that.options.wheelAction != 'none') {
- that._bind('DOMMouseScroll');
- that._bind('mousewheel');
- }
- }
-
- if (that.options.checkDOMChanges) that.checkDOMTime = setInterval(function () {
- that._checkDOMChanges();
- }, 500);
- };
-
-// Prototype
-iScroll.prototype = {
- enabled: true,
- x: 0,
- y: 0,
- steps: [],
- scale: 1,
- currPageX: 0, currPageY: 0,
- pagesX: [], pagesY: [],
- aniTime: null,
- wheelZoomCount: 0,
-
- handleEvent: function (e) {
- var that = this;
- switch(e.type) {
- case START_EV:
- if (!hasTouch && e.button !== 0) return;
- that._start(e);
- break;
- case MOVE_EV: that._move(e); break;
- case END_EV:
- case CANCEL_EV: that._end(e); break;
- case RESIZE_EV: that._resize(); break;
- case 'DOMMouseScroll': case 'mousewheel': that._wheel(e); break;
- case TRNEND_EV: that._transitionEnd(e); break;
- }
- },
-
- _checkDOMChanges: function () {
- if (this.moved || this.zoomed || this.animating ||
- (this.scrollerW == this.scroller.offsetWidth * this.scale && this.scrollerH == this.scroller.offsetHeight * this.scale)) return;
-
- this.refresh();
- },
-
- _scrollbar: function (dir) {
- var that = this,
- bar;
-
- if (!that[dir + 'Scrollbar']) {
- if (that[dir + 'ScrollbarWrapper']) {
- if (hasTransform) that[dir + 'ScrollbarIndicator'].style[transform] = '';
- that[dir + 'ScrollbarWrapper'].parentNode.removeChild(that[dir + 'ScrollbarWrapper']);
- that[dir + 'ScrollbarWrapper'] = null;
- that[dir + 'ScrollbarIndicator'] = null;
- }
-
- return;
- }
-
- if (!that[dir + 'ScrollbarWrapper']) {
- // Create the scrollbar wrapper
- bar = doc.createElement('div');
-
- if (that.options.scrollbarClass) bar.className = that.options.scrollbarClass + dir.toUpperCase();
- else bar.style.cssText = 'position:absolute;z-index:100;' + (dir == 'h' ? 'height:7px;bottom:1px;left:2px;right:' + (that.vScrollbar ? '7' : '2') + 'px' : 'width:7px;bottom:' + (that.hScrollbar ? '7' : '2') + 'px;top:2px;right:1px');
-
- bar.style.cssText += ';pointer-events:none;' + cssVendor + 'transition-property:opacity;' + cssVendor + 'transition-duration:' + (that.options.fadeScrollbar ? '350ms' : '0') + ';overflow:hidden;opacity:' + (that.options.hideScrollbar ? '0' : '1');
-
- that.wrapper.appendChild(bar);
- that[dir + 'ScrollbarWrapper'] = bar;
-
- // Create the scrollbar indicator
- bar = doc.createElement('div');
- if (!that.options.scrollbarClass) {
- bar.style.cssText = 'position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);' + cssVendor + 'background-clip:padding-box;' + cssVendor + 'box-sizing:border-box;' + (dir == 'h' ? 'height:100%' : 'width:100%') + ';' + cssVendor + 'border-radius:3px;border-radius:3px';
- }
- bar.style.cssText += ';pointer-events:none;' + cssVendor + 'transition-property:' + cssVendor + 'transform;' + cssVendor + 'transition-timing-function:cubic-bezier(0.33,0.66,0.66,1);' + cssVendor + 'transition-duration:0;' + cssVendor + 'transform: translate(0,0)' + translateZ;
- if (that.options.useTransition) bar.style.cssText += ';' + cssVendor + 'transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)';
-
- that[dir + 'ScrollbarWrapper'].appendChild(bar);
- that[dir + 'ScrollbarIndicator'] = bar;
- }
-
- if (dir == 'h') {
- that.hScrollbarSize = that.hScrollbarWrapper.clientWidth;
- that.hScrollbarIndicatorSize = m.max(m.round(that.hScrollbarSize * that.hScrollbarSize / that.scrollerW), 8);
- that.hScrollbarIndicator.style.width = that.hScrollbarIndicatorSize + 'px';
- that.hScrollbarMaxScroll = that.hScrollbarSize - that.hScrollbarIndicatorSize;
- that.hScrollbarProp = that.hScrollbarMaxScroll / that.maxScrollX;
- } else {
- that.vScrollbarSize = that.vScrollbarWrapper.clientHeight;
- that.vScrollbarIndicatorSize = m.max(m.round(that.vScrollbarSize * that.vScrollbarSize / that.scrollerH), 8);
- that.vScrollbarIndicator.style.height = that.vScrollbarIndicatorSize + 'px';
- that.vScrollbarMaxScroll = that.vScrollbarSize - that.vScrollbarIndicatorSize;
- that.vScrollbarProp = that.vScrollbarMaxScroll / that.maxScrollY;
- }
-
- // Reset position
- that._scrollbarPos(dir, true);
- },
-
- _resize: function () {
- var that = this;
- setTimeout(function () { that.refresh(); }, isAndroid ? 200 : 0);
- },
-
- _pos: function (x, y) {
- if (this.zoomed) return;
-
- x = this.hScroll ? x : 0;
- y = this.vScroll ? y : 0;
-
- if (this.options.useTransform) {
- this.scroller.style[transform] = 'translate(' + x + 'px,' + y + 'px) scale(' + this.scale + ')' + translateZ;
- } else {
- x = m.round(x);
- y = m.round(y);
- this.scroller.style.left = x + 'px';
- this.scroller.style.top = y + 'px';
- }
-
- this.x = x;
- this.y = y;
-
- this._scrollbarPos('h');
- this._scrollbarPos('v');
- },
-
- _scrollbarPos: function (dir, hidden) {
- var that = this,
- pos = dir == 'h' ? that.x : that.y,
- size;
-
- if (!that[dir + 'Scrollbar']) return;
-
- pos = that[dir + 'ScrollbarProp'] * pos;
-
- if (pos < 0) {
- if (!that.options.fixedScrollbar) {
- size = that[dir + 'ScrollbarIndicatorSize'] + m.round(pos * 3);
- if (size < 8) size = 8;
- that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px';
- }
- pos = 0;
- } else if (pos > that[dir + 'ScrollbarMaxScroll']) {
- if (!that.options.fixedScrollbar) {
- size = that[dir + 'ScrollbarIndicatorSize'] - m.round((pos - that[dir + 'ScrollbarMaxScroll']) * 3);
- if (size < 8) size = 8;
- that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px';
- pos = that[dir + 'ScrollbarMaxScroll'] + (that[dir + 'ScrollbarIndicatorSize'] - size);
- } else {
- pos = that[dir + 'ScrollbarMaxScroll'];
- }
- }
-
- that[dir + 'ScrollbarWrapper'].style[transitionDelay] = '0';
- that[dir + 'ScrollbarWrapper'].style.opacity = hidden && that.options.hideScrollbar ? '0' : '1';
- that[dir + 'ScrollbarIndicator'].style[transform] = 'translate(' + (dir == 'h' ? pos + 'px,0)' : '0,' + pos + 'px)') + translateZ;
- },
-
- _start: function (e) {
- var that = this,
- point = hasTouch ? e.touches[0] : e,
- matrix, x, y,
- c1, c2;
-
- if (!that.enabled) return;
-
- if (that.options.onBeforeScrollStart) that.options.onBeforeScrollStart.call(that, e);
-
- if (that.options.useTransition || that.options.zoom) that._transitionTime(0);
-
- that.moved = false;
- that.animating = false;
- that.zoomed = false;
- that.distX = 0;
- that.distY = 0;
- that.absDistX = 0;
- that.absDistY = 0;
- that.dirX = 0;
- that.dirY = 0;
-
- // Gesture start
- if (that.options.zoom && hasTouch && e.touches.length > 1) {
- c1 = m.abs(e.touches[0].pageX-e.touches[1].pageX);
- c2 = m.abs(e.touches[0].pageY-e.touches[1].pageY);
- that.touchesDistStart = m.sqrt(c1 * c1 + c2 * c2);
-
- that.originX = m.abs(e.touches[0].pageX + e.touches[1].pageX - that.wrapperOffsetLeft * 2) / 2 - that.x;
- that.originY = m.abs(e.touches[0].pageY + e.touches[1].pageY - that.wrapperOffsetTop * 2) / 2 - that.y;
-
- if (that.options.onZoomStart) that.options.onZoomStart.call(that, e);
- }
-
- if (that.options.momentum) {
- if (that.options.useTransform) {
- // Very lame general purpose alternative to CSSMatrix
- matrix = getComputedStyle(that.scroller, null)[transform].replace(/[^0-9\-.,]/g, '').split(',');
- x = +(matrix[12] || matrix[4]);
- y = +(matrix[13] || matrix[5]);
- } else {
- x = +getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, '');
- y = +getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, '');
- }
-
- if (x != that.x || y != that.y) {
- if (that.options.useTransition) that._unbind(TRNEND_EV);
- else cancelFrame(that.aniTime);
- that.steps = [];
- that._pos(x, y);
- if (that.options.onScrollEnd) that.options.onScrollEnd.call(that);
- }
- }
-
- that.absStartX = that.x; // Needed by snap threshold
- that.absStartY = that.y;
-
- that.startX = that.x;
- that.startY = that.y;
- that.pointX = point.pageX;
- that.pointY = point.pageY;
-
- that.startTime = e.timeStamp || Date.now();
-
- if (that.options.onScrollStart) that.options.onScrollStart.call(that, e);
-
- that._bind(MOVE_EV, window);
- that._bind(END_EV, window);
- that._bind(CANCEL_EV, window);
- },
-
- _move: function (e) {
- var that = this,
- point = hasTouch ? e.touches[0] : e,
- deltaX = point.pageX - that.pointX,
- deltaY = point.pageY - that.pointY,
- newX = that.x + deltaX,
- newY = that.y + deltaY,
- c1, c2, scale,
- timestamp = e.timeStamp || Date.now();
-
- if (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e);
-
- // Zoom
- if (that.options.zoom && hasTouch && e.touches.length > 1) {
- c1 = m.abs(e.touches[0].pageX - e.touches[1].pageX);
- c2 = m.abs(e.touches[0].pageY - e.touches[1].pageY);
- that.touchesDist = m.sqrt(c1*c1+c2*c2);
-
- that.zoomed = true;
-
- scale = 1 / that.touchesDistStart * that.touchesDist * this.scale;
-
- if (scale < that.options.zoomMin) scale = 0.5 * that.options.zoomMin * Math.pow(2.0, scale / that.options.zoomMin);
- else if (scale > that.options.zoomMax) scale = 2.0 * that.options.zoomMax * Math.pow(0.5, that.options.zoomMax / scale);
-
- that.lastScale = scale / this.scale;
-
- newX = this.originX - this.originX * that.lastScale + this.x,
- newY = this.originY - this.originY * that.lastScale + this.y;
-
- this.scroller.style[transform] = 'translate(' + newX + 'px,' + newY + 'px) scale(' + scale + ')' + translateZ;
-
- if (that.options.onZoom) that.options.onZoom.call(that, e);
- return;
- }
-
- that.pointX = point.pageX;
- that.pointY = point.pageY;
-
- // Slow down if outside of the boundaries
- if (newX > 0 || newX < that.maxScrollX) {
- newX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX;
- }
- if (newY > that.minScrollY || newY < that.maxScrollY) {
- newY = that.options.bounce ? that.y + (deltaY / 2) : newY >= that.minScrollY || that.maxScrollY >= 0 ? that.minScrollY : that.maxScrollY;
- }
-
- that.distX += deltaX;
- that.distY += deltaY;
- that.absDistX = m.abs(that.distX);
- that.absDistY = m.abs(that.distY);
-
- if (that.absDistX < 6 && that.absDistY < 6) {
- return;
- }
-
- // Lock direction
- if (that.options.lockDirection) {
- if (that.absDistX > that.absDistY + 5) {
- newY = that.y;
- deltaY = 0;
- } else if (that.absDistY > that.absDistX + 5) {
- newX = that.x;
- deltaX = 0;
- }
- }
-
- that.moved = true;
- that._pos(newX, newY);
- that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;
- that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;
-
- if (timestamp - that.startTime > 300) {
- that.startTime = timestamp;
- that.startX = that.x;
- that.startY = that.y;
- }
-
- if (that.options.onScrollMove) that.options.onScrollMove.call(that, e);
- },
-
- _end: function (e) {
- if (hasTouch && e.touches.length !== 0) return;
-
- var that = this,
- point = hasTouch ? e.changedTouches[0] : e,
- target, ev,
- momentumX = { dist:0, time:0 },
- momentumY = { dist:0, time:0 },
- duration = (e.timeStamp || Date.now()) - that.startTime,
- newPosX = that.x,
- newPosY = that.y,
- distX, distY,
- newDuration,
- snap,
- scale;
-
- that._unbind(MOVE_EV, window);
- that._unbind(END_EV, window);
- that._unbind(CANCEL_EV, window);
-
- if (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e);
-
- if (that.zoomed) {
- scale = that.scale * that.lastScale;
- scale = Math.max(that.options.zoomMin, scale);
- scale = Math.min(that.options.zoomMax, scale);
- that.lastScale = scale / that.scale;
- that.scale = scale;
-
- that.x = that.originX - that.originX * that.lastScale + that.x;
- that.y = that.originY - that.originY * that.lastScale + that.y;
-
- that.scroller.style[transitionDuration] = '200ms';
- that.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px) scale(' + that.scale + ')' + translateZ;
-
- that.zoomed = false;
- that.refresh();
-
- if (that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);
- return;
- }
-
- if (!that.moved) {
- if (hasTouch) {
- if (that.doubleTapTimer && that.options.zoom) {
- // Double tapped
- clearTimeout(that.doubleTapTimer);
- that.doubleTapTimer = null;
- if (that.options.onZoomStart) that.options.onZoomStart.call(that, e);
- that.zoom(that.pointX, that.pointY, that.scale == 1 ? that.options.doubleTapZoom : 1);
- if (that.options.onZoomEnd) {
- setTimeout(function() {
- that.options.onZoomEnd.call(that, e);
- }, 200); // 200 is default zoom duration
- }
- } else if (this.options.handleClick) {
- that.doubleTapTimer = setTimeout(function () {
- that.doubleTapTimer = null;
-
- // Find the last touched element
- target = point.target;
- while (target.nodeType != 1) target = target.parentNode;
-
- if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
- ev = doc.createEvent('MouseEvents');
- ev.initMouseEvent('click', true, true, e.view, 1,
- point.screenX, point.screenY, point.clientX, point.clientY,
- e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
- 0, null);
- ev._fake = true;
- target.dispatchEvent(ev);
- }
- }, that.options.zoom ? 250 : 0);
- }
- }
-
- that._resetPos(400);
-
- if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
- return;
- }
-
- if (duration < 300 && that.options.momentum) {
- momentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x, that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX;
- momentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, (that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y - that.minScrollY : 0), that.options.bounce ? that.wrapperH : 0) : momentumY;
-
- newPosX = that.x + momentumX.dist;
- newPosY = that.y + momentumY.dist;
-
- if ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX)) momentumX = { dist:0, time:0 };
- if ((that.y > that.minScrollY && newPosY > that.minScrollY) || (that.y < that.maxScrollY && newPosY < that.maxScrollY)) momentumY = { dist:0, time:0 };
- }
-
- if (momentumX.dist || momentumY.dist) {
- newDuration = m.max(m.max(momentumX.time, momentumY.time), 10);
-
- // Do we need to snap?
- if (that.options.snap) {
- distX = newPosX - that.absStartX;
- distY = newPosY - that.absStartY;
- if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) { that.scrollTo(that.absStartX, that.absStartY, 200); }
- else {
- snap = that._snap(newPosX, newPosY);
- newPosX = snap.x;
- newPosY = snap.y;
- newDuration = m.max(snap.time, newDuration);
- }
- }
-
- that.scrollTo(m.round(newPosX), m.round(newPosY), newDuration);
-
- if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
- return;
- }
-
- // Do we need to snap?
- if (that.options.snap) {
- distX = newPosX - that.absStartX;
- distY = newPosY - that.absStartY;
- if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) that.scrollTo(that.absStartX, that.absStartY, 200);
- else {
- snap = that._snap(that.x, that.y);
- if (snap.x != that.x || snap.y != that.y) that.scrollTo(snap.x, snap.y, snap.time);
- }
-
- if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
- return;
- }
-
- that._resetPos(200);
- if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
- },
-
- _resetPos: function (time) {
- var that = this,
- resetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x,
- resetY = that.y >= that.minScrollY || that.maxScrollY > 0 ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y;
-
- if (resetX == that.x && resetY == that.y) {
- if (that.moved) {
- that.moved = false;
- if (that.options.onScrollEnd) that.options.onScrollEnd.call(that); // Execute custom code on scroll end
- }
-
- if (that.hScrollbar && that.options.hideScrollbar) {
- if (vendor == 'webkit') that.hScrollbarWrapper.style[transitionDelay] = '300ms';
- that.hScrollbarWrapper.style.opacity = '0';
- }
- if (that.vScrollbar && that.options.hideScrollbar) {
- if (vendor == 'webkit') that.vScrollbarWrapper.style[transitionDelay] = '300ms';
- that.vScrollbarWrapper.style.opacity = '0';
- }
-
- return;
- }
-
- that.scrollTo(resetX, resetY, time || 0);
- },
-
- _wheel: function (e) {
- var that = this,
- wheelDeltaX, wheelDeltaY,
- deltaX, deltaY,
- deltaScale;
-
- if ('wheelDeltaX' in e) {
- wheelDeltaX = e.wheelDeltaX / 12;
- wheelDeltaY = e.wheelDeltaY / 12;
- } else if('wheelDelta' in e) {
- wheelDeltaX = wheelDeltaY = e.wheelDelta / 12;
- } else if ('detail' in e) {
- wheelDeltaX = wheelDeltaY = -e.detail * 3;
- } else {
- return;
- }
-
- if (that.options.wheelAction == 'zoom') {
- deltaScale = that.scale * Math.pow(2, 1/3 * (wheelDeltaY ? wheelDeltaY / Math.abs(wheelDeltaY) : 0));
- if (deltaScale < that.options.zoomMin) deltaScale = that.options.zoomMin;
- if (deltaScale > that.options.zoomMax) deltaScale = that.options.zoomMax;
-
- if (deltaScale != that.scale) {
- if (!that.wheelZoomCount && that.options.onZoomStart) that.options.onZoomStart.call(that, e);
- that.wheelZoomCount++;
-
- that.zoom(e.pageX, e.pageY, deltaScale, 400);
-
- setTimeout(function() {
- that.wheelZoomCount--;
- if (!that.wheelZoomCount && that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);
- }, 400);
- }
-
- return;
- }
-
- deltaX = that.x + wheelDeltaX;
- deltaY = that.y + wheelDeltaY;
-
- if (deltaX > 0) deltaX = 0;
- else if (deltaX < that.maxScrollX) deltaX = that.maxScrollX;
-
- if (deltaY > that.minScrollY) deltaY = that.minScrollY;
- else if (deltaY < that.maxScrollY) deltaY = that.maxScrollY;
-
- if (that.maxScrollY < 0) {
- that.scrollTo(deltaX, deltaY, 0);
- }
- },
-
- _transitionEnd: function (e) {
- var that = this;
-
- if (e.target != that.scroller) return;
-
- that._unbind(TRNEND_EV);
-
- that._startAni();
- },
-
-
- /**
- *
- * Utilities
- *
- */
- _startAni: function () {
- var that = this,
- startX = that.x, startY = that.y,
- startTime = Date.now(),
- step, easeOut,
- animate;
-
- if (that.animating) return;
-
- if (!that.steps.length) {
- that._resetPos(400);
- return;
- }
-
- step = that.steps.shift();
-
- if (step.x == startX && step.y == startY) step.time = 0;
-
- that.animating = true;
- that.moved = true;
-
- if (that.options.useTransition) {
- that._transitionTime(step.time);
- that._pos(step.x, step.y);
- that.animating = false;
- if (step.time) that._bind(TRNEND_EV);
- else that._resetPos(0);
- return;
- }
-
- animate = function () {
- var now = Date.now(),
- newX, newY;
-
- if (now >= startTime + step.time) {
- that._pos(step.x, step.y);
- that.animating = false;
- if (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that); // Execute custom code on animation end
- that._startAni();
- return;
- }
-
- now = (now - startTime) / step.time - 1;
- easeOut = m.sqrt(1 - now * now);
- newX = (step.x - startX) * easeOut + startX;
- newY = (step.y - startY) * easeOut + startY;
- that._pos(newX, newY);
- if (that.animating) that.aniTime = nextFrame(animate);
- };
-
- animate();
- },
-
- _transitionTime: function (time) {
- time += 'ms';
- this.scroller.style[transitionDuration] = time;
- if (this.hScrollbar) this.hScrollbarIndicator.style[transitionDuration] = time;
- if (this.vScrollbar) this.vScrollbarIndicator.style[transitionDuration] = time;
- },
-
- _momentum: function (dist, time, maxDistUpper, maxDistLower, size) {
- var deceleration = 0.0006,
- speed = m.abs(dist) / time,
- newDist = (speed * speed) / (2 * deceleration),
- newTime = 0, outsideDist = 0;
-
- // Proportinally reduce speed if we are outside of the boundaries
- if (dist > 0 && newDist > maxDistUpper) {
- outsideDist = size / (6 / (newDist / speed * deceleration));
- maxDistUpper = maxDistUpper + outsideDist;
- speed = speed * maxDistUpper / newDist;
- newDist = maxDistUpper;
- } else if (dist < 0 && newDist > maxDistLower) {
- outsideDist = size / (6 / (newDist / speed * deceleration));
- maxDistLower = maxDistLower + outsideDist;
- speed = speed * maxDistLower / newDist;
- newDist = maxDistLower;
- }
-
- newDist = newDist * (dist < 0 ? -1 : 1);
- newTime = speed / deceleration;
-
- return { dist: newDist, time: m.round(newTime) };
- },
-
- _offset: function (el) {
- var left = -el.offsetLeft,
- top = -el.offsetTop;
-
- while (el = el.offsetParent) {
- left -= el.offsetLeft;
- top -= el.offsetTop;
- }
-
- if (el != this.wrapper) {
- left *= this.scale;
- top *= this.scale;
- }
-
- return { left: left, top: top };
- },
-
- _snap: function (x, y) {
- var that = this,
- i, l,
- page, time,
- sizeX, sizeY;
-
- // Check page X
- page = that.pagesX.length - 1;
- for (i=0, l=that.pagesX.length; i<l; i++) {
- if (x >= that.pagesX[i]) {
- page = i;
- break;
- }
- }
- if (page == that.currPageX && page > 0 && that.dirX < 0) page--;
- x = that.pagesX[page];
- sizeX = m.abs(x - that.pagesX[that.currPageX]);
- sizeX = sizeX ? m.abs(that.x - x) / sizeX * 500 : 0;
- that.currPageX = page;
-
- // Check page Y
- page = that.pagesY.length-1;
- for (i=0; i<page; i++) {
- if (y >= that.pagesY[i]) {
- page = i;
- break;
- }
- }
- if (page == that.currPageY && page > 0 && that.dirY < 0) page--;
- y = that.pagesY[page];
- sizeY = m.abs(y - that.pagesY[that.currPageY]);
- sizeY = sizeY ? m.abs(that.y - y) / sizeY * 500 : 0;
- that.currPageY = page;
-
- // Snap with constant speed (proportional duration)
- time = m.round(m.max(sizeX, sizeY)) || 200;
-
- return { x: x, y: y, time: time };
- },
-
- _bind: function (type, el, bubble) {
- (el || this.scroller).addEventListener(type, this, !!bubble);
- },
-
- _unbind: function (type, el, bubble) {
- (el || this.scroller).removeEventListener(type, this, !!bubble);
- },
-
-
- /**
- *
- * Public methods
- *
- */
- destroy: function () {
- var that = this;
-
- that.scroller.style[transform] = '';
-
- // Remove the scrollbars
- that.hScrollbar = false;
- that.vScrollbar = false;
- that._scrollbar('h');
- that._scrollbar('v');
-
- // Remove the event listeners
- that._unbind(RESIZE_EV, window);
- that._unbind(START_EV);
- that._unbind(MOVE_EV, window);
- that._unbind(END_EV, window);
- that._unbind(CANCEL_EV, window);
-
- if (!that.options.hasTouch) {
- that._unbind('DOMMouseScroll');
- that._unbind('mousewheel');
- }
-
- if (that.options.useTransition) that._unbind(TRNEND_EV);
-
- if (that.options.checkDOMChanges) clearInterval(that.checkDOMTime);
-
- if (that.options.onDestroy) that.options.onDestroy.call(that);
- },
-
- refresh: function () {
- var that = this,
- offset,
- i, l,
- els,
- pos = 0,
- page = 0;
-
- if (that.scale < that.options.zoomMin) that.scale = that.options.zoomMin;
- that.wrapperW = that.wrapper.clientWidth || 1;
- that.wrapperH = that.wrapper.clientHeight || 1;
-
- that.minScrollY = -that.options.topOffset || 0;
- that.scrollerW = m.round(that.scroller.offsetWidth * that.scale);
- that.scrollerH = m.round((that.scroller.offsetHeight + that.minScrollY) * that.scale);
- that.maxScrollX = that.wrapperW - that.scrollerW;
- that.maxScrollY = that.wrapperH - that.scrollerH + that.minScrollY;
- that.dirX = 0;
- that.dirY = 0;
-
- if (that.options.onRefresh) that.options.onRefresh.call(that);
-
- that.hScroll = that.options.hScroll && that.maxScrollX < 0;
- that.vScroll = that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH > that.wrapperH);
-
- that.hScrollbar = that.hScroll && that.options.hScrollbar;
- that.vScrollbar = that.vScroll && that.options.vScrollbar && that.scrollerH > that.wrapperH;
-
- offset = that._offset(that.wrapper);
- that.wrapperOffsetLeft = -offset.left;
- that.wrapperOffsetTop = -offset.top;
-
- // Prepare snap
- if (typeof that.options.snap == 'string') {
- that.pagesX = [];
- that.pagesY = [];
- els = that.scroller.querySelectorAll(that.options.snap);
- for (i=0, l=els.length; i<l; i++) {
- pos = that._offset(els[i]);
- pos.left += that.wrapperOffsetLeft;
- pos.top += that.wrapperOffsetTop;
- that.pagesX[i] = pos.left < that.maxScrollX ? that.maxScrollX : pos.left * that.scale;
- that.pagesY[i] = pos.top < that.maxScrollY ? that.maxScrollY : pos.top * that.scale;
- }
- } else if (that.options.snap) {
- that.pagesX = [];
- while (pos >= that.maxScrollX) {
- that.pagesX[page] = pos;
- pos = pos - that.wrapperW;
- page++;
- }
- if (that.maxScrollX%that.wrapperW) that.pagesX[that.pagesX.length] = that.maxScrollX - that.pagesX[that.pagesX.length-1] + that.pagesX[that.pagesX.length-1];
-
- pos = 0;
- page = 0;
- that.pagesY = [];
- while (pos >= that.maxScrollY) {
- that.pagesY[page] = pos;
- pos = pos - that.wrapperH;
- page++;
- }
- if (that.maxScrollY%that.wrapperH) that.pagesY[that.pagesY.length] = that.maxScrollY - that.pagesY[that.pagesY.length-1] + that.pagesY[that.pagesY.length-1];
- }
-
- // Prepare the scrollbars
- that._scrollbar('h');
- that._scrollbar('v');
-
- if (!that.zoomed) {
- that.scroller.style[transitionDuration] = '0';
- that._resetPos(400);
- }
- },
-
- scrollTo: function (x, y, time, relative) {
- var that = this,
- step = x,
- i, l;
-
- that.stop();
-
- if (!step.length) step = [{ x: x, y: y, time: time, relative: relative }];
-
- for (i=0, l=step.length; i<l; i++) {
- if (step[i].relative) { step[i].x = that.x - step[i].x; step[i].y = that.y - step[i].y; }
- that.steps.push({ x: step[i].x, y: step[i].y, time: step[i].time || 0 });
- }
-
- that._startAni();
- },
-
- scrollToElement: function (el, time) {
- var that = this, pos;
- el = el.nodeType ? el : that.scroller.querySelector(el);
- if (!el) return;
-
- pos = that._offset(el);
- pos.left += that.wrapperOffsetLeft;
- pos.top += that.wrapperOffsetTop;
-
- pos.left = pos.left > 0 ? 0 : pos.left < that.maxScrollX ? that.maxScrollX : pos.left;
- pos.top = pos.top > that.minScrollY ? that.minScrollY : pos.top < that.maxScrollY ? that.maxScrollY : pos.top;
- time = time === undefined ? m.max(m.abs(pos.left)*2, m.abs(pos.top)*2) : time;
-
- that.scrollTo(pos.left, pos.top, time);
- },
-
- scrollToPage: function (pageX, pageY, time) {
- var that = this, x, y;
-
- time = time === undefined ? 400 : time;
-
- if (that.options.onScrollStart) that.options.onScrollStart.call(that);
-
- if (that.options.snap) {
- pageX = pageX == 'next' ? that.currPageX+1 : pageX == 'prev' ? that.currPageX-1 : pageX;
- pageY = pageY == 'next' ? that.currPageY+1 : pageY == 'prev' ? that.currPageY-1 : pageY;
-
- pageX = pageX < 0 ? 0 : pageX > that.pagesX.length-1 ? that.pagesX.length-1 : pageX;
- pageY = pageY < 0 ? 0 : pageY > that.pagesY.length-1 ? that.pagesY.length-1 : pageY;
-
- that.currPageX = pageX;
- that.currPageY = pageY;
- x = that.pagesX[pageX];
- y = that.pagesY[pageY];
- } else {
- x = -that.wrapperW * pageX;
- y = -that.wrapperH * pageY;
- if (x < that.maxScrollX) x = that.maxScrollX;
- if (y < that.maxScrollY) y = that.maxScrollY;
- }
-
- that.scrollTo(x, y, time);
- },
-
- disable: function () {
- this.stop();
- this._resetPos(0);
- this.enabled = false;
-
- // If disabled after touchstart we make sure that there are no left over events
- this._unbind(MOVE_EV, window);
- this._unbind(END_EV, window);
- this._unbind(CANCEL_EV, window);
- },
-
- enable: function () {
- this.enabled = true;
- },
-
- stop: function () {
- if (this.options.useTransition) this._unbind(TRNEND_EV);
- else cancelFrame(this.aniTime);
- this.steps = [];
- this.moved = false;
- this.animating = false;
- },
-
- zoom: function (x, y, scale, time) {
- var that = this,
- relScale = scale / that.scale;
-
- if (!that.options.useTransform) return;
-
- that.zoomed = true;
- time = time === undefined ? 200 : time;
- x = x - that.wrapperOffsetLeft - that.x;
- y = y - that.wrapperOffsetTop - that.y;
- that.x = x - x * relScale + that.x;
- that.y = y - y * relScale + that.y;
-
- that.scale = scale;
- that.refresh();
-
- that.x = that.x > 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x;
- that.y = that.y > that.minScrollY ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y;
-
- that.scroller.style[transitionDuration] = time + 'ms';
- that.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px) scale(' + scale + ')' + translateZ;
- that.zoomed = false;
- },
-
- isReady: function () {
- return !this.moved && !this.zoomed && !this.animating;
- }
-};
-
-function prefixStyle (style) {
- if ( vendor === '' ) return style;
-
- style = style.charAt(0).toUpperCase() + style.substr(1);
- return vendor + style;
-}
-
-dummyStyle = null; // for the sake of it
-
-if (typeof exports !== 'undefined') exports.iScroll = iScroll;
-else window.iScroll = iScroll;
-
-})(window, document);
View
6 public/javascripts/jquery.hotkeys.min.js
@@ -0,0 +1,6 @@
+(function(b){b.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",191:"/",224:"meta",179:"play",178:"stop",227:"rewind",176:"skipforward",228:"fastforward",177:"skipback",0:"rec"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"}};
+function a(d){if(typeof d.data!=="string"){return;}var c=d.handler,e=d.data.toLowerCase().split(" ");d.handler=function(n){if(this!==n.target&&(/textarea|select/i.test(n.target.nodeName)||n.target.type==="text")){return;
+}var h=n.type!=="keypress"&&b.hotkeys.specialKeys[n.which],o=String.fromCharCode(n.which).toLowerCase(),k,m="",g={};if(n.altKey&&h!=="alt"){m+="alt+";}if(n.ctrlKey&&h!=="ctrl"){m+="ctrl+";
+}if(n.metaKey&&!n.ctrlKey&&h!=="meta"){m+="meta+";}if(n.shiftKey&&h!=="shift"){m+="shift+";}if(h){g[m+h]=true;}else{g[m+o]=true;g[m+b.hotkeys.shiftNums[o]]=true;
+if(m==="shift+"){g[b.hotkeys.shiftNums[o]]=true;}}for(var j=0,f=e.length;j<f;j++){if(g[e[j]]){return c.apply(this,arguments);}}};}b.each(["keydown","keyup","keypress"],function(){b.event.special[this]={add:a};
+});})(jQuery);
View
874 public/javascripts/jquery.mcustomscrollbar.js
@@ -0,0 +1,874 @@
+/*
+== malihu jquery custom scrollbars plugin ==
+version: 2.3.1
+author: malihu (http://manos.malihu.gr)
+plugin home: http://manos.malihu.gr/jquery-custom-content-scroller
+*/
+(function($){
+ var methods={
+ init:function(options){
+ var defaults={
+ set_width:false, /*optional element width: boolean, pixels, percentage*/
+ set_height:false, /*optional element height: boolean, pixels, percentage*/
+ horizontalScroll:false, /*scroll horizontally: boolean*/
+ scrollInertia:550, /*scrolling inertia: integer (milliseconds)*/
+ scrollEasing:"easeOutCirc", /*scrolling easing: string*/
+ mouseWheel:"pixels", /*mousewheel support and velocity: boolean, "auto", integer, "pixels"*/
+ mouseWheelPixels:60, /*mousewheel pixels amount: integer*/
+ autoDraggerLength:true, /*auto-adjust scrollbar dragger length: boolean*/
+ scrollButtons:{ /*scroll buttons*/
+ enable:false, /*scroll buttons support: boolean*/
+ scrollType:"continuous", /*scroll buttons scrolling type: "continuous", "pixels"*/
+ scrollSpeed:20, /*scroll buttons continuous scrolling speed: integer*/
+ scrollAmount:40 /*scroll buttons pixels scroll amount: integer (pixels)*/
+ },
+ advanced:{
+ updateOnBrowserResize:true, /*update scrollbars on browser resize (for layouts based on percentages): boolean*/
+ updateOnContentResize:false, /*auto-update scrollbars on content resize (for dynamic content): boolean*/
+ autoExpandHorizontalScroll:false, /*auto-expand width for horizontal scrolling: boolean*/
+ autoScrollOnFocus:true /*auto-scroll on focused elements: boolean*/
+ },
+ callbacks:{
+ onScrollStart:function(){}, /*user custom callback function on scroll start event*/
+ onScroll:function(){}, /*user custom callback function on scroll event*/
+ onTotalScroll:function(){}, /*user custom callback function on scroll end reached event*/
+ onTotalScrollBack:function(){}, /*user custom callback function on scroll begin reached event*/
+ onTotalScrollOffset:0, /*scroll end reached offset: integer (pixels)*/
+ whileScrolling:false, /*user custom callback function on scrolling event*/
+ whileScrollingInterval:30 /*interval for calling whileScrolling callback: integer (milliseconds)*/
+ }
+ },
+ options=$.extend(true,defaults,options);
+ /*check for touch device*/
+ $(document).data("mCS-is-touch-device",false);
+ if(is_touch_device()){
+ $(document).data("mCS-is-touch-device",true);
+ }
+ function is_touch_device(){
+ return !!("ontouchstart" in window) ? 1 : 0;
+ }
+ return this.each(function(){
+ var $this=$(this);
+ /*set element width/height, create markup for custom scrollbars, add classes*/
+ if(options.set_width){
+ $this.css("width",options.set_width);
+ }
+ if(options.set_height){
+ $this.css("height",options.set_height);
+ }
+ if(!$(document).data("mCustomScrollbar-index")){
+ $(document).data("mCustomScrollbar-index","1");
+ }else{
+ var mCustomScrollbarIndex=parseInt($(document).data("mCustomScrollbar-index"));
+ $(document).data("mCustomScrollbar-index",mCustomScrollbarIndex+1);
+ }
+ $this.wrapInner("<div class='mCustomScrollBox' id='mCSB_"+$(document).data("mCustomScrollbar-index")+"' style='position:relative; height:100%; overflow:hidden; max-width:100%;' />").addClass("mCustomScrollbar _mCS_"+$(document).data("mCustomScrollbar-index"));
+ var mCustomScrollBox=$this.children(".mCustomScrollBox");
+ if(options.horizontalScroll){
+ mCustomScrollBox.addClass("mCSB_horizontal").wrapInner("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />");
+ var mCSB_h_wrapper=mCustomScrollBox.children(".mCSB_h_wrapper");
+ mCSB_h_wrapper.wrapInner("<div class='mCSB_container' style='position:absolute; left:0;' />").children(".mCSB_container").css({"width":mCSB_h_wrapper.children().outerWidth(),"position":"relative"}).unwrap();
+ }else{
+ mCustomScrollBox.wrapInner("<div class='mCSB_container' style='position:relative; top:0;' />");
+ }
+ var mCSB_container=mCustomScrollBox.children(".mCSB_container");
+ if($(document).data("mCS-is-touch-device")){
+ mCSB_container.addClass("mCS_touch");
+ }
+ mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>");
+ var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"),
+ mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"),
+ mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger");
+ if(options.horizontalScroll){
+ mCSB_dragger.data("minDraggerWidth",mCSB_dragger.width());
+ }else{
+ mCSB_dragger.data("minDraggerHeight",mCSB_dragger.height());
+ }
+ if(options.scrollButtons.enable){
+ if(options.horizontalScroll){
+ mCSB_scrollTools.prepend("<a class='mCSB_buttonLeft' style='display:block; position:relative;'></a>").append("<a class='mCSB_buttonRight' style='display:block; position:relative;'></a>");
+ }else{
+ mCSB_scrollTools.prepend("<a class='mCSB_buttonUp' style='display:block; position:relative;'></a>").append("<a class='mCSB_buttonDown' style='display:block; position:relative;'></a>");
+ }
+ }
+ /*mCustomScrollBox scrollTop and scrollLeft is always 0 to prevent browser focus scrolling*/
+ mCustomScrollBox.bind("scroll",function(){
+ if(!$this.is(".mCS_disabled")){ /*native focus scrolling for disabled scrollbars*/
+ mCustomScrollBox.scrollTop(0).scrollLeft(0);
+ }
+ });
+ /*store options, global vars/states, intervals and update element*/
+ $this.data({
+ /*init state*/
+ "mCS_Init":true,
+ /*option parameters*/
+ "horizontalScroll":options.horizontalScroll,
+ "scrollInertia":options.scrollInertia,
+ "scrollEasing":options.scrollEasing,
+ "mouseWheel":options.mouseWheel,
+ "mouseWheelPixels":options.mouseWheelPixels,
+ "autoDraggerLength":options.autoDraggerLength,
+ "scrollButtons_enable":options.scrollButtons.enable,
+ "scrollButtons_scrollType":options.scrollButtons.scrollType,
+ "scrollButtons_scrollSpeed":options.scrollButtons.scrollSpeed,
+ "scrollButtons_scrollAmount":options.scrollButtons.scrollAmount,
+ "autoExpandHorizontalScroll":options.advanced.autoExpandHorizontalScroll,
+ "autoScrollOnFocus":options.advanced.autoScrollOnFocus,
+ "onScrollStart_Callback":options.callbacks.onScrollStart,
+ "onScroll_Callback":options.callbacks.onScroll,
+ "onTotalScroll_Callback":options.callbacks.onTotalScroll,
+ "onTotalScrollBack_Callback":options.callbacks.onTotalScrollBack,
+ "onTotalScroll_Offset":options.callbacks.onTotalScrollOffset,
+ "whileScrolling_Callback":options.callbacks.whileScrolling,
+ "whileScrolling_Interval":options.callbacks.whileScrollingInterval,
+ /*events binding state*/
+ "bindEvent_scrollbar_click":false,
+ "bindEvent_mousewheel":false,
+ "bindEvent_focusin":false,
+ "bindEvent_buttonsContinuous_y":false,
+ "bindEvent_buttonsContinuous_x":false,
+ "bindEvent_buttonsPixels_y":false,
+ "bindEvent_buttonsPixels_x":false,
+ "bindEvent_scrollbar_touch":false,
+ "bindEvent_content_touch":false,
+ /*buttons intervals*/
+ "mCSB_buttonScrollRight":false,
+ "mCSB_buttonScrollLeft":false,
+ "mCSB_buttonScrollDown":false,
+ "mCSB_buttonScrollUp":false,
+ /*callback intervals*/
+ "whileScrolling":false
+ }).mCustomScrollbar("update");
+ /*detect max-width*/
+ if(options.horizontalScroll){
+ if($this.css("max-width")!=="none"){
+ if(!options.advanced.updateOnContentResize){ /*needs updateOnContentResize*/
+ options.advanced.updateOnContentResize=true;
+ }
+ $this.data({"mCS_maxWidth":parseInt($this.css("max-width")),"mCS_maxWidth_Interval":setInterval(function(){
+ if(parseInt($this.css("width"))>$this.data("mCS_maxWidth")){
+ clearInterval($this.data("mCS_maxWidth_Interval"));
+ $this.mCustomScrollbar("update");
+ }
+ },150)});
+ }
+ }else{
+ /*detect max-height*/
+ if($this.css("max-height")!=="none"){
+ $this.data({"mCS_maxHeight":parseInt($this.css("max-height")),"mCS_maxHeight_Interval":setInterval(function(){
+ mCustomScrollBox.css("max-height",$this.data("mCS_maxHeight"));
+ if(parseInt($this.css("height"))>$this.data("mCS_maxHeight")){
+ clearInterval($this.data("mCS_maxHeight_Interval"));
+ $this.mCustomScrollbar("update");
+ }
+ },150)});
+ }
+ }
+ /*window resize fn (for layouts based on percentages)*/
+ if(options.advanced.updateOnBrowserResize){
+ var mCSB_resizeTimeout;
+ $(window).resize(function(){
+ if(mCSB_resizeTimeout){
+ clearTimeout(mCSB_resizeTimeout);
+ }
+ mCSB_resizeTimeout=setTimeout(function(){
+ if(!$this.is(".mCS_disabled") && !$this.is(".mCS_destroyed")){
+ $this.mCustomScrollbar("update");
+ }
+ },150);
+ });
+ }
+ /*content resize fn (for dynamically generated content)*/
+ if(options.advanced.updateOnContentResize){
+ var mCSB_onContentResize;
+ if(options.horizontalScroll){
+ var mCSB_containerOldSize=mCSB_container.outerWidth();
+ }else{
+ var mCSB_containerOldSize=mCSB_container.outerHeight();
+ }
+ mCSB_onContentResize=setInterval(function(){
+ if(options.horizontalScroll){
+ if(options.advanced.autoExpandHorizontalScroll){
+ mCSB_container.css({"position":"absolute","width":"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap();
+ }
+ var mCSB_containerNewSize=mCSB_container.outerWidth();
+ }else{
+ var mCSB_containerNewSize=mCSB_container.outerHeight();
+ }
+ if(mCSB_containerNewSize!=mCSB_containerOldSize){
+ $this.mCustomScrollbar("update");
+ mCSB_containerOldSize=mCSB_containerNewSize;
+ }
+ },300);
+ }
+ });
+ },
+ update:function(){
+ var $this=$(this),
+ mCustomScrollBox=$this.children(".mCustomScrollBox"),
+ mCSB_container=mCustomScrollBox.children(".mCSB_container");
+ mCSB_container.removeClass("mCS_no_scrollbar");
+ $this.removeClass("mCS_disabled mCS_destroyed");
+ mCustomScrollBox.scrollTop(0).scrollLeft(0); /*reset scrollTop/scrollLeft to prevent browser focus scrolling*/
+ var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"),
+ mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"),
+ mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger");
+ if($this.data("horizontalScroll")){
+ var mCSB_buttonLeft=mCSB_scrollTools.children(".mCSB_buttonLeft"),
+ mCSB_buttonRight=mCSB_scrollTools.children(".mCSB_buttonRight"),
+ mCustomScrollBoxW=mCustomScrollBox.width();
+ if($this.data("autoExpandHorizontalScroll")){
+ mCSB_container.css({"position":"absolute","width":"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap();
+ }
+ var mCSB_containerW=mCSB_container.outerWidth();
+ }else{
+ var mCSB_buttonUp=mCSB_scrollTools.children(".mCSB_buttonUp"),
+ mCSB_buttonDown=mCSB_scrollTools.children(".mCSB_buttonDown"),
+ mCustomScrollBoxH=mCustomScrollBox.height(),
+ mCSB_containerH=mCSB_container.outerHeight();
+ }
+ if(mCSB_containerH>mCustomScrollBoxH && !$this.data("horizontalScroll")){ /*content needs vertical scrolling*/
+ mCSB_scrollTools.css("display","block");
+ var mCSB_draggerContainerH=mCSB_draggerContainer.height();
+ /*auto adjust scrollbar dragger length analogous to content*/
+ if($this.data("autoDraggerLength")){
+ var draggerH=Math.round(mCustomScrollBoxH/mCSB_containerH*mCSB_draggerContainerH),
+ minDraggerH=mCSB_dragger.data("minDraggerHeight");
+ if(draggerH<=minDraggerH){ /*min dragger height*/
+ mCSB_dragger.css({"height":minDraggerH});
+ }else if(draggerH>=mCSB_draggerContainerH-10){ /*max dragger height*/
+ var mCSB_draggerContainerMaxH=mCSB_draggerContainerH-10;
+ mCSB_dragger.css({"height":mCSB_draggerContainerMaxH});
+ }else{
+ mCSB_dragger.css({"height":draggerH});
+ }
+ mCSB_dragger.children(".mCSB_dragger_bar").css({"line-height":mCSB_dragger.height()+"px"});
+ }
+ var mCSB_draggerH=mCSB_dragger.height(),
+ /*calculate and store scroll amount, add scrolling*/
+ scrollAmount=(mCSB_containerH-mCustomScrollBoxH)/(mCSB_draggerContainerH-mCSB_draggerH);
+ $this.data("scrollAmount",scrollAmount).mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight);
+ /*scroll*/
+ var mCSB_containerP=Math.abs(Math.round(mCSB_container.position().top));
+ $this.mCustomScrollbar("scrollTo",mCSB_containerP,{callback:false});
+ }else if(mCSB_containerW>mCustomScrollBoxW && $this.data("horizontalScroll")){ /*content needs horizontal scrolling*/
+ mCSB_scrollTools.css("display","block");
+ var mCSB_draggerContainerW=mCSB_draggerContainer.width();
+ /*auto adjust scrollbar dragger length analogous to content*/
+ if($this.data("autoDraggerLength")){
+ var draggerW=Math.round(mCustomScrollBoxW/mCSB_containerW*mCSB_draggerContainerW),
+ minDraggerW=mCSB_dragger.data("minDraggerWidth");
+ if(draggerW<=minDraggerW){ /*min dragger height*/
+ mCSB_dragger.css({"width":minDraggerW});
+ }else if(draggerW>=mCSB_draggerContainerW-10){ /*max dragger height*/
+ var mCSB_draggerContainerMaxW=mCSB_draggerContainerW-10;
+ mCSB_dragger.css({"width":mCSB_draggerContainerMaxW});
+ }else{
+ mCSB_dragger.css({"width":draggerW});
+ }
+ }
+ var mCSB_draggerW=mCSB_dragger.width(),
+ /*calculate and store scroll amount, add scrolling*/
+ scrollAmount=(mCSB_containerW-mCustomScrollBoxW)/(mCSB_draggerContainerW-mCSB_draggerW);
+ $this.data("scrollAmount",scrollAmount).mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight);
+ /*scroll*/
+ var mCSB_containerP=Math.abs(Math.round(mCSB_container.position().left));
+ $this.mCustomScrollbar("scrollTo",mCSB_containerP,{callback:false});
+ }else{ /*content does not need scrolling*/
+ /*unbind events, reset content position, hide scrollbars, remove classes*/
+ mCustomScrollBox.unbind("mousewheel focusin");
+ if($this.data("horizontalScroll")){
+ mCSB_dragger.add(mCSB_container).css("left",0);
+ }else{
+ mCSB_dragger.add(mCSB_container).css("top",0);
+ }
+ mCSB_scrollTools.css("display","none");
+ mCSB_container.addClass("mCS_no_scrollbar");
+ $this.data({"bindEvent_mousewheel":false,"bindEvent_focusin":false});
+ }
+ },
+ scrolling:function(mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight){
+ var $this=$(this);
+ /*while scrolling callback*/
+ $this.mCustomScrollbar("callbacks","whileScrolling");
+ /*drag scrolling*/
+ if(!mCSB_dragger.hasClass("ui-draggable")){ /*apply drag function once*/
+ if($this.data("horizontalScroll")){
+ var draggableAxis="x";
+ }else{
+ var draggableAxis="y";
+ }
+ mCSB_dragger.draggable({
+ axis:draggableAxis,
+ containment:"parent",
+ drag:function(event,ui){
+ $this.mCustomScrollbar("scroll");
+ mCSB_dragger.addClass("mCSB_dragger_onDrag");
+ },
+ stop:function(event,ui){
+ mCSB_dragger.removeClass("mCSB_dragger_onDrag");
+ }
+ });
+ }
+ if(!$this.data("bindEvent_scrollbar_click")){ /*bind once*/
+ mCSB_draggerContainer.bind("click",function(e){
+ if($this.data("horizontalScroll")){
+ var mouseCoord=(e.pageX-mCSB_draggerContainer.offset().left);
+ if(mouseCoord<mCSB_dragger.position().left || mouseCoord>(mCSB_dragger.position().left+mCSB_dragger.width())){
+ var scrollToPos=mouseCoord;
+ if(scrollToPos>=mCSB_draggerContainer.width()-mCSB_dragger.width()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.width()-mCSB_dragger.width();
+ }
+ mCSB_dragger.css("left",scrollToPos);
+ $this.mCustomScrollbar("scroll");
+ }
+ }else{
+ var mouseCoord=(e.pageY-mCSB_draggerContainer.offset().top);
+ if(mouseCoord<mCSB_dragger.position().top || mouseCoord>(mCSB_dragger.position().top+mCSB_dragger.height())){
+ var scrollToPos=mouseCoord;
+ if(scrollToPos>=mCSB_draggerContainer.height()-mCSB_dragger.height()){ /*max dragger position is bottom*/
+ scrollToPos=mCSB_draggerContainer.height()-mCSB_dragger.height();
+ }
+ mCSB_dragger.css("top",scrollToPos);
+ $this.mCustomScrollbar("scroll");
+ }
+ }
+ });
+ $this.data({"bindEvent_scrollbar_click":true});
+ }
+ /*mousewheel scrolling*/
+ if($this.data("mouseWheel")){
+ var mousewheelVel=$this.data("mouseWheel");
+ if($this.data("mouseWheel")==="auto"){
+ mousewheelVel=8; /*default mousewheel velocity*/
+ /*check for safari browser on mac osx to lower mousewheel velocity*/
+ var os=navigator.userAgent;
+ if(os.indexOf("Mac")!=-1 && os.indexOf("Safari")!=-1 && os.indexOf("AppleWebKit")!=-1 && os.indexOf("Chrome")==-1){
+ mousewheelVel=1;
+ }
+ }
+ if(!$this.data("bindEvent_mousewheel")){ /*bind once*/
+ mCustomScrollBox.bind("mousewheel",function(event,delta){
+ event.preventDefault();
+ var vel=Math.abs(delta*mousewheelVel);
+ if($this.data("horizontalScroll")){
+ if($this.data("mouseWheel")==="pixels"){
+ if(delta<0){
+ delta=-1;
+ }else{
+ delta=1;
+ }
+ var scrollTo=Math.abs(Math.round(mCSB_container.position().left))-(delta*$this.data("mouseWheelPixels"));
+ $this.mCustomScrollbar("scrollTo",scrollTo);
+ }else{
+ var posX=mCSB_dragger.position().left-(delta*vel);
+ mCSB_dragger.css("left",posX);
+ if(mCSB_dragger.position().left<0){
+ mCSB_dragger.css("left",0);
+ }
+ var mCSB_draggerContainerW=mCSB_draggerContainer.width(),
+ mCSB_draggerW=mCSB_dragger.width();
+ if(mCSB_dragger.position().left>mCSB_draggerContainerW-mCSB_draggerW){
+ mCSB_dragger.css("left",mCSB_draggerContainerW-mCSB_draggerW);
+ }
+ $this.mCustomScrollbar("scroll");
+ }
+ }else{
+ if($this.data("mouseWheel")==="pixels"){
+ if(delta<0){
+ delta=-1;
+ }else{
+ delta=1;
+ }
+ var scrollTo=Math.abs(Math.round(mCSB_container.position().top))-(delta*$this.data("mouseWheelPixels"));
+ $this.mCustomScrollbar("scrollTo",scrollTo);
+ }else{
+ var posY=mCSB_dragger.position().top-(delta*vel);
+ mCSB_dragger.css("top",posY);
+ if(mCSB_dragger.position().top<0){
+ mCSB_dragger.css("top",0);
+ }
+ var mCSB_draggerContainerH=mCSB_draggerContainer.height(),
+ mCSB_draggerH=mCSB_dragger.height();
+ if(mCSB_dragger.position().top>mCSB_draggerContainerH-mCSB_draggerH){
+ mCSB_dragger.css("top",mCSB_draggerContainerH-mCSB_draggerH);
+ }
+ $this.mCustomScrollbar("scroll");
+ }
+ }
+ });
+ $this.data({"bindEvent_mousewheel":true});
+ }
+ }
+ /*buttons scrolling*/
+ if($this.data("scrollButtons_enable")){
+ if($this.data("scrollButtons_scrollType&