
/*	JQUERY COLORBOX
------------------------------------------------------------------------------------------------------ */

	(function ($, document, window) { var defaults = {
		transition: "elastic",
		speed: 0,
		width: false,
		initialWidth: "18",
		initialHeight: "18",
		innerWidth: false,
		maxWidth: false,
		innerHeight: false,
		maxHeight: false,
		scalePhotos: true,
		scrolling: false,
		inline: false,
		html: false,
		iframe: false,
		fastIframe: false,
		photo: false,
		href: false,
		title: false,
		rel: false,
		opacity: 1,
		preloading: true,
//		current: "{current} / {total}",
		current: "",
		previous: "Back",
		next: "Forward",
		close: "Thumbnails",
		open: false,
		returnFocus: true,
		loop: true,
		onOpen: false,
		onLoad: false,
		onComplete: false,
		onCleanup: false,
		onClosed: false,
		overlayClose: false,		
		escKey: true,
		arrowKey: true,
		top: false,
		bottom: false,
		left: false,
		right: false,
		fixed: false,
		data: false
	},
	
	// ABSTRACTING THE HTML AND EVENT IDENTIFIERS FOR EASIER REBRANDING
	colorbox = 'colorbox',
	prefix = 'cbox',
	boxElement = prefix + 'Element',
	
	// EVENTS
	event_open = prefix + '_open',
	event_load = prefix + '_load',
	event_complete = prefix + '_complete',
	event_cleanup = prefix + '_cleanup',
	event_closed = prefix + '_closed',
	event_purge = prefix + '_purge',
	
	// SPECIAL HANDLING FOR IE THAT DETECTS IE6, 7 OR 8
	// IE9 SUPPORTS OPACITY
	// FEATURE DETECTION ALONE GAVE A FALSE POSITIVE ON AT LEAST ONE PHONE BROWSER AND ON SOME DEVELOPMENT VERSIONS OF CHROME, HENCE THE USER-AGENT TEST
	isIE = $.browser.msie && !$.support.opacity, 
	isIE6 = isIE && $.browser.version < 7,
	event_ie6 = prefix + '_IE6',

	// CACHED JQUERY OBJECT VARIABLES
	$overlay,
	$box,
	$wrap,
	$content,
	$topBorder,
	$leftBorder,
	$rightBorder,
	$bottomBorder,
	$related,
	$window,
	$loaded,
	$loadingBay,
	$loadingOverlay,
	$title,
	$current,
	$next,
	$prev,
	$close,
	$groupControls,

	// VARIABLES FOR CACHED VALUES OR USE ACROSS MULTIPLE FUNCTIONS
	settings,
	interfaceHeight,
	interfaceWidth,
	loadedHeight,
	loadedWidth,
	element,
	index,
	photo,
	open,
	active,
	closing,
	handler,
	loadingTimer,
	publicMethod;
	
	// JQUERY OBJECT GENERATOR TO REDUCE CODE SIZE
	function $div(id, cssText, div) { 
		div = document.createElement('div');
		
		if (id) {
			div.id = prefix + id;
		}
		
		div.style.cssText = cssText || '';
		return $(div);
	};

	// CONVERT '%' AND 'PX' VALUES TO INTEGERS
	function setSize(size, dimension) {
		return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10));
	};
	
	// CHECKS AN HREF TO SEE IF IT IS A PHOTO
	// THERE IS A FORCE PHOTO OPTION (PHOTO: TRUE) FOR HREFS THAT CANNOT BE MATCHED BY THIS REGEX.
	function isImage(url) {
		return settings.photo || /\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i.test(url);
	};
	
	// ASSIGNS FUNCTION RESULTS TO THEIR RESPECTIVE SETTINGS. THIS ALLOWS FUNCTIONS TO BE USED AS VALUES
	function makeSettings(i) {
		settings = $.extend({}, $.data(element, colorbox));

		for (i in settings) {
			// CHECKS TO MAKE SURE THE FUNCTION ISN'T ONE OF THE CALLBACKS, THEY WILL BE HANDLED AT THE APPROPRIATE TIME
			if ($.isFunction(settings[i]) && i.substring(0, 2) !== 'on') {
				settings[i] = settings[i].call(element);
			}
		};

		settings.rel = settings.rel || element.rel || 'nofollow';
		settings.href = settings.href || $(element).attr('href');
		settings.title = settings.title || element.title;

		if (typeof settings.href === "string") {
			settings.href = $.trim(settings.href);
		};
	};

	function trigger(event, callback) {
		if (callback) {
			callback.call(element);
		}
		
		$.event.trigger(event);
	};

	function launch(target) {
		if (!closing) {
			element = target;
			
			makeSettings();
			
			$related = $(element);
			
			index = 0;
			
			if (settings.rel !== 'nofollow') {
				$related = $('.' + boxElement).filter(function () {
					var relRelated = $.data(this, colorbox).rel || this.rel;
					return (relRelated === settings.rel);
				});

				index = $related.index(element);
				
				// CHECK DIRECT CALLS TO COLORBOX
				if (index === -1) {
					$related = $related.add(element);
					index = $related.length - 1;
				}
			}
			
			if (!open) {
				// PREVENTS THE PAGE-CHANGE ACTION FROM QUEUING UP IF THE VISITOR HOLDS DOWN THE LEFT OR RIGHT KEYS
				open = active = true; 
				
				$box.show();
				
				if (settings.returnFocus) {
					try {
						element.blur();
						$(element).one(event_closed, function () {
							try {
								this.focus();
							} 
							catch (e) {
								// NULL
							}
						});
					} 
					catch (e) {
						// NULL
					}
				}
				
				// +SETTINGS.OPACITY AVOIDS A PROBLEM IN IE WHEN USING NON-ZERO-PREFIXED-STRING-VALUES, LIKE '.5'
				$overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();
				
				// OPENS INITAL EMPTY COLORBOX PRIOR TO CONTENT BEING LOADED
				settings.w = setSize(settings.initialWidth, 'x');
				settings.h = setSize(settings.initialHeight, 'y');
				publicMethod.position();
				
				if (isIE6) {
					$window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
						$overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
					}).trigger('resize.' + event_ie6);
				}
				
				trigger(event_open, settings.onOpen);
				
				$groupControls.add($title).hide();
				
				$close.html(settings.close).show();
			}
			
			publicMethod.load(true);
		}
	}

	publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
		var $this = this;
		
		options = options || {};

		if (!$this[0]) {
			// IF A SELECTOR WAS GIVEN AND IT DIDN'T MATCH ANY ELEMENTS, GO AHEAD AND EXIT.
			if ($this.selector) {
				return $this;
			}
			
			// IF NO SELECTOR WAS GIVEN (IE. $.COLORBOX()), CREATE A TEMPORARY ELEMENT TO WORK WITH
			$this = $('<a/>');
			
			// ASSUME AN IMMEDIATE OPEN
			options.open = true;
		}
		
		if (callback) {
			options.onComplete = callback;
		}
	
		$this.each(function () {
			$.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
			$(this).addClass(boxElement);
		});
	
		if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
			launch($this[0]);
		}
 
		return $this;
	};


/*	INITIALIZE COLORBOX: STORE COMMON CALCULATIONS, PRELOAD THE INTERFACE GRAPHICS, APPEND THE HTML
------------------------------------------------------------------------------------------------------ */

	publicMethod.init = function () {
		// CREATE & APPEND JQUERY OBJECTS
		$window = $(window);
		$box = $div().attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''});
		$overlay = $div("Overlay", isIE6 ? 'position:absolute' : '').hide();
		$wrap = $div("Wrapper");
		$content = $div("Content").append(
			$loaded = $div("LoadedContent",'width:0; height:0; overflow:hidden'),
			$loadingOverlay = $div("LoadingOverlay").add($div("LoadingGraphic")),
			$title = $div("Title"),
			$current = $div("Current"),
			$close = $div("Close"),
			$prev = $div("Previous"),
			$next = $div("Next")
		);
		
		// THE 3 X 3 GRID THAT MAKES UP COLORBOX
		// SHOULD BE REMOVED (IT WAS DISABLED), HOWEVER, REMOVAL BREAKS FUNCTIONALITY
		$wrap.append(
			$div().append(
				$div("TopLeft"),
				$topBorder = $div("TopCenter"),
				$div("TopRight")
			),
			$div(false, 'clear:left').append(
				$leftBorder = $div("MiddleLeft"),
				$content, $rightBorder = $div("MiddleRight")
			),
			$div(false, 'clear:left').append(
				$div("BottomLeft"),
				$bottomBorder = $div("BottomCenter"),
				$div("BottomRight")
			)
		).children().children().css({'float': 'left'});
		
		$loadingBay = $div(false, 'position:absolute; width:9999px; visibility:hidden; display:none');
		
		$('body').prepend($overlay, $box.append($wrap, $loadingBay));
		
		$content.children().hover(function () {
			$(this).addClass('hover');
		}, function () {
			$(this).removeClass('hover');
		}).addClass('hover');
		
		// CACHE VALUES NEEDED FOR SIZE CALCULATIONS
		// SUBTRACTION NEEDED FOR IE6
		interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
		interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
		loadedHeight = $loaded.outerHeight(true);
		loadedWidth = $loaded.outerWidth(true);
		
		// SET PADDING TO REMOVE THE NEED TO DO SIZE CONVERSIONS DURING THE ANIMATION STEP
		$box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();
		
		// SET CURSOR FOR NAVIGATION BUTTONS
		$("#cboxClose").css({ cursor: 'pointer' });
		$("#cboxPrevious").css({ cursor: 'pointer' });
		$("#cboxNext").css({ cursor: 'pointer' });
		

/*	CLICK FUNCTIONS
------------------------------------------------------------------------------------------------------ */

	// ANONYMOUS FUNCTIONS HERE KEEP THE PUBLIC METHOD FROM BEING CACHED WHICH ALLOWS THEM TO BE REDEFINED EACH TIME
	$next.click(function () {
		publicMethod.next();
	});

	$prev.click(function () {
		publicMethod.prev();
	});
	
	$close.click(function () {
		publicMethod.close();
	});
			
	$groupControls = $next.add($prev).add($current);
	
	// ADDING THE 'hover' CLASS ALLOWED THE BROWSER TO LOAD THE HOVER STATE BACKGROUND GRAPHICS IN CASE THE IMAGES WERE NOT PART OF A SPRITE (THE CLASS CAN NOW BE REMOVED)
	$content.children().removeClass('hover');
	
	$overlay.click(function () {
		if (settings.overlayClose) {
			publicMethod.close();
		}
	});
		
	/*	NAVIGATION KEY BINDINGS
	------------------------------------------------------------------------------------------------------ */
		$(document).bind('keydown.' + prefix, function (e) {
			var key = e.keyCode;
			
			if (open && settings.escKey && key === 27) {
				e.preventDefault();
				publicMethod.close();
			}
			
			if (open && settings.arrowKey && $related[1]) {
				if (key === 37) {
					e.preventDefault();
					$prev.click();
				} 
				else if (key === 39) {
					e.preventDefault();
					$next.click();
				}
			}
		});
	};
	
	publicMethod.remove = function () {
		$box.add($overlay).remove();
		$('.' + boxElement).removeData(colorbox).removeClass(boxElement);
	};

	publicMethod.position = function (speed, loadedCallback) {
		var top = 0, left = 0;

		$window.unbind('resize.' + prefix);

		// REMOVE THE MODAL SO THAT IT DOESN'T INFLUENCE THE DOCUMENT WIDTH/HEIGHT 
		$box.hide();
		
		if (settings.fixed && !isIE6) {
			$box.css({position: 'fixed'});
		}
		else {
			top = $window.scrollTop();
			left = $window.scrollLeft();
			$box.css({position: 'absolute'});
		}
		
		// KEEPS THE TOP AND LEFT POSITIONS WITHIN THE BROWSER'S VIEWPORT
		if (settings.right !== false) {
			left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
		} 
		else if (settings.left !== false) {
			left += setSize(settings.left, 'x');
		}
		else {
//			left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
			left += Math.round(300);
		}
		
		if (settings.bottom !== false) {
			top += Math.max(document.documentElement.clientHeight - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
		} 
		else if (settings.top !== false) {
			top += setSize(settings.top, 'y');
		}
		else {
			top += Math.round(Math.max(document.documentElement.clientHeight - settings.h - loadedHeight - interfaceHeight, 0) / 2);
		}

		$box.show();
			// SETTING THE SPEED TO 0 TO REDUCE THE DELAY BETWEEN SAME-SIZED CONTENT
			speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;
	
			// THIS GIVES THE WRAPPER PLENTY OF BREATHING ROOM SO IT'S FLOATED CONTENTS CAN MOVE AROUND SMOOTHLY
			// BUT IT HAS TO BE SHRANK DOWN AROUND THE SIZE OF DIV#COLORBOX WHEN IT'S DONE
			// IF NOT, IT CAN INVOKE AN OBSCURE IE BUG WHEN USING IFRAMES
			$wrap[0].style.width = $wrap[0].style.height = "9999px";
			
			function modalDimensions(that) {
				// LOADING OVERLAY HEIGHT HAS TO BE EXPLICITLY SET FOR IE6
				$topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
				$loadingOverlay[0].style.height = $loadingOverlay[1].style.height = $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
			}
			
			$box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}, { duration: speed, complete: function() {
				modalDimensions(this);
				
				active = false;
				
				// SHRINK THE WRAPPER DOWN TO EXACTLY THE SIZE OF COLORBOX TO AVOID A BUG IN IE'S IFRAME IMPLEMENTATION
				$wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
				$wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
				
				if (loadedCallback) {
					loadedCallback();
				}
		
				// SMALL DELAY BEFORE BINDING ONRESIZE DUE TO AN IE8 BUG
				setTimeout(function() { $window.bind('resize.' + prefix, publicMethod.position); }, 1); }, step: function () {
					modalDimensions(this);
				}
			});
		};



/*	RESIZE FUNCTION
------------------------------------------------------------------------------------------------------ */
	$(window).resize(function() {
		if (open) {
			publicMethod.load();
	
			options = options || {};
				
			if (options.width) {
				settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
			}
			
			if (options.innerWidth) {
				settings.w = setSize(options.innerWidth, 'x');
			}
			
			$loaded.css({width: settings.w});
			
			if (options.height) {
				settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
			}
			
			if (options.innerHeight) {
				settings.h = setSize(options.innerHeight, 'y');
			}
			
			if (!options.innerHeight && !options.height) {				
				// TEMPORARY WRAPPER TO GET AN ACCURATE ESTIMATE OF JUST HOW HIGH THE TOTAL CONTENT SHOULD BE
				var $child = $loaded.wrapInner("<div style='overflow:auto'></div>").children(); 
				
				settings.h = $child.height();
		
				// DITCH THE TEMPORARY WRAPPER DIV USED IN HEIGHT CALCULATION
				$child.replaceWith($child.children());
			}
			
			$loaded.css({height: settings.h});
			
			publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
		}
	});



/*	PREP FUNCTION
------------------------------------------------------------------------------------------------------ */
	publicMethod.prep = function (object) {
		if (!open) {
			return;
		}
		
		var callback, speed = settings.transition === "none" ? 0 : settings.speed;
		
		$loaded.remove();
		$loaded = $div('LoadedContent').append(object);
		
		function getWidth() {
			settings.w = settings.w || $loaded.width();
			settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
			return settings.w;
		}
		
		function getHeight() {
			settings.h = settings.h || $loaded.height();
			settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
			return settings.h;
		}
		
		$loaded.hide()
		
		// CONTENT HAS TO BE APPENDED TO THE DOM FOR ACCURATE SIZE CALCULATIONS
		.appendTo($loadingBay.show())

		// SET WIDTH & HEIGHT INDEPENDENTLY IN CASE THE NEW WIDTH INFLUENCES THE VALUE OF HEIGHT
		.css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
		.css({height: getHeight()})

		.prependTo($content);
		
		$loadingBay.hide();
		
		// 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
		$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
		$(photo).css({'float': 'none'});

		// HIDES SELECT ELEMENTS IN IE6 BECAUSE THEY WOULD OTHERWISE SIT ON TOP OF THE OVERLAY
		if (isIE6) {
			$('select').not($box.find('select')).filter(function () {
				return this.style.visibility !== 'hidden';
			}).css({'visibility': 'hidden'}).one(event_cleanup, function () {
				this.style.visibility = 'inherit';
			});
		}
		
		callback = function () {
			var prev, prevSrc, next, nextSrc, total = $related.length, iframe, complete;

			if (!open) {
				return;
			}
			
			function removeFilter() {
				if (isIE) {
					$box[0].style.removeAttribute('filter');
				}
			}
			
			// HIDE THE PRELOADING GRAPHIC AND TRANSITION TO THE PHOTO
			// CALLS EVERY TIME REGARDLESS OF PRELOAD STATUS
			complete = function () {
				clearTimeout(loadingTimer);
				
				$loadingOverlay.hide();
			
				// CODE ID: MEGAN
				$("#cboxClose").animate({opacity: '1.00'}, 1000, "easeOutQuart");
				$("#cboxPrevious").animate({opacity: '1.00'}, 1000, "easeOutQuart");
				$("#cboxNext").animate({opacity: '1.00'}, 1000, "easeOutQuart");

				trigger(event_complete, settings.onComplete);
			};
			
			// HELP INTERNET EXPLORER WITH BICUBIC RESAMPLING
			if (isIE) {
				if (photo) {
					$loaded.fadeIn(100);
				}
			}
			
			$title.html(settings.title).add($loaded).show();
			
			// HANDLE GROUPING
			if (total > 1) { 
				if (typeof settings.current === "string") {
				$current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
			}
			
			// IF END OF ARRAY HIDE THE NEXT BUTTON
			$next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
//			$next[(settings.loop || index < total - 1) ? "show" : "show"]().html(settings.next);
				
			// IF END OF ARRAY HIDE THE PREV BUTTON
			$prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
//			$prev[(settings.loop || index) ? "show" : "show"]().html(settings.previous);
			
			prev = index ? $related[index - 1] : $related[total - 1];
			next = index < total - 1 ? $related[index + 1] : $related[0];
			
			// PRELOADS IMAGES WITHIN A RELATED GROUP
			if (settings.preloading) {
				nextSrc = $.data(next, colorbox).href || next.href;
				prevSrc = $.data(prev, colorbox).href || prev.href;
			
				nextSrc = $.isFunction(nextSrc) ? nextSrc.call(next) : nextSrc;
				prevSrc = $.isFunction(prevSrc) ? prevSrc.call(prev) : prevSrc;
			
				if (isImage(nextSrc)) {
					$('<img/>')[0].src = nextSrc;
				}
			
				if (isImage(prevSrc)) {
					$('<img/>')[0].src = prevSrc;
				}
			}
		}
		else {
			$groupControls.hide();
		}
		
		if (settings.iframe) {
			iframe = $('<iframe/>').addClass(prefix + 'Iframe')[0];
		
			if (settings.fastIframe) {
				complete();
			}
			else {
				$(iframe).one('load', complete);
			}
		
			iframe.name = prefix + (+new Date());
			iframe.src = settings.href;
			
			if (!settings.scrolling) {
				iframe.scrolling = "no";
			}
		
			if (isIE) {
				iframe.frameBorder = 0;
				iframe.allowTransparency = "true";
			}
		
			$(iframe).appendTo($loaded).one(event_purge, function () { iframe.src = "//about:blank"; });
		}
		else {
			complete();
		}
		
		if (settings.transition === 'fade') {
			$box.fadeTo(speed, 1, removeFilter);
		}
		else {
			removeFilter();
		}
		};
		
		if (settings.transition === 'fade') {
			$box.fadeTo(speed, 0, function () {
				publicMethod.position(0, callback);
			});
		}
		else {
			publicMethod.position(speed, callback);
		}
	};




/*	LOAD FUNCTION
------------------------------------------------------------------------------------------------------ */
	publicMethod.load = function (launched) {
		var href, setResize, prep = publicMethod.prep;
		active = true;
		photo = false;
		element = $related[index];
		
		var __reg1 = $(window).height();
		$("#cboxOverlay").css({ height: __reg1 });

		$("#portfolioPage").hide();
		
		// IF: IN THE MIDDLE OF THE GALLERY (JUST SNAP TO NEW SOURCE IMAGE)
		if (!launched) {
			makeSettings();
		}
		// ELSE: OPENING THE IMAGE (SO FADE IT IN)
		else {
			$("#cboxPhoto").css({ opacity: 1.00 });
			$("#cboxPhoto").show();

			$("#cboxContent").css({ opacity: .55 });
			$("#cboxContent").show();
			$("#cboxContent").animate({opacity: '1.00'}, 800, "easeOutQuart");

			// CODE ID: MEGAN
			$("#cboxClose").css({ opacity: 0.00 });
			$("#cboxPrevious").css({ opacity: 0.00 });
			$("#cboxNext").css({ opacity: 0.00 });
		}
		
		trigger(event_purge);
		trigger(event_load, settings.onLoad);
		
		settings.h = settings.height ? setSize(settings.height, 'y') - loadedHeight - interfaceHeight :	settings.innerHeight && setSize(settings.innerHeight, 'y');
		settings.w = settings.width ? setSize(settings.width, 'x') - loadedWidth - interfaceWidth : settings.innerWidth && setSize(settings.innerWidth, 'x');
		
		// SETS THE MINIMUM DIMENSIONS FOR USE IN IMAGE SCALING
		settings.mw = settings.w;
		settings.mh = settings.h;
		
		// RE-EVALUATE THE MINIMUM WIDTH AND HEIGHT BASED ON MAXWIDTH AND MAXHEIGHT VALUES
		// IF THE WIDTH OR HEIGHT EXCEED THE MAXWIDTH OR MAXHEIGHT, USE THE MAXIMUM VALUES INSTEAD
		if (settings.maxWidth) {
			settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
			settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
		}
		
		if (settings.maxHeight) {
			settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
			settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
		}
		
		href = settings.href;
		
		loadingTimer = setTimeout(function() {
			// HIDE THE CURRENT PHOTO
			$("#cboxLoadedContent").css({opacity: 0.0});

			// SHOW PRELOADING GRAPHIC
			$loadingOverlay.show();
		}, 100);

		if (settings.inline) {
			// INSERTS AN EMPTY PLACEHOLDER WHERE INLINE CONTENT IS BEING PULLED FROM
			// AN EVENT IS BOUND TO PUT INLINE CONTENT BACK WHEN COLORBOX CLOSES OR LOADS NEW CONTENT
			$div().hide().insertBefore($(href)[0]).one(event_purge, function () { $(this).replaceWith($loaded.children()); });
			prep($(href));
		}
		else if (settings.html) {
			prep(settings.html);
		}
		else if (isImage(href)) {
			$(photo = new Image())
			.addClass(prefix + 'Photo')
			
			.load(function () {
				var percent;
				
				// STOPS ANIMATED GIF FROM FIRING THE ONLOAD REPEATEDLY
				photo.onload = null;

				if (settings.scalePhotos) {
					setResize = function () {
						photo.height -= photo.height * percent;
						photo.width -= photo.width * percent;
					}
					
					if (settings.mw && photo.width > settings.mw) {
						percent = (photo.width - settings.mw) / photo.width;
						setResize();
					}

					if (settings.mh && photo.height > settings.mh) {
						percent = (photo.height - settings.mh) / photo.height;
						setResize();
					}
				}
				
				if (settings.h) {
					photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px';
				}

				photo.style.cursor = "pointer";
				
				// PHOTO ONCLICK FUNCTION
				photo.onclick = function () {
					publicMethod.close();
				}
				
				if (isIE) {
					photo.style.msInterpolationMode = 'bicubic';
				}
				
				// A PAUSE BECAUSE CHROME WILL SOMETIMES REPORT A 0 X 0 SIZE OTHERWISE				
				setTimeout(function () { prep(photo);}, 1); });
			
				// A PAUSE BECAUSE OPERA 10.6+ WILL SOMETIMES NOT RUN THE ONLOAD FUNCTION OTHERWISE
				setTimeout(function () { photo.src = href; }, 1);
			} 
			else if (href) {
				$loadingBay.load(href, settings.data, function (data, status, xhr) { prep(status === 'error' ? $div('Error').text('Request unsuccessful: ' + xhr.statusText) : $(this).contents()); });
			}		
		};



/*	NEXT FUNCTION
------------------------------------------------------------------------------------------------------ */
	publicMethod.next = function () {
//		IF: NOT AT EDGE OF ARRAY
		if (!active && $related[1] && (index < $related.length - 1 || settings.loop)) {
			index = index < $related.length - 1 ? index + 1 : 0;
			publicMethod.load();
		}
//		ELSE: CLOSE ON LAST IMAGE
		else {
			publicMethod.close();
		}
	};



/*	PREV FUNCTION
------------------------------------------------------------------------------------------------------ */
	publicMethod.prev = function () {
//		IF: NOT AT EDGE OF ARRAY
		if (!active && $related[1] && (index || settings.loop)) {
			index = index ? index - 1 : $related.length - 1;
			publicMethod.load();
		}
//		ELSE: CLOSE ON FIRST IMAGE
		else {
			publicMethod.close();
		}
	};
	
	

/*	CLOSE FUNCTION
------------------------------------------------------------------------------------------------------ */
	publicMethod.close = function () {
		if (open && !closing) {
			closing = true;
			open = false;
			trigger(event_cleanup, settings.onCleanup);
			$window.unbind('.' + prefix + ' .' + event_ie6);
			$overlay.fadeTo(0, 0);
			
			$("#portfolioPage").css({ opacity: .0 });
			$("#portfolioPage").show();
			
			$('#cboxContent').animate({opacity: '0.00'}, 1, "easeOutQuart", function() {
				$box.stop().fadeTo(0, 0, function () {

					$("#portfolioPage").css({ opacity: .35 });
					$('#portfolioPage').animate({opacity: '1.00'}, 300, "easeOutQuart");
																			
					$box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
					trigger(event_purge);
					$loaded.remove();
					setTimeout(function () {
						closing = false;
						trigger(event_closed, settings.onClosed);
					}, 1);
					
					$("#cboxContent").css({ opacity: 1.00 });
				});
			});
		}
	};

	// A METHOD FOR FETCHING THE CURRENT ELEMENT COLORBOX IS REFERENCING
	// RETURNS A JQUERY OBJECT
	publicMethod.element = function () {
		return $(element);
	};

	publicMethod.settings = defaults;

	// BIND THE LIVE EVENT BEFORE DOM-READY FOR MAXIMUM PERFORMANCE IN IE6 & 7.
	handler = function (e) {

		// CHECKS TO SEE IF IT WAS A NON-LEFT MOUSE-CLICK AND FOR CLICKS MODIFIED WITH CTRL, SHIFT, OR ALT.
		if (!((e.button !== 0 && typeof e.button !== 'undefined') || e.ctrlKey || e.shiftKey || e.altKey)) {
			e.preventDefault();
			launch(this);
		}
	};

	if ($.fn.delegate) {
		$(document).delegate('.' + boxElement, 'click', handler);
 	}
	else {
 		$('.' + boxElement).live('click', handler);
 	};

	// INITIALIZES COLORBOX WHEN THE DOM HAS LOADED
	$(publicMethod.init);
}(jQuery, document, this));
