vendor: 5,076 bytes, lines 1-119
1/* 2 * jQuery FlexSlider v2.2.0 3 * Copyright 2012 WooThemes 4 * Contributing Author: Tyler Smith 5 */ 6; 7(function ($) { 8 9 //FlexSlider: Object Instance 10 $.flexslider = function(el, options) { 11 var slider = $(el); 12 13 // making variables public 14 slider.vars = $.extend({}, $.flexslider.defaults, options); 15 16 var namespace = slider.vars.namespace, 17 msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture, 18 touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch, 19 // depricating this idea, as devices are being released with both of these events 20 //eventType = (touch) ? "touchend" : "click", 21 eventType = "click touchend MSPointerUp", 22 watchedEvent = "", 23 watchedEventClearTimer, 24 vertical = slider.vars.direction === "vertical", 25 reverse = slider.vars.reverse, 26 carousel = (slider.vars.itemWidth > 0), 27 fade = slider.vars.animation === "fade", 28 asNav = slider.vars.asNavFor !== "", 29 methods = {}, 30 focused = true; 31 32 // Store a reference to the slider object 33 $.data(el, "flexslider", slider); 34 35 // Private slider methods 36 methods = { 37 init: function() { 38 slider.animating = false; 39 // Get current slide and make sure it is a number 40 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0) ); 41 if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0; 42 slider.animatingTo = slider.currentSlide; 43 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last); 44 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' ')); 45 slider.slides = $(slider.vars.selector, slider); 46 slider.container = $(slider.containerSelector, slider); 47 slider.count = slider.slides.length; 48 // SYNC: 49 slider.syncExists = $(slider.vars.sync).length > 0; 50 // SLIDE: 51 if (slider.vars.animation === "slide") slider.vars.animation = "swing"; 52 slider.prop = (vertical) ? "top" : "marginLeft"; 53 slider.args = {}; 54 // SLIDESHOW: 55 slider.manualPause = false; 56 slider.stopped = false; 57 //PAUSE WHEN INVISIBLE 58 slider.started = false; 59 slider.startTimeout = null; 60 // TOUCH/USECSS: 61 slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() { 62 var obj = document.createElement('div'), 63 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; 64 for (var i in props) { 65 if ( obj.style[ props[i] ] !== undefined ) { 66 slider.pfx = props[i].replace('Perspective','').toLowerCase(); 67 slider.prop = "-" + slider.pfx + "-transform"; 68 return true; 69 } 70 } 71 return false; 72 }()); 73 // CONTROLSCONTAINER: 74 if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer); 75 // MANUAL: 76 if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls); 77 78 // RANDOMIZE: 79 if (slider.vars.randomize) { 80 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); 81 slider.container.empty().append(slider.slides); 82 } 83 84 slider.doMath(); 85 86 // INIT 87 slider.setup("init"); 88 89 // CONTROLNAV: 90 if (slider.vars.controlNav) methods.controlNav.setup(); 91 92 // DIRECTIONNAV: 93 if (slider.vars.directionNav) methods.directionNav.setup(); 94 95 // KEYBOARD: 96 if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) { 97 $(document).bind('keyup', function(event) { 98 var keycode = event.keyCode; 99 if (!slider.animating && (keycode === 39 || keycode === 37)) { 100 var target = (keycode === 39) ? slider.getTarget('next') : 101 (keycode === 37) ? slider.getTarget('prev') : false; 102 slider.flexAnimate(target, slider.vars.pauseOnAction); 103 } 104 }); 105 } 106 // MOUSEWHEEL: 107 if (slider.vars.mousewheel) { 108 slider.bind('mousewheel', function(event, delta, deltaX, deltaY) { 109 event.preventDefault(); 110 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev'); 111 slider.flexAnimate(target, slider.vars.pauseOnAction); 112 }); 113 } 114 115 // PAUSEPLAY 116 if (slider.vars.pausePlay) methods.pausePlay.setup(); 117 118 //PAUSE WHEN INVISIBLE 119 if (slider.vars.slideshow && slider.vars.pauseInvisible) methods.pauseInvisible.init(
119); 120 121 // SLIDSESHOW 122 if (slider.vars.slideshow) { 123 if (slider.vars.pauseOnHover) { 124 slider.hover(function() { 125 if (!slider.manualPlay && !slider.manualPause) slider.pause(); 126 }, function() { 127 if (!slider.manualPause && !slider.manualPlay && !slider.stopped) slider.play(); 128 }); 129 } 130 // initialize animation 131 //If we're visible, or we don't use PageVisibility API 132 if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) { 133 (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play(); 134 } 135 } 136 137 // ASNAV: 138 if (asNav) methods.asNav.setup(); 139 140 // TOUCH 141 if (touch && slider.vars.touch) methods.touch(); 142 143 // FADE&&SMOOTHHEIGHT || SLIDE: 144 if (!fade || (fade && slider.vars.smoothHeight)) $(window).bind("resize orientationchange focus", methods.resize); 145 146 slider.find("img").attr("draggable", "false"); 147 148 // API: start() Callback 149 setTimeout(function(){ 150 slider.vars.start(slider); 151 }, 200); 152 }, 153 asNav: { 154 setup: function() { 155 slider.asNav = true; 156 slider.animatingTo = Math.floor(slider.currentSlide/slider.move); 157 slider.currentItem = slider.currentSlide; 158 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide"); 159 if(!msGesture){ 160 slider.slides.click(function(e){ 161 e.preventDefault(); 162 var $slide = $(this), 163 target = $slide.index(); 164 var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container 165 if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) { 166 slider.flexAnimate(slider.getTarget("prev"), true); 167 } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) { 168 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 169 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 170 } 171 }); 172 }else{ 173 el._slider = slider; 174 slider.slides.each(function (){ 175 var that = this; 176 that._gesture = new MSGesture(); 177 that._gesture.target = that; 178 that.addEventListener("MSPointerDown", function (e){ 179 e.preventDefault(); 180 if(e.currentTarget._gesture) 181 e.currentTarget._gesture.addPointer(e.pointerId); 182 }, false); 183 that.addEventListener("MSGestureTap", function (e){ 184 e.preventDefault(); 185 var $slide = $(this), 186 target = $slide.index(); 187 if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) { 188 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 189 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true); 190 } 191 }); 192 }); 193 } 194 } 195 }, 196 controlNav: { 197 setup: function() { 198 if (!slider.manualControls) { 199 methods.controlNav.setupPaging(); 200 } else { // MANUALCONTROLS: 201 methods.controlNav.setupManual(); 202 } 203 }, 204 setupPaging: function() { 205 var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging', 206 j = 1, 207 item, 208 slide; 209 210 slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>'); 211 212 if (slider.pagingCount > 1) { 213 for (var i = 0; i < slider.pagingCount; i++) { 214 slide = slider.slides.eq(i); 215 item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"/>' : '<a>' + j + '</a>'; 216 if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) { 217 var captn = slide.attr( 'data-thumbcaption' );
vendor: 25,055 bytes, lines 218-785
218 if ( '' != captn && undefined != captn ) item += '<span class="' + namespace + 'caption">' + captn + '</span>'; 219 } 220 slider.controlNavScaffold.append('<li>' + item + '</li>'); 221 j++; 222 } 223 } 224 225 // CONTROLSCONTAINER: 226 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold); 227 methods.controlNav.set(); 228 229 methods.controlNav.active(); 230 231 slider.controlNavScaffold.delegate('a, img', eventType, function(event) { 232 event.preventDefault(); 233 234 if (watchedEvent === "" || watchedEvent === event.type) { 235 var $this = $(this), 236 target = slider.controlNav.index($this); 237 238 if (!$this.hasClass(namespace + 'active')) { 239 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 240 slider.flexAnimate(target, slider.vars.pauseOnAction); 241 } 242 } 243 244 // setup flags to prevent event duplication 245 if (watchedEvent === "") { 246 watchedEvent = event.type; 247 } 248 methods.setToClearWatchedEvent(); 249 250 }); 251 }, 252 setupManual: function() { 253 slider.controlNav = slider.manualControls; 254 methods.controlNav.active(); 255 256 slider.controlNav.bind(eventType, function(event) { 257 event.preventDefault(); 258 259 if (watchedEvent === "" || watchedEvent === event.type) { 260 var $this = $(this), 261 target = slider.controlNav.index($this); 262 263 if (!$this.hasClass(namespace + 'active')) { 264 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev"; 265 slider.flexAnimate(target, slider.vars.pauseOnAction); 266 } 267 } 268 269 // setup flags to prevent event duplication 270 if (watchedEvent === "") { 271 watchedEvent = event.type; 272 } 273 methods.setToClearWatchedEvent(); 274 }); 275 }, 276 set: function() { 277 var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a'; 278 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider); 279 }, 280 active: function() { 281 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active"); 282 }, 283 update: function(action, pos) { 284 if (slider.pagingCount > 1 && action === "add") { 285 slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>')); 286 } else if (slider.pagingCount === 1) { 287 slider.controlNavScaffold.find('li').remove(); 288 } else { 289 slider.controlNav.eq(pos).closest('li').remove(); 290 } 291 methods.controlNav.set(); 292 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active(); 293 } 294 }, 295 directionNav: { 296 setup: function() { 297 var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>'); 298 299 // CONTROLSCONTAINER: 300 if (slider.controlsContainer) { 301 $(slider.controlsContainer).append(directionNavScaffold); 302 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer); 303 } else { 304 slider.append(directionNavScaffold); 305 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider); 306 } 307 308 methods.directionNav.update(); 309 310 slider.directionNav.bind(eventType, function(event) { 311 event.preventDefault(); 312 var target; 313 314 if (watchedEvent === "" || watchedEvent === event.type) { 315 target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev'); 316 slider.flexAnimate(target, slider.vars.pauseOnAction); 317 } 318 319 // setup flags to prevent event duplication 320 if (watchedEvent === "") { 321 watchedEvent = event.type; 322 } 323 methods.setToClearWatchedEvent(); 324 }); 325 }, 326 update: function() { 327 var disabledClass = namespace + 'disabled'; 328 if (slider.pagingCount === 1) { 329 slider.directionNav.addClass(disabledClass).attr('tabindex', '-1'); 330 } else if (!slider.vars.animationLoop) { 331 if (slider.animatingTo === 0) { 332 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1'); 333 } else if (slider.animatingTo === slider.last) { 334 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1'); 335 } else { 336 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 337 } 338 } else { 339 slider.directionNav.removeClass(disabledClass).removeAttr('tabindex'); 340 } 341 } 342 }, 343 pausePlay: { 344 setup: function() { 345 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>'); 346 347 // CONTROLSCONTAINER: 348 if (slider.controlsContainer) { 349 slider.controlsContainer.append(pausePlayScaffold); 350 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer); 351 } else { 352 slider.append(pausePlayScaffold); 353 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider); 354 } 355 356 methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play'); 357 358 slider.pausePlay.bind(eventType, function(event) { 359 event.preventDefault(); 360 361 if (watchedEvent === "" || watchedEvent === event.type) { 362 if ($(this).hasClass(namespace + 'pause')) { 363 slider.manualPause = true; 364 slider.manualPlay = false; 365 slider.pause(); 366 } else { 367 slider.manualPause = false; 368 slider.manualPlay = true; 369 slider.play(); 370 } 371 } 372 373 // setup flags to prevent event duplication 374 if (watchedEvent === "") { 375 watchedEvent = event.type; 376 } 377 methods.setToClearWatchedEvent(); 378 }); 379 }, 380 update: function(state) { 381 (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); 382 } 383 }, 384 touch: function() { 385 var startX, 386 startY, 387 offset, 388 cwidth, 389 dx, 390 startT, 391 scrolling = false, 392 localX = 0, 393 localY = 0, 394 accDx = 0; 395 396 if(!msGesture){ 397 el.addEventListener('touchstart', onTouchStart, false); 398 399 function onTouchStart(e) { 400 if (slider.animating) { 401 e.preventDefault(); 402 } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) { 403 slider.pause(); 404 // CAROUSEL: 405 cwidth = (vertical) ? slider.h : slider. w; 406 startT = Number(new Date()); 407 // CAROUSEL: 408 409 // Local vars for X and Y points. 410 localX = e.touches[0].pageX; 411 localY = e.touches[0].pageY; 412 413 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 414 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 415 (carousel && slider.currentSlide === slider.last) ? slider.limit : 416 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 417 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 418 startX = (vertical) ? localY : localX; 419 startY = (vertical) ? localX : localY; 420 421 el.addEventListener('touchmove', onTouchMove, false); 422 el.addEventListener('touchend', onTouchEnd, false); 423 } 424 } 425 426 function onTouchMove(e) { 427 // Local vars for X and Y points. 428 429 localX = e.touches[0].pageX; 430 localY = e.touches[0].pageY; 431 432 dx = (vertical) ? startX - localY : startX - localX; 433 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY)); 434 435 var fxms = 500; 436 437 if ( ! scrolling || Number( new Date() ) - startT > fxms ) { 438 e.preventDefault(); 439 if (!fade && slider.transitions) { 440 if (!slider.vars.animationLoop) { 441 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1); 442 } 443 slider.setProps(offset + dx, "setTouch"); 444 } 445 } 446 } 447 448 function onTouchEnd(e) { 449 // finish the touch by undoing the touch session 450 el.removeEventListener('touchmove', onTouchMove, false); 451 452 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 453 var updateDx = (reverse) ? -dx : dx, 454 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 455 456 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 457 slider.flexAnimate(target, slider.vars.pauseOnAction); 458 } else { 459 if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); 460 } 461 } 462 el.removeEventListener('touchend', onTouchEnd, false); 463 464 startX = null; 465 startY = null; 466 dx = null; 467 offset = null; 468 } 469 }else{ 470 el.style.msTouchAction = "none"; 471 el._gesture = new MSGesture(); 472 el._gesture.target = el; 473 el.addEventListener("MSPointerDown", onMSPointerDown, false); 474 el._slider = slider; 475 el.addEventListener("MSGestureChange", onMSGestureChange, false); 476 el.addEventListener("MSGestureEnd", onMSGestureEnd, false); 477 478 function onMSPointerDown(e){ 479 e.stopPropagation(); 480 if (slider.animating) { 481 e.preventDefault(); 482 }else{ 483 slider.pause(); 484 el._gesture.addPointer(e.pointerId); 485 accDx = 0; 486 cwidth = (vertical) ? slider.h : slider. w; 487 startT = Number(new Date()); 488 // CAROUSEL: 489 490 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 491 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 492 (carousel && slider.currentSlide === slider.last) ? slider.limit : 493 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 494 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 495 } 496 } 497 498 function onMSGestureChange(e) { 499 e.stopPropagation(); 500 var slider = e.target._slider; 501 if(!slider){ 502 return; 503 } 504 var transX = -e.translationX, 505 transY = -e.translationY; 506 507 //Accumulate translations. 508 accDx = accDx + ((vertical) ? transY : transX); 509 dx = accDx; 510 scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY)); 511 512 if(e.detail === e.MSGESTURE_FLAG_INERTIA){ 513 setImmediate(function (){ 514 el._gesture.stop(); 515 }); 516 517 return; 518 } 519 520 if (!scrolling || Number(new Date()) - startT > 500) { 521 e.preventDefault(); 522 if (!fade && slider.transitions) { 523 if (!slider.vars.animationLoop) { 524 dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1); 525 } 526 slider.setProps(offset + dx, "setTouch"); 527 } 528 } 529 } 530 531 function onMSGestureEnd(e) { 532 e.stopPropagation(); 533 var slider = e.target._slider; 534 if(!slider){ 535 return; 536 } 537 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 538 var updateDx = (reverse) ? -dx : dx, 539 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 540 541 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 542 slider.flexAnimate(target, slider.vars.pauseOnAction); 543 } else { 544 if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); 545 } 546 } 547 548 startX = null; 549 startY = null; 550 dx = null; 551 offset = null; 552 accDx = 0; 553 } 554 } 555 }, 556 resize: function() { 557 if (!slider.animating && slider.is(':visible')) { 558 if (!carousel) slider.doMath(); 559 560 if (fade) { 561 // SMOOTH HEIGHT: 562 methods.smoothHeight(); 563 } else if (carousel) { //CAROUSEL: 564 slider.slides.width(slider.computedW); 565 slider.update(slider.pagingCount); 566 slider.setProps(); 567 } 568 else if (vertical) { //VERTICAL: 569 slider.viewport.height(slider.h); 570 slider.setProps(slider.h, "setTotal"); 571 } else { 572 // SMOOTH HEIGHT: 573 if (slider.vars.smoothHeight) methods.smoothHeight(); 574 slider.newSlides.width(slider.computedW); 575 slider.setProps(slider.computedW, "setTotal"); 576 } 577 } 578 }, 579 smoothHeight: function(dur) { 580 if (!vertical || fade) { 581 var $obj = (fade) ? slider : slider.viewport; 582 (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height()); 583 } 584 }, 585 sync: function(action) { 586 var $obj = $(slider.vars.sync).data("flexslider"), 587 target = slider.animatingTo; 588 589 switch (action) { 590 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break; 591 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break; 592 case "pause": $obj.pause(); break; 593 } 594 }, 595 pauseInvisible: { 596 visProp: null, 597 init: function() { 598 var prefixes = ['webkit','moz','ms','o']; 599 600 if ('hidden' in document) return 'hidden'; 601 for (var i = 0; i < prefixes.length; i++) { 602 if ((prefixes[i] + 'Hidden') in document) 603 methods.pauseInvisible.visProp = prefixes[i] + 'Hidden'; 604 } 605 if (methods.pauseInvisible.visProp) { 606 var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; 607 document.addEventListener(evtname, function() { 608 if (methods.pauseInvisible.isHidden()) { 609 if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible 610 else slider.pause(); //Or just pause 611 } 612 else { 613 if(slider.started) slider.play(); //Initiated before, just play 614 else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it 615 } 616 }); 617 } 618 }, 619 isHidden: function() { 620 return document[methods.pauseInvisible.visProp] || false; 621 } 622 }, 623 setToClearWatchedEvent: function() { 624 clearTimeout(watchedEventClearTimer); 625 watchedEventClearTimer = setTimeout(function() { 626 watchedEvent = ""; 627 }, 3000); 628 } 629 } 630 631 // public methods 632 slider.flexAnimate = function(target, pause, override, withSync, fromNav) { 633 if (!slider.vars.animationLoop && target !== slider.currentSlide) { 634 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 635 } 636 637 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev"; 638 639 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) { 640 if (asNav && withSync) { 641 var master = $(slider.vars.asNavFor).data('flexslider'); 642 slider.atEnd = target === 0 || target === slider.count - 1; 643 master.flexAnimate(target, true, false, true, fromNav); 644 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 645 master.direction = slider.direction; 646 647 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) { 648 slider.currentItem = target; 649 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 650 target = Math.floor(target/slider.visible); 651 } else { 652 slider.currentItem = target; 653 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 654 return false; 655 } 656 } 657 658 slider.animating = true; 659 slider.animatingTo = target; 660 661 // SLIDESHOW: 662 if (pause) slider.pause(); 663 664 // API: before() animation Callback 665 slider.vars.before(slider); 666 667 // SYNC: 668 if (slider.syncExists && !fromNav) methods.sync("animate"); 669 670 // CONTROLNAV 671 if (slider.vars.controlNav) methods.controlNav.active(); 672 673 // !CAROUSEL: 674 // CANDIDATE: slide active class (for add/remove slide) 675 if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); 676 677 // INFINITE LOOP: 678 // CANDIDATE: atEnd 679 slider.atEnd = target === 0 || target === slider.last; 680 681 // DIRECTIONNAV: 682 if (slider.vars.directionNav) methods.directionNav.update(); 683 684 if (target === slider.last) { 685 // API: end() of cycle Callback 686 slider.vars.end(slider); 687 // SLIDESHOW && !INFINITE LOOP: 688 if (!slider.vars.animationLoop) slider.pause(); 689 } 690 691 // SLIDE: 692 if (!fade) { 693 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW, 694 margin, slideString, calcNext; 695 696 // INFINITE LOOP / REVERSE: 697 if (carousel) { 698 //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin; 699 margin = slider.vars.itemMargin; 700 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo; 701 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext; 702 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") { 703 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0; 704 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") { 705 slideString = (reverse) ? 0 : (slider.count + 1) * dimension; 706 } else { 707 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension; 708 } 709 slider.setProps(slideString, "", slider.vars.animationSpeed); 710 if (slider.transitions) { 711 if (!slider.vars.animationLoop || !slider.atEnd) { 712 slider.animating = false; 713 slider.currentSlide = slider.animatingTo; 714 } 715 slider.container.unbind("webkitTransitionEnd transitionend"); 716 slider.container.bind("webkitTransitionEnd transitionend", function() { 717 slider.wrapup(dimension); 718 }); 719 } else { 720 slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){ 721 slider.wrapup(dimension); 722 }); 723 } 724 } else { // FADE: 725 if (!touch) { 726 //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing); 727 //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 728 729 slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing); 730 slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 731 732 } else { 733 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 }); 734 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 }); 735 slider.wrapup(dimension); 736 } 737 } 738 // SMOOTH HEIGHT: 739 if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed); 740 } 741 } 742 slider.wrapup = function(dimension) { 743 // SLIDE: 744 if (!fade && !carousel) { 745 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) { 746 slider.setProps(dimension, "jumpEnd"); 747 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) { 748 slider.setProps(dimension, "jumpStart"); 749 } 750 } 751 slider.animating = false; 752 slider.currentSlide = slider.animatingTo; 753 // API: after() animation Callback 754 slider.vars.after(slider); 755 } 756 757 // SLIDESHOW: 758 slider.animateSlides = function() { 759 if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next")); 760 } 761 // SLIDESHOW: 762 slider.pause = function() { 763 clearInterval(slider.animatedSlides); 764 slider.animatedSlides = null; 765 slider.playing = false; 766 // PAUSEPLAY: 767 if (slider.vars.pausePlay) methods.pausePlay.update("play"); 768 // SYNC: 769 if (slider.syncExists) methods.sync("pause"); 770 } 771 // SLIDESHOW: 772 slider.play = function() { 773 if (slider.playing) clearInterval(slider.animatedSlides); 774 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 775 slider.started = slider.playing = true; 776 // PAUSEPLAY: 777 if (slider.vars.pausePlay) methods.pausePlay.update("pause"); 778 // SYNC: 779 if (slider.syncExists) methods.sync("play"); 780 } 781 // STOP: 782 slider.stop = function () { 783 slider.pause(); 784 slider.stopped = true; 785 }
786 slider.canAdvance = function(target, fromNav) { 787 // ASNAV: 788 var last = (asNav) ? slider.pagingCount - 1 : slider.last; 789 return (fromNav) ? true : 790 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true : 791 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false : 792 (target === slider.currentSlide && !asNav) ? false : 793 (slider.vars.animationLoop) ? true : 794 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false : 795 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false : 796 true; 797 } 798 slider.getTarget = function(dir) { 799 slider.direction = dir; 800 if (dir === "next") { 801 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1; 802 } else { 803 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1; 804 } 805 } 806 807 // SLIDE: 808 slider.setProps = function(pos, special, dur) { 809 var target = (function() { 810 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo, 811 posCalc = (function() { 812 if (carousel) { 813 return (special === "setTouch") ? pos : 814 (reverse && slider.animatingTo === slider.last) ? 0 : 815 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 816 (slider.animatingTo === slider.last) ? slider.limit : posCheck; 817 } else { 818 switch (special) { 819 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos; 820 case "setTouch": return (reverse) ? pos : pos; 821 case "jumpEnd": return (reverse) ? pos : slider.count * pos; 822 case "jumpStart": return (reverse) ? slider.count * pos : pos; 823 default: return pos; 824 } 825 } 826 }()); 827 828 return (posCalc * -1) + "px"; 829 }()); 830 831 if (slider.transitions) { 832 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)"; 833 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s"; 834 slider.container.css("-" + slider.pfx + "-transition-duration", dur); 835 } 836 837 slider.args[slider.prop] = target; 838 if (slider.transitions || dur === undefined) slider.container.css(slider.args); 839 } 840 841 slider.setup = function(type) { 842 // SLIDE: 843 if (!fade) { 844 var sliderOffset, arr; 845 846 if (type === "init") { 847 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container); 848 // INFINITE LOOP: 849 slider.cloneCount = 0; 850 slider.cloneOffset = 0; 851 // REVERSE: 852 if (reverse) { 853 arr = $.makeArray(slider.slides).reverse(); 854 slider.slides = $(arr); 855 slider.container.empty().append(slider.slides); 856 } 857 } 858 // INFINITE LOOP && !CAROUSEL: 859 if (slider.vars.animationLoop && !carousel) { 860 slider.cloneCount = 2; 861 slider.cloneOffset = 1; 862 // clear out old clones 863 if (type !== "init") slider.container.find('.clone').remove(); 864 slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true')); 865 } 866 slider.newSlides = $(slider.vars.selector, slider); 867 868 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset; 869 // VERTICAL: 870 if (vertical && !carousel) { 871 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 872 setTimeout(function(){ 873 slider.newSlides.css({"display": "block"}); 874 slider.doMath(); 875 slider.viewport.height(slider.h); 876 slider.setProps(sliderOffset * slider.h, "init"); 877 }, (type === "init") ? 100 : 0); 878 } else { 879 slider.container.width((slider.count + slider.cloneCount) * 200 + "%"); 880 slider.setProps(sliderOffset * slider.computedW, "init"); 881 setTimeout(function(){ 882 slider.doMath(); 883 slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"}); 884 // SMOOTH HEIGHT: 885 if (slider.vars.smoothHeight) methods.smoothHeight(); 886 }, (type === "init") ? 100 : 0); 887 } 888 } else { // FADE: 889 slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"}); 890 if (type === "init") { 891 if (!touch) { 892 //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing); 893 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); 894 } else { 895 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}); 896 } 897 } 898 // SMOOTH HEIGHT: 899 if (slider.vars.smoothHeight) methods.smoothHeight(); 900 } 901 // !CAROUSEL: 902 // CANDIDATE: active slide 903 if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); 904 } 905 906 907 slider.doMath = function() { 908 var slide = slider.slides.first(), 909 slideMargin = slider.vars.itemMargin, 910 minItems = slider.vars.minItems, 911 maxItems = slider.vars.maxItems; 912
vendor: 8,049 bytes, lines 913-1068
913 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width(); 914 slider.h = slide.height(); 915 slider.boxPadding = slide.outerWidth() - slide.width(); 916 917 // CAROUSEL: 918 if (carousel) { 919 slider.itemT = slider.vars.itemWidth + slideMargin; 920 slider.minW = (minItems) ? minItems * slider.itemT : slider.w; 921 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w; 922 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems : 923 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems : 924 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth; 925 926 slider.visible = Math.floor(slider.w/(slider.itemW)); 927 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible; 928 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1); 929 slider.last = slider.pagingCount - 1; 930 slider.limit = (slider.pagingCount === 1) ? 0 : 931 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin; 932 } else { 933 slider.itemW = slider.w; 934 slider.pagingCount = slider.count; 935 slider.last = slider.count - 1; 936 } 937 slider.computedW = slider.itemW - slider.boxPadding; 938 } 939 940 941 slider.update = function(pos, action) { 942 slider.doMath(); 943 944 // update currentSlide and slider.animatingTo if necessary 945 if (!carousel) { 946 if (pos < slider.currentSlide) { 947 slider.currentSlide += 1; 948 } else if (pos <= slider.currentSlide && pos !== 0) { 949 slider.currentSlide -= 1; 950 } 951 slider.animatingTo = slider.currentSlide; 952 } 953 954 // update controlNav 955 if (slider.vars.controlNav && !slider.manualControls) { 956 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) { 957 methods.controlNav.update("add"); 958 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) { 959 if (carousel && slider.currentSlide > slider.last) { 960 slider.currentSlide -= 1; 961 slider.animatingTo -= 1; 962 } 963 methods.controlNav.update("remove", slider.last); 964 } 965 } 966 // update directionNav 967 if (slider.vars.directionNav) methods.directionNav.update(); 968 969 } 970 971 slider.addSlide = function(obj, pos) { 972 var $obj = $(obj); 973 974 slider.count += 1; 975 slider.last = slider.count - 1; 976 977 // append new slide 978 if (vertical && reverse) { 979 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj); 980 } else { 981 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj); 982 } 983 984 // update currentSlide, animatingTo, controlNav, and directionNav 985 slider.update(pos, "add"); 986 987 // update slider.slides 988 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 989 // re-setup the slider to accomdate new slide 990 slider.setup(); 991 992 //FlexSlider: added() Callback 993 slider.vars.added(slider); 994 } 995 slider.removeSlide = function(obj) { 996 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj; 997 998 // update count 999 slider.count -= 1; 1000 slider.last = slider.count - 1; 1001 1002 // remove slide 1003 if (isNaN(obj)) { 1004 $(obj, slider.slides).remove(); 1005 } else { 1006 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove(); 1007 } 1008 1009 // update currentSlide, animatingTo, controlNav, and directionNav 1010 slider.doMath(); 1011 slider.update(pos, "remove"); 1012 1013 // update slider.slides 1014 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1015 // re-setup the slider to accomdate new slide 1016 slider.setup(); 1017 1018 // FlexSlider: removed() Callback 1019 slider.vars.removed(slider); 1020 } 1021 1022 //FlexSlider: Initialize 1023 methods.init(); 1024 } 1025 1026 // Ensure the slider isn't focussed if the window loses focus. 1027 $( window ).blur( function ( e ) { 1028 focused = false; 1029 }).focus( function ( e ) { 1030 focused = true; 1031 }); 1032 1033 //FlexSlider: Default Settings 1034 $.flexslider.defaults = { 1035 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin 1036 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril 1037 animation: "fade", //String: Select your animation type, "fade" or "slide" 1038 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported! 1039 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 1040 reverse: false, //{NEW} Boolean: Reverse the animation direction 1041 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 1042 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode 1043 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 1044 slideshow: true, //Boolean: Animate slider automatically 1045 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 1046 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds 1047 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds 1048 randomize: false, //Boolean: Randomize slide order 1049 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav. 1050 1051 // Usability features 1052 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended. 1053 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 1054 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage. 1055 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available 1056 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices 1057 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches 1058 1059 // Primary Controls 1060 controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage 1061 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 1062 prevText: "Previous", //String: Set the text for the "previous" directionNav item 1063 nextText: "Next", //String: Set the text for the "next" directionNav item 1064 1065 // Secondary Navigation 1066 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys 1067 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present. 1068 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1069 pausePlay: false, //Boolean: Create pause/play dynamic element 1070 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item 1071 playText: "Play", //String: Set the text for the "play" pausePlay item 1072 1073 // Special properties 1074 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. 1075 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. 1076 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care. 1077 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider 1078 1079 // Carousel Options 1080 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding. 1081 itemMargin: 0, //{NEW} Integer: Margin between carousel items. 1082 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this. 1083 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit. 1084 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items. 1085 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide 1086 1087 // Callback API 1088 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide 1089 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation 1090 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes 1091 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 1092 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added 1093 removed: function(){} //{NEW} Callback: function(slider) - Fires after a slide is removed 1094 } 1095 1096 1097 //FlexSlider: Plugin Function 1098 $.fn.flexslider = function(options) { 1099 if (options === undefined) options = {}; 1100 1101 if (typeof options === "object") { 1102 return this.each(function() { 1103 var $this = $(this), 1104 selector = (options.selector) ? options.selector : ".slides > li", 1105 $slides = $this.find(selector); 1106 1107 if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) { 1108 $slides.fadeIn(400); 1109 if (options.start) options.start($this); 1110 } else if ($this.data('flexslider') === undefined) { 1111 new $.flexslider(this, options); 1112 } 1113 }); 1114 } else { 1115 // Helper strings to quickly perform functions on the slider 1116 var $slider = $(this).data('flexslider'); 1117 switch (options) { 1118 case "play": $slider.play(); break; 1119 case "pause": $slider.pause(); break; 1120 case "stop": $slider.stop(); break; 1121 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break; 1122 case "prev": 1123 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break; 1124 default: if (typeof options === "number") $slider.flexAnimate(options, true); 1125 } 1126 } 1127 } 1128})(jQuery); 1129/* 1130 1131Uniform v2.1.0 1132Copyright © 2009 Josh Pyles / Pixelmatrix Design LLC 1133http://pixelmatrixdesign.com 1134 1135Requires jQuery 1.3 or newer
1136 1137Much thanks to Thomas Reynolds and Buck Wilson for their help and advice on 1138this. 1139 1140Disabling text selection is made possible by Mathias Bynens 1141<http://mathiasbynens.be/> and his noSelect plugin. 1142<https://github.com/mathiasbynens/jquery-noselect>, which is embedded. 1143 1144Also, thanks to David Kaneda and Eugene Bond for their contributions to the 1145plugin. 1146 1147Tyler Akins has also rewritten chunks of the plugin, helped close many issues, 1148and ensured version 2 got out the door. 1149 1150License: 1151MIT License - http://www.opensource.org/licenses/mit-license.php 1152 1153Enjoy! 1154 1155*/ 1156/*global jQuery, window, document, navigator*/ 1157 1158(function ($, undef) { 1159 "use strict"; 1160 1161 /** 1162 * Use .prop() if jQuery supports it, otherwise fall back to .attr() 1163 * 1164 * @param jQuery $el jQuery'd element on which we're calling attr/prop 1165 * @param ... All other parameters are passed to jQuery's function 1166 * @return The result from jQuery 1167 */ 1168 function attrOrProp($el) { 1169 var args = Array.prototype.slice.call(arguments, 1); 1170 1171 if ($el.prop) { 1172 // jQuery 1.6+ 1173 return $el.prop.apply($el, args); 1174 } 1175 1176 // jQuery 1.5 and below 1177 return $el.attr.apply($el, args); 1178 } 1179 1180 /** 1181 * For backwards compatibility with older jQuery libraries, only bind 1182 * one thing at a time. Also, this function adds our namespace to 1183 * events in one consistent location, shrinking the minified code. 1184 * 1185 * The properties on the events object are the names of the events 1186 * that we are supposed to add to. It can be a space separated list. 1187 * The namespace will be added automatically. 1188 * 1189 * @param jQuery $el 1190 * @param Object options Uniform options for this element 1191 * @param Object events Events to bind, properties are event names 1192 */ 1193 function bindMany($el, options, events) { 1194 var name, namespaced; 1195 1196 for (name in events) { 1197 if (events.hasOwnProperty(name)) { 1198 namespaced = name.replace(/ |$/g, options.eventNamespace); 1199 $el.bind(namespaced, events[name]); 1200 } 1201 } 1202 } 1203 1204 /** 1205 * Bind the hover, active, focus, and blur UI updates 1206 * 1207 * @param jQuery $el Original element 1208 * @param jQuery $target Target for the events (our div/span) 1209 * @param Object options Uniform options for the element $target 1210 */ 1211 function bindUi($el, $target, options) { 1212 bindMany($el, options, { 1213 focus: function () { 1214 $target.addClass(options.focusClass); 1215 }, 1216 blur: function () { 1217 $target.removeClass(options.focusClass); 1218 $target.removeClass(options.activeClass); 1219 }, 1220 mouseenter: function () { 1221 $target.addClass(options.hoverClass); 1222 }, 1223 mouseleave: function () { 1224 $target.removeClass(options.hoverClass); 1225 $target.removeClass(options.activeClass); 1226 }, 1227 "mousedown touchbegin": function () { 1228 if (!$el.is(":disabled")) { 1229 $target.addClass(options.activeClass); 1230 } 1231 }, 1232 "mouseup touchend": function () { 1233 $target.removeClass(options.activeClass); 1234 } 1235 }); 1236 } 1237 1238 /** 1239 * Remove the hover, focus, active classes. 1240 * 1241 * @param jQuery $el Element with classes 1242 * @param Object options Uniform options for the element 1243 */ 1244 function classClearStandard($el, options) { 1245 $el.removeClass(options.hoverClass + " " + options.focusClass + " " + options.activeClass); 1246 } 1247 1248 /** 1249 * Add or remove a class, depending on if it's "enabled" 1250 * 1251 * @param jQuery $el Element that has the class added/removed 1252 * @param String className Class or classes to add/remove 1253 * @param Boolean enabled True to add the class, false to remove 1254 */ 1255 function classUpdate($el, className, enabled) { 1256 if (enabled) { 1257 $el.addClass(className); 1258 } else { 1259 $el.removeClass(className); 1260 } 1261 } 1262 1263 /** 1264 * Updating the "checked" property can be a little tricky. This 1265 * changed in jQuery 1.6 and now we can pass booleans to .prop(). 1266 * Prior to that, one either adds an attribute ("checked=checked") or 1267 * removes the attribute. 1268 * 1269 * @param jQuery $tag Our Uniform span/div 1270 * @param jQuery $el Original form element 1271 * @param Object options Uniform options for this element 1272 */ 1273 function classUpdateChecked($tag, $el, options) { 1274 var c = "checked", 1275 isChecked = $el.is(":" + c); 1276 1277 if ($el.prop) { 1278 // jQuery 1.6+ 1279 $el.prop(c, isChecked); 1280 } else { 1281 // jQuery 1.5 and below 1282 if (isChecked) { 1283 $el.attr(c, c); 1284 } else { 1285 $el.removeAttr(c); 1286 } 1287 } 1288 1289 classUpdate($tag, options.checkedClass, isChecked); 1290 } 1291 1292 /** 1293 * Set or remove the "disabled" class for disabled elements, based on 1294 * if the 1295 * 1296 * @param jQuery $tag Our Uniform span/div 1297 * @param jQuery $el Original form element 1298 * @param Object options Uniform options for this element 1299 */ 1300 function classUpdateDisabled($tag, $el, options) { 1301 classUpdate($tag, options.disabledClass, $el.is(":disabled")); 1302 } 1303 1304 /** 1305 * Wrap an element inside of a container or put the container next 1306 * to the element. See the code for examples of the different methods. 1307 * 1308 * Returns the container that was added to the HTML. 1309 * 1310 * @param jQuery $el Element to wrap 1311 * @param jQuery $container Add this new container around/near $el 1312 * @param String method One of "after", "before" or "wrap" 1313 * @return $container after it has been cloned for adding to $el 1314 */ 1315 function divSpanWrap($el, $container, method) { 1316 switch (method) { 1317 case "after": 1318 // Result: <element /> <container /> 1319 $el.after($container); 1320 return $el.next(); 1321 case "before": 1322 // Result: <container /> <element /> 1323 $el.before($container); 1324 return $el.prev(); 1325 case "wrap": 1326 // Result: <container> <element /> </container> 1327 $el.wrap($container); 1328 return $el.parent(); 1329 } 1330 1331 return null; 1332 } 1333 1334 1335 /** 1336 * Create a div/span combo for uniforming an element 1337 * 1338 * @param jQuery $el Element to wrap 1339 * @param Object options Options for the element, set by the user 1340 * @param Object divSpanConfig Options for how we wrap the div/span 1341 * @return Object Contains the div and span as properties 1342 */ 1343 function divSpan($el, options, divSpanConfig) { 1344 var $div, $span, id; 1345 1346 if (!divSpanConfig) { 1347 divSpanConfig = {}; 1348 } 1349 1350 divSpanConfig = $.extend({ 1351 bind: {}, 1352 divClass: null, 1353 divWrap: "wrap", 1354 spanClass: null, 1355 spanHtml: null, 1356 spanWrap: "wrap" 1357 }, divSpanConfig); 1358
1359 $div = $('<div />'); 1360 $span = $('<span />'); 1361 1362 // Automatically hide this div/span if the element is hidden. 1363 // Do not hide if the element is hidden because a parent is hidden. 1364 if (options.autoHide && $el.is(':hidden') && $el.css('display') === 'none') { 1365 $div.hide(); 1366 } 1367 1368 if (divSpanConfig.divClass) { 1369 $div.addClass(divSpanConfig.divClass); 1370 } 1371 1372 if (options.wrapperClass) { 1373 $div.addClass(options.wrapperClass); 1374 } 1375 1376 if (divSpanConfig.spanClass) { 1377 $span.addClass(divSpanConfig.spanClass); 1378 } 1379 1380 id = attrOrProp($el, 'id'); 1381 1382 if (options.useID && id) { 1383 attrOrProp($div, 'id', options.idPrefix + '-' + id); 1384 } 1385 1386 if (divSpanConfig.spanHtml) { 1387 $span.html(divSpanConfig.spanHtml); 1388 } 1389 1390 $div = divSpanWrap($el, $div, divSpanConfig.divWrap); 1391 $span = divSpanWrap($el, $span, divSpanConfig.spanWrap); 1392 classUpdateDisabled($div, $el, options); 1393 return { 1394 div: $div, 1395 span: $span 1396 }; 1397 } 1398 1399 1400 /** 1401 * Wrap an element with a span to apply a global wrapper class 1402 * 1403 * @param jQuery $el Element to wrap 1404 * @param object options 1405 * @return jQuery Wrapper element 1406 */ 1407 function wrapWithWrapperClass($el, options) { 1408 var $span; 1409 1410 if (!options.wrapperClass) { 1411 return null; 1412 } 1413 1414 $span = $('<span />').addClass(options.wrapperClass); 1415 $span = divSpanWrap($el, $span, "wrap"); 1416 return $span; 1417 } 1418 1419 1420 /** 1421 * Test if high contrast mode is enabled. 1422 * 1423 * In high contrast mode, background images can not be set and 1424 * they are always returned as 'none'. 1425 * 1426 * @return boolean True if in high contrast mode 1427 */ 1428 function highContrast() { 1429 var c, $div, el, rgb; 1430 1431 // High contrast mode deals with white and black 1432 rgb = 'rgb(120,2,153)'; 1433 $div = $('<div style="width:0;height:0;color:' + rgb + '">'); 1434 $('body').append($div); 1435 el = $div.get(0); 1436 1437 // $div.css() will get the style definition, not 1438 // the actually displaying style 1439 if (window.getComputedStyle) { 1440 c = window.getComputedStyle(el, '').color; 1441 } else { 1442 c = (el.currentStyle || el.style || {}).color; 1443 } 1444 1445 $div.remove(); 1446 return c.replace(/ /g, '') !== rgb; 1447 } 1448 1449 1450 /** 1451 * Change text into safe HTML 1452 * 1453 * @param String text 1454 * @return String HTML version 1455 */ 1456 function htmlify(text) { 1457 if (!text) { 1458 return ""; 1459 } 1460 1461 return $('<span />').text(text).html(); 1462 } 1463 1464 /** 1465 * If not MSIE, return false. 1466 * If it is, return the version number. 1467 * 1468 * @return false|number 1469 */ 1470 function isMsie() { 1471 return navigator.cpuClass && !navigator.product; 1472 } 1473 1474 /** 1475 * Return true if this version of IE allows styling 1476 * 1477 * @return boolean 1478 */ 1479 function isMsieSevenOrNewer() { 1480 if (typeof window.XMLHttpRequest !== 'undefined') { 1481 return true; 1482 } 1483 1484 return false; 1485 } 1486 1487 /** 1488 * Test if the element is a multiselect 1489 * 1490 * @param jQuery $el Element 1491 * @return boolean true/false 1492 */ 1493 function isMultiselect($el) { 1494 var elSize; 1495 1496 if ($el[0].multiple) { 1497 return true; 1498 } 1499 1500 elSize = attrOrProp($el, "size"); 1501 1502 if (!elSize || elSize <= 1) { 1503 return false; 1504 } 1505 1506 return true; 1507 } 1508 1509 /** 1510 * Meaningless utility function. Used mostly for improving minification. 1511 * 1512 * @return false 1513 */ 1514 function returnFalse() { 1515 return false; 1516 } 1517 1518 /** 1519 * noSelect plugin, very slightly modified 1520 * http://mths.be/noselect v1.0.3 1521 * 1522 * @param jQuery $elem Element that we don't want to select 1523 * @param Object options Uniform options for the element 1524 */ 1525 function noSelect($elem, options) { 1526 var none = 'none'; 1527 bindMany($elem, options, { 1528 'selectstart dragstart mousedown': returnFalse 1529 }); 1530 1531 $elem.css({ 1532 MozUserSelect: none, 1533 msUserSelect: none, 1534 webkitUserSelect: none, 1535 userSelect: none 1536 }); 1537 } 1538 1539 /** 1540 * Updates the filename tag based on the value of the real input 1541 * element. 1542 * 1543 * @param jQuery $el Actual form element 1544 * @param jQuery $filenameTag Span/div to update 1545 * @param Object options Uniform options for this element 1546 */ 1547 function setFilename($el, $filenameTag, options) { 1548 var filename = $el.val(); 1549 1550 if (filename === "") { 1551 filename = options.fileDefaultHtml; 1552 } else { 1553 filename = filename.split(/[\/\\]+/); 1554 filename = filename[(filename.length - 1)]; 1555 } 1556 1557 $filenameTag.text(filename); 1558 } 1559 1560 1561 /** 1562 * Function from jQuery to swap some CSS values, run a callback, 1563 * then restore the CSS. Modified to pass JSLint and handle undefined 1564 * values with 'use strict'. 1565 * 1566 * @param jQuery $el Element 1567 * @param object newCss CSS values to swap out 1568 * @param Function callback Function to run 1569 */ 1570 function swap($elements, newCss, callback) { 1571 var restore, item; 1572 1573 restore = []; 1574 1575 $elements.each(function () { 1576 var name; 1577 1578 for (name in newCss) { 1579 if (Object.prototype.hasOwnProperty.call(newCss, name)) { 1580 restore.push({ 1581 el: this, 1582 name: name, 1583 old: this.style[name] 1584 });
1585 1586 this.style[name] = newCss[name]; 1587 } 1588 } 1589 }); 1590 1591 callback(); 1592 1593 while (restore.length) { 1594 item = restore.pop(); 1595 item.el.style[item.name] = item.old; 1596 } 1597 } 1598 1599 1600 /** 1601 * The browser doesn't provide sizes of elements that are not visible. 1602 * This will clone an element and add it to the DOM for calculations. 1603 * 1604 * @param jQuery $el 1605 * @param String method 1606 */ 1607 function sizingInvisible($el, callback) { 1608 var targets; 1609 1610 // We wish to target ourselves and any parents as long as 1611 // they are not visible 1612 targets = $el.parents(); 1613 targets.push($el[0]); 1614 targets = targets.not(':visible'); 1615 swap(targets, { 1616 visibility: "hidden", 1617 display: "block", 1618 position: "absolute" 1619 }, callback); 1620 } 1621 1622 1623 /** 1624 * Standard way to unwrap the div/span combination from an element 1625 * 1626 * @param jQuery $el Element that we wish to preserve 1627 * @param Object options Uniform options for the element 1628 * @return Function This generated function will perform the given work 1629 */ 1630 function unwrapUnwrapUnbindFunction($el, options) { 1631 return function () { 1632 $el.unwrap().unwrap().unbind(options.eventNamespace); 1633 }; 1634 } 1635 1636 var allowStyling = true, // False if IE6 or other unsupported browsers 1637 highContrastTest = false, // Was the high contrast test ran? 1638 uniformHandlers = [ // Objects that take care of "unification" 1639 { 1640 // Buttons 1641 match: function ($el) { 1642 return $el.is("a, button, :submit, :reset, input[type='button']"); 1643 }, 1644 apply: function ($el, options) { 1645 var $div, defaultSpanHtml, ds, getHtml, doingClickEvent; 1646 defaultSpanHtml = options.submitDefaultHtml; 1647 1648 if ($el.is(":reset")) { 1649 defaultSpanHtml = options.resetDefaultHtml; 1650 } 1651 1652 if ($el.is("a, button")) { 1653 // Use the HTML inside the tag 1654 getHtml = function () { 1655 return $el.html() || defaultSpanHtml; 1656 }; 1657 } else { 1658 // Use the value property of the element 1659 getHtml = function () { 1660 return htmlify(attrOrProp($el, "value")) || defaultSpanHtml; 1661 }; 1662 } 1663 1664 ds = divSpan($el, options, { 1665 divClass: options.buttonClass, 1666 spanHtml: getHtml() 1667 }); 1668 $div = ds.div; 1669 bindUi($el, $div, options); 1670 doingClickEvent = false; 1671 bindMany($div, options, { 1672 "click touchend": function () { 1673 var ev, res, target, href; 1674 1675 if (doingClickEvent) { 1676 return; 1677 } 1678 1679 if ($el.is(':disabled')) { 1680 return; 1681 } 1682 1683 doingClickEvent = true; 1684 1685 if ($el[0].dispatchEvent) { 1686 ev = document.createEvent("MouseEvents"); 1687 ev.initEvent("click", true, true); 1688 res = $el[0].dispatchEvent(ev); 1689 1690 if ($el.is('a') && res) { 1691 target = attrOrProp($el, 'target'); 1692 href = attrOrProp($el, 'href'); 1693 1694 if (!target || target === '_self') { 1695 document.location.href = href; 1696 } else { 1697 window.open(href, target); 1698 } 1699 } 1700 } else { 1701 $el.click(); 1702 } 1703 1704 doingClickEvent = false; 1705 } 1706 }); 1707 noSelect($div, options); 1708 return { 1709 remove: function () { 1710 // Move $el out 1711 $div.after($el); 1712 1713 // Remove div and span 1714 $div.remove(); 1715 1716 // Unbind events 1717 $el.unbind(options.eventNamespace); 1718 return $el; 1719 }, 1720 update: function () { 1721 classClearStandard($div, options); 1722 classUpdateDisabled($div, $el, options); 1723 $el.detach(); 1724 ds.span.html(getHtml()).append($el); 1725 } 1726 }; 1727 } 1728 }, 1729 { 1730 // Checkboxes 1731 match: function ($el) { 1732 return $el.is(":checkbox"); 1733 }, 1734 apply: function ($el, options) { 1735 var ds, $div, $span; 1736 ds = divSpan($el, options, { 1737 divClass: options.checkboxClass 1738 }); 1739 $div = ds.div; 1740 $span = ds.span; 1741 1742 // Add focus classes, toggling, active, etc. 1743 bindUi($el, $div, options); 1744 bindMany($el, options, { 1745 "click touchend": function () { 1746 classUpdateChecked($span, $el, options); 1747 } 1748 });
1749 classUpdateChecked($span, $el, options); 1750 return { 1751 remove: unwrapUnwrapUnbindFunction($el, options), 1752 update: function () { 1753 classClearStandard($div, options); 1754 $span.removeClass(options.checkedClass); 1755 classUpdateChecked($span, $el, options); 1756 classUpdateDisabled($div, $el, options); 1757 } 1758 }; 1759 } 1760 }, 1761 { 1762 // File selection / uploads 1763 match: function ($el) { 1764 return $el.is(":file"); 1765 }, 1766 apply: function ($el, options) { 1767 var ds, $div, $filename, $button; 1768 1769 // The "span" is the button 1770 ds = divSpan($el, options, { 1771 divClass: options.fileClass, 1772 spanClass: options.fileButtonClass, 1773 spanHtml: options.fileButtonHtml, 1774 spanWrap: "after" 1775 }); 1776 $div = ds.div; 1777 $button = ds.span; 1778 $filename = $("<span />").html(options.fileDefaultHtml); 1779 $filename.addClass(options.filenameClass); 1780 $filename = divSpanWrap($el, $filename, "after"); 1781 1782 // Set the size 1783 if (!attrOrProp($el, "size")) { 1784 attrOrProp($el, "size", $div.width() / 10); 1785 } 1786 1787 // Actions 1788 function filenameUpdate() { 1789 setFilename($el, $filename, options); 1790 } 1791 1792 bindUi($el, $div, options); 1793 1794 // Account for input saved across refreshes 1795 filenameUpdate(); 1796 1797 // IE7 doesn't fire onChange until blur or second fire. 1798 if (isMsie()) { 1799 // IE considers browser chrome blocking I/O, so it 1800 // suspends tiemouts until after the file has 1801 // been selected. 1802 bindMany($el, options, { 1803 click: function () { 1804 $el.trigger("change"); 1805 setTimeout(filenameUpdate, 0); 1806 } 1807 }); 1808 } else { 1809 // All other browsers behave properly 1810 bindMany($el, options, { 1811 change: filenameUpdate 1812 }); 1813 } 1814 1815 noSelect($filename, options); 1816 noSelect($button, options); 1817 return { 1818 remove: function () { 1819 // Remove filename and button 1820 $filename.remove(); 1821 $button.remove(); 1822 1823 // Unwrap parent div, remove events 1824 return $el.unwrap().unbind(options.eventNamespace); 1825 }, 1826 update: function () { 1827 classClearStandard($div, options); 1828 setFilename($el, $filename, options); 1829 classUpdateDisabled($div, $el, options); 1830 } 1831 }; 1832 } 1833 }, 1834 { 1835 // Input fields (text) 1836 match: function ($el) { 1837 if ($el.is("input")) { 1838 var t = (" " + attrOrProp($el, "type") + " ").toLowerCase(), 1839 allowed = " color date datetime datetime-local email month number password search tel text time url week "; 1840 return allowed.indexOf(t) >= 0; 1841 } 1842 1843 return false; 1844 }, 1845 apply: function ($el, options) { 1846 var elType, $wrapper; 1847 1848 elType = attrOrProp($el, "type"); 1849 $el.addClass(options.inputClass); 1850 $wrapper = wrapWithWrapperClass($el, options); 1851 bindUi($el, $el, options); 1852 1853 if (options.inputAddTypeAsClass) { 1854 $el.addClass(elType); 1855 } 1856 1857 return { 1858 remove: function () { 1859 $el.removeClass(options.inputClass); 1860 1861 if (options.inputAddTypeAsClass) { 1862 $el.removeClass(elType); 1863 } 1864 1865 if ($wrapper) { 1866 $el.unwrap(); 1867 } 1868 }, 1869 update: returnFalse 1870 }; 1871 } 1872 }, 1873 { 1874 // Radio buttons 1875 match: function ($el) { 1876 return $el.is(":radio"); 1877 }, 1878 apply: function ($el, options) { 1879 var ds, $div, $span; 1880 ds = divSpan($el, options, { 1881 divClass: options.radioClass 1882 }); 1883 $div = ds.div; 1884 $span = ds.span; 1885 1886 // Add classes for focus, handle active, checked 1887 bindUi($el, $div, options); 1888 bindMany($el, options, { 1889 "click touchend": function () { 1890 // Find all radios with the same name, then update 1891 // them with $.uniform.update() so the right 1892 // per-element options are used 1893 $.uniform.update($(':radio[name="' + attrOrProp($el, "name") + '"]')); 1894 } 1895 }); 1896 classUpdateChecked($span, $el, options); 1897 return { 1898 remove: unwrapUnwrapUnbindFunction($el, options), 1899 update: function () { 1900 classClearStandard($div, options); 1901 classUpdateChecked($span, $el, options); 1902 classUpdateDisabled($div, $el, options); 1903 } 1904 }; 1905 } 1906 }, 1907 { 1908 // Select lists, but do not style multiselects here 1909 match: function ($el) {
1910 if ($el.is("select") && !isMultiselect($el)) { 1911 return true; 1912 } 1913 1914 return false; 1915 }, 1916 apply: function ($el, options) { 1917 var ds, $div, $span, origElemWidth; 1918 1919 if (options.selectAutoWidth) { 1920 sizingInvisible($el, function () { 1921 origElemWidth = $el.width(); 1922 }); 1923 } 1924 1925 ds = divSpan($el, options, { 1926 divClass: options.selectClass, 1927 spanHtml: ($el.find(":selected:first") || $el.find("option:first")).html(), 1928 spanWrap: "before" 1929 }); 1930 $div = ds.div; 1931 $span = ds.span; 1932 1933 if (options.selectAutoWidth) { 1934 // Use the width of the select and adjust the 1935 // span and div accordingly 1936 sizingInvisible($el, function () { 1937 // Force "display: block" - related to bug #287 1938 swap($([ $span[0], $div[0] ]), { 1939 display: "block" 1940 }, function () { 1941 var spanPad; 1942 spanPad = $span.outerWidth() - $span.width(); 1943 $div.width(origElemWidth + spanPad); 1944 $span.width(origElemWidth); 1945 }); 1946 }); 1947 } else { 1948 // Force the select to fill the size of the div 1949 $div.addClass('fixedWidth'); 1950 } 1951 1952 // Take care of events 1953 bindUi($el, $div, options); 1954 bindMany($el, options, { 1955 change: function () { 1956 $span.html($el.find(":selected").html()); 1957 $div.removeClass(options.activeClass); 1958 }, 1959 "click touchend": function () { 1960 // IE7 and IE8 may not update the value right 1961 // until after click event - issue #238 1962 var selHtml = $el.find(":selected").html(); 1963 1964 if ($span.html() !== selHtml) { 1965 // Change was detected 1966 // Fire the change event on the select tag 1967 $el.trigger('change'); 1968 } 1969 }, 1970 keyup: function () { 1971 $span.html($el.find(":selected").html()); 1972 } 1973 }); 1974 noSelect($span, options); 1975 return { 1976 remove: function () { 1977 // Remove sibling span 1978 $span.remove(); 1979 1980 // Unwrap parent div 1981 $el.unwrap().unbind(options.eventNamespace); 1982 return $el; 1983 }, 1984 update: function () { 1985 if (options.selectAutoWidth) { 1986 // Easier to remove and reapply formatting 1987 $.uniform.restore($el); 1988 $el.uniform(options); 1989 } else { 1990 classClearStandard($div, options); 1991 1992 // Reset current selected text 1993 $span.html($el.find(":selected").html()); 1994 classUpdateDisabled($div, $el, options); 1995 } 1996 } 1997 }; 1998 } 1999 }, 2000 { 2001 // Select lists - multiselect lists only 2002 match: function ($el) { 2003 if ($el.is("select") && isMultiselect($el)) { 2004 return true; 2005 } 2006 2007 return false; 2008 }, 2009 apply: function ($el, options) { 2010 var $wrapper; 2011 2012 $el.addClass(options.selectMultiClass); 2013 $wrapper = wrapWithWrapperClass($el, options); 2014 bindUi($el, $el, options); 2015 2016 return { 2017 remove: function () { 2018 $el.removeClass(options.selectMultiClass); 2019 2020 if ($wrapper) { 2021 $el.unwrap(); 2022 } 2023 }, 2024 update: returnFalse 2025 }; 2026 } 2027 }, 2028 { 2029 // Textareas 2030 match: function ($el) { 2031 return $el.is("textarea"); 2032 }, 2033 apply: function ($el, options) { 2034 var $wrapper; 2035 2036 $el.addClass(options.textareaClass); 2037 $wrapper = wrapWithWrapperClass($el, options); 2038 bindUi($el, $el, options); 2039 2040 return { 2041 remove: function () { 2042 $el.removeClass(options.textareaClass); 2043 2044 if ($wrapper) { 2045 $el.unwrap(); 2046 } 2047 }, 2048 update: returnFalse 2049 }; 2050 } 2051 } 2052 ]; 2053 2054 // IE6 can't be styled - can't set opacity on select 2055 if (isMsie() && !isMsieSevenOrNewer()) { 2056 allowStyling = false; 2057 } 2058 2059 $.uniform = { 2060 // Default options that can be overridden globally or when uniformed 2061 // globally: $.uniform.defaults.fileButtonHtml = "Pick A File"; 2062 // on uniform: $('input').uniform({fileButtonHtml: "Pick a File"}); 2063 defaults: { 2064 activeClass: "active", 2065 autoHide: true, 2066 buttonClass: "button", 2067 checkboxClass: "checker", 2068 checkedClass: "checked", 2069 disabledClass: "disabled", 2070 eventNamespace: ".uniform", 2071 fileButtonClass: "action", 2072 fileButtonHtml: "Choose File", 2073 fileClass: "uploader", 2074 fileDefaultHtml: "No file selected", 2075 filenameClass: "filename",
2076 focusClass: "focus", 2077 hoverClass: "hover", 2078 idPrefix: "uniform", 2079 inputAddTypeAsClass: true, 2080 inputClass: "uniform-input", 2081 radioClass: "radio", 2082 resetDefaultHtml: "Reset", 2083 resetSelector: false, // We'll use our own function when you don't specify one 2084 selectAutoWidth: true, 2085 selectClass: "selector", 2086 selectMultiClass: "uniform-multiselect", 2087 submitDefaultHtml: "Submit", // Only text allowed 2088 textareaClass: "uniform", 2089 useID: true, 2090 wrapperClass: null 2091 }, 2092 2093 // All uniformed elements - DOM objects 2094 elements: [] 2095 }; 2096 2097 $.fn.uniform = function (options) { 2098 var el = this; 2099 options = $.extend({}, $.uniform.defaults, options); 2100 2101 // If we are in high contrast mode, do not allow styling 2102 if (!highContrastTest) { 2103 highContrastTest = true; 2104 2105 if (highContrast()) { 2106 allowStyling = false; 2107 } 2108 } 2109 2110 // Only uniform on browsers that work 2111 if (!allowStyling) { 2112 return this; 2113 } 2114 2115 // Code for specifying a reset button 2116 if (options.resetSelector) { 2117 $(options.resetSelector).mouseup(function () { 2118 window.setTimeout(function () { 2119 $.uniform.update(el); 2120 }, 10); 2121 }); 2122 } 2123 2124 return this.each(function () { 2125 var $el = $(this), i, handler, callbacks; 2126 2127 // Avoid uniforming elements already uniformed - just update 2128 if ($el.data("uniformed")) { 2129 $.uniform.update($el); 2130 return; 2131 } 2132 2133 // See if we have any handler for this type of element 2134 for (i = 0; i < uniformHandlers.length; i = i + 1) { 2135 handler = uniformHandlers[i]; 2136 2137 if (handler.match($el, options)) { 2138 callbacks = handler.apply($el, options); 2139 $el.data("uniformed", callbacks); 2140 2141 // Store element in our global array 2142 $.uniform.elements.push($el.get(0)); 2143 return; 2144 } 2145 } 2146 2147 // Could not style this element 2148 }); 2149 }; 2150 2151 $.uniform.restore = $.fn.uniform.restore = function (elem) { 2152 if (elem === undef) { 2153 elem = $.uniform.elements; 2154 } 2155 2156 $(elem).each(function () { 2157 var $el = $(this), index, elementData; 2158 elementData = $el.data("uniformed"); 2159 2160 // Skip elements that are not uniformed 2161 if (!elementData) { 2162 return; 2163 } 2164 2165 // Unbind events, remove additional markup that was added 2166 elementData.remove(); 2167 2168 // Remove item from list of uniformed elements 2169 index = $.inArray(this, $.uniform.elements); 2170 2171 if (index >= 0) { 2172 $.uniform.elements.splice(index, 1); 2173 } 2174 2175 $el.removeData("uniformed"); 2176 }); 2177 }; 2178 2179 $.uniform.update = $.fn.uniform.update = function (elem) { 2180 if (elem === undef) { 2181 elem = $.uniform.elements; 2182 } 2183 2184 $(elem).each(function () { 2185 var $el = $(this), elementData; 2186 elementData = $el.data("uniformed"); 2187 2188 // Skip elements that are not uniformed 2189 if (!elementData) { 2190 return; 2191 } 2192 2193 elementData.update($el, elementData.options); 2194 }); 2195 }; 2196}(jQuery)); 2197(function ($) 2198{ 2199 2200 // formstyling 2201 $('select').uniform({ 2202 selectClass: 'form-select-fake', 2203 selectAutoWidth: false 2204 }); 2205 2206 2207 // navigation toggler 2208 $('[data-action="navigation-toggle"]').on('click', function(e) 2209 { 2210 e.preventDefault(); 2211 2212 $(this).toggleClass('is-active'); 2213 }); 2214 2215 2216 // promo slider 2217 $('.promo-inner').flexslider({ 2218 animation: 'slide', 2219 animationSpeed: 800, 2220 slideshowSpeed: 3000, 2221 controlNav: false, 2222 directionNav: false 2223 }); 2224 2225 // buchneuheiten slider 2226 /*$('.flexslider').flexslider({ 2227 animation: 'slide', 2228 slideshow: false, 2229 controlNav: true, 2230 manualControls: '.buchneuheiten .listing-pagination a', 2231 selector: ".slides > .slide", 2232 directionNav: false 2233 });*/ 2234 2235 2236 2237 2238 // tab switcher 2239 $('.tabs-switch').on('click', function(e) 2240 { 2241 var me = $(this); 2242 var idx = me.parent().children().index(this); 2243 2244 e.preventDefault(); 2245 2246 if (me.hasClass('is-active')) 2247 { 2248 return; 2249 } 2250 2251 me.addClass('is-active').siblings().removeClass('is-active'); 2252 me.parent().next().children().removeClass('is-active').eq(idx).addClass('is-active'); 2253 }) 2254 2255 // accordion 2256 $('.accordion-switch').on('click', function(e) 2257 { 2258 e.preventDefault(); 2259 $(this).next().stop().slideToggle(400); 2260 }); 2261 2262 $('.bookInfoContent-buttons #presse-btn').on('click', function(e) 2263 { 2264 var me = $(this); 2265 if ($('.bookInfoContent-buttons .presse-btn-box').hasClass('is-active')) { 2266 $('.bookInfoContent-buttons .presse-btn-box').removeClass('is-active'); 2267 } 2268 else { 2269 $('.bookInfoContent-buttons .presse-btn-box').addClass('is-active'); 2270 } 2271 });
2272 2273 $('.bookInfoContent-buttons #rezex').on('click', function(e) 2274 { 2275 var me = $(this); 2276 if ($('.bookInfoContent-buttons .presse-btn-box-sub').hasClass('is-active')) { 2277 $('.bookInfoContent-buttons .presse-btn-box-sub').removeClass('is-active'); 2278 } 2279 else { 2280 $('.bookInfoContent-buttons .presse-btn-box-sub').addClass('is-active'); 2281 } 2282 }); 2283 2284 /*$('.bookInfoContent-buttons #rezex').hover( 2285 function(){ 2286 jQuery('.bookInfoContent-buttons #rezex .presse-btn-box-sub').show(); 2287 }, 2288 function(){ 2289 jQuery('.bookInfoContent-buttons #rezex .presse-btn-box-sub').hide(); 2290 } 2291 )*/ 2292 2293})(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.