/*
Gallery Plugin
Copyright Richard Hilton (Hiltonian Media), 2008
version 1.0
http://www.sursum-corda.co.uk/
This plugin may NOT be copied, modified, distributed or used 
except as part of the Sursum Corda Content Management System, 
or with written permission from Hiltonian Media.
*/

(function($) {
	$.fn.gallery = function(settings) {
		
		// Set up default settings and override with user settings
		settings = $.extend({
			type: 'selector',
			itemClass: 'gallery-item',
			selectorClass: 'selector',
			prevClass: 'prev',
			prevText: 'Previous',
			nextClass: 'next',
			nextText: 'Next',
			currentClass: 'current',
			selectorItemClass: 'item',
			disabledClass: 'disabled',
			selectorPosition: 'above',
			selectorCallback: false
		}, settings);
		
		
		function _showImage(index, list) {
			var settings = $(list).parent().data('settings');
			var current = $('.' + settings.selectorItemClass, list).index($('.' + settings.currentClass, list).get(0));
			if (current < 0) { current = 0; }
			list.siblings('.' + settings.itemClass).removeClass(settings.currentClass).eq(current).fadeOut("fast", function() {
				$('li.' + settings.selectorItemClass, list).removeClass(settings.currentClass).eq(index).addClass(settings.currentClass);
				$('.' + settings.itemClass, $(list).parent()).eq(index).fadeIn('fast');
				if (settings.selectorCallback) {
					settings.selectorCallback();
				}
			}).addClass(settings.currentClass);
			$('li', list).removeClass(settings.disabledClass);
			if (index == 0) {
				$('li.' + settings.prevClass, list).addClass(settings.disabledClass);
			} else if (index == $('li.' + settings.selectorItemClass, list).size() - 1) {
				$('li.' + settings.nextClass, list).addClass(settings.disabledClass);
			}
		}
		
		function _selectorClick() {
			var list = $(this).parents('ul').eq(0);
			var settings = $(list).parent().data('settings');
			var size = $('li.' + settings.selectorItemClass, list).size();
			if ($(this).parent('li').hasClass(settings.selectorItemClass)) {
				var index = $('.' + settings.selectorItemClass, list).index($(this).parent('li').get(0));
			} else {
				// We add size on to the next line because JS doesn't do modulus on negative numbers!
				var index = $('.' + settings.selectorItemClass, list).index($('.' + settings.currentClass, list).get(0)) + size;
				if ($(this).parent('li').hasClass(settings.nextClass)) {
					index++;
				} else if ($(this).parent('li').hasClass(settings.prevClass)) {
					index--;
				}
			}
			index = index % size;
			_showImage(index, list);
			return false;
		}
		
		return this.each(function() {
			obj = $(this);
			obj.data('settings', settings);
			
			switch (settings.type) {
			
				// Show one image at a time, with a selector bar above/below
				case 'selector':
					// Hide all the gallery items
					$('.' + settings.itemClass, obj).hide();
					
					// Create the image selector
					var selector = $('<ul class="' + settings.selectorClass + '"></ul>');
					selector.append('<li class="' + settings.prevClass + '"><a href="#">' + settings.prevText + '</a></li>');
					for (var i = 0; i < $(this).children('.' + settings.itemClass).size(); i++) {
						selector.append('<li class="' + settings.selectorItemClass + '"><a href="#">' + (i+1) + '</a></li>');
					}
					selector.append('<li class="' + settings.nextClass + '"><a href="#">' + settings.nextText + '</a></li>');
					$('li.' + settings.selectorItemClass, selector).eq(0).addClass(settings.currentClass);
					if (settings.selectorPosition == 'above') {
						obj.prepend(selector);
					} else {
						obj.append(selector);
					}
					_showImage(0, selector);
					
					$('ul.' + settings.selectorClass + ' a', obj).click(_selectorClick);
					break;
				
				// Thumbnails with lightbox popup
				case 'lightbox':
					$('.' + settings.itemClass + ' a', obj).click(_thumbClick);
					break;
			}
			
		});
	};
	
})(jQuery);



