/**
	GSlide gallery (part of CMSbg galleries plugins)
	
	@copyright 	: Toxic Media Limited, Sofia Bulgaria
	@author 	: Angel Kostadinov (angel.kostadinov@toxicmedia.bg)
	@version 	: 1.0
	@see		: http://labs.toxicmedia.bg
*/
(function($) 
{
	$.fn.gslide = function(options) 
	{
		/* Plugin options*/
		var defaults = 
		{
			speed: 20,
			step: 1,
			galleryWidth: 0,
			galleryHeight: 200,
			thumbnailsHeight: 84,
			thumbnailsOpacity: 80,
			infoBoxOpacity: 0.5,
			cssTweak: 0,
			fadeSpeed: 700
		};
		
		var options = $.extend({}, defaults, options);
		
		options.thumbnailsOpacity = options.thumbnailsOpacity / 100;
		
		options.step = (options.speed + 1) * 1.04;
		
		/* Plugin variables */
		var length = 0;
		var images = [];
		var loaded = [];
		
		var $gallery;
		
		
		var zoom = function()
		{
			display(this);
		};
		
		function display( item )
		{
			/* Show preloader */
			$('.preloader').css({ opacity:0.8}).show();
			
			/* Unselect currently selected image */
			$('img',options.slider).removeClass('current').css({ opacity: options.thumbnailsOpacity});
			
			/* Select current image */
			$(item).addClass('current').css({opacity: 1});

			/* Retrieve fullsize filename */
			var fullsize = item.src.replace('thumbnails/','');
			var caption = $('img[src$=' +  item.src + ']').attr('alt');
			
			$('.caption-text').find('div').empty().parent().animate(
			{
				width: caption.length*7
			},300, function()
			{
				$(this).find('div:first').html(caption);
			});
			
			$('.image', $gallery).gpreview(fullsize);
		};
		
		var scrollNext = function()
		{
			var next = $('.current', $gallery).next().length > 0 ? $('.current', $gallery).next().eq(0).get(0) : $('.current', $gallery).get(0);
			
			display(next);
			
			scrollPosition(next,-1);
		};
		
		var scrollPrev = function()
		{
			var prev = $('.current', $gallery).prev().length > 0 ? $('.current', $gallery).prev().eq(0).get(0) : $('.current', $gallery).get(0);
			
			display(prev);
			
			scrollPosition(prev,-1);
		};
		
		var scrollRight = function( position )
		{
			position = position - options.step;
			
			if (position > (0 - distance))
			{
				options.slider.css({ left: position });
				
				sliding = setTimeout(function()
				{
					scrollRight(position);
					
				},options.speed);
			}
		
		};
		
		var scrollLeft = function( position )
		{
			position = position + options.step;
			
			if (position < 0)
			{
				options.slider.css({ left: position });
				
				sliding = setTimeout(function()
				{
					scrollLeft(position);
					
				},options.speed);
			}
		};
		
		var scrollPosition = function(item, orientation )
		{
			var left = $(options.slider).position().left;
			
			var posx = $(item).position().left;

			var scrollx = (posx) * orientation;
			
			scrollx = (options.dim + scrollx) < $('.slidearea', $gallery).width() ? $('.slidearea', $gallery).width() - options.dim - options.step - options.cssTweak : scrollx;
			
			if ($('.slidearea', $gallery).width() < options.dim)
			{
				$(options.slider).animate({left: scrollx });
			}
		};

		var stopScroll = function()
		{
			if (typeof sliding != 'undefined')
			{
				window.clearTimeout(sliding);
			}
			
			$(document).stopTime();
		};
		
		var fadeIn = function()
		{
			$(this).fadeTo(100,1);
		}
		
		var fadeOut = function()
		{
			if (!$(this).hasClass('current'))
			{
				$(this).fadeTo(100,options.thumbnailsOpacity);
			}
		}
		
		
		
		var showGallery = function( dim)
		{
			options.dim = dim;
			
			/* Reset images */
			images.length = null;

    		distance = dim - $('.slidearea', $gallery).width();
    		
    		$('a.slideleft', $gallery).mouseover(function()
    		{
    			scrollLeft(options.slider.position().left);
    		});
    		
	    	$('a.slideright', $gallery).mouseover(function()
	    	{
	    		scrollRight(options.slider.position().left);
	    	});
	    	

	    	$('a.slideleft', $gallery).mouseout(stopScroll);
	    	$('a.slideright', $gallery).mouseout(stopScroll);
	    	

	    	$('.imgnext', $gallery).css({ opacity: 0.3 }).click(scrollNext);
	    	$('.imgprev', $gallery).css({ opacity: 0.3 }).click(scrollPrev);
	    	
	    	$('.imgnext', $gallery).mouseover(function()
	    	{
	    		$(this).fadeTo(400,1);
	    	});
	    	
	    	$('.imgnext', $gallery).mouseout(function()
	    	{
	    		$(this).fadeTo(400,0.3);
	    	});
	    	
	    	$('.imgprev', $gallery).mouseover(function()
	    	{
	    		$(this).fadeTo(400,1);
	    	});
	    	
	    	$('.imgprev', $gallery).mouseout(function()
	    	{
	    		$(this).fadeTo(400,0.3);
	    	});

	    	setTimeout(function()
	    	{
	    		if ($gallery.find('.slider img:first').length == 1)
	    		{
	    			display($gallery.find('.slider img:first').eq(0).get(0));
	    		}
	    		
	    	},200);
		};
		
		var attachCompleteHook = function(size)
		{
			var complete = [];
			
			var images = $('.slider img',$gallery);
			
			var dim = 0;
			
			if ($(images).length > 0)
			{
				$(images).each(function()
				{
					if ($(this).get(0).complete)
					{
						complete.push(true);
						
						dim += $(this).width();
					}
				});
			}
			else 
			{
				complete = false;
			}
			
			if (complete.length != size)
			{
				setTimeout(function()
				{
					attachCompleteHook(size);
					
				},20);
			}
			else 
			{
				showGallery(dim);
			}
		};
		
		var thumbnails = function(images)
		{
			if (images.length > 0)
			{
				var image = images.shift();
				var filename = image.substr(image.lastIndexOf('/') + 1);
				
				image = image.substr(0,image.lastIndexOf('/')) + '/' + filename;
				
				var thumbnail = new Image();
				
				thumbnail.onload = function()
	    		{
	    			$(this).click(zoom);
    				$(this).mouseover(fadeIn);
    				$(this).mouseout(fadeOut);
	    			
	    			$(this).css({ opacity: 0.8}).appendTo($('.slider',$gallery));
	    		};
				
				thumbnail.src = image;
				
				thumbnails(images);
			}
			else 
			{
				setTimeout(function()
				{
					attachCompleteHook(options.length);
					
				},20);
			}
		};

	    var init = function(element)
	    {
	    	$(element).css(
	    	{
	    		width: options.galleryWidth
	    	});
	    	
	    	$('.fullsize', $gallery).css(
	    	{
	    		 height: options.galleryHeight,
	    		 width: options.galleryWidth
	    	});
	    	
	    	$('.thumbnails', $gallery).css(
	    	{
	    		 width: options.galleryWidth,
	    		 height: options.thumbnailsHeight
	    	});
	    	
	    	$('.slidearea', $gallery).css(
	    	{
	    		 width: options.galleryWidth - (2 * $('a.slideleft', $gallery).width())
	    	});
	    }
		
	    return this.each(function(i,obj) 
	    {	
	    	var self = jQuery(obj);
	    	
	    	$gallery = $(this);
	    	
	    	images.length = null;
	    	
	    	options.slider = $('.slider',$gallery);
	    	
	    	/* Initialize gallery */
	    	init($(this));
	    	
	    	$(this).find('ul li img').each(function()
	    	{
	    		images.push($(this).attr('src'));
	    	});
	    	
	    	options.length = images.length;
	    	
	    	thumbnails(images);
	    });
	}; 
})(jQuery);
