1/* 2 * jQuery FlexSlider v2.1 3 * http://www.woothemes.com/flexslider/ 4 * 5 * Copyright 2012 WooThemes 6 * Free to use under the GPLv2 license. 7 * http://www.gnu.org/licenses/gpl-2.0.html 8 * 9 * Contributing author: Tyler Smith (@mbmufffin) 10 */ 11 12; (function ($) { 13 // FlexSlider: Object Instance 14 $.flexslider = function (el, options) { 15 var slider = $(el), 16 vars = $.extend({}, $.flexslider.defaults, options), 17 namespace = vars.namespace, 18 touch = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch, 19 eventType = (touch) ? "touchend" : "click", 20 vertical = vars.direction === "vertical", 21 reverse = vars.reverse, 22 carousel = (vars.itemWidth > 0), 23 fade = vars.animation === "fade", 24 asNav = vars.asNavFor !== "", 25 methods = {}; 26 27 // Store a reference to the slider object 28 $.data(el, "flexslider", slider); 29 30 // Privat slider methods 31 methods = { 32 init: function () { 33 slider.animating = false; 34 slider.currentSlide = vars.startAt; 35 slider.animatingTo = slider.currentSlide; 36 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last); 37 slider.containerSelector = vars.selector.substr(0, vars.selector.search(' ')); 38 slider.slides = $(vars.selector, slider); 39 slider.container = $(slider.containerSelector, slider); 40 slider.count = slider.slides.length; 41 // SYNC: 42 slider.syncExists = $(vars.sync).length > 0; 43 // SLIDE: 44 if (vars.animation === "slide") vars.animation = "swing"; 45 slider.prop = (vertical) ? "top" : "marginLeft"; 46 slider.args = {}; 47 // SLIDESHOW: 48 slider.manualPause = false; 49 // TOUCH/USECSS: 50 slider.transitions = !vars.video && !fade && vars.useCSS && (function () { 51 var obj = document.createElement('div'), 52 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; 53 for (var i in props) { 54 if (obj.style[props[i]] !== undefined) { 55 slider.pfx = props[i].replace('Perspective', '').toLowerCase(); 56 slider.prop = "-" + slider.pfx + "-transform"; 57 return true; 58 } 59 } 60 return false; 61 }()); 62 // CONTROLSCONTAINER: 63 if (vars.controlsContainer !== "") slider.controlsContainer = $(vars.controlsContainer).length > 0 && $(vars.controlsContainer); 64 // MANUAL: 65 if (vars.manualControls !== "") slider.manualControls = $(vars.manualControls).length > 0 && $(vars.manualControls); 66 67 // RANDOMIZE: 68 if (vars.randomize) { 69 slider.slides.sort(function () { return (Math.round(Math.random()) - 0.5); }); 70 slider.container.empty().append(slider.slides); 71 } 72 73 slider.doMath(); 74 75 // ASNAV: 76 if (asNav) methods.asNav.setup(); 77 78 // INIT 79 slider.setup("init"); 80 81 // CONTROLNAV: 82 if (vars.controlNav) methods.controlNav.setup(); 83 84 // DIRECTIONNAV: 85 if (vars.directionNav) methods.directionNav.setup(); 86 87 // KEYBOARD: 88 if (vars.keyboard && ($(slider.containerSelector).length === 1 || vars.multipleKeyboard)) { 89 $(document).bind('keyup', function (event) { 90 var keycode = event.keyCode; 91 if (!slider.animating && (keycode === 39 || keycode === 37)) { 92 var target = (keycode === 39) ? slider.getTarget('next') : 93 (keycode === 37) ? slider.getTarget('prev') : false; 94 slider.flexAnimate(target, vars.pauseOnAction); 95 } 96 }); 97 } 98 // MOUSEWHEEL: 99 if (vars.mousewheel) { 100 slider.bind('mousewheel', function (event, delta, deltaX, deltaY) { 101 event.preventDefault(); 102 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev'); 103 slider.flexAnimate(target, vars.pauseOnAction); 104 }); 105 } 106 107 // PAUSEPLAY 108 if (vars.pausePlay) methods.pausePlay.setup(); 109 110 // SLIDSESHOW 111 if (vars.slideshow) { 112 if (vars.pauseOnHover) { 113 slider.hover(function () { 114 if (!slider.manualPlay && !slider.manualPause) slider.pause(); 115 }, function () { 116 if (!slider.manualPause && !slider.manualPlay) slider.play(); 117 }); 118 } 119 // initialize animation 120 (vars.initDelay > 0) ? setTimeout(slider.play, vars.initDelay) : slider.play(); 121 } 122 123 // TOUCH 124 if (touch && vars.touch) methods.touch(); 125 126 // FADE&&SMOOTHHEIGHT || SLIDE: 127 if (!fade || (fade && vars.smoothHeight)) $(window).bind("resize focus", methods.resize); 128 129 // API: start() Callback 130 setTimeout(function () { 131 vars.start(slider); 132 }, 200); 133 }, 134 asNav: { 135 setup: function () { 136 slider.asNav = true; 137 slider.animatingTo = Math.floor(slider.currentSlide / slider.move); 138 slider.currentItem = slider.currentSlide; 139 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide"); 140 slider.slides.click(function (e) { 141 e.preventDefault(); 142 var $slide = $(this), 143 target = $slide.index(); 144 if (!$(vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) { 145 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 146 slider.flexAnimate(target, vars.pauseOnAction, false, true, true); 147 } 148 }); 149 } 150 }, 151 controlNav: { 152 setup: function () { 153 if (!slider.manualControls) {
154 methods.controlNav.setupPaging(); 155 } else { // MANUALCONTROLS: 156 methods.controlNav.setupManual(); 157 } 158 }, 159 setupPaging: function () { 160 var type = (vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging', 161 j = 1, 162 item; 163 164 slider.controlNavScaffold = $('<ol class="' + namespace + 'control-nav ' + namespace + type + '"></ol>'); 165 166 if (slider.pagingCount > 1) { 167 for (var i = 0; i < slider.pagingCount; i++) { 168 item = (vars.controlNav === "thumbnails") ? '<img src="' + slider.slides.eq(i).attr("data-hrumb") + '"/>' : '<a>' + j + '</a>'; 169 slider.controlNavScaffold.append('<li>' + item + '</li>'); 170 j++; 171 } 172 } 173 174 // CONTROLSCONTAINER: 175 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold); 176 methods.controlNav.set(); 177 178 methods.controlNav.active(); 179 180 slider.controlNavScaffold.delegate('a, img', eventType, function (event) { 181 event.preventDefault(); 182 var $this = $(this), 183 target = slider.controlNav.index($this); 184 185 if (!$this.hasClass(namespace + 'active')) { 186 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 187 slider.flexAnimate(target, vars.pauseOnAction); 188 } 189 }); 190 // Prevent iOS click event bug 191 if (touch) { 192 slider.controlNavScaffold.delegate('a', "click touchstart", function (event) { 193 event.preventDefault(); 194 }); 195 } 196 }, 197 setupManual: function () { 198 slider.controlNav = slider.manualControls; 199 methods.controlNav.active(); 200 201 slider.controlNav.live(eventType, function (event) { 202 event.preventDefault(); 203 var $this = $(this), 204 target = slider.controlNav.index($this); 205 206 if (!$this.hasClass(namespace + 'active')) { 207 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev"; 208 slider.flexAnimate(target, vars.pauseOnAction); 209 } 210 }); 211 // Prevent iOS click event bug 212 if (touch) { 213 slider.controlNav.live("click touchstart", function (event) { 214 event.preventDefault(); 215 }); 216 } 217 }, 218 set: function () { 219 var selector = (vars.controlNav === "thumbnails") ? 'img' : 'a'; 220 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider); 221 }, 222 active: function () { 223 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active"); 224 }, 225 update: function (action, pos) { 226 if (slider.pagingCount > 1 && action === "add") { 227 slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>')); 228 } else if (slider.pagingCount === 1) { 229 slider.controlNavScaffold.find('li').remove(); 230 } else { 231 slider.controlNav.eq(pos).closest('li').remove(); 232 } 233 methods.controlNav.set(); 234 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active(); 235 } 236 }, 237 directionNav: { 238 setup: function () { 239 var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">
239' + vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + vars.nextText + '</a></li></ul>'); 240 241 // CONTROLSCONTAINER: 242 if (slider.controlsContainer) { 243 $(slider.controlsContainer).append(directionNavScaffold); 244 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer); 245 } else { 246 slider.append(directionNavScaffold); 247 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider); 248 } 249 250 methods.directionNav.update(); 251 252 slider.directionNav.bind(eventType, function (event) { 253 event.preventDefault(); 254 var target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev'); 255 slider.flexAnimate(target, vars.pauseOnAction); 256 }); 257 // Prevent iOS click event bug 258 if (touch) { 259 slider.directionNav.bind("click touchstart", function (event) { 260 event.preventDefault(); 261 }); 262 } 263 }, 264 update: function () { 265 var disabledClass = namespace + 'disabled'; 266 if (slider.pagingCount === 1) { 267 slider.directionNav.addClass(disabledClass); 268 } else if (!vars.animationLoop) { 269 if (slider.animatingTo === 0) { 270 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass); 271 } else if (slider.animatingTo === slider.last) { 272 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass); 273 } else { 274 slider.directionNav.removeClass(disabledClass); 275 } 276 } else { 277 slider.directionNav.removeClass(disabledClass); 278 } 279 } 280 }, 281 pausePlay: { 282 setup: function () { 283 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>'); 284 285 // CONTROLSCONTAINER: 286 if (slider.controlsContainer) { 287 slider.controlsContainer.append(pausePlayScaffold); 288 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer); 289 } else { 290 slider.append(pausePlayScaffold); 291 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider); 292 } 293 294 methods.pausePlay.update((vars.slideshow) ? namespace + 'pause' : namespace + 'play'); 295 296 slider.pausePlay.bind(eventType, function (event) { 297 event.preventDefault(); 298 if ($(this).hasClass(namespace + 'pause')) { 299 slider.manualPause = true; 300 slider.manualPlay = false; 301 slider.pause(); 302 } else { 303 slider.manualPause = false; 304 slider.manualPlay = true; 305 slider.play(); 306 } 307 }); 308 // Prevent iOS click event bug 309 if (touch) { 310 slider.pausePlay.bind("click touchstart", function (event) { 311 event.preventDefault(); 312 }); 313 } 314 }, 315 update: function (state) { 316 (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').text(vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').text(vars.pauseText); 317 } 318 }, 319 touch: function () { 320 var startX, 321 startY, 322 offset, 323 cwidth, 324 dx, 325 startT, 326 scrolling = false; 327 328 el.addEventListener('touchstart', onTouchStart, false); 329 function onTouchStart(e) { 330 if (slider.animating) { 331 e.preventDefault(); 332 } else if (e.touches.length === 1) { 333 slider.pause(); 334 // CAROUSEL: 335 cwidth = (vertical) ? slider.h : slider.w; 336 startT = Number(new Date()); 337 // CAROUSEL: 338 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 339 (carousel && reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) *
vendor: 5,032 bytes, lines 339-432
339slider.move) * slider.animatingTo) : 340 (carousel && slider.currentSlide === slider.last) ? slider.limit : 341 (carousel) ? ((slider.itemW + vars.itemMargin) * slider.move) * slider.currentSlide : 342 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 343 startX = (vertical) ? e.touches[0].pageY : e.touches[0].pageX; 344 startY = (vertical) ? e.touches[0].pageX : e.touches[0].pageY; 345 346 el.addEventListener('touchmove', onTouchMove, false); 347 el.addEventListener('touchend', onTouchEnd, false); 348 } 349 } 350 351 function onTouchMove(e) { 352 dx = (vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX; 353 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY)); 354 355 if (!scrolling || Number(new Date()) - startT > 500) { 356 e.preventDefault(); 357 if (!fade && slider.transitions) { 358 if (!vars.animationLoop) { 359 dx = dx / ((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx) / cwidth + 2) : 1); 360 } 361 slider.setProps(offset + dx, "setTouch"); 362 } 363 } 364 } 365 366 function onTouchEnd(e) { 367 // finish the touch by undoing the touch session 368 el.removeEventListener('touchmove', onTouchMove, false); 369 370 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 371 var updateDx = (reverse) ? -dx : dx, 372 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 373 374 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth / 2)) { 375 slider.flexAnimate(target, vars.pauseOnAction); 376 } else { 377 if (!fade) slider.flexAnimate(slider.currentSlide, vars.pauseOnAction, true); 378 } 379 } 380 el.removeEventListener('touchend', onTouchEnd, false); 381 startX = null; 382 startY = null; 383 dx = null; 384 offset = null; 385 } 386 }, 387 resize: function () { 388 if (!slider.animating && slider.is(':visible')) { 389 if (!carousel) slider.doMath(); 390 391 if (fade) { 392 // SMOOTH HEIGHT: 393 methods.smoothHeight(); 394 } else if (carousel) { //CAROUSEL: 395 slider.slides.width(slider.computedW); 396 slider.update(slider.pagingCount); 397 slider.setProps(); 398 } 399 else if (vertical) { //VERTICAL: 400 slider.viewport.height(slider.h); 401 slider.setProps(slider.h, "setTotal"); 402 } else { 403 // SMOOTH HEIGHT: 404 if (vars.smoothHeight) methods.smoothHeight(); 405 slider.newSlides.width(slider.computedW); 406 slider.setProps(slider.computedW, "setTotal"); 407 } 408 } 409 }, 410 smoothHeight: function (dur) { 411 if (!vertical || fade) { 412 var $obj = (fade) ? slider : slider.viewport; 413 (dur) ? $obj.animate({ "height": slider.slides.eq(slider.animatingTo).height() }, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height()); 414 } 415 }, 416 sync: function (action) { 417 var $obj = $(vars.sync).data("flexslider"), 418 target = slider.animatingTo; 419 420 switch (action) { 421 case "animate": $obj.flexAnimate(target, vars.pauseOnAction, false, true); break; 422 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break; 423 case "pause": $obj.pause(); break; 424 } 425 } 426 } 427 428 // public methods 429 slider.flexAnimate = function (target, pause, override, withSync, fromNav) { 430 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev"; 431 432 if (!slider.animating && (slider.canAdvance(target, fromN
432av) || override) && slider.is(":visible")) { 433 if (asNav && withSync) { 434 var master = $(vars.asNavFor).data('flexslider'); 435 slider.atEnd = target === 0 || target === slider.count - 1; 436 master.flexAnimate(target, true, false, true, fromNav); 437 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 438 master.direction = slider.direction; 439 440 if (Math.ceil((target + 1) / slider.visible) - 1 !== slider.currentSlide && target !== 0) { 441 slider.currentItem = target; 442 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 443 target = Math.floor(target / slider.visible); 444 } else { 445 slider.currentItem = target; 446 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 447 return false; 448 } 449 } 450 451 slider.animating = true; 452 slider.animatingTo = target; 453 // API: before() animation Callback 454 vars.before(slider); 455 456 // SLIDESHOW: 457 if (pause) slider.pause(); 458 459 // SYNC: 460 if (slider.syncExists && !fromNav) methods.sync("animate"); 461 462 // CONTROLNAV 463 if (vars.controlNav) methods.controlNav.active(); 464 465 // !CAROUSEL: 466 // CANDIDATE: slide active class (for add/remove slide) 467 if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); 468 469 // INFINITE LOOP: 470 // CANDIDATE: atEnd 471 slider.atEnd = target === 0 || target === slider.last; 472 473 // DIRECTIONNAV: 474 if (vars.directionNav) methods.directionNav.update(); 475 476 if (target === slider.last) { 477 // API: end() of cycle Callback 478 vars.end(slider); 479 // SLIDESHOW && !INFINITE LOOP: 480 if (!vars.animationLoop) slider.pause(); 481 } 482 483 // SLIDE: 484 if (!fade) { 485 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW, 486 margin, slideString, calcNext; 487 488 // INFINITE LOOP / REVERSE: 489 if (carousel) { 490 margin = (vars.itemWidth > slider.w) ? vars.itemMargin * 2 : vars.itemMargin; 491 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo; 492 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext; 493 } else if (slider.currentSlide === 0 && target === slider.count - 1 && vars.animationLoop && slider.direction !== "next") { 494 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0; 495 } else if (slider.currentSlide === slider.last && target === 0 && vars.animationLoop && slider.direction !== "prev") { 496 slideString = (reverse) ? 0 : (slider.count + 1) * dimension; 497 } else { 498 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension; 499 } 500 slider.setProps(slideString, "", vars.animationSpeed); 501 if (slider.transitions) { 502 if (!vars.animationLoop || !slider.atEnd) { 503 slider.animating = false; 504 slider.currentSlide = slider.animatingTo; 505 } 506 slider.container.unbind("webkitTransitionEnd transitionend"); 507 slider.container.bind("webkitTransitionEnd transitionend", function () { 508 slider.wrapup(dimension); 509 }); 510 } else { 511 slider.container.animate(slider.args, vars.animationSpeed, vars.easing, function () { 512 slider.wrapup(dimension); 513 }); 514 } 515 } else { // FADE: 516 if (!touch) { 517 slider.slides.eq(slider.currentSlide).fadeOut(vars.animationSpeed, vars.easing); 518 slider.slides.eq(target).fadeIn(vars.animationSpeed, vars.easing, slider.wrapup); 519 } else { 520 slider.slides.eq(slider.currentSlide).css({ "opacity": 0 }); 521 slider.slides.eq(target).css({ "opacity": 1 }); 522 slider.animating = false; 523 slider.currentSlide = slider.animatingTo; 524 } 525 } 526 // SMOOTH HEIGHT: 527 if (vars.smoothHeight) methods.smoothHeight(vars.animationSpeed); 528 } 529 } 530 slider.wrapup = function (dimension) { 531 // SLIDE: 532 if (!fade && !carousel) { 533 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && vars.animationLoop) { 534 slider.setProps(dimension, "jumpEnd"); 535 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && vars.animationLoop) { 536 slider.setProps(dimension, "jumpStart"); 537 } 538 } 539 slider.animating = false; 540 slider.currentSlide = slider.animatingTo; 541 // API: after() animation Callback 542 vars.after(slider); 543 } 544 545 // SLIDESHOW: 546 slider.animateSlides = function () { 547 if (!slider.animating) slider.flexAnimate(slider.getTarget("next")); 548 } 549 // SLIDESHOW: 550 slider.pause = function () { 551 clearInterval(slider.animatedSlides); 552 slider.playing = false; 553 // PAUSEPLAY: 554 if (vars.pausePlay) methods.pausePlay.update("play"); 555 // SYNC: 556 if (slider.syncExists) methods.sync("pause"); 557 } 558 // SLIDESHOW: 559 slider.play = function () { 560 slider.animatedSlides = setInterval(slider.animateSlides, vars.slideshowSpeed); 561 slider.playing = true; 562 // PAUSEPLAY: 563 if (vars.pausePlay) methods.pausePlay.update("pause"); 564 // SYNC: 565 if (slider.syncExists) methods.sync("play"); 566 }
vendor: 4,443 bytes, lines 567-644
567 slider.canAdvance = function (target, fromNav) { 568 // ASNAV: 569 var last = (asNav) ? slider.pagingCount - 1 : slider.last; 570 return (fromNav) ? true : 571 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true : 572 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false : 573 (target === slider.currentSlide && !asNav) ? false : 574 (vars.animationLoop) ? true : 575 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false : 576 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false : 577 true; 578 } 579 slider.getTarget = function (dir) { 580 slider.direction = dir; 581 if (dir === "next") { 582 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1; 583 } else { 584 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1; 585 } 586 } 587 588 // SLIDE: 589 slider.setProps = function (pos, special, dur) { 590 var target = (function () { 591 var posCheck = (pos) ? pos : ((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo, 592 posCalc = (function () { 593 if (carousel) { 594 return (special === "setTouch") ? pos : 595 (reverse && slider.animatingTo === slider.last) ? 0 : 596 (reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) : 597 (slider.animatingTo === slider.last) ? slider.limit : posCheck; 598 } else { 599 switch (special) { 600 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos; 601 case "setTouch": return (reverse) ? pos : pos; 602 case "jumpEnd": return (reverse) ? pos : slider.count * pos; 603 case "jumpStart": return (reverse) ? slider.count * pos : pos; 604 default: return pos; 605 } 606 } 607 }()); 608 return (posCalc * -1) + "px"; 609 }()); 610 611 if (slider.transitions) { 612 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)"; 613 dur = (dur !== undefined) ? (dur / 1000) + "s" : "0s"; 614 slider.container.css("-" + slider.pfx + "-transition-duration", dur); 615 } 616 617 slider.args[slider.prop] = target; 618 if (slider.transitions || dur === undefined) slider.container.css(slider.args); 619 } 620 621 slider.setup = function (type) { 622 // SLIDE: 623 if (!fade) { 624 var sliderOffset, arr; 625 626 if (type === "init") { 627 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({ "overflow": "hidden", "position": "relative" }).appendTo(slider).append(slider.container); 628 // INFINITE LOOP: 629 slider.cloneCount = 0; 630 slider.cloneOffset = 0; 631 // REVERSE: 632 if (reverse) { 633 arr = $.makeArray(slider.slides).reverse(); 634 slider.slides = $(arr); 635 slider.container.empty().append(slider.slides); 636 } 637 } 638 // INFINITE LOOP && !CAROUSEL: 639 if (vars.animationLoop && !carousel) { 640 slider.cloneCount = 2; 641 slider.cloneOffset = 1; 642 // clear out old clones 643 if (type !== "init") slider.container.find('.clone').remove(); 644 slider.container.append(slider.slides.first().clone().addClass('clone')).prepend(sli
644der.slides.last().clone().addClass('clone')); 645 } 646 slider.newSlides = $(vars.selector, slider); 647 648 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset; 649 // VERTICAL: 650 if (vertical && !carousel) { 651 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 652 setTimeout(function () { 653 slider.newSlides.css({ "display": "block" }); 654 slider.doMath(); 655 slider.viewport.height(slider.h); 656 slider.setProps(sliderOffset * slider.h, "init"); 657 }, (type === "init") ? 100 : 0); 658 } else { 659 slider.container.width((slider.count + slider.cloneCount) * 200 + "%"); 660 slider.setProps(sliderOffset * slider.computedW, "init"); 661 setTimeout(function () { 662 slider.doMath(); 663 slider.newSlides.css({ "width": slider.computedW, "float": "left", "display": "block" }); 664 // SMOOTH HEIGHT: 665 if (vars.smoothHeight) methods.smoothHeight(); 666 }, (type === "init") ? 100 : 0); 667 } 668 } else { // FADE: 669 slider.slides.css({ "width": "100%", "float": "left", "marginRight": "-100%", "position": "relative" }); 670 if (type === "init") { 671 if (!touch) { 672 slider.slides.eq(slider.currentSlide).fadeIn(vars.animationSpeed, vars.easing); 673 } else { 674 slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + vars.animationSpeed / 1000 + "s ease" }).eq(slider.currentSlide).css({ "opacity": 1 }); 675 } 676 } 677 // SMOOTH HEIGHT: 678 if (vars.smoothHeight) methods.smoothHeight(); 679 } 680 // !CAROUSEL: 681 // CANDIDATE: active slide 682 if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); 683 } 684 685 slider.doMath = function () { 686 var slide = slider.slides.first(), 687 slideMargin = vars.itemMargin, 688 minItems = vars.minItems, 689 maxItems = vars.maxItems; 690 691 slider.w = slider.width(); 692 slider.h = slide.height(); 693 slider.boxPadding = slide.outerWidth() - slide.width(); 694 695 // CAROUSEL: 696 if (carousel) { 697 slider.itemT = vars.itemWidth + slideMargin; 698 slider.minW = (minItems) ? minItems * slider.itemT : slider.w; 699 slider.maxW = (maxItems) ? maxItems * slider.itemT : slider.w; 700 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * minItems)) / minItems : 701 (slider.maxW < slider.w) ? (slider.w - (slideMargin * maxItems)) / maxItems : 702 (vars.itemWidth > slider.w) ? slider.w : vars.itemWidth; 703 slider.visible = Math.floor(slider.w / (slider.itemW + slideMargin)); 704 slider.move = (vars.move > 0 && vars.move < slider.visible) ? vars.move : slider.visible; 705 slider.pagingCount = Math.ceil(((slider.count - slider.visible) / slider.move) + 1); 706 slider.last = slider.pagingCount - 1; 707 slider.limit = (slider.pagingCount === 1) ? 0 : 708 (vars.itemWidth > slider.w) ? ((slider.itemW + (slideMargin * 2)) * slider.count) - slider.w - slideMargin : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin; 709 } else { 710 slider.itemW = slider.w; 711 slider.pagingCount = slider.count; 712 slider.last = slider.count - 1; 713 } 714 slider.computedW = slider.itemW - slider.boxPadding; 715 } 716 717 slider.update = function (pos, action) { 718 slider.doMath(); 719 720 // update currentSlide and slider.animatingTo if necessary 721 if (!carousel) { 722 if (pos < slider.currentSlide) { 723 slider.currentSlide += 1; 724 } else if (pos <= slider.currentSlide && pos !== 0) { 725 slider.currentSlide -= 1; 726 } 727 slider.animatingTo = slider.currentSlide; 728 } 729 730 // update controlNav 731 if (vars.controlNav && !slider.manualControls) { 732 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) { 733 methods.controlNav.update("add"); 734 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) { 735 if (carousel && slider.currentSlide > slider.last) { 736 slider.currentSlide -= 1; 737 slider.animatingTo -= 1; 738 } 739 methods.controlNav.update("remove", slider.last); 740 } 741 } 742 // update directionNav
vendor: 1,111 bytes, lines 743-771
743 if (vars.directionNav) methods.directionNav.update(); 744 } 745 746 slider.addSlide = function (obj, pos) { 747 var $obj = $(obj); 748 749 slider.count += 1; 750 slider.last = slider.count - 1; 751 752 // append new slide 753 if (vertical && reverse) { 754 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj); 755 } else { 756 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj); 757 } 758 759 // update currentSlide, animatingTo, controlNav, and directionNav 760 slider.update(pos, "add"); 761 762 // update slider.slides 763 slider.slides = $(vars.selector + ':not(.clone)', slider); 764 // re-setup the slider to accomdate new slide 765 slider.setup(); 766 767 //FlexSlider: added() Callback 768 vars.added(slider); 769 } 770 slider.removeSlide = function (obj) { 771 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
772 773 // update count 774 slider.count -= 1; 775 slider.last = slider.count - 1; 776 777 // remove slide 778 if (isNaN(obj)) { 779 $(obj, slider.slides).remove(); 780 } else { 781 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove(); 782 } 783 784 // update currentSlide, animatingTo, controlNav, and directionNav 785 slider.doMath(); 786 slider.update(pos, "remove"); 787 788 // update slider.slides 789 slider.slides = $(vars.selector + ':not(.clone)', slider); 790 // re-setup the slider to accomdate new slide 791 slider.setup(); 792 793 // FlexSlider: removed() Callback 794 vars.removed(slider); 795 } 796 797 //FlexSlider: Initialize 798 methods.init(); 799 } 800 801 //FlexSlider: Default Settings 802 $.flexslider.defaults = { 803 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin 804 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril 805 animation: "fade", //String: Select your animation type, "fade" or "slide" 806 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported! 807 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 808 reverse: false, //{NEW} Boolean: Reverse the animation direction 809 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 810 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode 811 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 812 slideshow: true, //Boolean: Animate slider automatically 813 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 814 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds 815 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds 816 randomize: false, //Boolean: Randomize slide order 817 818 // Usability features 819 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended. 820 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 821 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available 822 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices 823 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches 824 825 // Primary Controls 826 controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage 827 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 828 prevText: "Previous", //String: Set the text for the "previous" directionNav item 829 nextText: "Next", //String: Set the text for the "next" directionNav item 830 831 // Secondary Navigation 832 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys 833 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present. 834 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
835 pausePlay: false, //Boolean: Create pause/play dynamic element 836 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item 837 playText: "Play", //String: Set the text for the "play" pausePlay item 838 839 // Special properties 840 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. 841 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. 842 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care. 843 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider 844 845 // Carousel Options 846 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding. 847 itemMargin: 0, //{NEW} Integer: Margin between carousel items. 848 minItems: 0, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this. 849 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit. 850 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items. 851 852 // Callback API 853 start: function () { }, //Callback: function(slider) - Fires when the slider loads the first slide 854 before: function () { }, //Callback: function(slider) - Fires asynchronously with each slider animation 855 after: function () { }, //Callback: function(slider) - Fires after each slider animation completes 856 end: function () { }, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 857 added: function () { }, //{NEW} Callback: function(slider) - Fires after a slide is added 858 removed: function () { } //{NEW} Callback: function(slider) - Fires after a slide is removed 859 } 860 861 //FlexSlider: Plugin Function 862 $.fn.flexslider = function (options) { 863 if (options === undefined) options = {}; 864 865 if (typeof options === "object") { 866 return this.each(function () { 867 var $this = $(this), 868 selector = (options.selector) ? options.selector : ".slides > li", 869 $slides = $this.find(selector); 870 871 if ($slides.length === 1) { 872 $slides.fadeIn(400); 873 if (options.start) options.start($this); 874 } else if ($this.data('flexslider') === undefined) { 875 new $.flexslider(this, options); 876 } 877 }); 878 } else { 879 // Helper strings to quickly perform functions on the slider 880 var $slider = $(this).data('flexslider'); 881 switch (options) { 882 case "play": $slider.play(); break; 883 case "pause": $slider.pause(); break; 884 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break; 885 case "prev": 886 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break; 887 default: if (typeof options === "number") $slider.flexAnimate(options, true); 888 } 889 } 890 } 891})(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.