vendor: 51,397 bytes, lines 1-1209
1/* 2 * jQuery FlexSlider v2.6.3 3 * Copyright 2012 WooThemes 4 * Contributing Author: Tyler Smith 5 */ 6; 7(function ($) { 8 9 var focused = true; 10 11 // Turns a mouse event into a touch event 12 function toTouchEvent(e) { 13 var touch = { 14 identifier: 0, 15 target: e.target, 16 screenX: e.screenX, 17 screenY: e.screenY, 18 clientX: e.clientX, 19 clientY: e.clientY, 20 pageX: e.pageX, 21 pageY: e.pageY 22 } 23 var touchEvent = { 24 touches: [touch], 25 targetTouches: [touch], 26 changedTouches: [touch], 27 altKey: e.altKey, 28 metaKey: e.metaKey, 29 ctrlKey: e.ctrlKey, 30 shiftKey: e.shiftKey, 31 target: e.target, 32 preventDefault: e.preventDefault.bind(e), 33 type: e.type === 'mousedown' ? 'touchstart' : e.type === 'mousemove' ? 'touchmove' : e.type === 'mouseup' ? 'touchend' : e.type, 34 timeStamp: e.timeStamp || Date.now() 35 } 36 return touchEvent 37 } 38 39 //FlexSlider: Object Instance 40 $.flexslider = function(el, options) { 41 var slider = $(el); 42 43 // making variables public 44 slider.vars = $.extend({}, $.flexslider.defaults, options); 45 46 var namespace = slider.vars.namespace, 47 msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture, 48 // touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch, 49 touch = /*(( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) &&*/ slider.vars.touch, 50 // depricating this idea, as devices are being released with both of these events 51 eventType = "click touchend MSPointerUp keyup", 52 watchedEvent = "", 53 watchedEventClearTimer, 54 vertical = slider.vars.direction === "vertical", 55 reverse = slider.vars.reverse, 56 carousel = (slider.vars.itemWidth > 0), 57 fade = slider.vars.animation === "fade", 58 asNav = slider.vars.asNavFor !== "", 59 methods = {}; 60 61 // Store a reference to the slider object 62 $.data(el, "flexslider", slider); 63 64 // Private slider methods 65 methods = { 66 init: function() { 67 slider.animating = false; 68 // Get current slide and make sure it is a number 69 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 ); 70 if ( isNaN( slider.currentSlide ) ) { slider.currentSlide = 0; } 71 slider.animatingTo = slider.currentSlide; 72 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last); 73 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' ')); 74 slider.slides = $(slider.vars.selector, slider); 75 slider.container = $(slider.containerSelector, slider); 76 slider.count = slider.slides.length; 77 // SYNC: 78 slider.syncExists = $(slider.vars.sync).length > 0; 79 // SLIDE: 80 if (slider.vars.animation === "slide") { slider.vars.animation = "swing"; } 81 slider.prop = (vertical) ? "top" : "marginLeft"; 82 slider.args = {}; 83 // SLIDESHOW: 84 slider.manualPause = false; 85 slider.stopped = false; 86 //PAUSE WHEN INVISIBLE 87 slider.started = false; 88 slider.startTimeout = null; 89 // TOUCH/USECSS: 90 slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() { 91 var obj = document.createElement('div'), 92 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; 93 for (var i in props) { 94 if ( obj.style[ props[i] ] !== undefined ) { 95 slider.pfx = props[i].replace('Perspective','').toLowerCase(); 96 slider.prop = "-" + slider.pfx + "-transform"; 97 return true; 98 } 99 } 100 return false; 101 }()); 102 slider.ensureAnimationEnd = ''; 103 // CONTROLSCONTAINER: 104 if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer); 105 // MANUAL: 106 if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls); 107 108 // CUSTOM DIRECTION NAV: 109 if (slider.vars.customDirectionNav !== "") slider.customDirectionNav = $(slider.vars.customDirectionNav).length === 2 && $(slider.vars.customDirectionNav); 110 111 // RANDOMIZE: 112 if (slider.vars.randomize) { 113 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); 114 slider.container.empty().append(slider.slides); 115 } 116 117 slider.doMath(); 118 119 // INIT 120 slider.setup("init"); 121 122 // CONTROLNAV: 123 if (slider.vars.controlNav) { methods.controlNav.setup(); } 124 125 // DIRECTIONNAV: 126 if (slider.vars.directionNav) { methods.directionNav.setup(); } 127 128 // KEYBOARD: 129 if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) { 130 $(document).bind('keyup', function(event) { 131 var keycode = event.keyCode; 132 if (!slider.animating && (keycode === 39 || keycode === 37)) { 133 var target = (keycode === 39) ? slider.getTarget('next') : 134 (keycode === 37) ? slider.getTarget('prev') : false; 135 slider.flexAnimate(target, slider.vars.pauseOnAction); 136 } 137 }); 138 } 139 // MOUSEWHEEL: 140 if (slider.vars.mousewheel) { 141 slider.bind('mousewheel', function(event, delta, deltaX, deltaY) { 142 event.preventDefault(); 143 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev'); 144 slider.flexAnimate(target, slider.vars.pauseOnAction); 145 }); 146 } 147 148 // PAUSEPLAY 149 if (slider.vars.pausePlay) { methods.pausePlay.setup(); } 150 151 //PAUSE WHEN INVISIBLE 152 if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible.init(); } 153 154 // SLIDSESHOW 155 if (slider.vars.slideshow) { 156 if (slider.vars.pauseOnHover) { 157 slider.hover(function() { 158 if (!slider.manualPlay && !slider.manualPause) { slider.pause(); } 159 }, function() { 160 if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); } 161 }); 162 } 163 // initialize animation 164 //If we're visible, or we don't use PageVisibility API 165 if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) { 166 (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play(); 167 } 168 } 169 170 // ASNAV: 171 if (asNav) { methods.asNav.setup(); } 172 173 // TOUCH 174 if (touch && slider.vars.touch) { methods.touch(); } 175 176 // FADE&&SMOOTHHEIGHT || SLIDE: 177 if (!fade || (fade && slider.vars.smoothHeight)) { $(window).bind("resize orientationchange", methods.resize); } 178 179 slider.find("img").attr("draggable", "false"); 180 181 // API: start() Callback 182 setTimeout(function(){ 183 slider.vars.start(slider); 184 }, 200); 185 }, 186 asNav: { 187 setup: function() { 188 slider.asNav = true; 189 slider.animatingTo = Math.floor(slider.currentSlide/slider.move); 190 slider.currentItem = slider.currentSlide; 191 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide"); 192 if(!msGesture){ 193 slider.slides.on(eventType, function(e){ 194 e.preventDefault(); 195 var $slide = $(this), 196 target = $slide.index(); 197 var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container 198 if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) { 199 slider.flexAnimate(slider.getTarget("prev"), true); 200 } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) { 201 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 202 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 203 } 204 }); 205 }else{ 206 el._slider = slider; 207 slider.slides.each(function (){ 208 var that = this; 209 that._gesture = new MSGesture(); 210 that._gesture.target = that; 211 that.addEventListener("MSPointerDown", function (e){ 212 e.preventDefault(); 213 if(e.currentTarget._gesture) { 214 e.currentTarget._gesture.addPointer(e.pointerId); 215 } 216 }, false); 217 that.addEventListener("MSGestureTap", function (e){ 218 e.preventDefault(); 219 var $slide = $(this), 220 target = $slide.index(); 221 if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) { 222 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 223 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 224 } 225 }); 226 }); 227 } 228 } 229 }, 230 controlNav: { 231 setup: function() { 232 if (!slider.manualControls) { 233 methods.controlNav.setupPaging(); 234 } else { // MANUALCONTROLS: 235 methods.controlNav.setupManual(); 236 } 237 }, 238 setupPaging: function() { 239 var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging', 240 j = 1, 241 item, 242 slide; 243 244 slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>'); 245 246 if (slider.pagingCount > 1) { 247 for (var i = 0; i < slider.pagingCount; i++) { 248 slide = slider.slides.eq(i); 249 if ( undefined === slide.attr( 'data-thumb-alt' ) ) { slide.attr( 'data-thumb-alt', '' ); } 250 var altText = ( '' !== slide.attr( 'data-thumb-alt' ) ) ? altText = ' alt="' + slide.attr( 'data-thumb-alt' ) + '"' : ''; 251 item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"' + altText + '/>' : '<a href="#">' + j + '</a>'; 252 if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) { 253 var captn = slide.attr( 'data-thumbcaption' ); 254 if ( '' !== captn && undefined !== captn ) { item += '<span class="' + namespace + 'caption">' + captn + '</span>'; } 255 } 256 slider.controlNavScaffold.append('<li>' + item + '</li>'); 257 j++; 258 } 259 } 260 261 // CONTROLSCONTAINER: 262 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold); 263 methods.controlNav.set(); 264 265 methods.controlNav.active(); 266 267 slider.controlNavScaffold.delegate('a, img', eventType, function(event) { 268 event.preventDefault(); 269 270 if (watchedEvent === "" || watchedEvent === event.type) { 271 var $this = $(this), 272 target = slider.controlNav.index($this); 273 274 if (!$this.hasClass(namespace + 'active')) { 275 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 276 slider.flexAnimate(target, slider.vars.pauseOnAction); 277 } 278 } 279 280 // setup flags to prevent event duplication 281 if (watchedEvent === "") { 282 watchedEvent = event.type; 283 } 284 methods.setToClearWatchedEvent(); 285 286 }); 287 }, 288 setupManual: function() { 289 slider.controlNav = slider.manualControls; 290 methods.controlNav.active(); 291 292 slider.controlNav.bind(eventType, function(event) { 293 event.preventDefault(); 294 295 if (watchedEvent === "" || watchedEvent === event.type) { 296 var $this = $(this), 297 target = slider.controlNav.index($this); 298 299 if (!$this.hasClass(namespace + 'active')) { 300 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev"; 301 slider.flexAnimate(target, slider.vars.pauseOnAction); 302 } 303 } 304 305 // setup flags to prevent event duplication 306 if (watchedEvent === "") { 307 watchedEvent = event.type; 308 } 309 methods.setToClearWatchedEvent(); 310 }); 311 }, 312 set: function() { 313 var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a'; 314 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider); 315 }, 316 active: function() { 317 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active"); 318 }, 319 update: function(action, pos) { 320 if (slider.pagingCount > 1 && action === "add") { 321 slider.controlNavScaffold.append($('<li><a href="#">' + slider.count + '</a></li>')); 322 } else if (slider.pagingCount === 1) { 323 slider.controlNavScaffold.find('li').remove(); 324 } else { 325 slider.controlNav.eq(pos).closest('li').remove(); 326 } 327 methods.controlNav.set(); 328 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active(); 329 } 330 }, 331 directionNav: { 332 setup: function() { 333 var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li class="' + namespace + 'nav-prev"><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li class="' + namespace + 'nav-next"><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>'); 334 335 // CUSTOM DIRECTION NAV: 336 if (slider.customDirectionNav) { 337 slider.directionNav = slider.customDirectionNav; 338 // CONTROLSCONTAINER: 339 } else if (slider.controlsContainer) { 340 $(slider.controlsContainer).append(directionNavScaffold); 341 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer); 342 } else { 343 slider.append(directionNavScaffold); 344 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider); 345 } 346 347 methods.directionNav.update(); 348 349 slider.directionNav.bind(eventType, function(event) { 350 event.preventDefault(); 351 var target; 352 353 if (watchedEvent === "" || watchedEvent === event.type) { 354 target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev'); 355 slider.flexAnimate(target, slider.vars.pauseOnAction); 356 } 357 358 // setup flags to prevent event duplication 359 if (watchedEvent === "") { 360 watchedEvent = event.type; 361 } 362 methods.setToClearWatchedEvent(); 363 }); 364 }, 365 update: function() { 366 var disabledClass = namespace + 'disabled'; 367 if (slider.pagingCount === 1 || slider.pagingCount < 1) { 368 slider.directionNav.addClass(disabledClass).attr('tabindex', '-1'); 369 slider.directionNav.parent().addClass(disabledClass); 370 } else if (!slider.vars.animationLoop) { 371 if (slider.animatingTo === 0) { 372 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1'); 373 slider.directionNav.parent().removeClass(disabledClass); 374 slider.directionNav.filter('.' + namespace + "prev").parent().addClass(disabledClass); 375 } else if (slider.animatingTo === slider.last) { 376 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1'); 377 slider.directionNav.parent().removeClass(disabledClass); 378 slider.directionNav.filter('.' + namespace + "next").parent().addClass(disabledClass); 379 } else { 380 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 381 slider.directionNav.parent().removeClass(disabledClass); 382 } 383 } else { 384 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 385 slider.directionNav.parent().removeClass(disabledClass); 386 } 387 } 388 }, 389 pausePlay: { 390 setup: function() { 391 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a href="#"></a></div>'); 392 393 // CONTROLSCONTAINER: 394 if (slider.controlsContainer) { 395 slider.controlsContainer.append(pausePlayScaffold); 396 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer); 397 } else { 398 slider.append(pausePlayScaffold); 399 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider); 400 } 401 402 methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play'); 403 404 slider.pausePlay.bind(eventType, function(event) { 405 event.preventDefault(); 406 407 if (watchedEvent === "" || watchedEvent === event.type) { 408 if ($(this).hasClass(namespace + 'pause')) { 409 slider.manualPause = true; 410 slider.manualPlay = false; 411 slider.pause(); 412 } else { 413 slider.manualPause = false; 414 slider.manualPlay = true; 415 slider.play(); 416 } 417 } 418 419 // setup flags to prevent event duplication 420 if (watchedEvent === "") { 421 watchedEvent = event.type; 422 } 423 methods.setToClearWatchedEvent(); 424 }); 425 }, 426 update: function(state) { 427 (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText); 428 } 429 }, 430 touch: function() { 431 var startX, 432 startY, 433 offset, 434 cwidth, 435 dx, 436 startT, 437 onTouchStart, 438 onTouchMove, 439 onTouchEnd, 440 onMouseStart, 441 onMouseMove, 442 onMouseEnd, 443 scrolling = false, 444 localX = 0, 445 localY = 0, 446 accDx = 0, 447 simulateTouch = slider.vars.simulateTouch; 448 449 if(!msGesture){ 450 onTouchStart = function(e) { 451 var links = (('touches' in e) && $(e.target)[0].nodeName == "A"); 452 453 if (slider.animating) { 454 e.preventDefault(); 455 } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) { 456 slider.pause(); 457 // CAROUSEL: 458 cwidth = (vertical) ? slider.h : slider.w; 459 startT = Number(new Date()); 460 // CAROUSEL: 461 462 // Local vars for X and Y points. 463 localX = e.touches[0].pageX; 464 localY = e.touches[0].pageY; 465 466 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 467 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 468 (carousel && slider.currentSlide === slider.last) ? slider.limit : 469 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 470 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 471 startX = (vertical) ? localY : localX; 472 startY = (vertical) ? localX : localY; 473 474 el.addEventListener('touchmove', onTouchMove, false); 475 el.addEventListener('touchend', onTouchEnd, false); 476 477 if (simulateTouch && !links) { 478 el.addEventListener('mousemove', onMouseMove, false); 479 el.addEventListener('mouseup', onMouseEnd, false); 480 } 481 } 482 }; 483 484 onTouchMove = function(e) { 485 // Local vars for X and Y points. 486 487 localX = e.touches[0].pageX; 488 localY = e.touches[0].pageY; 489 490 dx = (vertical) ? startX - localY : startX - localX; 491 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY)); 492 493 var fxms = 500; 494 495 if ( ! scrolling || Number( new Date() ) - startT > fxms ) { 496 e.preventDefault(); 497 if (!fade && slider.transitions) { 498 if (!slider.vars.animationLoop) { 499 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1); 500 } 501 slider.setProps(offset + dx, "setTouch"); 502 } 503 } 504 }; 505 506 onTouchEnd = function(e) { 507 var links = (('touches' in e) && $(e.target)[0].nodeName == "A"); 508 509 // finish the touch by undoing the touch session 510 el.removeEventListener('touchmove', onTouchMove, false); 511 512 if (simulateTouch && !links) { 513 el.removeEventListener('mousemove', onMouseMove, false); 514 } 515 516 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 517 var updateDx = (reverse) ? -dx : dx, 518 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 519 520 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 521 slider.flexAnimate(target, slider.vars.pauseOnAction); 522 } else { 523 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); } 524 } 525 } 526 el.removeEventListener('touchend', onTouchEnd, false); 527 528 if (simulateTouch && !links) { 529 el.removeEventListener('mouseup', onMouseEnd, false); 530 } 531 532 startX = null; 533 startY = null; 534 dx = null; 535 offset = null; 536 }; 537 538 onMouseStart = function(e) { 539 onTouchStart.call(this, toTouchEvent(e)); 540 }; 541 542 onMouseMove = function(e) { 543 onTouchMove.call(this, toTouchEvent(e)); 544 }; 545 546 onMouseEnd = function(e) { 547 onTouchEnd.call(this, toTouchEvent(e)); 548 }; 549 550 el.addEventListener('touchstart', onTouchStart, false); 551 552 if (simulateTouch) { 553 el.addEventListener('mousedown', onMouseStart, false); 554 } 555 }else{ 556 el.style.msTouchAction = "none"; 557 el._gesture = new MSGesture(); 558 el._gesture.target = el; 559 el.addEventListener("MSPointerDown", onMSPointerDown, false); 560 el._slider = slider; 561 el.addEventListener("MSGestureChange", onMSGestureChange, false); 562 el.addEventListener("MSGestureEnd", onMSGestureEnd, false); 563 564 function onMSPointerDown(e){ 565 e.stopPropagation(); 566 if (slider.animating) { 567 e.preventDefault(); 568 }else{ 569 slider.pause(); 570 el._gesture.addPointer(e.pointerId); 571 accDx = 0; 572 cwidth = (vertical) ? slider.h : slider.w; 573 startT = Number(new Date()); 574 // CAROUSEL: 575 576 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 577 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 578 (carousel && slider.currentSlide === slider.last) ? slider.limit : 579 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 580 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 581 } 582 } 583 584 function onMSGestureChange(e) { 585 e.stopPropagation(); 586 var slider = e.target._slider; 587 if(!slider){ 588 return; 589 } 590 var transX = -e.translationX, 591 transY = -e.translationY; 592 593 //Accumulate translations. 594 accDx = accDx + ((vertical) ? transY : transX); 595 dx = accDx; 596 scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY)); 597 598 if(e.detail === e.MSGESTURE_FLAG_INERTIA){ 599 setImmediate(function (){ 600 el._gesture.stop(); 601 }); 602 603 return; 604 } 605 606 if (!scrolling || Number(new Date()) - startT > 500) { 607 e.preventDefault(); 608 if (!fade && slider.transitions) { 609 if (!slider.vars.animationLoop) { 610 dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1); 611 } 612 slider.setProps(offset + dx, "setTouch"); 613 } 614 } 615 } 616 617 function onMSGestureEnd(e) { 618 e.stopPropagation(); 619 var slider = e.target._slider; 620 if(!slider){ 621 return; 622 } 623 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 624 var updateDx = (reverse) ? -dx : dx, 625 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 626 627 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 628 slider.flexAnimate(target, slider.vars.pauseOnAction); 629 } else { 630 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); } 631 } 632 } 633 634 startX = null; 635 startY = null; 636 dx = null; 637 offset = null; 638 accDx = 0; 639 } 640 } 641 }, 642 resize: function() { 643 if (!slider.animating && slider.is(':visible')) { 644 // aspro fix start 645 if(slider.vars.autoHeight !== undefined && slider.vars.autoHeight) { 646 slider.viewport.find('li').css('height', ''); 647 } 648 // aspro fix end 649 if (!carousel) { slider.doMath(); } 650 651 if (fade) { 652 // SMOOTH HEIGHT: 653 methods.smoothHeight(); 654 } else if (carousel) { //CAROUSEL: 655 slider.slides.width(slider.computedW); 656 657 slider.update(slider.pagingCount); 658 // slider.setProps(); 659 } 660 else if (vertical) { //VERTICAL: 661 slider.viewport.height(slider.h); 662 slider.setProps(slider.h, "setTotal"); 663 // aspro fix start 664 slider.viewport.find('li').css('height', slider.h); 665 // aspro fix end 666 } else { 667 // SMOOTH HEIGHT: 668 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 669 slider.newSlides.width(slider.computedW); 670 slider.setProps(slider.computedW, "setTotal"); 671 } 672 } 673 }, 674 smoothHeight: function(dur) { 675 if (!vertical || fade) { 676 var $obj = (fade) ? slider : slider.viewport; 677 (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).innerHeight()}, dur) : $obj.innerHeight(slider.slides.eq(slider.animatingTo).innerHeight()); 678 } 679 }, 680 sync: function(action) { 681 var $obj = $(slider.vars.sync).data("flexslider"), 682 target = slider.animatingTo; 683 684 switch (action) { 685 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break; 686 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break; 687 case "pause": $obj.pause(); break; 688 } 689 }, 690 uniqueID: function($clone) { 691 // Append _clone to current level and children elements with id attributes 692 $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() { 693 var $this = $(this); 694 $this.attr( 'id', $this.attr( 'id' ) + '_clone' ); 695 }); 696 return $clone; 697 }, 698 pauseInvisible: { 699 visProp: null, 700 init: function() { 701 var visProp = methods.pauseInvisible.getHiddenProp(); 702 if (visProp) { 703 var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; 704 document.addEventListener(evtname, function() { 705 if (methods.pauseInvisible.isHidden()) { 706 if(slider.startTimeout) { 707 clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible 708 } else { 709 slider.pause(); //Or just pause 710 } 711 } 712 else { 713 if(slider.started) { 714 slider.play(); //Initiated before, just play 715 } else { 716 if (slider.vars.initDelay > 0) { 717 setTimeout(slider.play, slider.vars.initDelay); 718 } else { 719 slider.play(); //Didn't init before: simply init or wait for it 720 } 721 } 722 } 723 }); 724 } 725 }, 726 isHidden: function() { 727 var prop = methods.pauseInvisible.getHiddenProp(); 728 if (!prop) { 729 return false; 730 } 731 return document[prop]; 732 }, 733 getHiddenProp: function() { 734 var prefixes = ['webkit','moz','ms','o']; 735 // if 'hidden' is natively supported just return it 736 if ('hidden' in document) { 737 return 'hidden'; 738 } 739 // otherwise loop over all the known prefixes until we find one 740 for ( var i = 0; i < prefixes.length; i++ ) { 741 if ((prefixes[i] + 'Hidden') in document) { 742 return prefixes[i] + 'Hidden'; 743 } 744 } 745 // otherwise it's not supported 746 return null; 747 } 748 }, 749 setToClearWatchedEvent: function() { 750 clearTimeout(watchedEventClearTimer); 751 watchedEventClearTimer = setTimeout(function() { 752 watchedEvent = ""; 753 }, 3000); 754 } 755 }; 756 757 // public methods 758 slider.flexAnimate = function(target, pause, override, withSync, fromNav) { 759 if (!slider.vars.animationLoop && target !== slider.currentSlide) { 760 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 761 } 762 763 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev"; 764 765 if (!slider.animating && (slider.canAdvance(target, fromNav) || override)/* && slider.is(":visible")*/) { 766 if (asNav && withSync) { 767 var master = $(slider.vars.asNavFor).data('flexslider'); 768 slider.atEnd = target === 0 || target === slider.count - 1; 769 master.flexAnimate(target, true, false, true, fromNav); 770 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 771 master.direction = slider.direction; 772 773 // ++ added by kach 774 slider.currentItem = target; 775 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 776 var newtarget = Math.floor((target + 1)/slider.visible) > 0 ? (Math.floor((target + 1 - slider.visible) / slider.move)) : 0; 777 if(newtarget != slider.currentSlide){ 778 target = newtarget; 779 } 780 else{ 781 return false; 782 } 783 // ++ 784 785 // -- removed by kach 786 /* 787 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) { 788 slider.currentItem = target; 789 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 790 target = Math.floor(target/slider.visible); 791 } else { 792 slider.currentItem = target; 793 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 794 return false; 795 }*/ 796 797 // -- 798 } 799 800 slider.animating = true; 801 slider.animatingTo = target; 802 803 // SLIDESHOW: 804 if (pause) { slider.pause(); } 805 806 // API: before() animation Callback 807 slider.vars.before(slider); 808 809 // SYNC: 810 if (slider.syncExists && !fromNav) { methods.sync("animate"); } 811 812 // CONTROLNAV 813 if (slider.vars.controlNav) { methods.controlNav.active(); } 814 815 // !CAROUSEL: 816 // CANDIDATE: slide active class (for add/remove slide) 817 if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); } 818 819 // INFINITE LOOP: 820 // CANDIDATE: atEnd 821 slider.atEnd = target === 0 || target === slider.last; 822 823 // DIRECTIONNAV: 824 if (slider.vars.directionNav) { methods.directionNav.update(); } 825 826 if (target === slider.last) { 827 // API: end() of cycle Callback 828 slider.vars.end(slider); 829 // SLIDESHOW && !INFINITE LOOP: 830 if (!slider.vars.animationLoop) { slider.pause(); } 831 } 832 833 // SLIDE: 834 if (!fade) { 835 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW, 836 margin, slideString, calcNext; 837 838 // INFINITE LOOP / REVERSE: 839 if (carousel) { 840 margin = slider.vars.itemMargin; 841 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo; 842 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext; 843 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") { 844 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0; 845 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") { 846 slideString = (reverse) ? 0 : (slider.count + 1) * dimension; 847 } else { 848 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension; 849 } 850 slider.setProps(slideString, "", slider.vars.animationSpeed); 851 if (slider.transitions) { 852 if (!slider.vars.animationLoop || !slider.atEnd) { 853 slider.animating = false; 854 slider.currentSlide = slider.animatingTo; 855 } 856 857 // Unbind previous transitionEnd events and re-bind new transitionEnd event 858 slider.container.unbind("webkitTransitionEnd transitionend"); 859 slider.container.bind("webkitTransitionEnd transitionend", function() { 860 clearTimeout(slider.ensureAnimationEnd); 861 slider.wrapup(dimension); 862 }); 863 864 // Insurance for the ever-so-fickle transitionEnd event 865 clearTimeout(slider.ensureAnimationEnd); 866 slider.ensureAnimationEnd = setTimeout(function() { 867 slider.wrapup(dimension); 868 }, slider.vars.animationSpeed + 100); 869 870 } else { 871 slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){ 872 slider.wrapup(dimension); 873 }); 874 } 875 } else { // FADE: 876 if (!touch) { 877 slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing); 878 slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 879 } else { 880 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 }); 881 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 }); 882 slider.wrapup(dimension); 883 } 884 } 885 // SMOOTH HEIGHT: 886 if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); } 887 } 888 }; 889 slider.wrapup = function(dimension) { 890 // SLIDE: 891 if (!fade && !carousel) { 892 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) { 893 slider.setProps(dimension, "jumpEnd"); 894 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) { 895 slider.setProps(dimension, "jumpStart"); 896 } 897 } 898 slider.animating = false; 899 slider.currentSlide = slider.animatingTo; 900 // API: after() animation Callback 901 slider.vars.after(slider); 902 }; 903 904 // SLIDESHOW: 905 slider.animateSlides = function() { 906 if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); } 907 }; 908 // SLIDESHOW: 909 slider.pause = function() { 910 clearInterval(slider.animatedSlides); 911 slider.animatedSlides = null; 912 slider.playing = false; 913 // PAUSEPLAY: 914 if (slider.vars.pausePlay) { methods.pausePlay.update("play"); } 915 // SYNC: 916 if (slider.syncExists) { methods.sync("pause"); } 917 }; 918 // SLIDESHOW: 919 slider.play = function() { 920 if (slider.playing) { clearInterval(slider.animatedSlides); } 921 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 922 slider.started = slider.playing = true; 923 // PAUSEPLAY: 924 if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); } 925 // SYNC: 926 if (slider.syncExists) { methods.sync("play"); } 927 }; 928 slider.smoothHeight = function(){ 929 methods.smoothHeight(); 930 }; 931 // STOP: 932 slider.stop = function () { 933 slider.pause(); 934 slider.stopped = true; 935 }; 936 slider.canAdvance = function(target, fromNav) { 937 // ASNAV: 938 var last = (asNav) ? slider.pagingCount - 1 : slider.last; 939 return (fromNav) ? true : 940 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true : 941 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false : 942 (target === slider.currentSlide && !asNav) ? false : 943 (slider.vars.animationLoop) ? true : 944 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false : 945 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false : 946 true; 947 }; 948 slider.getTarget = function(dir) { 949 slider.direction = dir; 950 if (dir === "next") { 951 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1; 952 } else { 953 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1; 954 } 955 }; 956 957 // SLIDE: 958 slider.setProps = function(pos, special, dur) { 959 var target = (function() { 960 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo, 961 posCalc = (function() { 962 if (carousel) { 963 return (special === "setTouch") ? pos : 964 (reverse && slider.animatingTo === slider.last) ? 0 : 965 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 966 (slider.animatingTo === slider.last) ? slider.limit : posCheck; 967 } else { 968 switch (special) { 969 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos; 970 case "setTouch": return (reverse) ? pos : pos; 971 case "jumpEnd": return (reverse) ? pos : slider.count * pos; 972 case "jumpStart": return (reverse) ? slider.count * pos : pos; 973 default: return pos; 974 } 975 } 976 }()); 977 978 return (posCalc * -1) + "px"; 979 }()); 980 981 982 983 if (slider.transitions) { 984 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)"; 985 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s"; 986 slider.container.css("-" + slider.pfx + "-transition-duration", dur); 987 slider.container.css("transition-duration", dur); 988 } 989 990 slider.args[slider.prop] = target; 991 if (slider.transitions || dur === undefined) { slider.container.css(slider.args); } 992 993 slider.container.css('transform',target); 994 }; 995 996 slider.setup = function(type) { 997 // SLIDE: 998 if (!fade) { 999 var sliderOffset, arr; 1000 1001 if (type === "init") { 1002 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container); 1003 // INFINITE LOOP: 1004 slider.cloneCount = 0; 1005 slider.cloneOffset = 0; 1006 // REVERSE: 1007 if (reverse) { 1008 arr = $.makeArray(slider.slides).reverse(); 1009 slider.slides = $(arr); 1010 slider.container.empty().append(slider.slides); 1011 } 1012 } 1013 // INFINITE LOOP && !CAROUSEL: 1014 if (slider.vars.animationLoop && !carousel) { 1015 slider.cloneCount = 2; 1016 slider.cloneOffset = 1; 1017 // aspro fix start 1018 slider.viewport.find('li').css('height', slider.h); 1019 // aspro fix end 1020 // clear out old clones 1021 if (type !== "init") { slider.container.find('.clone').remove(); } 1022 slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true')) 1023 .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true')); 1024 } 1025 slider.newSlides = $(slider.vars.selector, slider); 1026 1027 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset; 1028 // VERTICAL: 1029 if (vertical && !carousel) { 1030 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 1031 setTimeout(function(){ 1032 slider.newSlides.css({"display": "block"}); 1033 slider.doMath(); 1034 slider.viewport.height(slider.h); 1035 slider.setProps(sliderOffset * slider.h, "init"); 1036 }, (type === "init") ? 100 : 0); 1037 } else { 1038 slider.container.width((slider.count + slider.cloneCount) * 200 + "%"); 1039 slider.setProps(sliderOffset * slider.computedW, "init"); 1040 setTimeout(function(){ 1041 slider.doMath(); 1042 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "left", "display": "block"}); 1043 // SMOOTH HEIGHT: 1044 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 1045 }, (type === "init") ? 100 : 0); 1046 } 1047 } else { // FADE: 1048 slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"}); 1049 if (type === "init") { 1050 if (!touch) { 1051 //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing); 1052 if (slider.vars.fadeFirstSlide == false) { 1053 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1}); 1054 } else { 1055 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); 1056 } 1057 } else { 1058 slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2}); 1059 } 1060 } 1061 // SMOOTH HEIGHT: 1062 if (slider.vars.smoothHeight) { methods.smoothHeight(); } 1063 } 1064 // !CAROUSEL: 1065 // CANDIDATE: active slide 1066 if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); } 1067 1068 //FlexSlider: init() Callback 1069 slider.vars.init(slider); 1070 }; 1071 1072 slider.doMath = function() { 1073 var slide = slider.slides.first(), 1074 slideMargin = slider.vars.itemMargin, 1075 minItems = slider.vars.minItems, 1076 maxItems = slider.vars.maxItems; 1077 1078 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width(); 1079 slider.h = slide.height(); 1080 // aspro fix start 1081 var height = 0; 1082 if(vertical) { 1083 slider.slides.each(function(i, el) { 1084 var elHeight = $(el).height(); 1085 if(elHeight > height){ 1086 height = elHeight; 1087 } 1088 }); 1089 slider.h = height; 1090 } 1091 // aspro fix end 1092 slider.boxPadding = slide.outerWidth() - slide.width(); 1093 1094 // CAROUSEL: 1095 if (carousel) { 1096 slider.itemT = slider.vars.itemWidth + slideMargin; 1097 slider.itemM = slideMargin; 1098 slider.minW = (minItems) ? minItems * slider.itemT : slider.w; 1099 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w; 1100 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems : 1101 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems : 1102 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth; 1103 1104 slider.visible = Math.floor(slider.w / slider.itemW); // -- removed by kach 1105 // slider.visible = Math.floor((slider.itemT > slider.itemW ? slider.w + slider.itemM : slider.w)/(slider.itemT > slider.itemW ? slider.itemT : slider.itemW)); // ++ added by kach 1106 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible; 1107 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1); 1108 1109 slider.last = slider.pagingCount - 1; 1110 slider.limit = (slider.pagingCount === 1) ? 0 : 1111 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin; 1112 } else { 1113 slider.itemW = slider.w; 1114 slider.itemM = slideMargin; 1115 slider.pagingCount = slider.count; 1116 slider.last = slider.count - 1; 1117 } 1118 slider.computedW = slider.itemW - slider.boxPadding; 1119 slider.computedM = slider.itemM; 1120 }; 1121 1122 slider.update = function(pos, action) { 1123 slider.doMath(); 1124 1125 // update currentSlide and slider.animatingTo if necessary 1126 if (!carousel) { 1127 if (pos < slider.currentSlide) { 1128 slider.currentSlide += 1; 1129 } else if (pos <= slider.currentSlide && pos !== 0) { 1130 slider.currentSlide -= 1; 1131 } 1132 slider.animatingTo = slider.currentSlide; 1133 } 1134 1135 // update controlNav 1136 if (slider.vars.controlNav && !slider.manualControls) { 1137 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) { 1138 methods.controlNav.update("add"); 1139 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) { 1140 /*if (carousel && slider.currentSlide > slider.last) { 1141 slider.currentSlide -= 1; 1142 slider.animatingTo -= 1; 1143 }*/ 1144 methods.controlNav.update("remove", slider.last); 1145 } 1146 } 1147 // update directionNav 1148 if (slider.vars.directionNav) { methods.directionNav.update(); } 1149 1150 }; 1151 1152 slider.addSlide = function(obj, pos) { 1153 var $obj = $(obj); 1154 1155 slider.count += 1; 1156 slider.last = slider.count - 1; 1157 1158 // append new slide 1159 if (vertical && reverse) { 1160 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj); 1161 } else { 1162 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj); 1163 } 1164 1165 // update currentSlide, animatingTo, controlNav, and directionNav 1166 slider.update(pos, "add"); 1167 1168 // update slider.slides 1169 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1170 // re-setup the slider to accomdate new slide 1171 slider.setup(); 1172 1173 //FlexSlider: added() Callback 1174 slider.vars.added(slider); 1175 }; 1176 slider.removeSlide = function(obj) { 1177 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj; 1178 1179 // update count 1180 slider.count -= 1; 1181 slider.last = slider.count - 1; 1182 1183 // remove slide 1184 if (isNaN(obj)) { 1185 $(obj, slider.slides).remove(); 1186 } else { 1187 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove(); 1188 } 1189 1190 // update currentSlide, animatingTo, controlNav, and directionNav 1191 slider.doMath(); 1192 slider.update(pos, "remove"); 1193 1194 // update slider.slides 1195 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1196 // re-setup the slider to accomdate new slide 1197 slider.setup(); 1198 1199 // FlexSlider: removed() Callback 1200 slider.vars.removed(slider); 1201 }; 1202 1203 //FlexSlider: Initialize 1204 methods.init(); 1205 }; 1206 1207 // Ensure the slider isn't focussed if the window loses focus. 1208 $( window ).blur( function ( e ) { 1209 focused = false;
1210 }).focus( function ( e ) { 1211 focused = true; 1212 }); 1213 1214 //FlexSlider: Default Settings 1215 $.flexslider.defaults = { 1216 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin 1217 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril 1218 animation: "fade", //String: Select your animation type, "fade" or "slide" 1219 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported! 1220 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 1221 reverse: false, //{NEW} Boolean: Reverse the animation direction 1222 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 1223 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode 1224 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 1225 slideshow: true, //Boolean: Animate slider automatically 1226 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 1227 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds 1228 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds 1229 randomize: false, //Boolean: Randomize slide order 1230 fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade" 1231 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav. 1232 1233 // Usability features 1234 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended. 1235 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 1236 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage. 1237 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available 1238 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices 1239 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches 1240 simulateTouch: false, //{NEW} Boolean: Allow mouse swipe navigation of the slider. Requires touch to be true 1241 1242 // Primary Controls 1243 controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage 1244 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 1245 prevText: "Previous", //String: Set the text for the "previous" directionNav item 1246 nextText: "Next", //String: Set the text for the "next" directionNav item 1247 1248 // Secondary Navigation 1249 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys 1250 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present. 1251 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel 1252 pausePlay: false, //Boolean: Create pause/play dynamic element 1253 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item 1254 playText: "Play", //String: Set the text for the "play" pausePlay item 1255 1256 // Special properties 1257 controlsContainer: "", //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found. 1258 manualControls: "", //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs. 1259 customDirectionNav: "", //{NEW}
vendor: 3,359 bytes, lines 1259-1312
1259 jQuery Object/Selector: Custom prev / next button. Must be two jQuery elements. In order to make the events work they have to have the classes "prev" and "next" (plus namespace) 1260 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care. 1261 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider 1262 1263 // Carousel Options 1264 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding. 1265 itemMargin: 0, //{NEW} Integer: Margin between carousel items. 1266 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this. 1267 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit. 1268 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items. 1269 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide 1270 1271 // Callback API 1272 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide 1273 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation 1274 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes 1275 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 1276 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added 1277 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed 1278 init: function() {} //{NEW} Callback: function(slider) - Fires after the slider is initially setup 1279 }; 1280 1281 //FlexSlider: Plugin Function 1282 $.fn.flexslider = function(options) { 1283 if (options === undefined) { options = {}; } 1284 1285 if (typeof options === "object") { 1286 return this.each(function() { 1287 var $this = $(this), 1288 selector = (options.selector) ? options.selector : ".slides > li", 1289 $slides = $this.find(selector); 1290 1291 if ( ( $slides.length === 1 && options.allowOneSlide === false ) || $slides.length === 0 ) { 1292 $slides.fadeIn(400); 1293 if (options.start) { options.start($this); } 1294 } else if ($this.data('flexslider') === undefined) { 1295 new $.flexslider(this, options); 1296 } 1297 }); 1298 } else { 1299 // Helper strings to quickly perform functions on the slider 1300 var $slider = $(this).data('flexslider'); 1301 switch (options) { 1302 case "play": $slider.play(); break; 1303 case "pause": $slider.pause(); break; 1304 case "stop": $slider.stop(); break; 1305 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break; 1306 case "prev": 1307 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break; 1308 default: if (typeof options === "number") { $slider.flexAnimate(options, true); } 1309 } 1310 } 1311 }; 1312})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.