/*!	ColorBox v1.3.1 - a full featured, light-weight, customizable lightbox based on jQuery 1.3 */
//	(c) 2009 Jack Moore - www.colorpowered.com - jack@colorpowered.com
//	Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php

(function (jQuery) {
	//Shortcuts (to increase compression)
	var colorbox = 'colorbox',
	hover = 'hover',
	TRUE = true,
	FALSE = false,
	cboxPublic,
	isIE = !jQuery.support.opacity,
	isIE6 = isIE && !window.XMLHttpRequest,

	//Event Strings (to increase compression)
	cbox_click = 'click.colorbox',
	cbox_open = 'cbox_open',
	cbox_load = 'cbox_load',
	cbox_complete = 'cbox_complete',
	cbox_cleanup = 'cbox_cleanup',
	cbox_closed = 'cbox_closed',
	cbox_resize = 'resize.cbox_resize',
	cbox_ie6 = 'resize.cboxie6 scroll.cboxie6',

	//Cached jQuery Object Variables
	jQueryoverlay,
	jQuerycbox,
	jQuerywrap,
	jQuerycontent,
	jQuerytopBorder,
	jQueryleftBorder,
	jQueryrightBorder,
	jQuerybottomBorder,
	jQueryrelated,
	jQuerywindow,
	jQueryloaded,
	jQueryloadingOverlay,
	jQueryloadingGraphic,
	jQuerytitle,
	jQuerycurrent,
	jQueryslideshow,
	jQuerynext,
	jQueryprev,
	jQueryclose,

	//Variables for cached values or use across multiple functions
	interfaceHeight,
	interfaceWidth,
	loadedHeight,
	loadedWidth,
	maxWidth,
	maxHeight,
	element,
	index,
	settings,
	open,
	callback,
	
	// ColorBox Default Settings.	
	// See http://colorpowered.com/colorbox for details.
	defaults = {
		transition: "elastic",
		speed: 350,
		width: FALSE,
		height: FALSE,
		initialWidth: "400",
		initialHeight: "400",
		maxWidth: FALSE,
		maxHeight: FALSE,
		scalePhotos: TRUE,
		scrollbars: TRUE,
		inline: FALSE,
		html: FALSE,
		iframe: FALSE,
		photo: FALSE,
		href: FALSE,
		title: FALSE,
		rel: FALSE,
		opacity: 0.9,
		preloading: TRUE,
		current: "image {current} of {total}",
		previous: "previous",
		next: "next",
		close: "close",
		open: FALSE,
		overlayClose: TRUE,
		slideshow: FALSE,
		slideshowAuto: TRUE,
		slideshowSpeed: 2500,
		slideshowStart: "start slideshow",
		slideshowStop: "stop slideshow"
	};

	// ****************
	// HELPER FUNCTIONS
	// ****************
	
	// Set Navigation Key Bindings
	function cbox_key(e) {
		if (e.keyCode === 37) {
			e.preventDefault();
			jQueryprev.click();
		} else if (e.keyCode === 39) {
			e.preventDefault();
			jQuerynext.click();
		}
	}
	
	// Convert % values to pixels
	function setSize (size, dimension) {
		dimension = dimension === 'x' ? document.documentElement.clientWidth : document.documentElement.clientHeight;
		return (typeof size === 'string') ? (size.match(/%/) ? (dimension / 100) * parseInt(size, 10) : parseInt(size, 10)) : size;
	}

	// 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 || url.match(/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?jQuery/i);
	}
	
	// Assigns functions results to their respective settings.  This allows functions to be used to set ColorBox options.
	function process () {
		for (var i in settings) {
			if (typeof(settings[i]) === 'function') {
			    settings[i] = settings[i].call(element);
			}
		}
	}

	// ****************
	// PUBLIC FUNCTIONS
	// Usage format: jQuery.fn.colorbox.close();
	// Usage from within an iframe: parent.jQuery.fn.colorbox.close();
	// ****************
	
	cboxPublic = jQuery.fn.colorbox = function (options, custom_callback) {
		
		if (this.length) {
			this.each(function () {
				var data = jQuery(this).data(colorbox) ? jQuery.extend({},
					jQuery(this).data(colorbox), options) : jQuery.extend({}, defaults, options);
				jQuery(this).data(colorbox, data).addClass("cboxelement");
			});
		} else {
			jQuery(this).data(colorbox, jQuery.extend({}, defaults, options));
		}
		
		jQuery(this).unbind(cbox_click).bind(cbox_click, function (event) {
			
			element = this;
			
			settings = jQuery(element).data(colorbox);
			
			process();//process settings functions
			
			jQuery().bind("keydown.cbox_close", function (e) {
				if (e.keyCode === 27) {
					e.preventDefault();
					cboxPublic.close();
				}
			});
			if (settings.overlayClose) {
				jQueryoverlay.css({"cursor": "pointer"}).one('click', cboxPublic.close);
			}
			
			//remove the focus from the anchor to prevent accidentally calling
			//colorbox multiple times (by pressing the 'Enter' key
			//after colorbox has opened, but before the user has clicked on anything else)
			element.blur();
			
			callback = custom_callback || FALSE;
			
			var rel = settings.rel || element.rel;
			
			if (rel && rel !== 'nofollow') {
				jQueryrelated = jQuery('.cboxelement').filter(function () {
					var relRelated = jQuery(this).data(colorbox).rel || this.rel;
					return (relRelated === rel);
				});
				index = jQueryrelated.index(element);
				
				if (index < 0) { //this checks direct calls to colorbox
					jQueryrelated = jQueryrelated.add(element);
					index = jQueryrelated.length - 1;
				}
			
			} else {
				jQueryrelated = jQuery(element);
				index = 0;
			}
			if (!open) {
				open = TRUE;
				jQuery.event.trigger(cbox_open);
				jQueryclose.html(settings.close);
				jQueryoverlay.css({"opacity": settings.opacity}).show();
				cboxPublic.position(setSize(settings.initialWidth, 'x'), setSize(settings.initialHeight, 'y'), 0);
				if (isIE6) {
					jQuerywindow.bind(cbox_ie6, function () {
						jQueryoverlay.css({width: jQuerywindow.width(), height: jQuerywindow.height(), top: jQuerywindow.scrollTop(), left: jQuerywindow.scrollLeft()});
					}).trigger(cbox_ie6);
				}
			}
			cboxPublic.slideshow();
			cboxPublic.load();
			
			event.preventDefault();
		});
		
		if (options && options.open) {
			jQuery(this).triggerHandler(cbox_click);
		}
		
		return this;
	};

	// Initialize ColorBox: store common calculations, preload the interface graphics, append the html.
	// This preps colorbox for a speedy open when clicked, and lightens the burdon on the browser by only
	// having to run once, instead of each time colorbox is opened.
	cboxPublic.init = function () {
		
		// jQuery object generator to save a bit of space
		function jQuerydiv(id) {
			return jQuery('<div id="cbox' + id + '"/>');
		}
		
		// Create & Append jQuery Objects
		jQuerywindow = jQuery(window);
		jQuerycbox = jQuery('<div id="colorbox"/>');
		jQueryoverlay = jQuerydiv("Overlay").hide();
		jQuerywrap = jQuerydiv("Wrapper");
		jQuerycontent = jQuerydiv("Content").append(
			jQueryloaded = jQuerydiv("LoadedContent").css({width: 0, height: 0}),
			jQueryloadingOverlay = jQuerydiv("LoadingOverlay"),
			jQueryloadingGraphic = jQuerydiv("LoadingGraphic"),
			jQuerytitle = jQuerydiv("Title"),
			jQuerycurrent = jQuerydiv("Current"),
			jQueryslideshow = jQuerydiv("Slideshow"),
			jQuerynext = jQuerydiv("Next"),
			jQueryprev = jQuerydiv("Previous"),
			jQueryclose = jQuerydiv("Close")
		);
		jQuerywrap.append( // The 3x3 Grid that makes up ColorBox
			jQuery('<div/>').append(
				jQuerydiv("TopLeft"),
				jQuerytopBorder = jQuerydiv("TopCenter"),
				jQuerydiv("TopRight")
			),
			jQuery('<div/>').append(
				jQueryleftBorder = jQuerydiv("MiddleLeft"),
				jQuerycontent,
				jQueryrightBorder = jQuerydiv("MiddleRight")
			),
			jQuery('<div/>').append(
				jQuerydiv("BottomLeft"),
				jQuerybottomBorder = jQuerydiv("BottomCenter"),
				jQuerydiv("BottomRight")
			)
		).children().children().css({'float': 'left'});
		jQuery('body').prepend(jQueryoverlay, jQuerycbox.append(jQuerywrap));
				
		if (isIE) {
			jQuerycbox.addClass('cboxIE');
			if (isIE6) {
				jQueryoverlay.css('position', 'absolute');
			}
		}
		
		// Add rollover event to navigation elements
		jQuerycontent.children()
		.addClass(hover)
		.mouseover(function () { jQuery(this).addClass(hover); })
		.mouseout(function () { jQuery(this).removeClass(hover); })
		.hide();
		
		// Cache values needed for size calculations
		interfaceHeight = jQuerytopBorder.height() + jQuerybottomBorder.height() + jQuerycontent.outerHeight(TRUE) - jQuerycontent.height();//Subtraction needed for IE6
		interfaceWidth = jQueryleftBorder.width() + jQueryrightBorder.width() + jQuerycontent.outerWidth(TRUE) - jQuerycontent.width();
		loadedHeight = jQueryloaded.outerHeight(TRUE);
		loadedWidth = jQueryloaded.outerWidth(TRUE);
		
		// Setting padding to remove the need to do size conversions during the animation step.
		jQuerycbox.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();
		
		// Setup button & key events.
		jQuerynext.click(cboxPublic.next);
		jQueryprev.click(cboxPublic.prev);
		jQueryclose.click(cboxPublic.close);
		
		// Adding the 'hover' class allowed the browser to load the hover-state
		// background graphics.  The class can now can be removed.
		jQuerycontent.children().removeClass(hover);
	};

	cboxPublic.position = function (mWidth, mHeight, speed, loadedCallback) {
		var winHeight = document.documentElement.clientHeight,
		posTop = winHeight / 2 - mHeight / 2,
		posLeft = document.documentElement.clientWidth / 2 - mWidth / 2,
		animate_speed;
		
		//keeps the box from expanding to an inaccessible area offscreen.
		if (mHeight > winHeight) { posTop -=(mHeight - winHeight); }
		if (posTop < 0) { posTop = 0; } 
		if (posLeft < 0) { posLeft = 0; }
		
		posTop += jQuerywindow.scrollTop();
		posLeft += jQuerywindow.scrollLeft();
		
		mWidth = mWidth - interfaceWidth;
		mHeight = mHeight - interfaceHeight;
		
		//setting the speed to 0 to reduce the delay between same-sized content.
		animate_speed = (jQuerycbox.width() === mWidth && jQuerycbox.height() === mHeight) ? 0 : speed;
		
		//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.
		jQuerywrap[0].style.width = jQuerywrap[0].style.height = "9999px";
		
		function modalDimensions (that) {
			//loading overlay size has to be sure that IE6 uses the correct height.
			jQuerytopBorder[0].style.width = jQuerybottomBorder[0].style.width = jQuerycontent[0].style.width = that.style.width;
			jQueryloadingGraphic[0].style.height = jQueryloadingOverlay[0].style.height = jQuerycontent[0].style.height = jQueryleftBorder[0].style.height = jQueryrightBorder[0].style.height = that.style.height;
		}
		
		jQuerycbox.dequeue().animate({height:mHeight, width:mWidth, top:posTop, left:posLeft}, {duration: animate_speed,
			complete: function(){
				modalDimensions(this);
				
				//shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
				jQuerywrap[0].style.width = (mWidth+interfaceWidth) + "px";
				jQuerywrap[0].style.height = (mHeight+interfaceHeight) + "px";
				
				if (loadedCallback) {loadedCallback();}
			},
			step: function(){
				modalDimensions(this);
			}
		});
	};

	cboxPublic.resize = function (object) {
		if(!open){ return; }
		
		var width,
		height,
		topMargin,
		prev,
		prevSrc,
		next,
		nextSrc,
		photo,
		timeout,
		speed = settings.transition==="none" ? 0 : settings.speed;
		
		jQuerywindow.unbind(cbox_resize);
		
		if(!object){
			timeout = setTimeout(function(){ //timer allows IE to render the dimensions before attempting to calculate the height
				height = jQueryloaded.children().outerHeight(TRUE);
				jQueryloaded[0].style.height = height + 'px';
				cboxPublic.position(jQueryloaded.width()+loadedWidth+interfaceWidth, height+loadedHeight+interfaceHeight, speed);
			}, 1);
			return;
		}
		
		jQueryloaded.remove();
		jQueryloaded = jQuery(object);
		
		function getWidth(){
			width = settings.width ? maxWidth : maxWidth && maxWidth < jQueryloaded.width() ? maxWidth : jQueryloaded.width();
			return width;
		}
		function getHeight(){
			height = settings.height ? maxHeight : maxHeight && maxHeight < jQueryloaded.height() ? maxHeight : jQueryloaded.height();
			return height;
		}
		
		if(!settings.scrollbars){
			jQueryloaded.css({overflow:'hidden'});
		}
		
		jQueryloaded.hide().appendTo('body')
		.attr({id:'cboxLoadedContent'})
		.css({width:getWidth()})
		.css({height:getHeight()})//sets the height independently from the width in case the new width influences the value of height.
		.prependTo(jQuerycontent);
		
		// Hides 'select' form elements in IE6 because they would otherwise sit on top of the overlay.
		if (isIE6) {
			jQuery('select:not(#colorbox select)').filter(function(){
				return jQuery(this).css('visibility') !== 'hidden';
			}).css({'visibility':'hidden'}).one(cbox_cleanup, function(){
				jQuery(this).css({'visibility':'inherit'});
			});
		}
		
		photo = jQuery('#cboxPhoto')[0];
		if (photo && settings.height) {
			topMargin = (height - parseInt(photo.style.height, 10))/2;
			photo.style.marginTop = (topMargin > 0 ? topMargin : 0)+'px';
		}
		
		function setPosition (s) {
			var mWidth = width+loadedWidth+interfaceWidth,
			mHeight = height+loadedHeight+interfaceHeight;
			
			jQuery().unbind('keydown', cbox_key);
			cboxPublic.position(mWidth, mHeight, s, function(){
				if (!open) { return; }
				
				if (isIE) {
					//This fadeIn helps the bicubic resampling to kick-in.
					if( photo ){jQueryloaded.fadeIn(100);}
					//IE adds a filter when ColorBox fades in and out that can cause problems if the loaded content contains transparent pngs.
					jQuerycbox[0].style.removeAttribute("filter");
				}
				
				jQuerycontent.children().show();
				
				//Waited until the iframe is added to the DOM & it is visible before setting the src.
				//This increases compatability with pages using DOM dependent JavaScript.
				jQuery('#cboxIframeTemp').after("<iframe id='cboxIframe' name='iframe_"+new Date().getTime()+"' frameborder=0 src='"+(settings.href || element.href)+"' />").remove();
				
				jQueryloadingOverlay.hide();
				jQueryloadingGraphic.hide();
				jQueryslideshow.hide();
				
				if (jQueryrelated.length>1) {
					jQuerycurrent.html(settings.current.replace(/\{current\}/, index+1).replace(/\{total\}/, jQueryrelated.length));
					jQuerynext.html(settings.next);
					jQueryprev.html(settings.previous);
					
					jQuery().bind('keydown', cbox_key);
					
					if(settings.slideshow){
						jQueryslideshow.show();
					}
				} else {
					jQuerycurrent.hide();
					jQuerynext.hide();
					jQueryprev.hide();
				}
				
				jQuerytitle.html(settings.title || element.title);
				
				jQuery.event.trigger(cbox_complete);
				
				if (callback) {
					callback.call(element);
				}
				
				if (settings.transition === 'fade'){
					jQuerycbox.fadeTo(speed, 1, function(){
						if(isIE){jQuerycbox[0].style.removeAttribute("filter");}
					});
				}
				
				jQuerywindow.bind(cbox_resize, function(){
					cboxPublic.position(mWidth, mHeight, 0);
				});
			});
		}
		
		if((settings.transition === 'fade' && jQuerycbox.fadeTo(speed, 0, function(){setPosition(0);})) || setPosition(speed)){}
		
		// Preloads images within a rel group
		if (settings.preloading && jQueryrelated.length>1) {
			prev = index > 0 ? jQueryrelated[index-1] : jQueryrelated[jQueryrelated.length-1];
			next = index < jQueryrelated.length-1 ? jQueryrelated[index+1] : jQueryrelated[0];
			nextSrc = jQuery(next).data(colorbox).href || next.href;
			prevSrc = jQuery(prev).data(colorbox).href || prev.href;
			
			if(isImage(nextSrc)){
				jQuery('<img />').attr('src', nextSrc);
			}
			
			if(isImage(prevSrc)){
				jQuery('<img />').attr('src', prevSrc);
			}
		}
	};

	cboxPublic.load = function () {
		var height, width, href, loadingElement, resize = cboxPublic.resize;
		
		element = jQueryrelated[index];
		
		settings = jQuery(element).data(colorbox);
		
		//convert functions to static values
		process();
		
		jQuery.event.trigger(cbox_load);
		
		// Evaluate the height based on the optional height and width settings.
		height = settings.height ? setSize(settings.height, 'y') - loadedHeight - interfaceHeight : FALSE;
		width = settings.width ? setSize(settings.width, 'x') - loadedWidth - interfaceWidth : FALSE;
		
		href = settings.href || element.href;
		
		jQueryloadingOverlay.show();
		jQueryloadingGraphic.show();
		jQueryclose.show();
		
		//Re-evaluate the maximum dimensions based on the optional maxheight and maxwidth.
		if(settings.maxHeight){
			maxHeight = settings.maxHeight ? setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight : FALSE;
			height = height && height < maxHeight ? height : maxHeight;
		}
		if(settings.maxWidth){
			maxWidth = settings.maxWidth ? setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth : FALSE;
			width = width && width < maxWidth ? width : maxWidth;
		}
		
		maxHeight = height;
		maxWidth = width;
		
		if (settings.inline) {
			jQuery('<div id="cboxInlineTemp" />').hide().insertBefore(jQuery(href)[0]).bind(cbox_load+' '+cbox_cleanup, function(){
				jQueryloaded.children().insertBefore(this);
				jQuery(this).remove();
			});
			resize(jQuery(href).wrapAll('<div/>').parent());
		} else if (settings.iframe) {
			resize(jQuery("<div><div id='cboxIframeTemp' /></div>"));
		} else if (settings.html) {
			resize(jQuery('<div/>').html(settings.html));
		} else if (isImage(href)){
			loadingElement = new Image();
			loadingElement.onload = function(){
				loadingElement.onload = null;
				
				if((maxHeight || maxWidth) && settings.scalePhotos){
					var width = this.width,
					height = this.height,
					percent = 0,
					that = this,
					setResize = function(){
						height += height * percent;
						width += width * percent;
						that.height = height;
						that.width = width;	
					};
					
					if( maxWidth && width > maxWidth ){
						percent = (maxWidth - width) / width;
						setResize();
					}
					if( maxHeight && height > maxHeight ){
						percent = (maxHeight - height) / height;
						setResize();
					}
				}
				
				resize(jQuery("<div />").css({width:this.width, height:this.height}).append(jQuery(this).css({width:this.width, height:this.height, display:"block", margin:"auto", border:0}).attr('id', 'cboxPhoto')));
				
				if(jQueryrelated.length > 1){
					jQuery(this).css({cursor:'pointer'}).click(cboxPublic.next);
				}
				
				if(isIE){
					this.style.msInterpolationMode='bicubic';
				}
			};
			loadingElement.src = href;
		} else {
			jQuery('<div />').load(href, function(data, textStatus){
				if(textStatus === "success"){
					resize(jQuery(this));
				} else {
					resize(jQuery("<p>Request unsuccessful.</p>"));
				}
			});
		}
	};

	//navigates to the next page/image in a set.
	cboxPublic.next = function () {
		index = index < jQueryrelated.length-1 ? index+1 : 0;
		cboxPublic.load();
	};
	
	cboxPublic.prev = function () {
		index = index > 0 ? index-1 : jQueryrelated.length-1;
		cboxPublic.load();
	};

	cboxPublic.slideshow = function () {
		var stop, timeOut, className = 'cboxSlideshow_';
		
		jQueryslideshow.bind(cbox_cleanup, function(){
			clearTimeout(timeOut);
			jQueryslideshow.unbind(cbox_complete+' '+cbox_load+" click");
		});
		
		function start(){
			jQueryslideshow
			.text(settings.slideshowStop)
			.bind(cbox_complete, function(){
				timeOut = setTimeout(cboxPublic.next, settings.slideshowSpeed);
			})
			.bind(cbox_load, function(){
				clearTimeout(timeOut);	
			}).one("click", function(){
				stop();
				jQuery(this).removeClass(hover);
			});
			jQuerycbox.removeClass(className+"off").addClass(className+"on");
		}
		
		stop = function(){
			clearTimeout(timeOut);
			jQueryslideshow
			.text(settings.slideshowStart)
			.unbind(cbox_complete+' '+cbox_load)
			.one("click", function(){
				start();
				timeOut = setTimeout(cboxPublic.next, settings.slideshowSpeed);
				jQuery(this).removeClass(hover);
			});
			jQuerycbox.removeClass(className+"on").addClass(className+"off");
		};
		
		if(settings.slideshow && jQueryrelated.length>1){
			if(settings.slideshowAuto){
				start();
			} else {
				stop();
			}
		}
	};

	//Note: to use this within an iframe use the following format: parent.jQuery.fn.colorbox.close();
	cboxPublic.close = function () {
		jQuery.event.trigger(cbox_cleanup);
		open = FALSE;
		jQuery().unbind('keydown', cbox_key).unbind("keydown.cbox_close");
		jQuerywindow.unbind(cbox_resize+" "+cbox_ie6);
		jQueryoverlay.css({cursor: 'auto'}).fadeOut('fast');
		
		jQuerycbox
		.stop(TRUE, FALSE)
		.fadeOut('fast', function () {
			jQueryloaded.remove();
			jQuerycbox.css({'opacity': 1});
			jQuerycontent.children().hide();
			jQuery.event.trigger(cbox_closed);
		});
	};

	cboxPublic.element = function(){ return element; };

	cboxPublic.settings = defaults;

	// Initializes ColorBox when the DOM has loaded
	jQuery(cboxPublic.init);

}(jQuery));
