vendor: 29,124 bytes, lines 1-1090
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: false, 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: true, 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 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.