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