PageSourceSearch

https://pels.be/js/colorbox/colorbox.js

js pels.be collected 2026-10-05 11:29:58 UTC 26,012 bytes, 942 lines download raw bytes

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.