var J = jQuery.noConflict();
/*
	ColorBox v1.2.9b - 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 (J) {
	
	// ****************
	// COMMON VARIABLES
	// ****************
	
	//jQuery Object Variables
	var Joverlay, Jcbox, Jwrap, Jcontent, JtopBorder, JleftBorder, JrightBorder, JbottomBorder, Jrelated, Jwindow, Jloaded, JloadingOverlay, JloadingGraphic, Jtitle, Jcurrent, Jslideshow, Jnext, Jprev, Jclose,
	
	//Variables
	publicMethod, interfaceHeight, interfaceWidth, loadedHeight, loadedWidth, maxWidth, maxHeight, element, index, settings, open, callback, colorbox = 'colorbox', hover = 'hover',

	//Functions
	prev, next, init, load, position, dimensions, slideshow, close,
	
	//Events
	cbox_open = 'cbox_open', cbox_load = 'cbox_load', cbox_complete = 'cbox_complete', cbox_close = 'cbox_close', cbox_closed = 'cbox_closed',

	// ColorBox Default Settings.	
	// See http://colorpowered.com/colorbox for details.
	defaults = {
		transition: "elastic",
		speed: 350,
		width: false,
		height: false,
		initialWidth: "100",
		initialHeight: "100",
		maxWidth: false,
		maxHeight: false,
		resize: true,
		inline: false,
		html: false,
		iframe: false,
		photo: false,
		href: false,
		title: false,
		rel: false,
		opacity: 0.8,
		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 Keys
	function cbox_key(e) {
		if (e.keyCode === 37) {
			e.preventDefault();
			Jprev.click();
		} else if (e.keyCode === 39) {
			e.preventDefault();
			Jnext.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 for hrefs that cannot be matched by this regex.
	function isImage(url) {
		return settings.photo ? true : url.match(/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?J/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);
			}
		}
	}

	J.fn.colorbox = function (options, custom_callback) {
		
		if (this.length) {
			this.each(function () {
				var data = J(this).data(colorbox) ? J.extend({},
					J(this).data(colorbox), options) : J.extend({}, defaults, options);
				J(this).data(colorbox, data).addClass("cboxelement");
			});
		} else {
			J(this).data(colorbox, J.extend({}, defaults, options));
		}
		
		J(this).unbind("click.colorbox").bind("click.colorbox", function (event) {
			
			element = this;
			
			settings = J(element).data(colorbox);
			
			process();//process settings functions
			
			J().bind("keydown.cbox_close", function (e) {
				if (e.keyCode === 27) {
					e.preventDefault();
					Jclose.click();
				}
			});
			if (settings.overlayClose === true) {
				Joverlay.css({"cursor": "pointer"}).one('click', 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') {
				Jrelated = J('.cboxelement').filter(function () {
					var relRelated = J(this).data(colorbox).rel || this.rel;
					return (relRelated === rel);
				});
				index = Jrelated.index(element);
				
				if (index < 0) { //this checks direct calls to colorbox
					Jrelated = Jrelated.add(element);
					index = Jrelated.length - 1;
				}
			
			} else {
				Jrelated = J(element);
				index = 0;
			}
			if (!open) {
				J.event.trigger(cbox_open);
				Jclose.html(settings.close);
				Joverlay.css({"opacity": settings.opacity}).show();
				open = true;
				position(setSize(settings.initialWidth, 'x'), setSize(settings.initialHeight, 'y'), 0);
				if (J.browser.msie && J.browser.version < 7) {
					Jwindow.bind("resize.cboxie6 scroll.cboxie6", function () {
						Joverlay.css({width: Jwindow.width(), height: Jwindow.height(), top: Jwindow.scrollTop(), left: Jwindow.scrollLeft()});
					}).trigger('scroll.cboxie6');
				}
			}
			slideshow();
			load();
			
			event.preventDefault();
		});
		
		if (options && options.open) {
			J(this).triggerHandler('click.colorbox');
		}
		
		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.
	init = function () {				
		// jQuery object generator to save a bit of space
		function Jdiv(id) {
			return J('<div id="cbox' + id + '"/>');
		}
		// Create & Append jQuery Objects
		Jwindow = J(window);
		Jcbox = J('<div id="colorbox"/>');
		Joverlay = Jdiv("Overlay").hide();
		Jwrap = Jdiv("Wrapper");
		Jcontent = Jdiv("Content").append(
			Jloaded = Jdiv("LoadedContent").css({width: 0, height: 0}),
			JloadingOverlay = Jdiv("LoadingOverlay"),
			JloadingGraphic = Jdiv("LoadingGraphic"),
			Jtitle = Jdiv("Title"),
			Jcurrent = Jdiv("Current"),
			Jslideshow = Jdiv("Slideshow"),
			Jnext = Jdiv("Next"),
			Jprev = Jdiv("Previous"),
			Jclose = Jdiv("Close")
		);
		Jwrap.append( // The 3x3 Grid that makes up ColorBox
			J('<div/>').append(
				Jdiv("TopLeft"),
				JtopBorder = Jdiv("TopCenter"),
				Jdiv("TopRight")
			),
			J('<div/>').append(
				JleftBorder = Jdiv("MiddleLeft"),
				Jcontent,
				JrightBorder = Jdiv("MiddleRight")
			),
			J('<div/>').append(
				Jdiv("BottomLeft"),
				JbottomBorder = Jdiv("BottomCenter"),
				Jdiv("BottomRight")
			)
		).children().children().css({'float': 'left'});
		J('body').prepend(Joverlay, Jcbox.append(Jwrap));
		
		if (J.browser.msie && J.browser.version < 7) {
			Joverlay.css('position', 'absolute');
		}
		
		// Add rollover event to navigation elements
		Jcontent.children()
		.addClass(hover)
		.mouseover(function () { J(this).addClass(hover); })
		.mouseout(function () { J(this).removeClass(hover); })
		.hide();
		
		// Cache values needed for size calculations
		interfaceHeight = JtopBorder.height() + JbottomBorder.height() + Jcontent.outerHeight(true) - Jcontent.height();//Subtraction needed for IE6
		interfaceWidth = JleftBorder.width() + JrightBorder.width() + Jcontent.outerWidth(true) - Jcontent.width();
		loadedHeight = Jloaded.outerHeight(true);
		loadedWidth = Jloaded.outerWidth(true);
		
		// Setting padding to remove the need to do size conversions during the animation step.
		Jcbox.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();
		
		// Setup button & key events.
		Jnext.click(next);
		Jprev.click(prev);
		Jclose.click(close);
		
		// Adding the 'hover' class allowed the browser to load the hover-state
		// background graphics.  The class can now can be removed.
		Jcontent.children().removeClass(hover);
	};

	position = function (mWidth, mHeight, speed, loadedCallback) {
		var winHeight = document.documentElement.clientHeight,
		posTop = winHeight / 4 - mHeight / 4,
		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 += Jwindow.scrollTop();
		posLeft += Jwindow.scrollLeft();
		
		mWidth = mWidth - interfaceWidth;
		mHeight = mHeight - interfaceHeight;
		
		//setting the speed to 0 to reduce the delay between same-sized content.
		animate_speed = (Jcbox.width() === mWidth && Jcbox.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.
		Jwrap[0].style.width = Jwrap[0].style.height = "9999px";
		
		function modalDimensions (that) {
			//loading overlay size has to be sure that IE6 uses the correct height.
			JtopBorder[0].style.width = JbottomBorder[0].style.width = Jcontent[0].style.width = that.style.width;
			JloadingGraphic[0].style.height = JloadingOverlay[0].style.height = Jcontent[0].style.height = JleftBorder[0].style.height = JrightBorder[0].style.height = that.style.height;
		}
		
		Jcbox.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.
				Jwrap[0].style.width = (mWidth+interfaceWidth) + "px";
				Jwrap[0].style.height = (mHeight+interfaceHeight) + "px";
				
				if (loadedCallback) {loadedCallback();}
			},
			step: function(){
				modalDimensions(this);
			}
		});
	};

	dimensions = function (object) {
		if(!open){ return; }
		
		Jwindow.unbind('resize.cbox_resize');
		
		var width, height, topMargin, prev, prevSrc, next, nextSrc, photo,
		speed = settings.transition==="none" ? 0 : settings.speed;
		
		Jloaded.remove();
		Jloaded = J(object);
		
		function getWidth(){
			if(settings.width){
				width = maxWidth;
			} else {
				width = maxWidth && maxWidth < Jloaded.width() ? maxWidth : Jloaded.width();
			}
			return width;
		}
		function getHeight(){
			if(settings.height){
				height = maxHeight;
			} else {
				height = maxHeight && maxHeight < Jloaded.height() ? maxHeight : Jloaded.height();
			}
			return height;
		}
		
		Jloaded.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(Jcontent);
		
		
		// Hides 'select' form elements in IE6 because they would otherwise sit on top of the overlay.
		if (J.browser.msie && J.browser.version < 7) {
			J('select:not(#colorbox select)').filter(function(){
				return J(this).css('visibility') !== 'hidden';
			}).css({'visibility':'hidden'}).one(cbox_close, function(){
				J(this).css({'visibility':'inherit'});
			});
		}
		
		photo = J('#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;
			
			position(mWidth, mHeight, s, function(){
				if (!open) { return; }
				
				if (J.browser.msie) {
					//This fadeIn helps the bicubic resampling to kick-in.
					if( photo ){Jloaded.fadeIn(100);}
					//IE adds a filter when ColorBox fades in and out that can cause problems if the loaded content contains transparent pngs.
					Jcbox.css('filter','');
				}
				
				Jcontent.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.
				J('#cboxIframeTemp').after("<iframe id='cboxIframe' name='iframe_"+new Date().getTime()+"' frameborder=0 src='"+(settings.href || element.href)+"' />").remove();
				
				JloadingOverlay.hide();
				JloadingGraphic.hide();
				Jslideshow.hide();
				
				if (Jrelated.length>1) {
					Jcurrent.html(settings.current.replace(/\{current\}/, index+1).replace(/\{total\}/, Jrelated.length));
					Jnext.html(settings.next);
					Jprev.html(settings.previous);
					
					J().unbind('keydown', cbox_key).bind('keydown', cbox_key);
					
					if(settings.slideshow){
						Jslideshow.show();
					}
				} else {
					Jcurrent.hide();
					Jnext.hide();
					Jprev.hide();
				}
				
				Jtitle.html(settings.title || element.title);
				
				J.event.trigger(cbox_complete);
				
				if (callback) {
					callback.call(element);
				}
				
				if (settings.transition === 'fade'){
					Jcbox.fadeTo(speed, 1, function(){
						if(J.browser.msie){Jcontent.css('filter','');}
					});
				}
				
				Jwindow.bind('resize.cbox_resize', function(){
					position(mWidth, mHeight, 0);
				});
			});
		}
		if (settings.transition === 'fade') {
			Jcbox.fadeTo(speed, 0, function(){setPosition(0);});
		} else {
			setPosition(speed);
		}
		
		// Preloads images within a rel group
		if (settings.preloading && Jrelated.length>1) {
			prev = index > 0 ? Jrelated[index-1] : Jrelated[Jrelated.length-1];
			next = index < Jrelated.length-1 ? Jrelated[index+1] : Jrelated[0];
			nextSrc = J(next).data(colorbox).href || next.href;
			prevSrc = J(prev).data(colorbox).href || prev.href;
			
			if(isImage(nextSrc)){
				J('<img />').attr('src', nextSrc);
			}
			if(isImage(prevSrc)){
				J('<img />').attr('src', prevSrc);
			}
		}
	};

	load = function () {
		var height, width, href, loadingElement;

		element = Jrelated[index];
		
		settings = J(element).data(colorbox);
		
		//convert functions to static values
		process();

		J.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;
		
		JloadingOverlay.show();
		JloadingGraphic.show();
		Jclose.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) {
			J('<div id="cboxInlineTemp" />').hide().insertBefore(J(href)[0]).bind(cbox_load+' '+cbox_close, function(){
				Jloaded.children().insertBefore(this);
				J(this).remove();
			});
			dimensions(J(href).wrapAll('<div/>').parent());
		} else if (settings.iframe) {
			dimensions(
				J("<div><div id='cboxIframeTemp' /></div>")
			);//timestamp to prevent caching.
		} else if (settings.html) {
			dimensions(
				J('<div/>').html(settings.html)
			);
		} else if (isImage(href)){
			loadingElement = new Image();
			loadingElement.onload = function(){
				loadingElement.onload = null;
				
				if((maxHeight || maxWidth) && settings.resize){
					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();
					}
				}
				dimensions(J("<div />").css({width:this.width, height:this.height}).append(J(this).css({width:this.width, height:this.height, display:"block", margin:"auto", border:0}).attr('id', 'cboxPhoto')));
				if(Jrelated.length > 1){
					J(this).css({cursor:'pointer'}).click(next);
				}
				if(J.browser.msie && J.browser.version == 7){
					this.style.msInterpolationMode='bicubic';
				}
			};
			loadingElement.src = href;
		} else {
			J('<div />').load(href, function(data, textStatus){
				if(textStatus === "success"){
					dimensions(J(this));
				} else {
					dimensions(J("<p>Request unsuccessful.</p>"));
				}
			});
		}	
	};

	//navigates to the next page/image in a set.
	next = function () {
		index = index < Jrelated.length-1 ? index+1 : 0;
		load();
	};
	
	prev = function () {
		index = index > 0 ? index-1 : Jrelated.length-1;
		load();
	};

	slideshow = function () {
		var stop, timeOut, className = 'cboxSlideshow_';
		
		Jslideshow.bind(cbox_close, function(){
			clearTimeout(timeOut);
			Jslideshow.unbind();
		});
		
		function start(){
			Jslideshow
			.text(settings.slideshowStop)
			.bind(cbox_complete, function(){
				timeOut = setTimeout(next, settings.slideshowSpeed);
			})
			.bind(cbox_load, function(){
				clearTimeout(timeOut);	
			}).one("click", function(){
				stop();
				J(this).removeClass(hover);
			});
			Jcbox.removeClass(className+"off").addClass(className+"on");
		}
		
		stop = function(){
			clearTimeout(timeOut);
			Jslideshow
			.text(settings.slideshowStart)
			.unbind(cbox_complete+' '+cbox_load)
			.one("click", function(){
				start();
				timeOut = setTimeout(next, settings.slideshowSpeed);
				J(this).removeClass(hover);
			});
			Jcbox.removeClass(className+"on").addClass(className+"off");
		};
		
		if(settings.slideshow && Jrelated.length>1){
			if(settings.slideshowAuto){
				start();
			} else {
				stop();
			}
		}
	};

	//public function for closing colorbox.  To use this within an iframe use the following format: parent.J.fn.colorbox.close();
	close = function () {
		J.event.trigger(cbox_close);
		open = false;
		J().unbind('keydown', cbox_key).unbind("keydown.cbox_close");
		Jwindow.unbind('resize.cbox_resize resize.cboxie6 scroll.cboxie6');
		Joverlay.css({cursor:'auto'}).fadeOut('fast');
		
		Jcontent.children().hide();
		
		Jcbox
		.stop(true, false)
		.removeClass()
		.fadeOut('fast', function(){
			Jloaded.remove();
			Jcbox.css({'opacity':1});
			J.event.trigger(cbox_closed);
		});
		
	};

	// Create Public Methods
	publicMethod = J.fn.colorbox;
	publicMethod.init = init;
	publicMethod.next = next;
	publicMethod.prev = prev;
	publicMethod.close = close;
	publicMethod.load = load;
	publicMethod.position = position;
	publicMethod.dimensions = dimensions;
	publicMethod.element = function(){ return element; };
	publicMethod.settings = defaults;

	// Initializes ColorBox when the DOM has loaded
	J(function () {
		init();
	});

}(jQuery));

