(function($){

	$.fn.inlineGallery = function(options)
	{
		if(this.size() == 0) return;

		var opts = $.extend($.fn.inlineGallery.defaults, options);

		this.each(inlineGallery);
		function inlineGallery()
		{
			var $gallery = $(this);
			var $list = $gallery.children();

			if($list.length > 1)
			{
				var $menu = createMenu($gallery);
				$menu.find('.prev').click(loadPrev);
				$menu.find('.next').click(loadNext);
			}
			
			var $wrapper = createWrapper($gallery);
			$wrapper.width(opts.width);
			$wrapper.height(opts.height);

			var $title = createTitle($gallery);

			var $new;
			var $old;
			var loadingImageTitle;

			var curr = 0;
			loadImage(curr);

			function loadImage(index)
			{
				$old = $wrapper.find('.new').removeClass('new');
				var $link = $($list[index]);
				var imgUrl = $link.attr('href');
				loadingImageTitle = $link.attr('title');

				$new = newImage($wrapper);
				$new
					.hide()
					.load(newLoaded)
					.attr('src', imgUrl);
			}

			function newLoaded()
			{
				if($new.width() == 0 || $new.height() == 0)
				{
					setTimeout(newLoaded, 1);
					return;
				}
				setImagePosition();

				$old.fadeTo('default', 0, removeOld);
				$new.fadeTo('default', 1);
				$title.html(loadingImageTitle);

				$new.click(loadNext);
			}

			function setImagePosition()
			{
				$new.css
				({
					left:($wrapper.width() - $new.width()) / 2,
					top:($wrapper.height() - $new.height()) / 2
				});
			}

			function loadPrev()
			{
				curr --;
				if(curr < 0)
				{
					if(opts.loop)
						curr = $list.length - 1;
					else
					{
						curr ++;
						return;
					}
				}
				loadImage(curr);
			}

			function loadNext()
			{
				curr ++;
				if(curr >= $list.length)
				{
					if(opts.loop)
						curr = 0;
					else
					{
						curr --;
						return;
					}
				}
				loadImage(curr);
			}

			function removeOld()
			{
				$old.remove();
			}
		}

		function createMenu($gallery)
		{
			var $menu = $('<div class="ingal_menu"/>');
			var prev = '<span class="prev">' + opts.prevLabel + '</span>';
			var next = '<span class="next">' + opts.nextLabel + '</span>';
			$menu.html(prev + opts.menuSeparator + next);

			$gallery.append($menu);
			return $menu;
		}

		function createWrapper($gallery)
		{
			var $wrapper = $('<div class="ingal_wrapper"/>');
			$gallery.append($wrapper);
			return $wrapper;
		}

		function createTitle($gallery)
		{
			var $title = $('<div class="ingal_title"/>');
			$gallery.append($title);
			return $title;
		}

		function newImage($wrapper)
		{
			$wrapper.append($('<img class="new"/>'));
			return $wrapper.find('.new');
		}
	}

	$.fn.inlineGallery.defaults = {
		loop: true,
		prevLabel:'prevoius',
		nextLabel:'next',
		closeLabel:'close',
		menuSeparator:' | '
	};


})(jQuery);
