jQuery.fn.pbgallery = function(options){
    return this.each(function(){
        var gallery = $(this),
			preview,
			block = createBlock(),
			popup = createPopup(),
			imgGroup = [],
			activeImg = 0,
            defaults = {
				loadarea:$('div',this),
				thumbs:$('a',this),
				folderThumb:'thmb',
				folderPreview:'prev',
				folderFull:'full'
            };

		options = $.extend(defaults,options);

		preview = $('img',options.loadarea);

		function ImgObj(img,index){
			var that = this;
			this.index = index;
			this.thmb = img;
			this.prev;
			this.full;

			this.thmb.bind('mouseover',function(){
				if(!that.imgs){
					var imgs = preload($(this).attr('src'));
					that.prev = imgs[0];
					that.full = imgs[1];
				}
				options.loadarea.empty().append(that.prev);
				return false;
			});

			this.thmb.bind('click',function(){
				showPopup(that);
				activeImg = that.index;
				return false;
			});
		}

		options.thumbs.each(function(i){
			imgGroup.push(new ImgObj($('img',this),i));
		});

		function generatePath(imgSrc,targetFolder){
			return imgSrc.replace(/\/thmb\/|\/prev\/|\/full\//gi,'/' + targetFolder + '/');
		}

		function preload(currentSrc){
			var paths = [generatePath(currentSrc,'prev'),generatePath(currentSrc,'full')],
				img,
				imgs = [];

			for(i=0;i<paths.length;i++){
				img = new Image();
				img.src = paths[i];
				imgs.push(img);
			}

			return imgs;
		}

		function createBlock(){
			var bl = $('<div class="whiteOut"></div>');
			bl.hide().appendTo($('body')).css({height:$('body').height(),width:'100%'});
			return bl;
		}

		function coverScreen(){
			if(block.is(':hidden')){
				block.fadeTo('fast','.7');
			}
		}

		function createPopup(){
			var pop = $('<div id="popup"></div>'),
				imgDiv = $('<div class="imageContainer"></div>'),
				closeBtn = $('<a class="closeButton" href="#"><img src="http://assets.portlandbolt.com/images/close_button.jpg" alt="Close"></a>'),
				printBtn = $('<a class="printButton" href="#"><img src="http://assets.portlandbolt.com/images/printer.png" alt="Print"></a>');

			pop.append(imgDiv);
			pop.append(printBtn);
			pop.append(closeBtn);

			pop.hide().appendTo($('body'));

			closeBtn.click(hidePopup);
			printBtn.click(printImg);
			imgDiv.click(rotatePopup);

			return pop;
		}

		function rotatePopup(){
			var next = (activeImg >= imgGroup.length - 1) ? imgGroup[0] : imgGroup[activeImg + 1];
			if(!next.full){
				var imgs = preload(next.thmb.attr('src'));
				next.prev = imgs[0];
				next.full = imgs[1];
			}
			showPopup(next);
			return false;
		}

		function showPopup(imgObj){
			var css = {},
				timer;
			coverScreen();
			if(imgObj.full.complete){
				$('.imageContainer',popup).empty().append(imgObj.full).append($('<img class="next" src="/image/misc/next.gif" alt="Next">'));
				if(timer){
					clearTimeout(timer);
				}
			}else{
				timer = setTimeout(function(){
					showPopup(imgObj);
				},250);
			}
			activeImg = imgObj.index;
			css.width = (imgObj.full.width > 0) ? imgObj.full.width + 2 + 'px' : 'auto';
			popup.css(css);
			css = {
				marginLeft:popup.outerWidth() / -2 + 'px',
				marginTop:popup.outerHeight() / -2 + 'px'
			}
			popup.css(css).show();
			return false;
		}

		function hidePopup(){
			popup.hide();
			block.fadeOut('fast');
			return false;
		}

		function printImg(){
			var img = imgGroup[activeImg].full.src.replace(/(.+\/)/,'');
			win = window.open('http://new.portlandbolt.com/image/products/full/printpage.php?img='+img);
			return false;
		}
    });
};
