PageSourceSearch

https://sotozen-navi.com/js/jquery.colorbox.js

js sotozen-navi.com collected 2026-10-02 07:47:48 UTC 29,188 bytes, 1,090 lines download raw bytes

vendor: 29,188 bytes, lines 1-1090
1/*!
2	Colorbox v1.5.13 - 2014-08-04
3	jQuery lightbox and modal window plugin
4	(c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox
5	license: http://www.opensource.org/licenses/mit-license.php
6*/
7(function ($, document, window) {
8	var
9	// Default settings object.
10	// See http://jacklmoore.com/colorbox for details.
11	defaults = {
12		// data sources
13		html: false,
14		photo: false,
15		iframe: false,
16		inline: false,
17
18		// behavior and appearance
19		transition: "elastic",
20		speed: 300,
21		fadeOut: 300,
22		width: false,
23		initialWidth: "600",
24		innerWidth: false,
25		maxWidth: false,
26		height: false,
27		initialHeight: "450",
28		innerHeight: false,
29		maxHeight: false,
30		scalePhotos: true,
31		scrolling: true,
32		opacity: 0.9,
33		preloading: true,
34		className: false,
35		overlayClose: true,
36		escKey: true,
37		arrowKey: true,
38		top: false,
39		bottom: false,
40		left: false,
41		right: false,
42		fixed: false,
43		data: undefined,
44		closeButton: true,
45		fastIframe: true,
46		open: false,
47		reposition: true,
48		loop: true,
49		slideshow: false,
50		slideshowAuto: true,
51		slideshowSpeed: 2500,
52		slideshowStart: "start slideshow",
53		slideshowStop: "stop slideshow",
54		photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,
55
56		// alternate image paths for high-res displays
57		retinaImage: false,
58		retinaUrl: false,
59		retinaSuffix: '@2x.$1',
60
61		// internationalization
62		current: "",
63		previous: "previous",
64		next: "next",
65		close: "close",
66		xhrError: "This content failed to load.",
67		imgError: "This image failed to load.",
68
69		// accessbility
70		returnFocus: true,
71		trapFocus: true,
72
73		// callbacks
74		onOpen: false,
75		onLoad: false,
76		onComplete: false,
77		onCleanup: false,
78		onClosed: false,
79
80		rel: function() {
81			return this.rel;
82		},
83		href: function() {
84			// using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container')
85			return $(this).attr('href');
86		},
87		title: function() {
88			return this.title;
89		}
90	},
91
92	// Abstracting the HTML and event identifiers for easy rebranding
93	colorbox = 'colorbox',
94	prefix = 'cbox',
95	boxElement = prefix + 'Element',
96	
97	// Events
98	event_open = prefix + '_open',
99	event_load = prefix + '_load',
100	event_complete = prefix + '_complete',
101	event_cleanup = prefix + '_cleanup',
102	event_closed = prefix + '_closed',
103	event_purge = prefix + '_purge',
104
105	// Cached jQuery Object Variables
106	$overlay,
107	$box,
108	$wrap,
109	$content,
110	$topBorder,
111	$leftBorder,
112	$rightBorder,
113	$bottomBorder,
114	$related,
115	$window,
116	$loaded,
117	$loadingBay,
118	$loadingOverlay,
119	$title,
120	$current,
121	$slideshow,
122	$next,
123	$prev,
124	$close,
125	$groupControls,
126	$events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2
127	
128	// Variables for cached values or use across multiple functions
129	settings,
130	interfaceHeight,
131	interfaceWidth,
132	loadedHeight,
133	loadedWidth,
134	index,
135	photo,
136	open,
137	active,
138	closing,
139	loadingTimer,
140	publicMethod,
141	div = "div",
142	requests = 0,
143	previousCSS = {},
144	init;
145
146	// ****************
147	// HELPER FUNCTIONS
148	// ****************
149	
150	// Convenience function for creating new jQuery objects
151	function $tag(tag, id, css) {
152		var element = document.createElement(tag);
153
154		if (id) {
155			element.id = prefix + id;
156		}
157
158		if (css) {
159			element.style.cssText = css;
160		}
161
162		return $(element);
163	}
164	
165	// Get the window height using innerHeight when available to avoid an issue with iOS
166	// http://bugs.jquery.com/ticket/6724
167	function winheight() {
168		return window.innerHeight ? window.innerHeight : $(window).height();
169	}
170
171	function Settings(element, options) {
172		if (options !== Object(options)) {
173			options = {};
174		}
175
176		this.cache = {};
177		this.el = element;
178
179		this.value = function(key) {
180			var dataAttr;
181
182			if (this.cache[key] === undefined) {
183				dataAttr = $(this.el).attr('data-cbox-'+key);
184
185				if (dataAttr !== undefined) {
186					this.cache[key] = dataAttr;
187				} else if (options[key] !== undefined) {
188					this.cache[key] = options[key];
189				} else if (defaults[key] !== undefined) {
190					this.cache[key] = defaults[key];
191				}
192			}
193
194			return this.cache[key];
195		};
196
197		this.get = function(key) {
198			var value = this.value(key);
199			return $.isFunction(value) ? value.call(this.el, this) : value;
200		};
201	}
202
203	// Determine the next and previous members in a group.
204	function getIndex(increment) {
205		var
206		max = $related.length,
207		newIndex = (index + increment) % max;
208		
209		return (newIndex < 0) ? max + newIndex : newIndex;
210	}
211
212	// Convert '%' and 'px' values to integers
213	function setSize(size, dimension) {
214		return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10));
215	}
216	
217	// Checks an href to see if it is a photo.
218	// There is a force photo option (photo: true) for hrefs that cannot be matched by the regex.
219	function isImage(settings, url) {
220		return settings.get('photo') || settings.get('photoRegex').test(url);
221	}
222
223	function retinaUrl(settings, url) {
224		return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url;
225	}
226
227	function trapFocus(e) {
228		if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) {
229			e.stopPropagation();
230			$box.focus();
231		}
232	}
233
234	function setClass(str) {
235		if (setClass.str !== str) {
236			$box.add($overlay).removeClass(setClass.str).addClass(str);
237			setClass.str = str;
238		}
239	}
240
241	function getRelated(rel) {
242		index = 0;
243		
244		if (rel && rel !== false && rel !== 'nofollow') {
245			$related = $('.' + boxElement).filter(function () {
246				var options = $.data(this, colorbox);
247				var settings = new Settings(this, options);
248				return (settings.get('rel') === rel);
249			});
250			index = $related.index(settings.el);
251			
252			// Check direct calls to Colorbox.
253			if (index === -1) {
254				$related = $related.add(settings.el);
255				index = $related.length - 1;
256			}
257		} else {
258			$related = $(settings.el);
259		}
260	}
261
262	function trigger(event) {
263		// for external use
264		$(document).trigger(event);
265		// for internal use
266		$events.triggerHandler(event);
267	}
268
269	var slideshow = (function(){
270		var active,
271			className = prefix + "Slideshow_",
272			click = "click." + prefix,
273			timeOut;
274
275		function clear () {
276			clearTimeout(timeOut);
277		}
278
279		function set() {
280			if (settings.get('loop') || $related[index + 1]) {
281				clear();
282				timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed'));
283			}
284		}
285
286		function start() {
287			$slideshow
288				.html(settings.get('slideshowStop'))
289				.unbind(click)
290				.one(click, stop);
291
292			$events
293				.bind(event_complete, set)
294				.bind(event_load, clear);
295
296			$box.removeClass(className + "off").addClass(className + "on");
297		}
298
299		function stop() {
300			clear();
301			
302			$events
303				.unbind(event_complete, set)
304				.unbind(event_load, clear);
305
306			$slideshow
307				.html(settings.get('slideshowStart'))
308				.unbind(click)
309				.one(click, function () {
310					publicMethod.next();
311					start();
312				});
313
314			$box.removeClass(className + "on").addClass(className + "off");
315		}
316
317		function reset() {
318			active = false;
319			$slideshow.hide();
320			clear();
321			$events
322				.unbind(event_complete, set)
323				.unbind(event_load, clear);
324			$box.removeClass(className + "off " + className + "on");
325		}
326
327		return function(){
328			if (active) {
329				if (!settings.get('slideshow')) {
330					$events.unbind(event_cleanup, reset);
331					reset();
332				}
333			} else {
334				if (settings.get('slideshow') && $related[1]) {
335					active = true;
336					$events.one(event_cleanup, reset);
337					if (settings.get('slideshowAuto')) {
338						start();
339					} else {
340						stop();
341					}
342					$slideshow.show();
343				}
344			}
345		};
346
347	}());
348
349
350	function launch(element) {
351		var options;
352
353		if (!closing) {
354
355			options = $(element).data(colorbox);
356
357			settings = new Settings(element, options);
358			
359			getRelated(settings.get('rel'));
360
361			if (!open) {
362				open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
363
364				setClass(settings.get('className'));
365				
366				// Show colorbox so the sizes can be calculated in older versions of jQuery
367				$box.css({visibility:'hidden', display:'block', opacity:''});
368				
369				$loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden');
370				$content.css({width:'', height:''}).append($loaded);
371
372				// Cache values needed for size calculations
373				interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
374				interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
375				loadedHeight = $loaded.outerHeight(true);
376				loadedWidth = $loaded.outerWidth(true);
377
378				// Opens inital empty Colorbox prior to content being loaded.
379				var initialWidth = setSize(settings.get('initialWidth'), 'x');
380				var initialHeight = setSize(settings.get('initialHeight'), 'y');
381				var maxWidth = settings.get('maxWidth');
382				var maxHeight = settings.get('maxHeight');
383
384				settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth;
385				settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight;
386
387				$loaded.css({width:'', height:settings.h});
388				publicMethod.position();
389
390				trigger(event_open);
391				settings.get('onOpen');
392
393				$groupControls.add($title).hide();
394
395				$box.focus();
396				
397				if (settings.get('trapFocus')) {
398					// Confine focus to the modal
399					// Uses event capturing that is not supported in IE8-
400					if (document.addEventListener) {
401
402						document.addEventListener('focus', trapFocus, true);
403						
404						$events.one(event_closed, function () {
405							document.removeEventListener('focus', trapFocus, true);
406						});
407					}
408				}
409
410				// Return focus on closing
411				if (settings.get('returnFocus')) {
412					$events.one(event_closed, function () {
413						$(settings.el).focus();
414					});
415				}
416			}
417
418			var opacity = parseFloat(settings.get('opacity'));
419			$overlay.css({
420				opacity: opacity === opacity ? opacity : '',
421				cursor: settings.get('overlayClose') ? 'pointer' : '',
422				visibility: 'visible'
423			}).show();
424			
425			if (settings.get('closeButton')) {
426				$close.html(settings.get('close')).appendTo($content);
427			} else {
428				$close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4
429			}
430
431			load();
432		}
433	}
434
435	// Colorbox's markup needs to be added to the DOM prior to being called
436	// so that the browser will go ahead and load the CSS background images.
437	function appendHTML() {
438		if (!$box && document.body) {
439			init = false;
440			$window = $(window);
441			$box = $tag(div).attr({
442				id: colorbox,
443				'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS.
444				role: 'dialog',
445				tabindex: '-1'
446			}).hide();
447			$overlay = $tag(div, "Overlay").hide();
448			$loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]);
449			$wrap = $tag(div, "Wrapper");
450			$content = $tag(div, "Content").append(
451				$title = $tag(div, "Title"),
452				$current = $tag(div, "Current"),
453				$prev = $('<button type="button"/>').attr({id:prefix+'Previous'}),
454				$next = $('<button type="button"/>').attr({id:prefix+'Next'}),
455				$slideshow = $tag('button', "Slideshow"),
456				$loadingOverlay
457			);
458
459			$close = $('<button type="button"/>').attr({id:prefix+'Close'});
460			
461			$wrap.append( // The 3x3 Grid that makes up Colorbox
462				$tag(div).append(
463					$tag(div, "TopLeft"),
464					$topBorder = $tag(div, "TopCenter"),
465					$tag(div, "TopRight")
466				),
467				$tag(div, false, 'clear:left').append(
468					$leftBorder = $tag(div, "MiddleLeft"),
469					$content,
470					$rightBorder = $tag(div, "MiddleRight")
471				),
472				$tag(div, false, 'clear:left').append(
473					$tag(div, "BottomLeft"),
474					$bottomBorder = $tag(div, "BottomCenter"),
475					$tag(div, "BottomRight")
476				)
477			).find('div div').css({'float': 'left'});
478			
479			$loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;');
480			
481			$groupControls = $next.add($prev).add($current).add($slideshow);
482
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.