1/*! Superslides - v0.6.2 - 2013-07-10 2* https://github.com/nicinabox/superslides 3* Copyright (c) 2013 Nic Aitch; Licensed MIT */ 4(function(window, $) { 5 6var Superslides, plugin = 'superslides'; 7 8Superslides = function(el, options) { 9 this.options = $.extend({ 10 play: false, 11 animation_speed: 600, 12 animation_easing: 'swing', 13 animation: 'slide', 14 inherit_width_from: window, 15 inherit_height_from: '.slides-container', 16 pagination: true, 17 hashchange: false, 18 scrollable: true, 19 elements: { 20 preserve: '.preserve', 21 nav: '.slides-navigation', 22 container: '.slides-container', 23 pagination: '.slides-pagination' 24 } 25 }, options); 26 27 var that = this, 28 $control = $('<div>', { "class": 'slides-control' }), 29 multiplier = 1; 30 31 this.$el = $(el); 32 this.$container = this.$el.find(this.options.elements.container); 33 34 // Private Methods 35 var initialize = function() { 36 multiplier = that._findMultiplier(); 37 38 that.$el.on('click', that.options.elements.nav + " a", function(e) { 39 e.preventDefault(); 40 41 that.stop(); 42 if ($(this).hasClass('next')) { 43 that.animate('next', function() { 44 that.start(); 45 }); 46 } else { 47 that.animate('prev', function() { 48 that.start(); 49 }); 50 } 51 }); 52 53 $(document).on('keyup', function(e) { 54 if (e.keyCode === 37) { 55 that.animate('prev'); 56 } 57 if (e.keyCode === 39) { 58 that.animate('next'); 59 } 60 }); 61 62 $(window).on('resize', function() { 63 setTimeout(function() { 64 var $children = that.$container.children(); 65 66 that.width = that._findWidth(); 67 that.height = that._findHeight(); 68 69 $children.css({ 70 width: that.width, 71 left: that.width 72 }); 73 74 that.css.containers(); 75 that.css.images(); 76 }, 10); 77 }); 78 79 $(window).on('hashchange', function() { 80 var hash = that._parseHash(), index; 81 82 if (hash && !isNaN(hash)) { 83 // Minus 1 here because we don't want the url 84 // to be zero-indexed 85 index = that._upcomingSlide(hash - 1); 86 87 } else { 88 index = that._upcomingSlide(hash); 89 } 90 91 if (index >= 0 && index !== that.current) { 92 that.animate(index); 93 } 94 }); 95 96 that.pagination._events(); 97 98 that.start(); 99 return that; 100 }; 101 102var css = { 103 containers: function() { 104 if (that.init) { 105 that.$el.css({ 106 height: that.height 107 }); 108 109 that.$control.css({ 110 width: that.width * multiplier, 111 left: -that.width 112 }); 113 114 that.$container.css({ 115 116 }); 117 } else { 118 $('body').css({ 119 margin: 0 120 }); 121 122 that.$el.css({ 123 position: 'relative', 124 overflow: 'hidden', 125 width: '100%', 126 height: that.height 127 }); 128 129 that.$control.css({ 130 position: 'relative', 131 transform: 'translate3d(0)', 132 height: '100%', 133 width: that.width * multiplier, 134 left: -that.width 135 }); 136 137 that.$container.css({ 138 display: 'none', 139 margin: '0', 140 padding: '0', 141 listStyle: 'none', 142 position: 'relative', 143 height: '100%' 144 }); 145 } 146 147 if (that.size() === 1) { 148 that.$el.find(that.options.elements.nav).hide(); 149 } 150 }, 151 images: function() { 152 var $images = that.$container.find('img') 153 .not(that.options.elements.preserve) 154 155 $images.removeAttr('width').removeAttr('height') 156 .css({ 157 "-webkit-backface-visibility": 'hidden', 158 "-ms-interpolation-mode": 'bicubic', 159 "position": 'absolute', 160 "left": '0', 161 "top": '0', 162 "z-index": '-1', 163 "max-width": 'none' 164 }); 165 166 $images.each(function() { 167 var image_aspect_ratio = that.image._aspectRatio(this), 168 image = this; 169 170 if (!$.data(this, 'processed')) { 171 var img = new Image(); 172 img.onload = function() { 173 that.image._scale(image, image_aspect_ratio); 174 that.image._center(image, image_aspect_ratio); 175 $.data(image, 'processed', true); 176 }; 177 img.src = this.src; 178 179 } else { 180 that.image._scale(image, image_aspect_ratio); 181 that.image._center(image, image_aspect_ratio); 182 } 183 });
184 }, 185 children: function() { 186 var $children = that.$container.children(); 187 188 if ($children.is('img')) { 189 $children.each(function() { 190 if ($(this).is('img')) { 191 $(this).wrap('<div>'); 192 193 // move id attribute 194 var id = $(this).attr('id'); 195 $(this).removeAttr('id'); 196 $(this).parent().attr('id', id); 197 } 198 }); 199 200 $children = that.$container.children(); 201 } 202 203 if (!that.init) { 204 $children.css({ 205 display: 'none', 206 left: that.width * 2 207 }); 208 } 209 210 $children.css({ 211 position: 'absolute', 212 overflow: 'hidden', 213 height: '100%', 214 width: that.width, 215 top: 0, 216 zIndex: 0 217 }); 218 219 } 220} 221 222var fx = { 223 slide: function(orientation, complete) { 224 var $children = that.$container.children(), 225 $target = $children.eq(orientation.upcoming_slide); 226 227 $target.css({ 228 left: orientation.upcoming_position, 229 display: 'block' 230 }); 231 232 that.$control.animate({ 233 left: orientation.offset 234 }, 235 that.options.animation_speed, 236 that.options.animation_easing, 237 function() { 238 if (that.size() > 1) { 239 that.$control.css({ 240 left: -that.width 241 }); 242 243 $children.eq(orientation.upcoming_slide).css({ 244 left: that.width, 245 zIndex: 2 246 }); 247 248 if (orientation.outgoing_slide >= 0) { 249 $children.eq(orientation.outgoing_slide).css({ 250 left: that.width, 251 display: 'none', 252 zIndex: 0 253 }); 254 } 255 } 256 257 complete(); 258 }); 259 }, 260 fade: function(orientation, complete) { 261 var that = this, 262 $children = that.$container.children(), 263 $outgoing = $children.eq(orientation.outgoing_slide), 264 $target = $children.eq(orientation.upcoming_slide); 265 266 $target.css({ 267 left: this.width, 268 opacity: 1, 269 display: 'block' 270 }); 271 272 if (orientation.outgoing_slide >= 0) { 273 $outgoing.animate({ 274 opacity: 0 275 }, 276 that.options.animation_speed, 277 that.options.animation_easing, 278 function() { 279 if (that.size() > 1) { 280 $children.eq(orientation.upcoming_slide).css({ 281 zIndex: 2 282 }); 283 284 if (orientation.outgoing_slide >= 0) { 285 $children.eq(orientation.outgoing_slide).css({ 286 opacity: 1, 287 display: 'none', 288 zIndex: 0 289 }); 290 } 291 } 292 293 complete(); 294 }); 295 } else { 296 $target.css({ 297 zIndex: 2 298 }); 299 complete(); 300 } 301 } 302}; 303 304fx = $.extend(fx, $.fn.superslides.fx); 305 306var image = { 307 _centerY: function(image) { 308 var $img = $(image); 309 310 $img.css({ 311 top: (that.height - $img.height()) / 2 312 }); 313 }, 314 _centerX: function(image) { 315 var $img = $(image); 316 317 $img.css({ 318 left: (that.width - $img.width()) / 2 319 }); 320 }, 321 _center: function(image) { 322 that.image._centerX(image); 323 that.image._centerY(image); 324 }, 325 _aspectRatio: function(image) { 326 if (!image.naturalHeight && !image.naturalWidth) { 327 var img = new Image(); 328 img.src = image.src; 329 image.naturalHeight = img.height; 330 image.naturalWidth = img.width; 331 } 332 333 return image.naturalHeight / image.naturalWidth; 334 }, 335 _scale: function(image, image_aspect_ratio) { 336 image_aspect_ratio = image_aspect_ratio || that.image._aspectRatio(image); 337 338 var container_aspect_ratio = that.height / that.width, 339 $img = $(image); 340 341 if (container_aspect_ratio > image_aspect_ratio) { 342 $img.css({ 343 height: that.height, 344 width: that.height / image_aspect_ratio 345 }); 346 347 } else { 348 $img.css({ 349 height: that.width * image_aspect_ratio, 350 width: that.width 351 }); 352 } 353 } 354}; 355 356var pagination = { 357 _setCurrent: function(i) { 358 if (!that.$pagination) { return; } 359 360 var $pagination_children = that.$pagination.children();
361 362 $pagination_children.removeClass('current'); 363 $pagination_children.eq(i) 364 .addClass('current'); 365 }, 366 _addItem: function(i) { 367 var slide_number = i + 1, 368 href = slide_number, 369 $slide = that.$container.children().eq(i), 370 slide_id = $slide.attr('id'); 371 372 if (slide_id) { 373 href = slide_id; 374 } 375 376 var $item = $("<a>", { 377 'href': "#" + href, 378 'text': href 379 }); 380 381 $item.appendTo(that.$pagination); 382 }, 383 _setup: function() { 384 if (!that.options.pagination || that.size() === 1) { return; } 385 386 var $pagination = $("<nav>", { 387 'class': that.options.elements.pagination.replace(/^\./, '') 388 }); 389 390 that.$pagination = $pagination.appendTo(that.$el); 391 392 for (var i = 0; i < that.size(); i++) { 393 that.pagination._addItem(i); 394 } 395 }, 396 _events: function() { 397 that.$el.on('click', that.options.elements.pagination + ' a', function(e) { 398 e.preventDefault(); 399 400 var hash = that._parseHash(this.hash), 401 index = that._upcomingSlide(hash - 1); 402 403 if (index !== that.current) { 404 that.animate(index, function() { 405 that.start(); 406 }); 407 } 408 }); 409 } 410}; 411 412 this.css = css; 413 this.image = image; 414 this.pagination = pagination; 415 this.fx = fx; 416 this.animation = this.fx[this.options.animation]; 417 418 this.$control = this.$container.wrap($control).parent('.slides-control'); 419 420 that._findPositions(); 421 that.width = that._findWidth(); 422 that.height = that._findHeight(); 423 424 this.css.children(); 425 this.css.containers(); 426 this.css.images(); 427 this.pagination._setup(); 428 429 return initialize(); 430}; 431 432Superslides.prototype = { 433 _findWidth: function() { 434 return $(this.options.inherit_width_from).width(); 435 }, 436 _findHeight: function() { 437 return $(this.options.inherit_height_from).height(); 438 }, 439 440 _findMultiplier: function() { 441 return this.size() === 1 ? 1 : 3; 442 }, 443 444 _upcomingSlide: function(direction) { 445 if ((/next/).test(direction)) { 446 return this._nextInDom(); 447 448 } else if ((/prev/).test(direction)) { 449 return this._prevInDom(); 450 451 } else if ((/\d/).test(direction)) { 452 return +direction; 453 454 } else if (direction && (/\w/).test(direction)) { 455 var index = this._findSlideById(direction); 456 if (index >= 0) { 457 return index; 458 } else { 459 return 0; 460 } 461 462 } else { 463 return 0; 464 } 465 }, 466 467 _findSlideById: function(id) { 468 return this.$container.find('#' + id).index(); 469 }, 470 471 _findPositions: function(current, thisRef) { 472 thisRef = thisRef || this; 473 474 if (current === undefined) { 475 current = -1; 476 } 477 478 thisRef.current = current; 479 thisRef.next = thisRef._nextInDom(); 480 thisRef.prev = thisRef._prevInDom(); 481 }, 482 483 _nextInDom: function() { 484 var index = this.current + 1; 485 486 if (index === this.size()) { 487 index = 0; 488 } 489 490 return index; 491 }, 492 493 _prevInDom: function() { 494 var index = this.current - 1; 495 496 if (index < 0) { 497 index = this.size() - 1; 498 } 499 500 return index; 501 }, 502 503 _parseHash: function(hash) { 504 hash = hash || window.location.hash; 505 hash = hash.replace(/^#/, ''); 506 507 if (hash && !isNaN(+hash)) { 508 hash = +hash; 509 } 510 511 return hash; 512 }, 513 514 size: function() { 515 return this.$container.children().length; 516 }, 517 518 destroy: function() { 519 return this.$el.removeData(); 520 }, 521 522 update: function() { 523 this.css.children(); 524 this.css.containers(); 525 this.css.images(); 526 527 this.pagination._addItem(this.size()) 528 529 this._findPositions(this.current); 530 this.$el.trigger('updated.slides'); 531 }, 532 533 stop: function() { 534 clearInterval(this.play_id); 535 delete this.play_id; 536 537 this.$el.trigger('stopped.slides'); 538 }, 539 540 start: function() { 541 var that = this; 542 543 if (that.options.hashchange) { 544 $(window).trigger('hashchange'); 545 } else { 546 this.animate(); 547 } 548 549 if (this.options.play) { 550 if (this.play_id) { 551 this.stop(); 552 } 553 554 this.play_id = setInterval(function() { 555 that.animate(); 556 }, this.options.play); 557 } 558 559 this.$el.trigger('started.slides'); 560 }, 561 562 animate: function(direction, userCallback) { 563 var that = this, 564 orientation = {}; 565 566 if (this.animating) { 567 return; 568 } 569 570 this.animating = true; 571 572 if (direction === undefined) {
573 direction = 'next'; 574 } 575 576 orientation.upcoming_slide = this._upcomingSlide(direction); 577 578 if (orientation.upcoming_slide >= this.size()) { 579 return; 580 } 581 582 orientation.outgoing_slide = this.current; 583 orientation.upcoming_position = this.width * 2; 584 orientation.offset = -orientation.upcoming_position; 585 586 if (direction === 'prev' || direction < orientation.outgoing_slide) { 587 orientation.upcoming_position = 0; 588 orientation.offset = 0; 589 } 590 591 if (that.size() > 1) { 592 that.pagination._setCurrent(orientation.upcoming_slide); 593 } 594 595 if (that.options.hashchange) { 596 var hash = orientation.upcoming_slide + 1, 597 id = that.$container.children(':eq(' + orientation.upcoming_slide + ')').attr('id'); 598 599 if (id) { 600 window.location.hash = id; 601 } else { 602 window.location.hash = hash; 603 } 604 } 605 606 that.$el.trigger('animating.slides', [orientation]); 607 608 that.animation(orientation, function() { 609 that._findPositions(orientation.upcoming_slide, that); 610 611 if (typeof userCallback === 'function') { 612 userCallback(); 613 } 614 615 that.animating = false; 616 that.$el.trigger('animated.slides'); 617 618 if (!that.init) { 619 that.$el.trigger('init.slides'); 620 that.init = true; 621 that.$container.fadeIn('fast'); 622 } 623 }); 624 } 625}; 626 627// jQuery plugin definition 628 629$.fn[plugin] = function(option, args) { 630 var result = []; 631 632 this.each(function() { 633 var $this, data, options; 634 635 $this = $(this); 636 data = $this.data(plugin); 637 options = typeof option === 'object' && option; 638 639 if (!data) { 640 result = $this.data(plugin, (data = new Superslides(this, options))); 641 } 642 643 if (typeof option === "string") { 644 result = data[option]; 645 if (typeof result === 'function') { 646 return result = result.call(data, args); 647 } 648 } 649 }); 650 651 return result; 652}; 653 654$.fn[plugin].fx = {}; 655 656})(this, 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.