/*
Version 0.95
*/
(function($){
	var ID=0;
	var settings;
	var images={};
	var captions={};
	var total_images_loaded={};
	var total_images_loading={};
	var loading_intervals={};
	var at_image={};
	var at_thumb={};
	var has_thumbs={};
	var has_captions={};
	var has_large_images={};
	var thumb_width={};
	var visible_thumbs={};
	var thumb_container_widths={};
	var sizes={};
	var display_image_width={};
	var display_image_height={};
	var caption_selector_height={};
	var caption_selector_width={};
	var use_counter={};
	var swap_directions={};
	var transitions=['SLIDE','FADE'];
	var transition={};
	var transition_speed={};
	var action_functions={};
	var lightbox_opacity={};
	var auto_page={};
	var keep_state={};
	//see  defaults at bottom for options
	$.fn.slideProjector = function(options){
		settings = $.extend({}, $.fn.slideProjector.defaults, options);
		var curr_id=$(this).data('uniq',ID++);
		if(typeof curr_id === 'object'){
			curr_id=$(this).data('uniq');
		}
		if(settings.preload_images){
			$(this).addClass('loading');
		}
		if(settings.auto_page !== false && parseInt(settings.auto_page)>0){
			var ap_time = parseInt(settings.auto_page)*1000;
			auto_page[curr_id]={ap_time:ap_time,clickstop:settings.stop_auto_page_on_click,interval:false};
		}

		keep_state[curr_id] = settings.keep_state;


		if(typeof settings.action_function !== 'function'){
			settings.action_function=function(){};
		}
		if(transitions.join(' ').indexOf(settings.transition)==-1){
			settings.transition=transitions[0];
		}
		lightbox_opacity[curr_id]=settings.lightbox_opacity;
		if(lightbox_opacity[curr_id]<0 || lightbox_opacity[curr_id]>1){
			lightbox_opacity[curr_id]=.5;
		}
		action_functions[curr_id]=settings.action_function;
		total_images_loaded[curr_id]=0;
		total_images_loading[curr_id]=0;
		at_image[curr_id]=0;
		at_thumb[curr_id]=0;
		transition_speed[curr_id]=settings.transition_speed;
		transition[curr_id]=settings.transition;
		swap_directions[curr_id]=settings.swap_directions;
		if($(this).length && $(settings.image_data_selector,this).is('ul')){
			$(this).addClass(settings.gallery_parent_class);
			$(this).addClass('sPgID_'+curr_id);
			images[curr_id]=[];
			captions[curr_id]=[];
			has_thumbs[curr_id]=false;
			has_captions[curr_id]=false;
			has_large_images[curr_id]=false;
			$(settings.image_data_selector+' > li',this).each(function(){
				var curr_image=false;
				var title=$(settings.image_title_selector,this).html();
				var title_attr=$.trim($(settings.image_title_selector,this).text());
				var details=$('div.details',this).html();
				var sizes=['thumb','main','enlarged','original'];
				$('ul.images > li',this).each(function(){
					var img=[];
					var i=$('img',this);
					img.width=$(i).attr('width'); //for some reason the first call to attr(width) in webkit returns zero
					if(img.width==0 || isNaN(img.width)){ 
						img.width=$(i).attr('width');
					}
					img.height=$(i).attr('height');
					img.alt=$(i).attr('alt');
					img.title=$(i).attr('title');
					if(img.title==''){
						img.title=title_attr;
					}
					img.src=$(i).attr('src');
					
					for(var j=0;j<sizes.length;j++){
						if($(this).hasClass(sizes[j])){
							if(sizes[j]=='thumb'){
								has_thumbs[curr_id]=true;
							}
							if(sizes[j]=='enlarged'){
								has_large_images[curr_id]=true;
							}
							if(curr_image===false){curr_image=[];}
							curr_image[sizes[j]]=img;
						}
					}
				});
				if(curr_image){
					images[curr_id].push(curr_image);
					captions[curr_id].push(details);
					if(details.length){
						has_captions[curr_id]=true;
					}
				}
			});
		}
		else{
			return;
		}
		if(document.location.hash){
			var h=document.location.hash.replace(/\D/,'');
			if(h.length){
				h=parseInt(h);
				h--;
				if(h<images[curr_id].length && h>0){
					at_image[curr_id]=h;
				}
			}
		}
		
		$.fn.slideProjector.setupHTML(this,curr_id);
		if(has_large_images[curr_id]==false){
			$($.fn.slideProjector.getSelector(curr_id,'.enlarge')).css({display:'none'});
		}
		if(has_thumbs[curr_id]==false){
			$($.fn.slideProjector.getSelector(curr_id,'.thumb_block')).css({display:'none'});
			$($.fn.slideProjector.getSelector(curr_id,'.thumb_navigation')).css({display:'none'});
		}
		if(images[curr_id].length<=1){
			var gp = $.fn.slideProjector.getSelector(curr_id,'.go_previous');
			var gn = $.fn.slideProjector.getSelector(curr_id,'.go_next');
			$(gp+','+gn).addClass('inactive');
		}
		//setting css values
		$('.thumb_block',this).css({position:'relative',overflow:'hidden'});
		$('.thumb_slide',this).css({position:'absolute'});
		$('.images',this).css({overflow:'hidden',position:'relative'});
		var iw=parseInt($('.images',this).css('width'));
		var ih=parseInt($('.images',this).css('height'));
		if(iw==0 ||ih ==0 || isNaN(iw) || isNaN(ih)){
			$('.images',this).css({width:settings.default_width,height:settings.default_image_height});
		}
		//propogating width and height of the image display div to the three images in the display
		display_image_width[curr_id]=parseInt($('.images',this).css('width'));
		display_image_height[curr_id]=parseInt($('.images',this).css('height'));

		$('.current_image, .next_image',this).css({width:display_image_width[curr_id],height:display_image_height[curr_id],position:'absolute'});
		
		
		//displaying current, previous and next images
		$.fn.slideProjector.displayImage(curr_id,at_image[curr_id],'.current_image');
		// $.fn.slideProjector.displayImage(curr_id,$.fn.slideProjector.getPrevious(curr_id,at_image[curr_id]),'.previous_image');
		// $.fn.slideProjector.displayImage(curr_id,$.fn.slideProjector.getNext(curr_id,at_image[curr_id]),'.next_image');
		
		//setting 
		// $('.previous_image, .next_image',this).css({display:'none'});
		
		if(settings.use_counter){
			use_counter[curr_id]=settings.counter_format; //store counter format in use counter because it evaluates to true
			$.fn.slideProjector.displayCounter(curr_id,at_image[curr_id]);
		}
		else{
			use_counter[curr_id]=false;
		}
		$.fn.slideProjector.setupImages(curr_id);
		$.fn.slideProjector.setupThumbs(curr_id);
		$.fn.slideProjector.setupCaptions(curr_id);
		$.fn.slideProjector.bindActions(curr_id);
		if(at_image[curr_id]>0){
			$.fn.slideProjector.goSlideThumbs(curr_id,at_image[curr_id]);
		}
		if(settings.preload_images){
			if(total_images_loaded[curr_id]!=total_images_loading[curr_id]){
				var self=this;
				loading_intervals[curr_id]=setInterval(function(){$.fn.slideProjector._checkLoading(self,curr_id)},500);
			}
			else{
				$(this).removeClass('loading');
				$.fn.slideProjector._setupAutoPager(curr_id);
			}
		}
		else{
			$.fn.slideProjector._setupAutoPager(curr_id);
		}

		
	};
	$.fn.slideProjector._setupAutoPager = function(curr_id){
		if(auto_page[curr_id] !== undefined){
			var s = auto_page[curr_id];
			auto_page[curr_id].interval = setInterval(function(){$.fn.slideProjector.goNext(curr_id)},s.ap_time);
		}
	};
	$.fn.slideProjector._clickStop = function(curr_id){
		if(auto_page[curr_id] !== undefined){
			clearInterval(auto_page[curr_id].interval);
		}
	};
	$.fn.slideProjector.displayCounter = function(curr_id){
		image_num=(arguments[1]!==undefined?arguments[1]:at_image[curr_id]);
		if(use_counter[curr_id]){
			var t=use_counter[curr_id];
			t=t.replace(/\$\$AT/g,(image_num+1));
			t=t.replace(/\$\$TOTAL/,images[curr_id].length);
			$($.fn.slideProjector.getSelector(curr_id,'.counter')).html(t);
		}

	};
	$.fn.slideProjector.changeHash = function(curr_id){
		if(keep_state[curr_id]){
			image_num=(arguments[1]!==undefined?arguments[1]:at_image[curr_id]);
			document.location.hash=image_num+1;
		}


	};
	$.fn.slideProjector.unbindActions = function(curr_id){
		var gp = $.fn.slideProjector.getSelector(curr_id,'.go_previous');
		var gn = $.fn.slideProjector.getSelector(curr_id,'.go_next');
		var tgp = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_previous');
		var tgn = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_next');
		var es = $.fn.slideProjector.getSelector(curr_id,'.enlarge');
		var eis = $.fn.slideProjector.getSelector(curr_id,'.current_image a.enlarge_link');
		$(gp).unbind('click');
		$(gn).unbind('click');
		$(gp).unbind('mouseover');
		$(gn).unbind('mouseover');
		if(has_thumbs[curr_id]){
			$(tgp).unbind('click');
			$(tgn).unbind('click');
			$(tgp).unbind('mouseover');
			$(tgn).unbind('mouseover');
			$($.fn.slideProjector.getSelector(curr_id,'.thumbs img')).unbind('click');
			$($.fn.slideProjector.getSelector(curr_id,'.thumbs img')).unbind('mouseover');
			$(tgp+' a , '+tgn+' a').addClass('disabled');
		}
		if(has_large_images[curr_id]){
			$(es).unbind('click');
			$(eis).unbind('click');
			$(es).unbind('mouseover');
			$(eis).unbind('mouseover');
			
			$(es+' a , '+eis).addClass('disabled');
			
		}
		$(gp+' a , '+gn+' a').addClass('disabled');
	};
	//this changes the cursor to a pointer when you hover over any of the clickable items
	$.fn.slideProjector._actionItemHover = function(selector){
		$(selector).bind('mouseover',function(e){
			$(e.target).css({cursor:'pointer'});
		});
	}
	
	$.fn.slideProjector.actionWrapper = function(e,func,curr_id){
		e.preventDefault();
		action_functions[curr_id]();
		func(curr_id);
		$.fn.slideProjector._clickStop(curr_id);
	}
	
	
	$.fn.slideProjector.bindActions = function(curr_id){
		var gp = $.fn.slideProjector.getSelector(curr_id,'.go_previous');
		var gn = $.fn.slideProjector.getSelector(curr_id,'.go_next');
		var tgp = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_previous');
		var tgn = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_next');
		var es = $.fn.slideProjector.getSelector(curr_id,'.enlarge');
		var is = $.fn.slideProjector.getSelector(curr_id,'.current_image img');
		
		$(gp).bind('click',function(e){$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.goPrevious(id)},curr_id);});

		$(gn).bind('click',function(e){$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.goNext(id)},curr_id);});
		if(has_thumbs[curr_id]){
			
			$(tgp).bind('click',function(e){$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.goSlideThumbs(id,'left');},curr_id);});
			$(tgn).bind('click',function(e){$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.goSlideThumbs(id,'right');},curr_id);});

		}
		if(has_large_images[curr_id]){
			$(es).bind('click',function(e){e.preventDefault();$.fn.slideProjector.enlarge(curr_id);});
			$(is).wrap('<a class="enlarge_link" ></a>');
			$.fn.slideProjector._actionItemHover($.fn.slideProjector.getSelector(curr_id,'.current_image a.enlarge_link'));
			var img_enlarge_selector=$.fn.slideProjector.getSelector(curr_id,'.images .current_image .enlarge_link');
			$(img_enlarge_selector).css({width:parseInt($(is).css('width')),height:parseInt($(is).css('height')),zIndex:100});
			$(img_enlarge_selector).bind('click',function(e){$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.enlarge(id)},curr_id)});
			
		}
		$(gp+' a , '+gn+' a , '+tgp+' a , '+tgn+' a , '+es+' a').removeClass('disabled');
		var i=0;
		var ts=$.fn.slideProjector.getSelector(curr_id,'.thumbs img');
		$(ts).each(function(){
			$(this).bind('click',(function(ii){
				return function(e){
					$.fn.slideProjector.actionWrapper(e,function(id){$.fn.slideProjector.goPicture(id,ii)},curr_id);
				};
			})(i));
			$(this).attr('id','thumb_'+i);
			i++;
		});

		// if($.browser.msie){ //add hrefs to all the links we bind so it properly does the hover
		// 	var selectors=[gp,gn,tgp,tgn,es];
		// 	for(i=0;i<selectors.length;i++){
		// 		if(selectors[i]!==false){
		// 			$(selectors[i]).attr('href','javascript:;');
		// 		}
		// 	}
		// }

	};
	$.fn.slideProjector.enlarge = function(curr_id){
		if($('#sPg_lightbox').length){ //don't allow more than one enlargement
			return;
		}
		$('body').append('<div id="sPg_lightbox"></div><div id="sPg_enlarged"><div id="sPg_enlarged_image"></div><div id="sPg_enlarged_caption" /></div>');
		var at=at_image[curr_id];
		var ww=$(window).width();
		var wh=$(window).height();
		var w=images[curr_id][at].enlarged.width;
		var h=images[curr_id][at].enlarged.height;
		var end_opacity=lightbox_opacity[curr_id];
		$('div#sPg_lightbox').css({width:ww,height:wh,'top':-10000,zIndex:99999});

		// if(has_captions[curr_id]){
		// 	$('div#sPg_enlarged_caption').html($.fn.slideProjector._getCaption(curr_id,at,'enlarged'));
		// }

		$('div#sPg_enlarged').css({'display':'block','top':-10000,zIndex:99999});
		$.fn.slideProjector.displayImage(curr_id,at_image[curr_id],'div#sPg_enlarged_image',true);
		$('div#sPg_enlarged_image').css({'display':'block','width':w});
		if(has_captions[curr_id]){
			$('div#sPg_enlarged_caption').css('display','block');
		}
		var ew=parseInt($('div#sPg_enlarged img').css('width'));
		var eh=parseInt($('div#sPg_enlarged img').css('height'));
		
		var lightbox_top=0;
		var enlarged_left=Math.ceil((ww-ew)/2);
		var enlarged_top=Math.ceil((wh-eh)/2);
		if(!($.browser.msie && parseInt($.browser.version)<=6)){
			$('div#sPg_lightbox, div#sPg_enlarged').css({'position':'fixed'});
		}
		else{
			$('div#sPg_lightbox, div#sPg_enlarged').css({'position':'absolute'});
			var offset=$.fn.slideProjector._getWindowOffset();
			lightbox_top+=offset;
			enlarged_top+=offset;
		}
		if($('div#sPg_lightbox').css('background-color')=='' || $('div#sPg_lightbox').css('background-color')=='transparent'){
			$('div#sPg_lightbox').css('background-color',settings.default_lightbox_bg_color);
		}
		$('div#sPg_enlarged').css({'left':enlarged_left});
		var trans=transition[curr_id];
		if(trans=='SLIDE'){

			$('div#sPg_lightbox').css({'top':-wh,'opacity':end_opacity,'display':'block'});
			$('div#sPg_enlarged').css({'top':-(wh-enlarged_top)});
			$('div#sPg_lightbox').animate({'top':lightbox_top},transition_speed[curr_id]);
			$('div#sPg_enlarged').animate({'top':enlarged_top},transition_speed[curr_id]);

		}
		else if(trans=='FADE'){
			$('div#sPg_lightbox').css({'opacity':0,'display':'block'});
			$('div#sPg_lightbox').fadeTo(1,0.01,function(){
				$('div#sPg_lightbox').css({'top':lightbox_top});
				$('div#sPg_lightbox').fadeTo(transition_speed[curr_id],end_opacity);
				});
			$('div#sPg_enlarged img').fadeTo(1,0.01,function(){
				$('div#sPg_enlarged').css({'top':enlarged_top});
				$('div#sPg_enlarged img').fadeTo(transition_speed[curr_id],1);
				});
		
		}

		$('div#sPg_lightbox').wrap('<a href="#" class="sPg_shrink"></a>');
		$('div#sPg_enlarged').wrap('<a href="#" class="sPg_shrink"></a>');
		if($.browser.msie && parseInt($.browser.version)<=6){
			$(window).scroll(function(e){$.fn.slideProjector.moveEnlarge();});
		}
		$('.sPg_shrink').bind('click',function(e){e.preventDefault();$.fn.slideProjector.shrink(curr_id)});
	};
	$.fn.slideProjector.shrink = function(curr_id){
		var trans=transition[curr_id];
		$(window).unbind('scroll');
		if(trans=='SLIDE'){
			var wh=$(window).height();
			var enlarged_top=wh;
			var lb_top=wh;
			enlarged_top+=parseInt($('div#sPg_enlarged').css('top'));
			lb_top+=parseInt($('div#sPg_lightbox').css('top'));	

			$('div#sPg_lightbox').animate({'top':lb_top},transition_speed[curr_id]);
			$('div#sPg_enlarged').animate({'top':enlarged_top},transition_speed[curr_id],function(){
				$.fn.slideProjector._postShrink();
			});		
		}
		else if(trans=='FADE'){
			$('div#sPg_lightbox').fadeOut(transition_speed[curr_id]);
			$('div#sPg_enlarged img').fadeOut(transition_speed[curr_id],function(){
				$.fn.slideProjector._postShrink();
			});
		}

	};
	$.fn.slideProjector._postShrink = function(){
		$('div#sPg_lightbox').remove();
		$('div#sPg_enlarged').remove();
		$('.sPg_shrink').remove();
	}
	$.fn.slideProjector.moveEnlarge = function(){
		var offset=$.fn.slideProjector._getWindowOffset();
		$('div#sPg_lightbox').css('top',offset);
		var eh=$('div#sPg_enlarged img').height();
		var wh=$(window).height();
		$('div#sPg_enlarged').css('top',Math.ceil((wh-eh)/2)+offset);
	};
	$.fn.slideProjector._getWindowOffset = function(){

		var scrOfX = 0;
	 	var scrOfY = 0;
		if (typeof(window.pageYOffset) == 'number') {
			//Netscape compliant
			scrOfY = window.pageYOffset;
			scrOfX = window.pageXOffset;
		} else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
			//DOM compliant
			scrOfY = document.body.scrollTop;
			scrOfX = document.body.scrollLeft;
		} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
			//IE6 standards compliant mode
			scrOfY = document.documentElement.scrollTop;
			scrOfX = document.documentElement.scrollLeft;
		}
		return scrOfY;

	};
	
	
	$.fn.slideProjector.goPicture = function(curr_id,image_num){
		if(image_num!=at_image[curr_id]){
			action_functions[curr_id]();

			var old_at=at_image[curr_id];
			var new_at=image_num;
			$.fn.slideProjector.selectThumb(curr_id,new_at);
			at_image[curr_id]=new_at;

			$.fn.slideProjector.goSlideThumbs(curr_id,new_at);
			switch(transition[curr_id]){
				case 'FADE':
					$.fn.slideProjector.fadeGoPicture(curr_id);
					break;
				default:
					$.fn.slideProjector.slideGoPicture(curr_id);
			}
		}
		$.fn.slideProjector.imageChangeFunctions(curr_id);


	};
	$.fn.slideProjector.slideGoPicture = function(curr_id){
		$.fn.slideProjector.displayImage(curr_id,at_image[curr_id],'.next_image');
		$.fn.slideProjector.slideImage(curr_id,'up');
	};

	$.fn.slideProjector.goPrevious = function(curr_id){
		var old_at=at_image[curr_id];
		var new_at=$.fn.slideProjector.getPrevious(curr_id,old_at);
		
		$.fn.slideProjector.selectThumb(curr_id,new_at)
		$.fn.slideProjector.goSlideThumbs(curr_id,new_at);
		at_image[curr_id]=new_at;

		switch(transition[curr_id]){
			case 'FADE':
				$.fn.slideProjector.fadeImage(curr_id);
				break;
			default:
				$.fn.slideProjector.slideImage(curr_id,'right');
				
		}
		$.fn.slideProjector.imageChangeFunctions(curr_id);
	};
	$.fn.slideProjector.goNext = function(curr_id){
		var old_at=at_image[curr_id];
		var new_at=$.fn.slideProjector.getNext(curr_id,old_at);
		
		$.fn.slideProjector.selectThumb(curr_id,new_at);
		$.fn.slideProjector.goSlideThumbs(curr_id,new_at);
		at_image[curr_id]=new_at;

		switch(transition[curr_id]){
			case 'FADE':
				$.fn.slideProjector.fadeImage(curr_id);
				break;
			default:
				$.fn.slideProjector.slideImage(curr_id,'left');
				
		}
		$.fn.slideProjector.imageChangeFunctions(curr_id);
	};
	$.fn.slideProjector.imageChangeFunctions = function(curr_id){
		$.fn.slideProjector.displayCounter(curr_id);
		$.fn.slideProjector.changeHash(curr_id);
	}
	$.fn.slideProjector.slideImage = function(curr_id,direction){
		var ahead_selector=$.fn.slideProjector.getSelector(curr_id,'.next_image');
		$.fn.slideProjector.displayImage(curr_id,at_image[curr_id],'.next_image');
		
		var from_selector=$.fn.slideProjector.getSelector(curr_id,'.current_image');
		$.fn.slideProjector.slideCaptions(curr_id,direction);
		//this.slide_ratings(direction,at_image);
		var from_selector_animate;
		var ahead_selector_animate;
		if(swap_directions[curr_id]){
			if(direction=='left'){
				direction='right';
			}
			else if(direction=='right'){
				direction='left';
			}
		}
		if(direction=='left'){
			$(ahead_selector).css('left',display_image_width[curr_id]);
			from_selector_animate={'left':-(display_image_width[curr_id]*1.1)};
			ahead_selector_animate={'left':"0"};
		}
		else if(direction=='right'){
			$(ahead_selector).css('left',-display_image_width[curr_id]);
			from_selector_animate={'left':display_image_width[curr_id]*1.1};
			ahead_selector_animate={'left':"0"};			
		}
		else if(direction=='up'){
			$(ahead_selector).css('top',display_image_height[curr_id]);
			from_selector_animate={'top':-display_image_height[curr_id]};
			ahead_selector_animate={'top':0};
		}
		else if(direction=='down'){
			$(ahead_selector).css('bottom',0);
			from_selector_animate={'bottom':display_image_height[curr_id]};
			ahead_selector_animate={'bottom':-display_image_height[curr_id]};
		}
		$(ahead_selector).css("display","block");
		$.fn.slideProjector.unbindActions(curr_id);
		$(from_selector).animate(from_selector_animate,transition_speed[curr_id]);
		$(ahead_selector).animate(ahead_selector_animate,transition_speed[curr_id],'',function(){
			$.fn.slideProjector._postImageAnimate(curr_id,from_selector,ahead_selector);
		});
		
	};
	$.fn.slideProjector._postImageAnimate = function(curr_id,from_selector,ahead_selector){
		$(from_selector).remove();
		$(ahead_selector).addClass('current_image');
		$(ahead_selector).removeClass('next_image');
		$($.fn.slideProjector.getSelector(curr_id,'.images')).append('<div class="next_image"></div>');
		$(ahead_selector).css({width:display_image_width[curr_id],height:display_image_height[curr_id],position:'absolute'});
		$.fn.slideProjector.bindActions(curr_id);
	};
	
	$.fn.slideProjector.fadeGoPicture = function(curr_id){
		$.fn.slideProjector.fadeImage(curr_id);
	};
	
	
	$.fn.slideProjector.fadeImage = function(curr_id){
		$.fn.slideProjector.unbindActions(curr_id);
		$.fn.slideProjector.fadeCaptions(curr_id);
		var ahead_selector=$.fn.slideProjector.getSelector(curr_id,'.next_image');
		
		
		var from_selector=$.fn.slideProjector.getSelector(curr_id,'.current_image');
		var from_selector_fade=$.fn.slideProjector.getSelector(curr_id,'.current_image img');
		
		$(ahead_selector).css({top:0,left:0,display:'block'});
		$.fn.slideProjector.displayImage(curr_id,at_image[curr_id],'.next_image');
		var ahead_selector_fade=$.fn.slideProjector.getSelector(curr_id,'.next_image img');
		
		$(ahead_selector_fade).css({display:'none',zIndex:10});
		$(ahead_selector_fade).fadeIn(transition_speed[curr_id]);
		$(from_selector_fade).fadeOut(transition_speed[curr_id],function(){
			$.fn.slideProjector._postImageAnimate(curr_id,from_selector,ahead_selector);
		});
		
		
	}
	$.fn.slideProjector.slideCaptions =function(curr_id,direction){
		if(has_captions[curr_id]){

			$.fn.slideProjector.displayCaption(curr_id,at_image[curr_id],'.next_caption');
			var ahead_caption_animate;
			var from_caption_animate;
			var ahead_selector=$.fn.slideProjector.getSelector(curr_id,'.next_caption');

			var from_selector=$.fn.slideProjector.getSelector(curr_id,'.current_caption');
			if(swap_directions[curr_id]){
				if(direction=='left'){
					direction='right';
				}
				else if(direction=='right'){
					direction='left';
				}
			}
			$(from_selector).css({position:'absolute'});
			if(direction=='left'){
				$(ahead_selector).css('left',caption_selector_width[curr_id]);
				from_caption_animate={'left':-(caption_selector_width[curr_id]*1.1)};
				ahead_caption_animate={'left':"0"};
			}
			else if(direction=='right'){
				$(ahead_selector).css('left',-caption_selector_width[curr_id]);
				from_caption_animate={'left':caption_selector_width[curr_id]*1.1};
				ahead_caption_animate={'left':"0"};			
			}
			else if(direction=='up'){
				$(ahead_selector).css('top',caption_selector_height[curr_id]);
				from_caption_animate={'top':-caption_selector_height[curr_id]};
				ahead_caption_animate={'top':0};
			}
			else if(direction=='down'){
				$(ahead_selector).css('bottom',0);
				from_caption_animate={'bottom':caption_selector_height[curr_id]};
				ahead_caption_animate={'bottom':-caption_selector_height[curr_id]};
			}
			$(ahead_selector).css("display","block");

			$(from_selector).animate(from_caption_animate,transition_speed[curr_id],function(){

			});

			$(ahead_selector).animate(ahead_caption_animate,transition_speed[curr_id],'',function(){
				$.fn.slideProjector.postCaptionAnimate(curr_id,from_selector,ahead_selector);
			});

		}
	};
	$.fn.slideProjector.fadeCaptions =function(curr_id){
		if(has_captions[curr_id]){
			$.fn.slideProjector.displayCaption(curr_id,at_image[curr_id],'.next_caption');
			var ahead_selector=$.fn.slideProjector.getSelector(curr_id,'.next_caption');
			var from_selector=$.fn.slideProjector.getSelector(curr_id,'.current_caption');

			$(ahead_selector).fadeIn(transition_speed[curr_id]);
			$(from_selector).fadeOut(transition_speed[curr_id],function(){
				$.fn.slideProjector.postCaptionAnimate(curr_id,from_selector,ahead_selector);
				$(ahead_selector).css({display:'none'});
			});
		}
	};
	$.fn.slideProjector.postCaptionAnimate = function(curr_id,from_selector,ahead_selector){
		$(from_selector).remove();
		$(ahead_selector).addClass('current_caption');
		$(ahead_selector).removeClass('next_caption');
		$($.fn.slideProjector.getSelector(curr_id,'.caption')).append('<div class="next_caption"></div>');
		$(ahead_selector).css({width:'100%',height:'100%',position:'absolute'});
	}
	$.fn.slideProjector.goSlideThumbs = function(curr_id,where){
		if(has_thumbs[curr_id]){
			var go_thumb;
			var tbs=$.fn.slideProjector.getSelector(curr_id,'.thumb_block');
			var width=$(tbs).innerWidth();
			var total_images=images[curr_id].length;
			if(visible_thumbs[curr_id]>=total_images){
				return;
			}
			if(where==='left' || where==='right'){
				if(where==='left'){
					go_thumb=((at_thumb[curr_id]-1)%total_images);
					if(go_thumb<0){
						go_thumb=total_images-(go_thumb+1);
					}

				}
				else{
					go_thumb=((at_thumb[curr_id]+1)%((total_images-visible_thumbs[curr_id])+1));
				}
			}
			else{
				go_thumb=where;
				if(go_thumb>(total_images-visible_thumbs[curr_id])){
					go_thumb=total_images-visible_thumbs[curr_id];
				}
			}
			if(isNaN(go_thumb)){
				return;
			}
			else{
				if(go_thumb>(total_images-visible_thumbs[curr_id]) && go_thumb<=total_images){
					go_thumb=(total_images-visible_thumbs[curr_id]);
				}
				var to_go=go_thumb*thumb_width[curr_id];
				$(tbs+' .thumb_slide').animate({'left':-to_go},transition_speed[curr_id],function(){
					at_thumb[curr_id]=go_thumb;
				});
			}		
		}
	}
	$.fn.slideProjector.getPrevious = function(curr_id,at){
		return at==0?images[curr_id].length-1:at-1;
	};
	$.fn.slideProjector.getNext = function(curr_id,at){
		return (at==images[curr_id].length-1)?0:at+1;	
	};
	$.fn.slideProjector.displayImage = function(){
		var curr_id=arguments[0];
		var image_num=arguments[1];
		var image_selector=$.fn.slideProjector.getSelector(curr_id,arguments[2]);
		
		var enlarged=arguments[3]?arguments[3]:false;
		var i=false
		var w=0;
		var h=0;
		var divw=0;
		var divh=0;
		var img_type='main';
		if(!enlarged){
			w=images[curr_id][image_num]['main']['width'];
			h=images[curr_id][image_num]['main']['height'];
			divh=display_image_height[curr_id];
			divw=display_image_width[curr_id];
		}
		else{
			if(image_selector==false){
				image_selector=arguments[2];
			}
			img_type='enlarged';
			w=images[curr_id][image_num]['enlarged']['width'];
			h=images[curr_id][image_num]['enlarged']['height'];
			divh=$(window).height()*0.9;
			divw=$(window).width()*0.9;
		}
		var ratio=w/h;

		if(w>divw && h>divh){
			if(w-divw > h-divh){
				w=divw;
				h=w*(1/ratio);
			}
			else if(h-divh > w-divw){
				h=divh;
				w=h*(ratio);
			}
			else if(h-divh==w-divw){
				h=divh;
				w=divw;
			}
		}
		else if(w>divw && h<=divh){
			w=divw;
			h=w*(1/ratio);
		}
		else if(w<=divw && h>divh){
			h=divh;
			w=h*(ratio);
		}
		w=Math.floor(w);
		h=Math.floor(h);
		$(image_selector).empty();
		$(image_selector).html($.fn.slideProjector.buildImage(images[curr_id][image_num],img_type,w,h));
		$(image_selector+' img').css({width:w,height:h,position:'absolute'});
		if(!enlarged){
			if(w<divw){
				$(image_selector+' img').css('left',Math.ceil((divw-w)/2));
			}
			if(h<divh){
				$(image_selector+' img').css('top',Math.ceil((divh-h)/2));
			}
			$(image_selector+' img').css('z-index',9);
		}

	};
	$.fn.slideProjector._checkLoading = function(curr,curr_id){
		if(total_images_loaded[curr_id]===total_images_loading[curr_id]){
			$(curr).removeClass('loading');
			clearInterval(loading_intervals[curr_id]);
			$.fn.slideProjector._setupAutoPager(curr_id);
		}
	};
	$.fn.slideProjector._setupImages = function(curr_id,type,selector){
		var imgs=images[curr_id];
		var sel=$.fn.slideProjector.getSelector(curr_id,selector);
		if(sel){
			for(var i=0;i<imgs.length;i++){
				$(sel).append("<li>"+$.fn.slideProjector.buildImage(imgs[i],type)+"</li>");
				total_images_loading[curr_id]++;
				$(sel+' li:eq('+i+') img').bind('load',(function(ci){return function(e){total_images_loaded[ci]++;return false;};})(curr_id));
			}
		}
	};
	$.fn.slideProjector.setupImages = function(curr_id){
		$($.fn.slideProjector.getSelector(curr_id,'ul.slideshow_images')).css({display:'none'});
		$.fn.slideProjector._setupImages(curr_id,'main','ul.slideshow_images');
	};
	$.fn.slideProjector.setupThumbs = function(curr_id){
		if(has_thumbs[curr_id]){
			
			$.fn.slideProjector._setupImages(curr_id,'thumb','ul.thumbs');
			
			$($.fn.slideProjector.getSelector(curr_id,'ul.thumbs')).css({margin:0,padding:0});
			var thumb_selector=$.fn.slideProjector.getSelector(curr_id,'ul.thumbs li');
			$(thumb_selector).css({listStyleType:'none',float:'left'});
			// var width=0;
			
			// thumb_widths[curr_id]=[];
			// thumb_offsets[curr_id]=[];
			var tbs=$.fn.slideProjector.getSelector(curr_id,'div.thumb_block');
			thumb_container_widths[curr_id]=parseInt($(tbs).css('width'));
			var tbh=parseInt($(tbs).css('height'))
			if(thumb_container_widths[curr_id]==0 || isNaN(thumb_container_widths[curr_id])){
				$($.fn.slideProjector.getSelector(curr_id,'div.thumb_block')).css({width:settings.default_width,height:settings.default_thumb_block_height});
				thumb_container_widths[curr_id]=settings.default_width;
			}
			if(tbh==0 || isNaN(tbh)){
				$(tbs).css({height:settings.default_thumb_block_height});
			}
			var max_width=0;
			var max_image_width=0;
			var mp=['margin-right','margin-left','padding-right','padding-left'];
			var i=0;
			$(thumb_selector).each(function(){
				var cw=images[curr_id][i]['thumb'].width;
				if(cw>max_image_width){
					max_image_width=cw;
				}
				//can't use outerWidth because in ff when an item is hidden it has no width
				for(var j=0;j<mp.length;j++){
					if(j==mp.length-1 && mp[j].match(/left/)){
						continue;
					}
					var val=parseInt($(this).css(mp[j]));
					if(!isNaN(val)){cw+=val;}
					val=parseInt($('img',this).css(mp[j]));
					if(!isNaN(val)){cw+=val;}
				}
				if(cw>max_width){
					max_width=cw;
				}
				// thumb_widths[curr_id].push(cw);
				// thumb_offsets[curr_id].push(width);
				// width+=cw;
				i++;
			});

			$(thumb_selector+' img').wrap('<div class="thumb_wrapper"></div>');
			$(thumb_selector+' .thumb_wrapper').css({width:max_image_width,position:'relative'});
			//center any thumbs that are less than the maximum width
			i=0;
			$(thumb_selector+' img').each(function(){
				var w=images[curr_id][i]['thumb'].width;
				if(w<max_image_width){
					var left=Math.round((max_image_width-w)/2);
					$(this).css({position:'relative',left:left});
				}
				i++;
			});
			$.fn.slideProjector._actionItemHover(thumb_selector+' img');
			$(thumb_selector+' img').bind('mouseover',function(e){$(e.target).css({cursor:'pointer'});});
			visible_thumbs[curr_id]=Math.round(thumb_container_widths[curr_id]/max_width);
			thumb_width[curr_id]=max_width;
			if(visible_thumbs[curr_id] >= images[curr_id].length){
				var tgp = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_previous');
				var tgn = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_next');
				$(tgp+','+tgn).addClass('inactive');
			}
			
			$(thumb_selector).css({width:max_width,margin:0,padding:0});
			$($.fn.slideProjector.getSelector(curr_id,'div.thumb_slide')).css({width:max_width*images[curr_id].length});
			$.fn.slideProjector.selectThumb(curr_id,at_image[curr_id]);
		}
	};
	$.fn.slideProjector.setupCaptions = function(curr_id){
		if(has_captions[curr_id]){
			var c_sel=$.fn.slideProjector.getSelector(curr_id,'div.caption');
			$(c_sel).html('<div class="current_caption"></div><div class="next_caption"></div>');
			var cc_sel=$.fn.slideProjector.getSelector(curr_id,'div.caption .current_caption');
			var nc_sel=$.fn.slideProjector.getSelector(curr_id,'div.caption .next_caption');


			
			//using css to get the height, because if it is not set, we set
			//it from the longest string length
			caption_selector_height[curr_id]=parseInt($(c_sel).css('height'));
			caption_selector_width[curr_id]=parseInt($(c_sel).css('width'));
			if(caption_selector_width[curr_id]==0 || isNaN(caption_selector_width[curr_id])){
				$(c_sel).css({width:settings.default_width});
				caption_selector_width[curr_id]=settings.default_width;
			}
			if(caption_selector_height[curr_id]==0 || isNaN(caption_selector_height[curr_id])){
				var longest='';
				caption_selector_height[curr_id]=0;
				var cs_sel='div#sPg_caption_sizer_'+curr_id;
				$('body').append('<div id="sPg_caption_sizer_'+curr_id+'"><div>');
				if($.browser.msie){
					$(cs_sel).css({'display':'none','width':caption_selector_width[curr_id]});
				}
				else{
					$(cs_sel).css({'position':'absolute','width':caption_selector_width[curr_id],'top':-99999}); //font size used to be in here, but, it was broken in ie, now needs to be in CSS
				}

				for(var i=0;i<captions[curr_id].length;i++){
					$(cs_sel).html($.fn.slideProjector._getCaption(curr_id,i,'main')+'<br/>');
					var hh=$(cs_sel).height();
					if(hh>caption_selector_height[curr_id]){caption_selector_height[curr_id]=hh;}
				}

				if(caption_selector_height[curr_id]>1000 || caption_selector_height[curr_id]===0){caption_selector_height[curr_id]=1000;}
				var caption_margin_bottom=parseInt($(c_sel).css('margin-bottom'));
				if(!isNaN(caption_margin_bottom) && caption_margin_bottom!=0){
					caption_selector_height[curr_id]+=caption_margin_bottom;
				}
				
				//need to test to see if this is going to do anything
				// var caption_margin_top=parseInt($(c_sel).css('margin-top'));
				// if(!isNaN(caption_margin_top) && caption_margin_top!=0){
				// 	caption_selector_height[curr_id]+=caption_margin_top;
				// }
				
				
				$(c_sel).css('height',caption_selector_height[curr_id]);
				$(cs_sel).remove();


			}
			else{
				$(c_sel).css({overflow:'hidden'});
			}
			
			$.fn.slideProjector.displayCaption(curr_id,at_image[curr_id],'.current_caption');
			$(nc_sel).css({display:'none'});
			$(cc_sel+', '+nc_sel).css({width:'100%',height:'100%',position:'absolute'});
			$(c_sel).css({display:'block',position:'relative',overflow:'hidden'});
			
			
		}
	};
	$.fn.slideProjector._getCaption = function(curr_id,at,img_type){
		var caption=captions[curr_id][at];
		if(images[curr_id][at][img_type].title!==undefined && img_type!=='enlarged'){
			caption='<'+settings.image_title_selector+'>'+images[curr_id][at][img_type].title+'</'+settings.image_title_selector+'>'+caption;
		}
		return caption
	};
	$.fn.slideProjector.displayCaption = function(curr_id,at,selector){
		var img_type=arguments[3]!==undefined?arguments[3]:'main';
		var sel=$.fn.slideProjector.getSelector(curr_id,selector);
		if(sel){

			$(sel).html($.fn.slideProjector._getCaption(curr_id,at,img_type));
		}
	};
	$.fn.slideProjector.selectThumb = function(curr_id,at){
		$($.fn.slideProjector.getSelector(curr_id,'ul.thumbs li')).removeClass('selected');
		$($.fn.slideProjector.getSelector(curr_id,'ul.thumbs li:eq('+at+')')).addClass('selected');
	};
	$.fn.slideProjector.buildImage = function(img){
		var img_type=arguments[1]!==undefined?arguments[1]:'main';
		var width=arguments[2]!==undefined?arguments[2]:false;
		var height=arguments[3]!==undefined?arguments[3]:false;
		var curr=(img[img_type]!==undefined?img[img_type]:img['main']);
		var ret="";
		for(var i in curr){
			if(curr.hasOwnProperty(i)){
				var val=curr[i];
				if(i.toLowerCase()=='width' && width!==false){
					val=width;
				}
				else if(i.toLowerCase()=='height' && height!==false){
					val=height;
				}
				ret+=i+'="'+val+'" ';
			}
		}
		return "<img "+ret+"/>";
	};
	$.fn.slideProjector.setupHTML = function(curr,curr_id){
		var html='<ul class="slideshow_images"></ul><ul class="navigation"><li class="go_previous"><a>Previous</a></li><li class="enlarge"><a>Enlarge</a></li><li class="go_next"><a>Next</a></li></ul><div class="images"><div class="current_image"></div><div class="next_image"></div></div><div class="counter"></div><div class="caption"></div><div class="thumb_block"><div class="thumb_slide"><ul class="thumbs"></ul></div></div><ul class="thumb_navigation"><li class="thumb_move_previous"><a>Previous</a></li><li class="thumb_move_next"><a>Next</a></li></ul>';
		if(settings.gallery_html){
			html=settings.gallery_html;
		}
		$(curr).html(html);
		var gp = $.fn.slideProjector.getSelector(curr_id,'.go_previous');
		var gn = $.fn.slideProjector.getSelector(curr_id,'.go_next');
		var tgp = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_previous');
		var tgn = $.fn.slideProjector.getSelector(curr_id,'.thumb_move_next');
		var es = $.fn.slideProjector.getSelector(curr_id,'.enlarge');
		var selectors=[gp,gn,tgp,tgn,es];
		for(i=0;i<selectors.length;i++){
			if(selectors[i]!==false){
				$.fn.slideProjector._actionItemHover(selectors[i]);
			}
		}
	};
	$.fn.slideProjector.getSelector = function(curr_id,selector){
		if($('.sPgID_'+curr_id+' '+selector).length){
			return '.sPgID_'+curr_id+' '+selector;
		}

		return false;
	};

	$.fn.slideProjector.defaults = {
		image_data_selector:'ul.imageList',
		gallery_parent_class:'sPg_ParentContainer',
		use_thumbnails:true,
		image_title_selector:'h1',
		transition: 'SLIDE',
		use_counter:true,
		counter_format:'($$AT of $$TOTAL)',
		transition_speed: 500,
		default_width: 300,
		default_thumb_block_height: 100,
		default_image_height: 250,
		default_lightbox_bg_color: '#000000',
		swap_directions:false,
		lightbox_opacity: .5,
		preload_images: true,
		auto_page: false,
		stop_auto_page_on_click: true,
		keep_state: true,
		action_function: function(){}
		

	};
})(jQuery);
