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