$.fn.galleryShow = function(){
	var isIE6 = ($.browser.msie && $.browser.version < 7);
	if ($("div.overlay").length < 1) {
		var $overlay;
		
		if (isIE6) {
			$overlay = $("<iframe class='overlayIFrame'></iframe><div class='overlay'></div>").appendTo('body');
		}
		else {
			$overlay = $('<div class="overlay"></div>').appendTo('body');
		}

		$overlay.click(function(){
			$modal.galleryHide();
		});
		
	}
	var $modal=$("<div id='galleryModal'></div>").appendTo('body');
	$("<div class='galleryModalHdr'></div>").prependTo($modal);
	var $modalBody = $("<div class='galleryModalBody'></div>").appendTo($modal);
	$("<span class='modalClose'><a href='#' title='Close'>Close</a></span>").prependTo($modalBody);
	$("<div class='galleryModalFtr'></div>").appendTo($modal);
	$modal.find('span.modalClose a').click(function(){
		$modal.galleryHide();
	});
	var $galleryClone = $(this).clone().appendTo($modalBody);
	$("div.overlay, div#galleryModal").show();
	$galleryClone.gallery();
	$modal.galleryPosition();
	return $modal;
}

$.fn.galleryPosition = function(){
	var modH=this.height();
	var modTop=( $(window).height() - this.height() ) / 2 + $(window).scrollTop();
	var modShift=( $(window).width() - this.outerWidth() ) / 2;
	modTop = modTop < 0 ? 0 : modTop;
	this.css({top:modTop+"px",left:modShift+"px",marginLeft:0});
	return this;
}

$.fn.galleryHide = function(){
	$("div.overlay, iframe.overlayIFrame, div#galleryModal").remove();
}
// end Base modal functions

$.fn.gallery = function(options,styling) {	
	// Default options
	var opt = $.extend({
		speed: 900,
		minHeight: 600,
		minWidth: 600
	},options);
	return this.each(function(x){
		
		var currGallery = x;
		var speed = opt.speed;
		var imgData = [];
		var currIndex = 0;
		
		var $gallery = $(this);
		var $imgs= $gallery.find("img");
		
		var $galleryWrap = $("<div class='galleryWrap'></div>").insertBefore($gallery);
		var $imgWrap = $("<div class='imgWrap'/>").prependTo($galleryWrap);
		var $imgClone = $("<img style='display:none;' />").prependTo($imgWrap);
		var $galleryDesc = $("<div class='galleryDesc'/>").appendTo($galleryWrap);
		var $galleryNav = $("<ul class='galleryNav'/>").appendTo($galleryWrap);
		var $galleryTitle = $("<div class='galleryTitle'/>").prependTo($galleryWrap);
		/*
		var $prevLink = $("<a href='#' class='prevLink' title='previous'><span>&laquo; Prev</span></a>").appendTo($imgWrap);
		var $nextLink = $("<a href='#' class='nextLink' title='next'><span>Next &raquo;</span></a>").appendTo($imgWrap);
		*/
		var $prevLink = $("<a href='#' class='prevLink' title='previous'><span>&laquo; Prev</span></a>").insertBefore($galleryNav);
		var $nextLink = $("<a href='#' class='nextLink' title='next'><span>Next &raquo;</span></a>").insertAfter($galleryNav);

		if ($imgs.length == 1) {
			$galleryNav.hide();
			$prevLink.hide();
			$nextLink.hide();
		}
		//var $loading = $("<div class='galleryLoading'>Loading...</div>").appendTo($imgWrap);
		
		$imgs.each(function(i){
			imgData[i] = {
				src : $(this).attr('src'),
				alt : $(this).attr('alt'),
				desc : $(this).attr('longdesc'),
				width : $(this).width(),
				height : $(this).height()
			}
				
			opt.minHeight = (imgData[i].height < opt.minHeight) ? imgData[i].height : opt.minHeight;
		});
		//$gallery.css({display:"none"});
		opt.minHeight = opt.minHeight + $galleryNav.outerHeight();
		$galleryWrap.css({minHeight:opt.minHeight + "px"});
		
		start();

		function start(){
			
			/*create nav*/
			$imgs.each(function(i){
				var $li = $("<li class='galleryLink'></li>").appendTo($galleryNav);
				$("<a/>").appendTo($li)
				.text(i+1)
				.attr("href", "#gallery"+currGallery+"_img"+i) 
				.click(function(){
					changeImage(i);
				});				
			})
			
			$imgClone.click(function(){
				nextImage();
			});
			$nextLink.click(function(){
				nextImage();
			});
			$prevLink.click(function(){
				prevImage();
			});
			
			$imgWrap.css({width:imgData[0].width,height:imgData[0].height});
			changeImage(0);

			function changeImage(n, callback){
				
				$galleryNav.find("li").removeClass("curr");
				$galleryNav.find("li").eq(n).addClass("curr");
				
				var currImg = imgData[currIndex];
				var newImg = imgData[n];
				
				$galleryDesc.fadeOut(speed / 5);
				$galleryTitle.fadeOut(speed / 5);
				$imgClone.fadeOut(speed / 4, function(){
					//$loading.css({display:"block"});
					$imgClone.attr('src', newImg.src)
						.load(function(){
							//$loading.css({display:"none"});
						})
						.attr('alt', newImg.alt)
						.css({height:newImg.height,width:newImg.width});
					if ((newImg.width == currImg.width) && (newImg.height == currImg.height)) { 
						transitionIn(); 
					} else {
						resizeWrap();
					}
					
					function resizeWrap(){
						$imgWrap.animate({
							width: newImg.width,
							height: newImg.height
						}, speed / 3, function(){
							transitionIn(true)
						})
					}
					function transitionIn(afterResize){
						var localSpeed = speed;
						if (!afterResize) 
							localSpeed = speed / 2;
						$galleryTitle.html('<h2>' + newImg.alt + '</h2>');
						$galleryDesc.html('<p>' + newImg.desc + '</p>');
						if (typeof newImg.desc=="undefined") {
							$galleryDesc.hide();
						}
						else if (newImg.desc!="") {
							$galleryDesc.fadeIn();
						}
						/*
						if (typeof newImg.alt=="undefined") {
							$galleryTitle.hide();
						}
						else if (newImg.alt!="") {
							$galleryTitle.fadeIn();
						}*/
						$galleryTitle.fadeIn();

						$imgClone.fadeIn(localSpeed / 2);
						
						if (callback) callback();
						if (styling) styling();
					}
				})
				
				currIndex = n;
				$nextLink.removeClass("disabled").attr("href", "#gallery"+currGallery+"_img"+(currIndex+1));
				$prevLink.removeClass("disabled").attr("href", "#gallery"+currGallery+"_img"+(currIndex-1));;
				
				if (currIndex == ($imgs.length - 1)) {
					$nextLink.addClass("disabled").attr("href", "#gallery"+currGallery+"_img"+currIndex);
				}
				
				if (currIndex == (0)) {
					$prevLink.addClass("disabled").attr("href", "#gallery"+currGallery+"_img0");
				}
			}
			
			function nextImage(){
				if (currIndex < $imgs.length - 1) {
					changeImage(currIndex + 1);
				}
			}
			
			function prevImage(){
				if (currIndex > 0) {
					changeImage(currIndex - 1);
				}
			}
			
			function styling (){
				/*
				var linkHeight = $prevLink.outerHeight();
				$imgWrap.css({height:$imgClone.height()+linkHeight+"px"});
				
				var currHeight = $imgWrap.outerHeight();
				var currWidth = $imgWrap.outerWidth();
				
				var prevOffset = $prevLink.width() + parseInt($prevLink.css("margin-right"));
				
				var nextOffset = $nextLink.width() + parseInt($nextLink.css("margin-left"));
				
				$prevLink.css({height:currHeight, left:prevOffset * -1 + "px"});
				$nextLink.css({height:currHeight, right:nextOffset * -1 + "px"});
				$galleryWrap.css({width:currWidth});
				*/
			}
		}
	});
}

$(document).ready(function(){
	$("a.showGallery").click(function(){
		var galleryID = $(this).attr("href");
		$(galleryID).galleryShow();
		return false;
	});
});