diff options
Diffstat (limited to 'usecaseui-holmes/src/main/webapp/public/common/js/jquery.sly.js')
-rw-r--r-- | usecaseui-holmes/src/main/webapp/public/common/js/jquery.sly.js | 1446 |
1 files changed, 0 insertions, 1446 deletions
diff --git a/usecaseui-holmes/src/main/webapp/public/common/js/jquery.sly.js b/usecaseui-holmes/src/main/webapp/public/common/js/jquery.sly.js deleted file mode 100644 index ce3390ff..00000000 --- a/usecaseui-holmes/src/main/webapp/public/common/js/jquery.sly.js +++ /dev/null @@ -1,1446 +0,0 @@ -/*! - * jQuery Sly v0.9.6 - * https://github.com/Darsain/sly - * - * Licensed under the MIT license. - * http://www.opensource.org/licenses/MIT - */ - -/*jshint eqeqeq: true, noempty: true, strict: true, undef: true, expr: true, smarttabs: true, browser: true */ -/*global jQuery:false */ - -;(function($, undefined){ -'use strict'; - -// Plugin names -var pluginName = 'sly', - namespace = 'plugin_' + pluginName; - -/** - * Plugin class - * - * @class - * @param {Element} frame DOM element of sly container - * @param {Object} o Object with plugin options - */ -function Plugin( frame, o ){ - - // Alias for this - var self = this, - - // Frame variables - $frame = $(frame), - $slidee = $frame.children().eq(0), - frameSize = 0, - slideeSize = 0, - pos = { - cur: 0, - max: 0, - min: 0 - }, - - // Scrollbar variables - $sb = $(o.scrollBar).eq(0), - $handle = $sb.length ? $sb.children().eq(0) : 0, - sbSize = 0, - handleSize = 0, - hPos = { - cur: 0, - max: 0, - min: 0 - }, - - // Pagesbar variables - $pb = $(o.pagesBar), - $pages = 0, - pages = [], - - // Navigation type booleans - basicNav = o.itemNav === 'basic', - smartNav = o.itemNav === 'smart', - forceCenteredNav = o.itemNav === 'forceCentered', - centeredNav = o.itemNav === 'centered' || forceCenteredNav, - itemNav = basicNav || smartNav || centeredNav || forceCenteredNav, - - // Other variables - $items = 0, - items = [], - rel = { - firstItem: 0, - lastItem: 1, - centerItem: 1, - activeItem: -1, - activePage: 0, - items: 0, - pages: 0 - }, - $scrollSource = o.scrollSource ? $( o.scrollSource ) : $frame, - $dragSource = o.dragSource ? $( o.dragSource ) : $frame, - $prevButton = $(o.prev), - $nextButton = $(o.next), - $prevPageButton = $(o.prevPage), - $nextPageButton = $(o.nextPage), - cycleIndex = 0, - cycleIsPaused = 0, - isDragging = 0, - callbacks = {}; - - - /** - * (Re)Loading function - * - * Populates arrays, sets sizes, binds events, ... - * - * @public - */ - var load = this.reload = function(){ - - // Local variables - var ignoredMargin = 0, - oldPos = $.extend({}, pos); - - // Clear cycling timeout - clearTimeout( cycleIndex ); - - // Reset global variables - frameSize = o.horizontal ? $frame.width() : $frame.height(); - sbSize = o.horizontal ? $sb.width() : $sb.height(); - slideeSize = o.horizontal ? $slidee.outerWidth() : $slidee.outerHeight(); - $items = $slidee.children(); - items = []; - pages = []; - - // Set position limits & relatives - pos.min = 0; - pos.max = slideeSize > frameSize ? slideeSize - frameSize : 0; - rel.items = $items.length; - - // Sizes & offsets logic, but only when needed - if( itemNav ){ - - var marginStart = getPx( $items, o.horizontal ? 'marginLeft' : 'marginTop' ), - marginEnd = getPx( $items.slice(-1), o.horizontal ? 'marginRight' : 'marginBottom' ), - centerOffset = 0, - paddingStart = getPx( $slidee, o.horizontal ? 'paddingLeft' : 'paddingTop' ), - paddingEnd = getPx( $slidee, o.horizontal ? 'paddingRight' : 'paddingBottom' ), - areFloated = $items.css('float') !== 'none'; - - // Update ignored margin - ignoredMargin = marginStart ? 0 : marginEnd; - - // Reset slideeSize - slideeSize = 0; - - // Iterate through items - $items.each(function(i,e){ - - // Item - var item = $(e), - itemSize = o.horizontal ? item.outerWidth(true) : item.outerHeight(true), - marginTop = getPx( item, 'marginTop' ), - marginBottom = getPx( item, 'marginBottom'), - marginLeft = getPx( item, 'marginLeft'), - marginRight = getPx( item, 'marginRight'), - itemObj = { - size: itemSize, - offStart: slideeSize - ( !i || o.horizontal ? 0 : marginTop ), - offCenter: slideeSize - Math.round( frameSize / 2 - itemSize / 2 ), - offEnd: slideeSize - frameSize + itemSize - ( marginStart ? 0 : marginRight ), - margins: { - top: marginTop, - bottom: marginBottom, - left: marginLeft, - right: marginRight - } - }; - - // Account for centerOffset & slidee padding - if( !i ){ - centerOffset = -( forceCenteredNav ? Math.round( frameSize / 2 - itemSize / 2 ) : 0 ) + paddingStart; - slideeSize += paddingStart; - } - - // Increment slidee size for size of the active element - slideeSize += itemSize; - - // Try to account for vertical margin collapsing in vertical mode - // It's not bulletproof, but should work in 99% of cases - if( !o.horizontal && !areFloated ){ - - // Subtract smaller margin, but only when top margin is not 0, and this is not the first element - if( marginBottom && marginTop && i > 0 ){ - slideeSize -= marginTop < marginBottom ? marginTop : marginBottom; - } - - } - - // Things to be done at last item - if( i === $items.length - 1 ){ - slideeSize += paddingEnd; - } - - // Add item object to items array - items.push(itemObj); - - }); - - // Resize slidee - $slidee.css( o.horizontal ? { width: slideeSize+'px' } : { height: slideeSize+'px' } ); - - // Adjust slidee size for last margin - slideeSize -= ignoredMargin; - - // Set limits - pos.min = centerOffset; - pos.max = forceCenteredNav ? items[items.length-1].offCenter : slideeSize > frameSize ? slideeSize - frameSize : 0; - - // Fix overflowing activeItem - rel.activeItem >= items.length && self.activate( items.length-1 ); - - } - - // Assign relative position indexes - assignRelatives(); - - // Scrollbar - if( $handle ){ - - // Stretch scrollbar handle to represent the visible area - handleSize = o.dynamicHandle ? Math.round( sbSize * frameSize / slideeSize ) : o.horizontal ? $handle.width() : $handle.height(); - handleSize = handleSize > sbSize ? sbSize : handleSize; - handleSize = handleSize < o.minHandleSize ? o.minHandleSize : handleSize; - hPos.max = sbSize - handleSize; - - // Resize handle - $handle.css( o.horizontal ? { width: handleSize+'px' } : { height: handleSize+'px' } ); - - } - - // Pages - var tempPagePos = 0, - pagesHtml = '', - pageIndex = 0; - - // Populate pages array - if( forceCenteredNav ){ - pages = $.map( items, function( o ){ return o.offCenter; } ); - } else { - while( tempPagePos - frameSize < pos.max ){ - - var pagePos = tempPagePos > pos.max ? pos.max : tempPagePos; - - pages.push( pagePos ); - tempPagePos += frameSize; - - // When item navigation, and last page is smaller than half of the last item size, - // adjust the last page position to pos.max and break the loop - if( tempPagePos > pos.max && itemNav && pos.max - pagePos < ( items[items.length-1].size - ignoredMargin ) / 2 ){ - - pages[pages.length-1] = pos.max; - break; - - } - - } - } - - // Pages bar - if( $pb.length ){ - - for( var i = 0; i < pages.length; i++ ){ - pagesHtml += o.pageBuilder( pageIndex++ ); - } - - // Bind page navigation, append to pagesbar, and save to $pages variable - $pages = $(pagesHtml).bind('click.' + namespace, function(){ - - self.activatePage( $pages.index(this) ); - - }).appendTo( $pb.empty() ); - - } - - // Bind activating to items - $items.unbind('.' + namespace).bind('mouseup.' + namespace, function(e){ - - e.which === 1 && !isDragging && self.activate( this ); - - }); - - // Fix overflowing - pos.cur < pos.min && slide( pos.min ); - pos.cur > pos.max && slide( pos.max ); - - // Extend relative variables object with some useful info - rel.pages = pages.length; - rel.slideeSize = slideeSize; - rel.frameSize = frameSize; - rel.sbSize = sbSize; - rel.handleSize = handleSize; - - // Synchronize scrollbar - syncBars(0); - - // Disable buttons - disableButtons(); - - // Automatic cycling - if( itemNav && o.cycleBy ){ - - var pauseEvents = 'mouseenter.' + namespace + ' mouseleave.' + namespace; - - // Pause on hover - o.pauseOnHover && $frame.unbind(pauseEvents).bind(pauseEvents, function(e){ - - !cycleIsPaused && self.cycle( e.type === 'mouseenter', 1 ); - - }); - - // Initiate cycling - self.cycle( o.startPaused ); - - } - - // Trigger :load event - $frame.trigger( pluginName + ':load', [ $.extend({}, pos, { old: oldPos }), $items, rel ] ); - - }; - - - /** - * Slide the slidee - * - * @private - * - * @param {Int} newPos New slidee position in relation to frame - * @param {Bool} align Whetner to Align elements to the frame border - * @param {Int} speed Animation speed in milliseconds - */ - function slide( newPos, align, speed ){ - - speed = isNumber( speed ) ? speed : o.speed; - - // Align items - if( align && itemNav ){ - - var tempRel = getRelatives( newPos ); - - if( centeredNav ){ - - newPos = items[tempRel.centerItem].offCenter; - self[ forceCenteredNav ? 'activate' : 'toCenter']( tempRel.centerItem, 1 ); - - } else if( newPos > pos.min && newPos < pos.max ){ - - newPos = items[tempRel.firstItem].offStart; - - } - - } - - // Fix overflowing position - if( !isDragging || !o.elasticBounds ){ - newPos = newPos < pos.min ? pos.min : newPos; - newPos = newPos > pos.max ? pos.max : newPos; - } - - // Stop if position has not changed - if( newPos === pos.cur ) { - return; - } else { - pos.cur = newPos; - } - - // Reassign relative indexes - assignRelatives(); - - // Add disabled classes - disableButtons(); - - // halt ongoing animations - stop(); - - // Trigger :move event - !isDragging && $frame.trigger( pluginName + ':move', [ pos, $items, rel ] ); - - var newProp = o.horizontal ? { left: -pos.cur+'px' } : { top: -pos.cur+'px' }; - - // Slidee move - if( speed > 16 ){ - - $slidee.animate( newProp, speed, isDragging ? 'swing' : o.easing, function(e){ - - // Trigger :moveEnd event - !isDragging && $frame.trigger( pluginName + ':moveEnd', [ pos, $items, rel ] ); - - }); - - } else { - - $slidee.css( newProp ); - - // Trigger :moveEnd event - !isDragging && $frame.trigger( pluginName + ':moveEnd', [ pos, $items, rel ] ); - - } - - } - - - /** - * Synchronizes scrollbar & pagesbar positions with the slidee - * - * @private - * - * @param {Int} speed Animation speed for scrollbar synchronization - */ - function syncBars( speed ){ - - // Scrollbar synchronization - if ($handle) { - - hPos.cur = Math.round( ( pos.cur - pos.min ) / ( pos.max - pos.min ) * hPos.max ); - hPos.cur = hPos.cur < hPos.min ? hPos.min : hPos.cur > hPos.max ? hPos.max : hPos.cur; - $handle.stop().animate( o.horizontal ? { left: hPos.cur+'px' } : { top: hPos.cur+'px' }, isNumber(speed) ? speed : o.speed, o.easing ); - - } - - // Pagesbar synchronization - syncPages(); - - } - - - /** - * Synchronizes pagesbar - * - * @private - */ - function syncPages(){ - - if (!$pages.length) { - return; - } - - // Classes - $pages.removeClass(o.activeClass).eq(rel.activePage).addClass(o.activeClass); - - } - - - /** - * Activate previous item - * - * @public - */ - this.prev = function(){ - - self.activate( rel.activeItem - 1 ); - - }; - - - /** - * Activate next item - * - * @public - */ - this.next = function(){ - - self.activate( rel.activeItem + 1 ); - - }; - - - /** - * Activate previous page - * - * @public - */ - this.prevPage = function(){ - - self.activatePage( rel.activePage - 1 ); - - }; - - - /** - * Activate next page - * - * @public - */ - this.nextPage = function(){ - - self.activatePage( rel.activePage + 1 ); - - }; - - - /** - * Stop ongoing animations - * - * @private - */ - function stop(){ - - $slidee.add($handle).stop(); - - } - - - /** - * Animate element or the whole slidee to the start of the frame - * - * @public - * - * @param {Element|Int} el DOM element, or index of element in items array - */ - this.toStart = function( el ){ - - if( itemNav ){ - - var index = getIndex( el ); - - if( el === undefined ){ - - slide( pos.min, 1 ); - - } else if( index !== -1 ){ - - // You can't align items to the start of the frame when centeredNav is enabled - if (centeredNav) { - return; - } - - index !== -1 && slide( items[index].offStart ); - - } - - } else { - - if( el === undefined ){ - - slide( pos.min ); - - } else { - - var $el = $slidee.find(el).eq(0); - - if( $el.length ){ - - var offset = o.horizontal ? $el.offset().left - $slidee.offset().left : $el.offset().top - $slidee.offset().top; - - slide( offset ); - - } - - } - - } - - syncBars(); - - }; - - - /** - * Animate element or the whole slidee to the end of the frame - * - * @public - * - * @param {Element|Int} el DOM element, or index of element in items array - */ - this.toEnd = function( el ){ - - if( itemNav ){ - - var index = getIndex( el ); - - if( el === undefined ){ - - slide( pos.max, 1 ); - - } else if( index !== -1 ){ - - // You can't align items to the end of the frame when centeredNav is enabled - if (centeredNav) { - return; - } - - slide( items[index].offEnd ); - - } - - } else { - - if( el === undefined ){ - - slide( pos.max ); - - } else { - - var $el = $slidee.find(el).eq(0); - - if( $el.length ){ - - var offset = o.horizontal ? $el.offset().left - $slidee.offset().left : $el.offset().top - $slidee.offset().top; - - slide( offset - frameSize + $el[o.horizontal ? 'outerWidth' : 'outerHeight']() ); - - } - - } - - } - - syncBars(); - - }; - - - /** - * Animate element or the whole slidee to the center of the frame - * - * @public - * - * @param {Element|Int} el DOM element, or index of element in items array - */ - this.toCenter = function( el ){ - - if( itemNav ){ - - var index = getIndex( el ); - - if( el === undefined ){ - - slide( Math.round( pos.max / 2 + pos.min / 2 ), 1 ); - - } else if( index !== -1 ){ - - slide( items[index].offCenter ); - forceCenteredNav && self.activate( index, 1 ); - - } - - } else { - - if( el === undefined ){ - - slide( Math.round( pos.max / 2 ) ); - - } else { - - var $el = $slidee.find(el).eq(0); - - if( $el.length ){ - - var offset = o.horizontal ? $el.offset().left - $slidee.offset().left : $el.offset().top - $slidee.offset().top; - - slide( offset - frameSize / 2 + $el[o.horizontal ? 'outerWidth' : 'outerHeight']() / 2 ); - - } - - } - - - } - - syncBars(); - - }; - - - /** - * Get an index of the element - * - * @private - * - * @param {Element|Int} el DOM element, or index of element in items array - */ - function getIndex( el ){ - - return isNumber(el) ? el < 0 ? 0 : el > items.length-1 ? items.length-1 : el : el === undefined ? -1 : $items.index( el ); - - } - - - /** - * Parse style to pixels - * - * @private - * - * @param {Object} $item jQuery object with element - * @param {Property} property Property to get the pixels from - */ - function getPx( $item, property ){ - - return parseInt( $item.css( property ), 10 ); - - } - - - /** - * Activates an element - * - * Element is positioned to one of the sides of the frame, based on it's current position. - * If the element is close to the right frame border, it will be animated to the start of the left border, - * and vice versa. This helps user to navigate through the elements only by clicking on them, without - * the need for navigation buttons, scrolling, or keyboard arrows. - * - * @public - * - * @param {Element|Int} el DOM element, or index of element in items array - * @param {Bool} noReposition Activate item without repositioning it - */ - this.activate = function( el, noReposition ){ - - if (!itemNav || el === undefined) { - return; - } - - var index = getIndex( el ), - oldActive = rel.activeItem; - - // Update activeItem index - rel.activeItem = index; - - // Add active class to the active element - $items.removeClass(o.activeClass).eq(index).addClass(o.activeClass); - - // Trigget :active event if a new element is being activated - index !== oldActive && $items.eq( index ).trigger( pluginName + ':active', [ $items, rel ] ); - - if( !noReposition ){ - - // When centeredNav is enabled, center the element - if( centeredNav ){ - - self.toCenter( index ); - - // Otherwise determine where to position the element - } else if( smartNav ) { - - // If activated element is currently on the far right side of the frame, assume that - // user is moving forward and animate it to the start of the visible frame, and vice versa - if (index >= rel.lastItem) { - self.toStart(index); - } else if (index <= rel.firstItem) { - self.toEnd(index); - } - - } - - } - - // Add disabled classes - disableButtons(); - - }; - - - /** - * Activates a page - * - * @public - * - * @param {Int} index Page index, starting from 0 - */ - this.activatePage = function( index ){ - - // Fix overflowing - index = index < 0 ? 0 : index >= pages.length ? pages.length-1 : index; - slide( pages[index], itemNav ); - - syncBars(); - - }; - - - /** - * Return relative positions of items based on their location within visible frame - * - * @private - * - * @param {Int} sPos Position of slidee - */ - function getRelatives( sPos ){ - - var newRel = {}, - centerOffset = forceCenteredNav ? 0 : frameSize / 2; - - // Determine active page - for( var p = 0; p < pages.length; p++ ){ - - if( sPos >= pos.max || p === pages.length - 1 ){ - newRel.activePage = pages.length - 1; - break; - } - - if( sPos <= pages[p] + centerOffset ){ - newRel.activePage = p; - break; - } - - } - - // Relative item indexes - if( itemNav ){ - - var first = false, - last = false, - center = false; - - /* From start */ - for( var i=0; i < items.length; i++ ){ - - // First item - if (first === false && sPos <= items[i].offStart) { - first = i; - } - - // Centered item - if (center === false && sPos - items[i].size / 2 <= items[i].offCenter) { - center = i; - } - - // Last item - if (i === items.length - 1 || (last === false && sPos < items[i + 1].offEnd)) { - last = i; - } - - // Terminate if all are assigned - if (last !== false) { - break; - } - - } - - // Safe assignment, just to be sure the false won't be returned - newRel.firstItem = isNumber( first ) ? first : 0; - newRel.centerItem = isNumber( center ) ? center : newRel.firstItem; - newRel.lastItem = isNumber( last ) ? last : newRel.centerItem; - - } - - return newRel; - - } - - - /** - * Assign element indexes to the relative positions - * - * @private - */ - function assignRelatives(){ - - $.extend( rel, getRelatives( pos.cur ) ); - - } - - - /** - * Disable buttons when needed - * - * Adds disabledClass, and when the button is <button> or <input>, - * activates :disabled state - * - * @private - */ - function disableButtons(){ - - // item navigation - if( itemNav ){ - - var isFirstItem = rel.activeItem === 0, - isLastItem = rel.activeItem >= items.length-1; - - if( $prevButton.is('button,input') ){ - $prevButton.prop('disabled', isFirstItem); - } - - if( $nextButton.is('button,input') ){ - $nextButton.prop('disabled', isLastItem); - } - - $prevButton[ isFirstItem ? 'removeClass' : 'addClass'](o.disabledClass); - $nextButton[ isLastItem ? 'removeClass' : 'addClass'](o.disabledClass); - - } - - // pages navigation - if( $pages.length ){ - - var isStart = pos.cur <= pos.min, - isEnd = pos.cur >= pos.max; - - if( $prevPageButton.is('button,input') ){ - $prevPageButton.prop('disabled', isStart); - } - - if( $nextPageButton.is('button,input') ){ - $nextPageButton.prop('disabled', isEnd); - } - - $prevPageButton[ isStart ? 'removeClass' : 'addClass'](o.disabledClass); - $nextPageButton[ isEnd ? 'removeClass' : 'addClass'](o.disabledClass); - - } - - } - - - /** - * Manage cycling - * - * @public - * - * @param {Bool} pause Pass true to pause cycling - * @param {Bool} soft Soft pause intended for pauseOnHover - won't set cycleIsPaused variable to true - */ - this.cycle = function( pause, soft ){ - - if (!itemNav || !o.cycleBy) { - return; - } - - if( !soft ){ - cycleIsPaused = !!pause; - } - - if( pause ){ - - if( cycleIndex ){ - - cycleIndex = clearTimeout( cycleIndex ); - - // Trigger :cyclePause event - $frame.trigger( pluginName + ':cyclePause', [ pos, $items, rel ] ); - - } - - } else { - - // Don't initiate more than one cycle - if (cycleIndex) { - return; - } - - // Trigger :cycleStart event - $frame.trigger( pluginName + ':cycleStart', [ pos, $items, rel ] ); - - // Cycling loop - (function loop(){ - - if( o.cycleInterval === 0 ){ - return; - } - - cycleIndex = setTimeout( function(){ - - if( !isDragging ){ - switch( o.cycleBy ){ - - case 'items': - var nextItem = rel.activeItem >= items.length-1 ? 0 : rel.activeItem + 1; - self.activate( nextItem ); - break; - - case 'pages': - var nextPage = rel.activePage >= pages.length-1 ? 0 : rel.activePage + 1; - self.activatePage( nextPage ); - break; - - } - } - - // Trigger :cycle event - $frame.trigger( pluginName + ':cycle', [ pos, $items, rel ] ); - - // Cycle the cycle! - loop(); - - }, o.cycleInterval ); - - }()); - - } - - }; - - - /** - * Crossbrowser reliable way to stop default event action - * - * @private - * - * @param {Event} e Event object - * @param {Bool} noBubbles Cancel event bubbling - */ - function stopDefault( e, noBubbles ){ - - var evt = e || window.event; - evt.preventDefault ? evt.preventDefault() : evt.returnValue = false; - noBubbles && evt.stopPropagation ? evt.stopPropagation() : evt.cancelBubble = true; - - } - - - /** - * Updates a signle or multiple option values - * - * @param {Mixed} property Option property name that should be updated, or object with options that will extend the current one - * @param {Mixed} value Option property value - * - * @public - */ - this.set = function( property, value ){ - - if( $.isPlainObject(property) ){ - - o = $.extend({}, o, property); - - } else if( typeof property === 'string' ) { - - o[property] = value; - - } - - }; - - - /** - * Destroys plugin instance and everything it created - * - * @public - */ - this.destroy = function(){ - - // Unbind all events - $frame.add(document).add($slidee).add($items).add($scrollSource).add($handle) - .add($prevButton).add($nextButton).add($prevPageButton).add($nextPageButton) - .unbind('.' + namespace); - - // Reset some styles - $slidee.add($handle).css( o.horizontal ? { left: 0 } : { top: 0 } ); - - // Remove plugin classes - $prevButton.add($nextButton).removeClass(o.disabledClass); - - // Remove page items - $pb.empty(); - - // Remove plugin from element data storage - $.removeData(frame, namespace); - - }; - - - /** - * Check if variable is a number - * - * @param {Mixed} n Any type of variable - * - * @return {Boolean} - */ - function isNumber( n ) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - - /** Constructor */ - (function(){ - - var doc = $(document), - dragEvents = 'mousemove.' + namespace + ' mouseup.' + namespace; - - // Extend options - o = $.extend( {}, $.fn[pluginName].defaults, o ); - - // Set required styles to elements - $frame.css({ overflow: 'hidden' }).css('position') === 'static' && $frame.css({ position: 'relative' }); - $sb.css('position') === 'static' && $sb.css({ position: 'relative' }); - $slidee.add($handle).css( o.horizontal ? { position: 'absolute', left: 0 } : { position: 'absolute', top: 0 } ); - - // Load - load(); - - // Activate requested position - itemNav ? self.activate( o.startAt ) : slide( o.startAt ); - - // Sync scrollbar & pages - syncBars(); - - // Scrolling navigation - o.scrollBy && $scrollSource.bind('DOMMouseScroll.' + namespace + ' mousewheel.' + namespace, function(e){ - - // If there is no scrolling to be done, leave the default event alone - if (pos.min === pos.max) { - return; - } - - stopDefault( e, 1 ); - - var orgEvent = e.originalEvent, - delta = 0, - isForward, nextItem; - - // Old school scrollwheel delta - if ( orgEvent.wheelDelta ){ delta = orgEvent.wheelDelta / 120; } - if ( orgEvent.detail ){ delta = -orgEvent.detail / 3; } - - isForward = delta < 0; - - if( itemNav ){ - - nextItem = getIndex( ( centeredNav ? forceCenteredNav ? rel.activeItem : rel.centerItem : rel.firstItem ) + ( isForward ? o.scrollBy : -o.scrollBy ) ); - - self[centeredNav ? forceCenteredNav ? 'activate' : 'toCenter' : 'toStart']( nextItem ); - - } else { - - slide( pos.cur + ( isForward ? o.scrollBy : -o.scrollBy ) ); - - } - - syncBars(); - - }); - - // Keyboard navigation - o.keyboardNav && doc.bind('keydown.' + namespace, function(e){ - - switch( e.keyCode || e.which ){ - - // Left or Up - case o.horizontal ? 37 : 38: - - stopDefault(e); - o.keyboardNavByPages ? self.prevPage() : self.prev(); - - break; - - // Right or Down - case o.horizontal ? 39 : 40: - - stopDefault(e); - o.keyboardNavByPages ? self.nextPage() : self.next(); - - break; - - } - - }); - - // Navigation buttons - o.prev && $prevButton.bind('click.' + namespace, function(e){ stopDefault(e); self.prev(); }); - o.next && $nextButton.bind('click.' + namespace, function(e){ stopDefault(e); self.next(); }); - o.prevPage && $prevPageButton.bind('click.' + namespace, function(e){ stopDefault(e); self.prevPage(); }); - o.nextPage && $nextPageButton.bind('click.' + namespace, function(e){ stopDefault(e); self.nextPage(); }); - - // Dragging navigation - o.dragContent && $dragSource.bind('mousedown.' + namespace, function(e){ - - // Ignore other than left mouse button - if (e.which !== 1) { - return; - } - - stopDefault(e); - - var leftInit = e.clientX, - topInit = e.clientY, - posInit = pos.cur, - start = +new Date(), - srcEl = e.target, - easeoff = 0, - isInitialized = 0; - - // Add dragging class - $slidee.addClass(o.draggedClass); - - // Stop potential ongoing animations - stop(); - - // Bind dragging events - doc.bind(dragEvents, function(e){ - - var released = e.type === 'mouseup', - path = o.horizontal ? e.clientX - leftInit : e.clientY - topInit, - newPos = posInit - path; - - // Initialized logic - if( !isInitialized && Math.abs( path ) > 10 ){ - - isInitialized = 1; - - // Trigger :dragStart event - $slidee.trigger( pluginName + ':dragStart', [ pos ] ); - - } - - // Limits & Elastic bounds - if( newPos > pos.max ){ - newPos = o.elasticBounds ? pos.max + ( newPos - pos.max ) / 6 : pos.max; - } else if( newPos < pos.min ){ - newPos = o.elasticBounds ? pos.min + ( newPos - pos.min ) / 6 : pos.min; - } - - // Adjust newPos with easing when content has been released - if( released ){ - - // Cleanup - doc.unbind(dragEvents); - $slidee.removeClass(o.draggedClass); - - // How long was the dragging - var time = +new Date() - start; - - // Calculate swing length - var swing = time < 300 ? Math.ceil( Math.pow( 6 / ( time / 300 ) , 2 ) * Math.abs( path ) / 120 ) : 0; - newPos += path > 0 ? -swing : swing; - - } - - // Drag only when isInitialized - if (!isInitialized) { - return; - } - - stopDefault(e); - - // Stop default click action on source element - if( srcEl ){ - - $(srcEl).bind('click.' + namespace, function stopMe(e){ - - stopDefault(e,true); - $(this).unbind('click.' + namespace, stopMe); - - }); - - srcEl = 0; - - } - - // Dragging state - isDragging = !released; - - // Animage, synch bars, & align - slide( newPos, released, released ? o.speed : 0 ); - syncBars( released ? null : 0 ); - - // Trigger :drag event - if (isInitialized) { - $slidee.trigger(pluginName + ':drag', [pos]); - } - - // Trigger :dragEnd event - if (released) { - $slidee.trigger(pluginName + ':dragEnd', [pos]); - } - - }); - - }); - - // Scrollbar navigation - $handle && o.dragHandle && $handle.bind('mousedown.' + namespace, function(e){ - - // Ignore other than left mouse button - if (e.which !== 1) { - return; - } - - stopDefault(e); - - var leftInit = e.clientX, - topInit = e.clientY, - posInit = hPos.cur, - pathMin = -hPos.cur, - pathMax = hPos.max - hPos.cur, - nextDrag = 0; - - // Add dragging class - $handle.addClass(o.draggedClass); - - // Stop potential ongoing animations - stop(); - - // Bind dragging events - doc.bind(dragEvents, function(e){ - - stopDefault(e); - - var released = e.type === 'mouseup', - path = o.horizontal ? e.clientX - leftInit : e.clientY - topInit, - newPos = posInit + path, - time = +new Date(); - - // Dragging state - isDragging = !released; - - // Unbind events and remove classes when released - if( released ){ - - doc.unbind(dragEvents); - $handle.removeClass(o.draggedClass); - - } - - // Execute only moves within path limits - if( path < pathMax+5 && path > pathMin-5 || released ){ - - // Fix overflows - hPos.cur = newPos > hPos.max ? hPos.max : newPos < hPos.min ? hPos.min : newPos; - - // Move handle - $handle.stop().css( o.horizontal ? { left: hPos.cur+'px' } : { top: hPos.cur+'px' } ); - - // Trigger :dragStart event - if (!nextDrag) { - $handle.trigger(pluginName + ':dragStart', [hPos]); - } - - // Trigger :drag event - $handle.trigger( pluginName + ':drag', [ hPos ] ); - - // Trigger :dragEnd event - if (released) { - $handle.trigger(pluginName + ':dragEnd', [hPos]); - } - - // Throttle sync interval -> smoother animations, lower CPU load - if( nextDrag <= time || released || path > pathMax || path < pathMin ){ - - nextDrag = time + 50; - - // Synchronize slidee position - slide( Math.round( hPos.cur / hPos.max * ( pos.max - pos.min ) ) + pos.min, released, released ? o.speed : 50 ); - - } - - // Sync pagesbar - syncPages(); - - } - - }); - - }); - - }()); - -} - - -// jQuery plugin extension -$.fn[pluginName] = function( options, returnInstance ){ - - var method = false, - methodArgs, - instances = []; - - // Basic attributes logic - if( typeof options !== 'undefined' && !$.isPlainObject( options ) ){ - method = options === false ? 'destroy' : options; - methodArgs = arguments; - Array.prototype.shift.call( methodArgs ); - } - - // Apply requested actions on all elements - this.each(function( i, element ){ - - // Plugin call with prevention against multiple instantiations - var plugin = $.data( element, namespace ); - - if( plugin && method ){ - - // Call plugin method - if( plugin[method] ){ - - plugin[method].apply( plugin, methodArgs ); - - } - - } else if( !plugin && !method ){ - - // Create a new plugin object if it doesn't exist yet - plugin = $.data( element, namespace, new Plugin( element, options ) ); - - } - - // Push plugin to instances - instances.push( plugin ); - - }); - - // Return chainable jQuery object, or plugin instance(s) - return returnInstance && !method ? instances.length > 1 ? instances : instances[0] : this; - -}; - - -// Default options -$.fn[pluginName].defaults = { - - // Sly direction - horizontal: 0, // set to 1 to change the sly direction to horizontal - - // Navigation by items; when using this, `scrollBy` option scrolls by items, not pixels - itemNav: 0, // enable type of item based navigation. when itemNav is enabled, items snap to frame edges or frame center - // itemNav also enables "item activation" functionality and methods associated with it - // - // itemNav can be: - // ------------------------------------------------------------------------------------ - // basic: items snap to edges (ideal if you don't care about "active item" functionality) - // smart: same as basic, but activated item close to, or outside of the visible edge will be positioned to the opposite edge - // centered: activated items are positioned to the center of visible frame if possible - // forceCentered: active items are always centered & centered items are always active (scrolling & dragging end activates centered item) - - // Scrollbar - scrollBar: null, // selector or DOM element for scrollbar container (scrollbar container should have one child element representing scrollbar handle) - dynamicHandle: 1, // resizes scrollbar handle to represent the relation between hidden and visible content. set to "0" to leave it as big as CSS made it - dragHandle: 1, // set to 0 to disable dragging of scrollbar handle with mouse - minHandleSize: 50, // minimal height or width (depends on sly direction) of a handle in pixels - - // Pagesbar (when centerActive is enabled, every item is considered to be a page) - pagesBar: null, // selector or DOM element for pages bar container - pageBuilder: // function with `index` (starting at 0) as argument that returns an HTML for one item - function( index ){ - return '<li>'+(index+1)+'</li>'; - }, - - // Navigation buttons - prev: null, // selector or DOM element for "previous item" button ; doesn't work when `itemsNav` is disabled - next: null, // selector or DOM element for "next item" button ; doesn't work when `itemsNav` is disabled - prevPage: null, // selector or DOM element for "previous page" button - nextPage: null, // selector or DOM element for "next page" button - - // Automated cycling - cycleBy: 0, // enable automatic cycling by 'items', or 'pages' - cycleInterval: 5000, // number of milliseconds between cycles - pauseOnHover: 1, // pause cycling when mouse hovers over frame - startPaused: 0, // set to "1" to start in paused sate. cycling can be than resumed with "cycle" method - - // Mixed options - scrollBy: 0, // how many pixels/items should one mouse scroll event go. leave "0" to disable mousewheel scrolling - dragContent: 0, // set to 1 to enable navigation by dragging the content with your mouse - elasticBounds: 0, // when dragging past limits, stretch them a little bit (like on spartphones) - speed: 300, // animations speed - easing: 'swing', // animations easing. build in jQuery options are "linear" and "swing". for more, install gsgd.co.uk/sandbox/jquery/easing/ - scrollSource: null, // selector or DOM element for catching the mouse wheel event for sly scrolling. default source is the frame - dragSource: null, // selector or DOM element for catching the mouse dragging events. default source is the frame - startAt: 0, // starting offset in pixels or items (depends on itemsNav option) - keyboardNav: 0, // whether to allow navigation by keyboard arrows (left & right for horizontal, up & down for vertical) - // NOTE! keyboard navigation will disable page scrolling with keyboard arrows in correspondent sly direction (vertical or horizontal) - keyboardNavByPages: 0, // whether the keyboard should navigate by pages instead of items (useful when not using `itemsNav` navigation) - - // Classes - draggedClass: 'dragged', // class that will be added to scrollbar handle, or content when they are being dragged - activeClass: 'active', // class that will be added to the active item, or page - disabledClass: 'disabled' // class that will be added to prev button when on start, or next button when on end - -}; - -}(jQuery));
\ No newline at end of file |