vendor: 29,188 bytes, lines 1-1090
1/*! 2 Colorbox v1.5.13 - 2014-08-04 3 jQuery lightbox and modal window plugin 4 (c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox 5 license: http://www.opensource.org/licenses/mit-license.php 6*/ 7(function ($, document, window) { 8 var 9 // Default settings object. 10 // See http://jacklmoore.com/colorbox for details. 11 defaults = { 12 // data sources 13 html: false, 14 photo: false, 15 iframe: false, 16 inline: false, 17 18 // behavior and appearance 19 transition: "elastic", 20 speed: 300, 21 fadeOut: 300, 22 width: false, 23 initialWidth: "600", 24 innerWidth: false, 25 maxWidth: false, 26 height: false, 27 initialHeight: "450", 28 innerHeight: false, 29 maxHeight: false, 30 scalePhotos: true, 31 scrolling: true, 32 opacity: 0.9, 33 preloading: true, 34 className: false, 35 overlayClose: true, 36 escKey: true, 37 arrowKey: true, 38 top: false, 39 bottom: false, 40 left: false, 41 right: false, 42 fixed: false, 43 data: undefined, 44 closeButton: true, 45 fastIframe: true, 46 open: false, 47 reposition: true, 48 loop: true, 49 slideshow: false, 50 slideshowAuto: true, 51 slideshowSpeed: 2500, 52 slideshowStart: "start slideshow", 53 slideshowStop: "stop slideshow", 54 photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, 55 56 // alternate image paths for high-res displays 57 retinaImage: false, 58 retinaUrl: false, 59 retinaSuffix: '@2x.$1', 60 61 // internationalization 62 current: "", 63 previous: "previous", 64 next: "next", 65 close: "close", 66 xhrError: "This content failed to load.", 67 imgError: "This image failed to load.", 68 69 // accessbility 70 returnFocus: true, 71 trapFocus: true, 72 73 // callbacks 74 onOpen: false, 75 onLoad: false, 76 onComplete: false, 77 onCleanup: false, 78 onClosed: false, 79 80 rel: function() { 81 return this.rel; 82 }, 83 href: function() { 84 // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') 85 return $(this).attr('href'); 86 }, 87 title: function() { 88 return this.title; 89 } 90 }, 91 92 // Abstracting the HTML and event identifiers for easy rebranding 93 colorbox = 'colorbox', 94 prefix = 'cbox', 95 boxElement = prefix + 'Element', 96 97 // Events 98 event_open = prefix + '_open', 99 event_load = prefix + '_load', 100 event_complete = prefix + '_complete', 101 event_cleanup = prefix + '_cleanup', 102 event_closed = prefix + '_closed', 103 event_purge = prefix + '_purge', 104 105 // Cached jQuery Object Variables 106 $overlay, 107 $box, 108 $wrap, 109 $content, 110 $topBorder, 111 $leftBorder, 112 $rightBorder, 113 $bottomBorder, 114 $related, 115 $window, 116 $loaded, 117 $loadingBay, 118 $loadingOverlay, 119 $title, 120 $current, 121 $slideshow, 122 $next, 123 $prev, 124 $close, 125 $groupControls, 126 $events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 127 128 // Variables for cached values or use across multiple functions 129 settings, 130 interfaceHeight, 131 interfaceWidth, 132 loadedHeight, 133 loadedWidth, 134 index, 135 photo, 136 open, 137 active, 138 closing, 139 loadingTimer, 140 publicMethod, 141 div = "div", 142 requests = 0, 143 previousCSS = {}, 144 init; 145 146 // **************** 147 // HELPER FUNCTIONS 148 // **************** 149 150 // Convenience function for creating new jQuery objects 151 function $tag(tag, id, css) { 152 var element = document.createElement(tag); 153 154 if (id) { 155 element.id = prefix + id; 156 } 157 158 if (css) { 159 element.style.cssText = css; 160 } 161 162 return $(element); 163 } 164 165 // Get the window height using innerHeight when available to avoid an issue with iOS 166 // http://bugs.jquery.com/ticket/6724 167 function winheight() { 168 return window.innerHeight ? window.innerHeight : $(window).height(); 169 } 170 171 function Settings(element, options) { 172 if (options !== Object(options)) { 173 options = {}; 174 } 175 176 this.cache = {}; 177 this.el = element; 178 179 this.value = function(key) { 180 var dataAttr; 181 182 if (this.cache[key] === undefined) { 183 dataAttr = $(this.el).attr('data-cbox-'+key); 184 185 if (dataAttr !== undefined) { 186 this.cache[key] = dataAttr; 187 } else if (options[key] !== undefined) { 188 this.cache[key] = options[key]; 189 } else if (defaults[key] !== undefined) { 190 this.cache[key] = defaults[key]; 191 } 192 } 193 194 return this.cache[key]; 195 }; 196 197 this.get = function(key) { 198 var value = this.value(key); 199 return $.isFunction(value) ? value.call(this.el, this) : value; 200 }; 201 } 202 203 // Determine the next and previous members in a group. 204 function getIndex(increment) { 205 var 206 max = $related.length, 207 newIndex = (index + increment) % max; 208 209 return (newIndex < 0) ? max + newIndex : newIndex; 210 } 211 212 // Convert '%' and 'px' values to integers 213 function setSize(size, dimension) { 214 return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); 215 } 216 217 // Checks an href to see if it is a photo. 218 // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. 219 function isImage(settings, url) { 220 return settings.get('photo') || settings.get('photoRegex').test(url); 221 } 222 223 function retinaUrl(settings, url) { 224 return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; 225 } 226 227 function trapFocus(e) { 228 if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { 229 e.stopPropagation(); 230 $box.focus(); 231 } 232 } 233 234 function setClass(str) { 235 if (setClass.str !== str) { 236 $box.add($overlay).removeClass(setClass.str).addClass(str); 237 setClass.str = str; 238 } 239 } 240 241 function getRelated(rel) { 242 index = 0; 243 244 if (rel && rel !== false && rel !== 'nofollow') { 245 $related = $('.' + boxElement).filter(function () { 246 var options = $.data(this, colorbox); 247 var settings = new Settings(this, options); 248 return (settings.get('rel') === rel); 249 }); 250 index = $related.index(settings.el); 251 252 // Check direct calls to Colorbox. 253 if (index === -1) { 254 $related = $related.add(settings.el); 255 index = $related.length - 1; 256 } 257 } else { 258 $related = $(settings.el); 259 } 260 } 261 262 function trigger(event) { 263 // for external use 264 $(document).trigger(event); 265 // for internal use 266 $events.triggerHandler(event); 267 } 268 269 var slideshow = (function(){ 270 var active, 271 className = prefix + "Slideshow_", 272 click = "click." + prefix, 273 timeOut; 274 275 function clear () { 276 clearTimeout(timeOut); 277 } 278 279 function set() { 280 if (settings.get('loop') || $related[index + 1]) { 281 clear(); 282 timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); 283 } 284 } 285 286 function start() { 287 $slideshow 288 .html(settings.get('slideshowStop')) 289 .unbind(click) 290 .one(click, stop); 291 292 $events 293 .bind(event_complete, set) 294 .bind(event_load, clear); 295 296 $box.removeClass(className + "off").addClass(className + "on"); 297 } 298 299 function stop() { 300 clear(); 301 302 $events 303 .unbind(event_complete, set) 304 .unbind(event_load, clear); 305 306 $slideshow 307 .html(settings.get('slideshowStart')) 308 .unbind(click) 309 .one(click, function () { 310 publicMethod.next(); 311 start(); 312 }); 313 314 $box.removeClass(className + "on").addClass(className + "off"); 315 } 316 317 function reset() { 318 active = false; 319 $slideshow.hide(); 320 clear(); 321 $events 322 .unbind(event_complete, set) 323 .unbind(event_load, clear); 324 $box.removeClass(className + "off " + className + "on"); 325 } 326 327 return function(){ 328 if (active) { 329 if (!settings.get('slideshow')) { 330 $events.unbind(event_cleanup, reset); 331 reset(); 332 } 333 } else { 334 if (settings.get('slideshow') && $related[1]) { 335 active = true; 336 $events.one(event_cleanup, reset); 337 if (settings.get('slideshowAuto')) { 338 start(); 339 } else { 340 stop(); 341 } 342 $slideshow.show(); 343 } 344 } 345 }; 346 347 }()); 348 349 350 function launch(element) { 351 var options; 352 353 if (!closing) { 354 355 options = $(element).data(colorbox); 356 357 settings = new Settings(element, options); 358 359 getRelated(settings.get('rel')); 360 361 if (!open) { 362 open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. 363 364 setClass(settings.get('className')); 365 366 // Show colorbox so the sizes can be calculated in older versions of jQuery 367 $box.css({visibility:'hidden', display:'block', opacity:''}); 368 369 $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); 370 $content.css({width:'', height:''}).append($loaded); 371 372 // Cache values needed for size calculations 373 interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); 374 interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); 375 loadedHeight = $loaded.outerHeight(true); 376 loadedWidth = $loaded.outerWidth(true); 377 378 // Opens inital empty Colorbox prior to content being loaded. 379 var initialWidth = setSize(settings.get('initialWidth'), 'x'); 380 var initialHeight = setSize(settings.get('initialHeight'), 'y'); 381 var maxWidth = settings.get('maxWidth'); 382 var maxHeight = settings.get('maxHeight'); 383 384 settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth; 385 settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight; 386 387 $loaded.css({width:'', height:settings.h}); 388 publicMethod.position(); 389 390 trigger(event_open); 391 settings.get('onOpen'); 392 393 $groupControls.add($title).hide(); 394 395 $box.focus(); 396 397 if (settings.get('trapFocus')) { 398 // Confine focus to the modal 399 // Uses event capturing that is not supported in IE8- 400 if (document.addEventListener) { 401 402 document.addEventListener('focus', trapFocus, true); 403 404 $events.one(event_closed, function () { 405 document.removeEventListener('focus', trapFocus, true); 406 }); 407 } 408 } 409 410 // Return focus on closing 411 if (settings.get('returnFocus')) { 412 $events.one(event_closed, function () { 413 $(settings.el).focus(); 414 }); 415 } 416 } 417 418 var opacity = parseFloat(settings.get('opacity')); 419 $overlay.css({ 420 opacity: opacity === opacity ? opacity : '', 421 cursor: settings.get('overlayClose') ? 'pointer' : '', 422 visibility: 'visible' 423 }).show(); 424 425 if (settings.get('closeButton')) { 426 $close.html(settings.get('close')).appendTo($content); 427 } else { 428 $close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4 429 } 430 431 load(); 432 } 433 } 434 435 // Colorbox's markup needs to be added to the DOM prior to being called 436 // so that the browser will go ahead and load the CSS background images. 437 function appendHTML() { 438 if (!$box && document.body) { 439 init = false; 440 $window = $(window); 441 $box = $tag(div).attr({ 442 id: colorbox, 443 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. 444 role: 'dialog', 445 tabindex: '-1' 446 }).hide(); 447 $overlay = $tag(div, "Overlay").hide(); 448 $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); 449 $wrap = $tag(div, "Wrapper"); 450 $content = $tag(div, "Content").append( 451 $title = $tag(div, "Title"), 452 $current = $tag(div, "Current"), 453 $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}), 454 $next = $('<button type="button"/>').attr({id:prefix+'Next'}), 455 $slideshow = $tag('button', "Slideshow"), 456 $loadingOverlay 457 ); 458 459 $close = $('<button type="button"/>').attr({id:prefix+'Close'}); 460 461 $wrap.append( // The 3x3 Grid that makes up Colorbox 462 $tag(div).append( 463 $tag(div, "TopLeft"), 464 $topBorder = $tag(div, "TopCenter"), 465 $tag(div, "TopRight") 466 ), 467 $tag(div, false, 'clear:left').append( 468 $leftBorder = $tag(div, "MiddleLeft"), 469 $content, 470 $rightBorder = $tag(div, "MiddleRight") 471 ), 472 $tag(div, false, 'clear:left').append( 473 $tag(div, "BottomLeft"), 474 $bottomBorder = $tag(div, "BottomCenter"), 475 $tag(div, "BottomRight") 476 ) 477 ).find('div div').css({'float': 'left'}); 478 479 $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;'); 480 481 $groupControls = $next.add($prev).add($current).add($slideshow); 482 483 $(document.body).append($overlay, $box.append($wrap, $loadingBay)); 484 } 485 } 486 487 // Add Colorbox's event bindings 488 function addBindings() { 489 function clickHandler(e) { 490 // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. 491 // See: http://jacklmoore.com/notes/click-events/ 492 if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) { 493 e.preventDefault(); 494 launch(this); 495 } 496 } 497 498 if ($box) { 499 if (!init) { 500 init = true; 501 502 // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. 503 $next.click(function () { 504 publicMethod.next(); 505 }); 506 $prev.click(function () { 507 publicMethod.prev(); 508 }); 509 $close.click(function () { 510 publicMethod.close(); 511 }); 512 $overlay.click(function () { 513 if (settings.get('overlayClose')) { 514 publicMethod.close(); 515 } 516 }); 517 518 // Key Bindings 519 $(document).bind('keydown.' + prefix, function (e) { 520 var key = e.keyCode; 521 if (open && settings.get('escKey') && key === 27) { 522 e.preventDefault(); 523 publicMethod.close(); 524 } 525 if (open && settings.get('arrowKey') && $related[1] && !e.altKey) { 526 if (key === 37) { 527 e.preventDefault(); 528 $prev.click(); 529 } else if (key === 39) { 530 e.preventDefault(); 531 $next.click(); 532 } 533 } 534 }); 535 536 if ($.isFunction($.fn.on)) { 537 // For jQuery 1.7+ 538 $(document).on('click.'+prefix, '.'+boxElement, clickHandler); 539 } else { 540 // For jQuery 1.3.x -> 1.6.x 541 // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed. 542 // This is not here for jQuery 1.9, it's here for legacy users. 543 $('.'+boxElement).live('click.'+prefix, clickHandler); 544 } 545 } 546 return true; 547 } 548 return false; 549 } 550 551 // Don't do anything if Colorbox already exists. 552 if ($[colorbox]) { 553 return; 554 } 555 556 // Append the HTML when the DOM loads 557 $(appendHTML); 558 559 560 // **************** 561 // PUBLIC FUNCTIONS 562 // Usage format: $.colorbox.close(); 563 // Usage from within an iframe: parent.jQuery.colorbox.close(); 564 // **************** 565 566 publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { 567 var settings; 568 var $obj = this; 569 570 options = options || {}; 571 572 if ($.isFunction($obj)) { // assume a call to $.colorbox 573 $obj = $('<a/>'); 574 options.open = true; 575 } else if (!$obj[0]) { // colorbox being applied to empty collection 576 return $obj; 577 } 578 579 580 if (!$obj[0]) { // colorbox being applied to empty collection 581 return $obj; 582 } 583 584 appendHTML(); 585 586 if (addBindings()) { 587 588 if (callback) { 589 options.onComplete = callback; 590 } 591 592 $obj.each(function () { 593 var old = $.data(this, colorbox) || {}; 594 $.data(this, colorbox, $.extend(old, options)); 595 }).addClass(boxElement); 596 597 settings = new Settings($obj[0], options); 598 599 if (settings.get('open')) { 600 launch($obj[0]); 601 } 602 } 603 604 return $obj; 605 }; 606 607 publicMethod.position = function (speed, loadedCallback) { 608 var 609 css, 610 top = 0, 611 left = 0, 612 offset = $box.offset(), 613 scrollTop, 614 scrollLeft; 615 616 $window.unbind('resize.' + prefix); 617 618 // remove the modal so that it doesn't influence the document width/height 619 $box.css({top: -9e4, left: -9e4}); 620 621 scrollTop = $window.scrollTop(); 622 scrollLeft = $window.scrollLeft(); 623 624 if (settings.get('fixed')) { 625 offset.top -= scrollTop; 626 offset.left -= scrollLeft; 627 $box.css({position: 'fixed'}); 628 } else { 629 top = scrollTop; 630 left = scrollLeft; 631 $box.css({position: 'absolute'}); 632 } 633 634 // keeps the top and left positions within the browser's viewport. 635 if (settings.get('right') !== false) { 636 left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.get('right'), 'x'), 0); 637 } else if (settings.get('left') !== false) { 638 left += setSize(settings.get('left'), 'x'); 639 } else { 640 left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2); 641 } 642 643 if (settings.get('bottom') !== false) { 644 top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.get('bottom'), 'y'), 0); 645 } else if (settings.get('top') !== false) { 646 top += setSize(settings.get('top'), 'y'); 647 } else { 648 top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2); 649 } 650 651 $box.css({top: offset.top, left: offset.left, visibility:'visible'}); 652 653 // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, 654 // but it has to be shrank down around the size of div#colorbox when it's done. If not, 655 // it can invoke an obscure IE bug when using iframes. 656 $wrap[0].style.width = $wrap[0].style.height = "9999px"; 657 658 function modalDimensions() { 659 $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px'; 660 $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px'; 661 } 662 663 css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left}; 664 665 // setting the speed to 0 if the content hasn't changed size or position 666 if (speed) { 667 var tempSpeed = 0; 668 $.each(css, function(i){ 669 if (css[i] !== previousCSS[i]) { 670 tempSpeed = speed; 671 return; 672 } 673 }); 674 speed = tempSpeed; 675 } 676 677 previousCSS = css; 678 679 if (!speed) { 680 $box.css(css); 681 } 682 683 $box.dequeue().animate(css, { 684 duration: speed || 0, 685 complete: function () { 686 modalDimensions(); 687 688 active = false; 689 690 // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. 691 $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; 692 $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; 693 694 if (settings.get('reposition')) { 695 setTimeout(function () { // small delay before binding onresize due to an IE8 bug. 696 $window.bind('resize.' + prefix, publicMethod.position); 697 }, 1); 698 } 699 700 if ($.isFunction(loadedCallback)) { 701 loadedCallback(); 702 } 703 }, 704 step: modalDimensions 705 }); 706 }; 707 708 publicMethod.resize = function (options) { 709 var scrolltop; 710 711 if (open) { 712 options = options || {}; 713 714 if (options.width) { 715 settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; 716 } 717 718 if (options.innerWidth) { 719 settings.w = setSize(options.innerWidth, 'x'); 720 } 721 722 $loaded.css({width: settings.w}); 723 724 if (options.height) { 725 settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; 726 } 727 728 if (options.innerHeight) { 729 settings.h = setSize(options.innerHeight, 'y'); 730 } 731 732 if (!options.innerHeight && !options.height) { 733 scrolltop = $loaded.scrollTop(); 734 $loaded.css({height: "auto"}); 735 settings.h = $loaded.height(); 736 } 737 738 $loaded.css({height: settings.h}); 739 740 if(scrolltop) { 741 $loaded.scrollTop(scrolltop); 742 } 743 744 publicMethod.position(settings.get('transition') === "none" ? 0 : settings.get('speed')); 745 } 746 }; 747 748 publicMethod.prep = function (object) { 749 if (!open) { 750 return; 751 } 752 753 var callback, speed = settings.get('transition') === "none" ? 0 : settings.get('speed'); 754 755 $loaded.remove(); 756 757 $loaded = $tag(div, 'LoadedContent').append(object); 758 759 function getWidth() { 760 settings.w = settings.w || $loaded.width(); 761 settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; 762 return settings.w; 763 } 764 function getHeight() { 765 settings.h = settings.h || $loaded.height(); 766 settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; 767 return settings.h; 768 } 769 770 $loaded.hide() 771 .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. 772 .css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'}) 773 .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. 774 .prependTo($content); 775 776 $loadingBay.hide(); 777 778 // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width. 779 780 $(photo).css({'float': 'none'}); 781 782 setClass(settings.get('className')); 783 784 callback = function () { 785 var total = $related.length, 786 iframe, 787 complete; 788 789 if (!open) { 790 return; 791 } 792 793 function removeFilter() { // Needed for IE8 in versions of jQuery prior to 1.7.2 794 if ($.support.opacity === false) { 795 $box[0].style.removeAttribute('filter'); 796 } 797 } 798 799 complete = function () { 800 clearTimeout(loadingTimer); 801 $loadingOverlay.hide(); 802 trigger(event_complete); 803 settings.get('onComplete'); 804 }; 805 806 807 $title.html(settings.get('title')).show(); 808 $loaded.show(); 809 810 if (total > 1) { // handle grouping 811 if (typeof settings.get('current') === "string") { 812 $current.html(settings.get('current').replace('{current}', index + 1).replace('{total}', total)).show(); 813 } 814 815 $next[(settings.get('loop') || index < total - 1) ? "show" : "hide"]().html(settings.get('next')); 816 $prev[(settings.get('loop') || index) ? "show" : "hide"]().html(settings.get('previous')); 817 818 slideshow(); 819 820 // Preloads images within a rel group 821 if (settings.get('preloading')) { 822 $.each([getIndex(-1), getIndex(1)], function(){ 823 var img, 824 i = $related[this], 825 settings = new Settings(i, $.data(i, colorbox)), 826 src = settings.get('href'); 827 828 if (src && isImage(settings, src)) { 829 src = retinaUrl(settings, src); 830 img = document.createElement('img'); 831 img.src = src; 832 } 833 }); 834 } 835 } else { 836 $groupControls.hide(); 837 } 838 839 if (settings.get('iframe')) { 840 iframe = document.createElement('iframe'); 841 842 if ('frameBorder' in iframe) { 843 iframe.frameBorder = 0; 844 } 845 846 if ('allowTransparency' in iframe) { 847 iframe.allowTransparency = "true"; 848 } 849 850 if (!settings.get('scrolling')) { 851 iframe.scrolling = "no"; 852 } 853 854 $(iframe) 855 .attr({ 856 src: settings.get('href'), 857 name: (new Date()).getTime(), // give the iframe a unique name to prevent caching 858 'class': prefix + 'Iframe', 859 allowFullScreen : true // allow HTML5 video to go fullscreen 860 }) 861 .one('load', complete) 862 .appendTo($loaded); 863 864 $events.one(event_purge, function () { 865 iframe.src = "//about:blank"; 866 }); 867 868 if (settings.get('fastIframe')) { 869 $(iframe).trigger('load'); 870 } 871 } else { 872 complete(); 873 } 874 875 if (settings.get('transition') === 'fade') { 876 $box.fadeTo(speed, 1, removeFilter); 877 } else { 878 removeFilter(); 879 } 880 }; 881 882 if (settings.get('transition') === 'fade') { 883 $box.fadeTo(speed, 0, function () { 884 publicMethod.position(0, callback); 885 }); 886 } else { 887 publicMethod.position(speed, callback); 888 } 889 }; 890 891 function load () { 892 var href, setResize, prep = publicMethod.prep, $inline, request = ++requests; 893 894 active = true; 895 896 photo = false; 897 898 trigger(event_purge); 899 trigger(event_load); 900 settings.get('onLoad'); 901 902 settings.h = settings.get('height') ? 903 setSize(settings.get('height'), 'y') - loadedHeight - interfaceHeight : 904 settings.get('innerHeight') && setSize(settings.get('innerHeight'), 'y'); 905 906 settings.w = settings.get('width') ? 907 setSize(settings.get('width'), 'x') - loadedWidth - interfaceWidth : 908 settings.get('innerWidth') && setSize(settings.get('innerWidth'), 'x'); 909 910 // Sets the minimum dimensions for use in image scaling 911 settings.mw = settings.w; 912 settings.mh = settings.h; 913 914 // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. 915 // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. 916 if (settings.get('maxWidth')) { 917 settings.mw = setSize(settings.get('maxWidth'), 'x') - loadedWidth - interfaceWidth; 918 settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; 919 } 920 if (settings.get('maxHeight')) { 921 settings.mh = setSize(settings.get('maxHeight'), 'y') - loadedHeight - interfaceHeight; 922 settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; 923 } 924 925 href = settings.get('href'); 926 927 loadingTimer = setTimeout(function () { 928 $loadingOverlay.show(); 929 }, 100); 930 931 if (settings.get('inline')) { 932 var $target = $(href); 933 // Inserts an empty placeholder where inline content is being pulled from. 934 // An event is bound to put inline content back when Colorbox closes or loads new content. 935 $inline = $('<div>').hide().insertBefore($target); 936 937 $events.one(event_purge, function () { 938 $inline.replaceWith($target); 939 }); 940 941 prep($target); 942 } else if (settings.get('iframe')) { 943 // IFrame element won't be added to the DOM until it is ready to be displayed, 944 // to avoid problems with DOM-ready JS that might be trying to run in that iframe. 945 prep(" "); 946 } else if (settings.get('html')) { 947 prep(settings.get('html')); 948 } else if (isImage(settings, href)) { 949 950 href = retinaUrl(settings, href); 951 952 photo = new Image(); 953 954 $(photo) 955 .addClass(prefix + 'Photo') 956 .bind('error',function () { 957 prep($tag(div, 'Error').html(settings.get('imgError'))); 958 }) 959 .one('load', function () { 960 if (request !== requests) { 961 return; 962 } 963 964 // A small pause because some browsers will occassionaly report a 965 // img.width and img.height of zero immediately after the img.onload fires 966 setTimeout(function(){ 967 var percent; 968 969 $.each(['alt', 'longdesc', 'aria-describedby'], function(i,val){ 970 var attr = $(settings.el).attr(val) || $(settings.el).attr('data-'+val); 971 if (attr) { 972 photo.setAttribute(val, attr); 973 } 974 }); 975 976 if (settings.get('retinaImage') && window.devicePixelRatio > 1) { 977 photo.height = photo.height / window.devicePixelRatio; 978 photo.width = photo.width / window.devicePixelRatio; 979 } 980 981 if (settings.get('scalePhotos')) { 982 setResize = function () { 983 photo.height -= photo.height * percent; 984 photo.width -= photo.width * percent; 985 }; 986 if (settings.mw && photo.width > settings.mw) { 987 percent = (photo.width - settings.mw) / photo.width; 988 setResize(); 989 } 990 if (settings.mh && photo.height > settings.mh) { 991 percent = (photo.height - settings.mh) / photo.height; 992 setResize(); 993 } 994 } 995 996 if (settings.h) { 997 photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px'; 998 } 999 1000 if ($related[1] && (settings.get('loop') || $related[index + 1])) { 1001 photo.style.cursor = 'pointer'; 1002 photo.onclick = function () { 1003 publicMethod.next(); 1004 }; 1005 } 1006 1007 photo.style.width = photo.width + 'px'; 1008 photo.style.height = photo.height + 'px'; 1009 prep(photo); 1010 }, 1); 1011 }); 1012 1013 photo.src = href; 1014 1015 } else if (href) { 1016 $loadingBay.load(href, settings.get('data'), function (data, status) { 1017 if (request === requests) { 1018 prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents()); 1019 } 1020 }); 1021 } 1022 } 1023 1024 // Navigates to the next page/image in a set. 1025 publicMethod.next = function () { 1026 if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) { 1027 index = getIndex(1); 1028 launch($related[index]); 1029 } 1030 }; 1031 1032 publicMethod.prev = function () { 1033 if (!active && $related[1] && (settings.get('loop') || index)) { 1034 index = getIndex(-1); 1035 launch($related[index]); 1036 } 1037 }; 1038 1039 // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close(); 1040 publicMethod.close = function () { 1041 if (open && !closing) { 1042 1043 closing = true; 1044 open = false; 1045 trigger(event_cleanup); 1046 settings.get('onCleanup'); 1047 $window.unbind('.' + prefix); 1048 $overlay.fadeTo(settings.get('fadeOut') || 0, 0); 1049 1050 $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () { 1051 $box.hide(); 1052 $overlay.hide(); 1053 trigger(event_purge); 1054 $loaded.remove(); 1055 1056 setTimeout(function () { 1057 closing = false; 1058 trigger(event_closed); 1059 settings.get('onClosed'); 1060 }, 1); 1061 }); 1062 } 1063 }; 1064 1065 // Removes changes Colorbox made to the document, but does not remove the plugin. 1066 publicMethod.remove = function () { 1067 if (!$box) { return; } 1068 1069 $box.stop(); 1070 $[colorbox].close(); 1071 $box.stop(false, true).remove(); 1072 $overlay.remove(); 1073 closing = false; 1074 $box = null; 1075 $('.' + boxElement) 1076 .removeData(colorbox) 1077 .removeClass(boxElement); 1078 1079 $(document).unbind('click.'+prefix).unbind('keydown.'+prefix); 1080 }; 1081 1082 // A method for fetching the current element Colorbox is referencing. 1083 // returns a jQuery object. 1084 publicMethod.element = function () { 1085 return $(settings.el); 1086 }; 1087 1088 publicMethod.settings = defaults; 1089 1090}(jQuery, document, window));
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.