1// ColorBox v1.3.20.1 - jQuery lightbox plugin 2// (c) 2012 Jack Moore - jacklmoore.com 3// License: http://www.opensource.org/licenses/mit-license.php 4(function ($, document, window) { 5 var 6 // Default settings object. 7 // See http://jacklmoore.com/colorbox for details. 8 defaults = { 9 transition: "elastic", 10 speed: 300, 11 width: false, 12 initialWidth: "600", 13 innerWidth: false, 14 maxWidth: false, 15 height: false, 16 initialHeight: "450", 17 innerHeight: false, 18 maxHeight: false, 19 scalePhotos: true, 20 scrolling: true, 21 inline: false, 22 html: false, 23 iframe: false, 24 fastIframe: true, 25 photo: false, 26 href: false, 27 title: false, 28 rel: false, 29 opacity: 0.9, 30 preloading: true, 31 32 current: "image {current} of {total}", 33 previous: "previous", 34 next: "next", 35 close: "close", 36 xhrError: "This content failed to load.", 37 imgError: "This image failed to load.", 38 39 open: false, 40 returnFocus: true, 41 reposition: true, 42 loop: true, 43 slideshow: false, 44 slideshowAuto: true, 45 slideshowSpeed: 2500, 46 slideshowStart: "start slideshow", 47 slideshowStop: "stop slideshow", 48 onOpen: false, 49 onLoad: false, 50 onComplete: false, 51 onCleanup: false, 52 onClosed: false, 53 overlayClose: true, 54 escKey: true, 55 arrowKey: true, 56 top: false, 57 bottom: false, 58 left: false, 59 right: false, 60 fixed: false, 61 data: undefined 62 }, 63 64 // Abstracting the HTML and event identifiers for easy rebranding 65 colorbox = 'colorbox', 66 prefix = 'cbox', 67 boxElement = prefix + 'Element', 68 69 // Events 70 event_open = prefix + '_open', 71 event_load = prefix + '_load', 72 event_complete = prefix + '_complete', 73 event_cleanup = prefix + '_cleanup', 74 event_closed = prefix + '_closed', 75 event_purge = prefix + '_purge', 76 77 // Special Handling for IE 78 isIE = !$.support.opacity && !$.support.style, // IE7 & IE8 79 isIE6 = isIE && !window.XMLHttpRequest, // IE6 80 event_ie6 = prefix + '_IE6', 81 82 // Cached jQuery Object Variables 83 $overlay, 84 $box, 85 $wrap, 86 $content, 87 $topBorder, 88 $leftBorder, 89 $rightBorder, 90 $bottomBorder, 91 $related, 92 $window, 93 $loaded, 94 $loadingBay, 95 $loadingOverlay, 96 $title, 97 $current, 98 $slideshow, 99 $next, 100 $prev, 101 $close, 102 $groupControls, 103 104 // Variables for cached values or use across multiple functions 105 settings, 106 interfaceHeight, 107 interfaceWidth, 108 loadedHeight, 109 loadedWidth, 110 element, 111 index, 112 photo, 113 open, 114 active, 115 closing, 116 loadingTimer, 117 publicMethod, 118 div = "div", 119 init; 120 121 // **************** 122 // HELPER FUNCTIONS 123 // **************** 124 125 // Convience function for creating new jQuery objects 126 function $tag(tag, id, css) { 127 var element = document.createElement(tag); 128 129 if (id) { 130 element.id = prefix + id; 131 } 132 133 if (css) { 134 element.style.cssText = css; 135 } 136 137 return $(element); 138 } 139 140 // Determine the next and previous members in a group. 141 function getIndex(increment) { 142 var 143 max = $related.length, 144 newIndex = (index + increment) % max; 145 146 return (newIndex < 0) ? max + newIndex : newIndex; 147 } 148 149 // Convert '%' and 'px' values to integers 150 function setSize(size, dimension) { 151 return Math.round((/%/.test(size) ? ((dimension === 'x' ? winWidth() : winHeight()) / 100) : 1) * parseInt(size, 10)); 152 } 153 154 // Checks an href to see if it is a photo. 155 // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex. 156 function isImage(url) { 157 return settings.photo || /\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url); 158 } 159 160 function winWidth() { 161 // $(window).width() is incorrect for some mobile browsers, but 162 // window.innerWidth is unsupported in IE8 and lower. 163 return window.innerWidth || $window.width(); 164 } 165 166 function winHeight() { 167 return window.innerHeight || $window.height(); 168 } 169 170 // Assigns function results to their respective properties 171 function makeSettings() { 172 var i, 173 data = $.data(element, colorbox); 174 175 if (data == null) { 176 settings = $.extend({}, defaults); 177 if (console && console.log) { 178 console.log('Error: cboxElement missing settings object'); 179 } 180 } else { 181 settings = $.extend({}, data); 182 } 183 184 for (i in settings) { 185 if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time. 186 settings[i] = settings[i].call(element); 187 } 188 } 189 190 settings.rel = settings.rel || element.rel || 'nofollow'; 191 settings.href = settings.href || $(element).attr('href'); 192 settings.title = settings.title || element.title; 193 194 if (typeof settings.href === "string") { 195 settings.href = $.trim(settings.href); 196 } 197 } 198 199 function trigger(event, callback) { 200 $.event.trigger(event); 201 if (callback) { 202 callback.call(element); 203 } 204 } 205 206 // Slideshow functionality 207 function slideshow() { 208 var 209 timeOut, 210 className = prefix + "Slideshow_", 211 click = "click." + prefix, 212 start, 213 stop, 214 clear; 215 216 if (settings.slideshow && $related[1]) { 217 start = function () { 218 $slideshow
219 .text(settings.slideshowStop) 220 .unbind(click) 221 .bind(event_complete, function () { 222 if (settings.loop || $related[index + 1]) { 223 timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); 224 } 225 }) 226 .bind(event_load, function () { 227 clearTimeout(timeOut); 228 }) 229 .one(click + ' ' + event_cleanup, stop); 230 $box.removeClass(className + "off").addClass(className + "on"); 231 timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); 232 }; 233 234 stop = function () { 235 clearTimeout(timeOut); 236 $slideshow 237 .text(settings.slideshowStart) 238 .unbind([event_complete, event_load, event_cleanup, click].join(' ')) 239 .one(click, function () { 240 publicMethod.next(); 241 start(); 242 }); 243 $box.removeClass(className + "on").addClass(className + "off"); 244 }; 245 246 if (settings.slideshowAuto) { 247 start(); 248 } else { 249 stop(); 250 } 251 } else { 252 $box.removeClass(className + "off " + className + "on"); 253 } 254 } 255 256 function launch(target) { 257 if (!closing) { 258 259 element = target; 260 261 makeSettings(); 262 263 $related = $(element); 264 265 index = 0; 266 267 if (settings.rel !== 'nofollow') { 268 $related = $('.' + boxElement).filter(function () { 269 var data = $.data(this, colorbox), 270 relRelated; 271 272 if (data) { 273 relRelated = data.rel || this.rel; 274 } 275 276 return (relRelated === settings.rel); 277 }); 278 index = $related.index(element); 279 280 // Check direct calls to ColorBox. 281 if (index === -1) { 282 $related = $related.add(element); 283 index = $related.length - 1; 284 } 285 } 286 287 if (!open) { 288 open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. 289 290 $box.show(); 291 292 if (settings.returnFocus) { 293 $(element).blur().one(event_closed, function () { 294 $(this).focus(); 295 }); 296 } 297 298 // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5' 299 $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show(); 300 301 // Opens inital empty ColorBox prior to content being loaded. 302 settings.w = setSize(settings.initialWidth, 'x'); 303 settings.h = setSize(settings.initialHeight, 'y'); 304 publicMethod.position(); 305 306 if (isIE6) { 307 $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () { 308 $overlay.css({width: winWidth(), height: winHeight(), top: $window.scrollTop(), left: $window.scrollLeft()}); 309 }).trigger('resize.' + event_ie6); 310 } 311 312 trigger(event_open, settings.onOpen); 313 314 $groupControls.add($title).hide(); 315 316 $close.html(settings.close).show(); 317 } 318 319 publicMethod.load(true); 320 } 321 } 322 323 // ColorBox's markup needs to be added to the DOM prior to being called 324 // so that the browser will go ahead and load the CSS background images. 325 function appendHTML() { 326 if (!$box && document.body) { 327 init = false; 328 329 $window = $(window); 330 $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
331 $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide(); 332 $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")); 333 $wrap = $tag(div, "Wrapper"); 334 $content = $tag(div, "Content").append( 335 $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'), 336 $title = $tag(div, "Title"), 337 $current = $tag(div, "Current"), 338 $next = $tag(div, "Next"), 339 $prev = $tag(div, "Previous"), 340 $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow), 341 $close = $tag(div, "Close") 342 ); 343 344 $wrap.append( // The 3x3 Grid that makes up ColorBox 345 $tag(div).append( 346 $tag(div, "TopLeft"), 347 $topBorder = $tag(div, "TopCenter"), 348 $tag(div, "TopRight") 349 ), 350 $tag(div, false, 'clear:left').append( 351 $leftBorder = $tag(div, "MiddleLeft"), 352 $content, 353 $rightBorder = $tag(div, "MiddleRight") 354 ), 355 $tag(div, false, 'clear:left').append( 356 $tag(div, "BottomLeft"), 357 $bottomBorder = $tag(div, "BottomCenter"), 358 $tag(div, "BottomRight") 359 ) 360 ).find('div div').css({'float': 'left'}); 361 362 $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none'); 363 364 $groupControls = $next.add($prev).add($current).add($slideshow); 365 366 $(document.body).append($overlay, $box.append($wrap, $loadingBay)); 367 } 368 } 369 370 // Add ColorBox's event bindings 371 function addBindings() { 372 if ($box) { 373 if (!init) { 374 init = true; 375 376 // Cache values needed for size calculations 377 interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6 378 interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); 379 loadedHeight = $loaded.outerHeight(true); 380 loadedWidth = $loaded.outerWidth(true); 381 382 // Setting padding to remove the need to do size conversions during the animation step. 383 $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}); 384 385 // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. 386 $next.click(function () { 387 publicMethod.next(); 388 }); 389 $prev.click(function () { 390 publicMethod.prev(); 391 }); 392 $close.click(function () { 393 publicMethod.close(); 394 }); 395 $overlay.click(function () { 396 if (settings.overlayClose) { 397 publicMethod.close(); 398 } 399 }); 400 401 // Key Bindings 402 $(document).bind('keydown.' + prefix, function (e) { 403 var key = e.keyCode; 404 if (open && settings.escKey && key === 27) { 405 e.preventDefault(); 406 publicMethod.close(); 407 } 408 if (open && settings.arrowKey && $related[1]) { 409 if (key === 37) { 410 e.preventDefault(); 411 $prev.click(); 412 } else if (key === 39) { 413 e.preventDefault(); 414 $next.click(); 415 } 416 } 417 }); 418 419 $('.' + boxElement, document).live('click', function (e) { 420 // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. 421 // See: http://jacklmoore.com/notes/click-events/ 422 if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) { 423 e.preventDefault(); 424 launch(this); 425 } 426 }); 427 } 428 return true; 429 } 430 return false; 431 } 432 433 // Don't do anything if ColorBox already exists. 434 if ($.colorbox) { 435 return; 436 } 437 438 // Append the HTML when the DOM loads 439 $(appendHTML); 440 441 442 // **************** 443 // PUBLIC FUNCTIONS 444 // Usage format: $.fn.colorbox.close(); 445 // Usage from within an iframe: parent.$.fn.colorbox.close(); 446 // **************** 447 448 publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { 449 var $this = this; 450 451 options = options || {}; 452 453 appendHTML(); 454 455 if (addBindings()) { 456 if (!$this[0]) { 457 if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit. 458 return $this; 459 } 460 // if no selector was given (ie. $.colorbox()), create a temporary element to work with 461 $this = $('<a/>'); 462 options.open = true; // assume an immediate open 463 } 464 465 if (callback) { 466 options.onComplete = callback; 467 } 468 469 $this.each(function () { 470 $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options)); 471 }).addClass(boxElement); 472 473 if (($.isFunction(options.open) && options.open.call($this)) || options.open) { 474 launch($this[0]); 475 } 476 } 477 478 return $this; 479 }; 480 481 publicMethod.position = function (speed, loadedCallback) { 482 var 483 css, 484 top = 0, 485 left = 0, 486 offset = $box.offset(), 487 scrollTop, 488 scrollLeft; 489 490 $window.unbind('resize.' + prefix); 491 492 // remove the modal so that it doesn't influence the document width/height 493 $box.css({top: -9e4, left: -9e4}); 494 495 scrollTop = $window.scrollTop(); 496 scrollLeft = $window.scrollLeft(); 497 498 if (settings.fixed && !isIE6) { 499 offset.top -= scrollTop; 500 offset.left -= scrollLeft; 501 $box.css({position: 'fixed'}); 502 } else { 503 top = scrollTop; 504 left = scrollLeft; 505 $box.css({position: 'absolute'}); 506 } 507 508 // keeps the top and left positions within the browser's viewport. 509 if (settings.right !== false) { 510 left += Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth - setSize(sett
510ings.right, 'x'), 0); 511 } else if (settings.left !== false) { 512 left += setSize(settings.left, 'x'); 513 } else { 514 left += Math.round(Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth, 0) / 2); 515 } 516 517 if (settings.bottom !== false) { 518 top += Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0); 519 } else if (settings.top !== false) { 520 top += setSize(settings.top, 'y'); 521 } else { 522 top += Math.round(Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight, 0) / 2); 523 } 524 525 $box.css({top: offset.top, left: offset.left}); 526 527 // setting the speed to 0 to reduce the delay between same-sized content. 528 speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0; 529 530 // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, 531 // but it has to be shrank down around the size of div#colorbox when it's done. If not, 532 // it can invoke an obscure IE bug when using iframes. 533 $wrap[0].style.width = $wrap[0].style.height = "9999px"; 534 535 function modalDimensions(that) { 536 $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width; 537 $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height; 538 } 539 540 css = {width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}; 541 if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273) 542 $box.css(css); 543 } 544 $box.dequeue().animate(css, { 545 duration: speed, 546 complete: function () { 547 modalDimensions(this); 548 549 active = false; 550 551 // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. 552 $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; 553 $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; 554 555 if (settings.reposition) { 556 setTimeout(function () { // small delay before binding onresize due to an IE8 bug. 557 $window.bind('resize.' + prefix, publicMethod.position); 558 }, 1); 559 } 560 561 if (loadedCallback) { 562 loadedCallback(); 563 } 564 }, 565 step: function () { 566 modalDimensions(this); 567 } 568 }); 569 }; 570 571 publicMethod.resize = function (options) { 572 if (open) { 573 options = options || {}; 574 575 if (options.width) { 576 settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; 577 } 578 if (options.innerWidth) { 579 settings.w = setSize(options.innerWidth, 'x'); 580 } 581 $loaded.css({width: settings.w}); 582 583 if (options.height) { 584 settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; 585 } 586 if (options.innerHeight) { 587 settings.h = setSize(options.innerHeight, 'y'); 588 } 589 if (!options.innerHeight && !options.height) { 590 $loaded.css({height: "auto"}); 591 settings.h = $loaded.height(); 592 } 593 $loaded.css({height: settings.h}); 594 595 publicMethod.position(settings.transition === "none" ? 0 : settings.speed); 596 } 597 }; 598 599 publicMethod.prep = function (object) { 600 if (!open) { 601 return; 602 } 603 604 var callback, speed = settings.transition === "none" ? 0 : settings.speed; 605 606 $loaded.remove(); 607 $loaded = $tag(div, 'LoadedContent').append(object); 608 609 function getWidth() { 610 settings.w = settings.w || $loaded.width(); 611 settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; 612 return settings.w; 613 } 614 function getHeight() { 615 settings.h = settings.h || $loaded.height(); 616 settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; 617 return settings.h; 618 } 619 620 $loaded.hide() 621 .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. 622 .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'}) 623 .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. 624 .prependTo($content); 625 626 $loadingBay.hide(); 627 628 // 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. 629 //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'}); 630 631 $(photo).css({'float': 'none'}); 632 633 // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay. 634 if (isIE6) { 635 $('select').not($box.find('select')).filter(function () { 636 return this.style.visibility !== 'hidden'; 637 }).css({'visibility': 'hidden'}).one(event_cleanup, function () { 638 this.style.visibility = 'inherit'; 639 }); 640 } 641 642 callback = function () { 643 var preload, 644 i, 645 total = $related.length, 646 iframe, 647 frameBorder = 'frameBorder', 648 allowTransparency = 'allowTransparency', 649 complete, 650 src, 651 img, 652 data; 653 654 if (!open) { 655 return; 656 } 657 658 function removeFilter() { 659 if (isIE) { 660 $box[0].style.removeAttribute('filter'); 661 } 662 } 663 664 complete = function () { 665 clearTimeout(loadingTimer); 666 // Detaching forces Andriod stock browser to redraw the area underneat the loading overlay. Hiding alone isn't enough. 667 $loadingOverlay.detach().hide(); 668 trigger(event_complete, settings.onComplete); 669 }; 670 671 if (isIE) { 672 //This fadeIn helps the bicubic resampling to kick-in. 673 if (photo) { 674 $loaded.fadeIn(100); 675 } 676 } 677
678 $title.html(settings.title).add($loaded).show(); 679 680 if (total > 1) { // handle grouping 681 if (typeof settings.current === "string") { 682 $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show(); 683 } 684 685 $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next); 686 $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous); 687 688 if (settings.slideshow) { 689 $slideshow.show(); 690 } 691 692 // Preloads images within a rel group 693 if (settings.preloading) { 694 preload = [ 695 getIndex(-1), 696 getIndex(1) 697 ]; 698 while (i = $related[preload.pop()]) { 699 data = $.data(i, colorbox); 700 701 if (data && data.href) { 702 src = data.href; 703 if ($.isFunction(src)) { 704 src = src.call(i); 705 } 706 } else { 707 src = i.href; 708 } 709 710 if (isImage(src)) { 711 img = new Image(); 712 img.src = src; 713 } 714 } 715 } 716 } else { 717 $groupControls.hide(); 718 } 719 720 if (settings.iframe) { 721 iframe = $tag('iframe')[0]; 722 723 if (frameBorder in iframe) { 724 iframe[frameBorder] = 0; 725 } 726 if (allowTransparency in iframe) { 727 iframe[allowTransparency] = "true"; 728 } 729 // give the iframe a unique name to prevent caching 730 iframe.name = prefix + (+new Date()); 731 if (settings.fastIframe) { 732 complete(); 733 } else { 734 $(iframe).one('load', complete); 735 } 736 iframe.src = settings.href; 737 if (!settings.scrolling) { 738 iframe.scrolling = "no"; 739 } 740 $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () { 741 iframe.src = "//about:blank"; 742 }); 743 } else { 744 complete(); 745 } 746 747 if (settings.transition === 'fade') { 748 $box.fadeTo(speed, 1, removeFilter); 749 } else { 750 removeFilter(); 751 } 752 }; 753 754 if (settings.transition === 'fade') { 755 $box.fadeTo(speed, 0, function () { 756 publicMethod.position(0, callback); 757 }); 758 } else { 759 publicMethod.position(speed, callback); 760 } 761 }; 762 763 publicMethod.load = function (launched) { 764 var href, setResize, prep = publicMethod.prep; 765 766 active = true; 767 768 photo = false; 769 770 element = $related[index]; 771 772 if (!launched) { 773 makeSettings(); 774 } 775 776 trigger(event_purge); 777 778 trigger(event_load, settings.onLoad); 779 780 settings.h = settings.height ? 781 setSize(settings.height, 'y') - loadedHeight - interfaceHeight : 782 settings.innerHeight && setSize(settings.innerHeight, 'y'); 783 784 settings.w = settings.width ? 785 setSize(settings.width, 'x') - loadedWidth - interfaceWidth : 786 settings.innerWidth && setSize(settings.innerWidth, 'x'); 787 788 // Sets the minimum dimensions for use in image scaling 789 settings.mw = settings.w; 790 settings.mh = settings.h; 791
792 // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. 793 // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. 794 if (settings.maxWidth) { 795 settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth; 796 settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; 797 } 798 if (settings.maxHeight) { 799 settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight; 800 settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; 801 } 802 803 href = settings.href; 804 805 loadingTimer = setTimeout(function () { 806 $loadingOverlay.show().appendTo($content); 807 }, 100); 808 809 if (settings.inline) { 810 // Inserts an empty placeholder where inline content is being pulled from. 811 // An event is bound to put inline content back when ColorBox closes or loads new content. 812 $tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () { 813 $(this).replaceWith($loaded.children()); 814 }); 815 prep($(href)); 816 } else if (settings.iframe) { 817 // IFrame element won't be added to the DOM until it is ready to be displayed, 818 // to avoid problems with DOM-ready JS that might be trying to run in that iframe. 819 prep(" "); 820 } else if (settings.html) { 821 prep(settings.html); 822 } else if (isImage(href)) { 823 $(photo = new Image()) 824 .addClass(prefix + 'Photo') 825 .error(function () { 826 settings.title = false; 827 prep($tag(div, 'Error').html(settings.imgError)); 828 }) 829 .load(function () { 830 var percent; 831 photo.onload = null; //stops animated gifs from firing the onload repeatedly. 832 833 if (settings.scalePhotos) { 834 setResize = function () { 835 photo.height -= photo.height * percent; 836 photo.width -= photo.width * percent; 837 }; 838 if (settings.mw && photo.width > settings.mw) { 839 percent = (photo.width - settings.mw) / photo.width; 840 setResize(); 841 } 842 if (settings.mh && photo.height > settings.mh) { 843 percent = (photo.height - settings.mh) / photo.height; 844 setResize(); 845 } 846 } 847 848 if (settings.h) { 849 photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px'; 850 } 851 852 if ($related[1] && (settings.loop || $related[index + 1])) { 853 photo.style.cursor = 'pointer'; 854 photo.onclick = function () { 855 publicMethod.next(); 856 }; 857 } 858 859 if (isIE) { 860 photo.style.msInterpolationMode = 'bicubic'; 861 } 862 863 setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise. 864 prep(photo); 865 }, 1); 866 }); 867 868 setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise. 869 photo.src = href; 870 }, 1); 871 } else if (href) { 872 $loadingBay.load(href, settings.data, function (data, status, xhr) { 873 prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents()); 874 }); 875 } 876 }; 877 878 // Navigates to the next page/image in a set. 879 publicMethod.next = function () { 880 if (!active && $related[1] && (settings.loop || $related[index + 1])) { 881 index = getIndex(1); 882 publicMethod.load(); 883 } 884 }; 885 886 publicMethod.prev = function () { 887 if (!active && $related[1] && (settings.loop || index)) { 888 index = getIndex(-1); 889 publicMethod.load(); 890 } 891 }; 892 893 // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close(); 894 publicMethod.close = function () { 895 if (open && !closing) { 896 897 closing = true; 898 899 open = false; 900 901 trigger(event_cleanup, settings.onCleanup); 902 903 $window.unbind('.' + prefix + ' .' + event_ie6); 904 905 $overlay.fadeTo(200, 0); 906 907 $box.stop().fadeTo(300, 0, function () { 908 909 $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide(); 910 911 trigger(event_purge); 912 913 $loaded.remove(); 914 915 setTimeout(function () { 916 closing = false; 917 trigger(event_closed, settings.onClosed); 918 }, 1); 919 }); 920 } 921 }; 922 923 // Removes changes ColorBox made to the document, but does not remove the plugin 924 // from jQuery. 925 publicMethod.remove = function () { 926 $([]).add($box).add($overlay).remove(); 927 $box = null; 928 $('.' + boxElement) 929 .removeData(colorbox) 930 .removeClass(boxElement) 931 .die(); 932 }; 933 934 // A method for fetching the current element ColorBox is referencing. 935 // returns a jQuery object. 936 publicMethod.element = function () { 937 return $(element); 938 }; 939 940 publicMethod.settings = defaults; 941 942}(jQuery, document, this));
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.