/* 
	Simple gallery plugin
	Mike Harding, Cactuslab
	
	Image transitions based on 'innerfade' plugin by Torsten Baldes: http://medienfreunde.com
	
	speed				: The speed of the fade transition between images. Accepts normal JQuery values. Default is 'normal'
	timeout 			: The time an image shows when in autoplay mode. Default is '4000'
	containerheight 	: Height of the gallery image area. Can take numberic value, or 'auto' (which is the default)
	runningclass 		: A custom CSS class if you which to use one. Defaults to 'clgallery'
	autoplay 			: Autoplay slideshow on load. Slideshow is stopped by clicking a nav item. Default is false
	loop 				: Whether to loop the autoplay. Default is true
	nextlabel 			: Text label for next button. Default is "Next"
	prevlabel 			: Text label for prev button. Default is "Prev"
	showhidenav 		: Show/hide nav on hover. Default is false
	showcaptions 		: Show captions for images, based on alt tags. Default is true
	showhidecaptions 	: Show/hide captions on hover. Dependent on showcaptions being true. Default is false
	children 			: A selector for elements included in the gallery. Defaults to the immediate children of the parent
	
*/

(function($) {
	
	var currentIndex = 0;
	
    $.fn.clgallery = function(options) {
        return this.each(function() {   
            $.clgallery(this, options);
        });
    };

	$.clgallery = function(container, options) {
		var settings = {
			'speed': 			'normal',
			'timeout': 			4000,
			'containerheight': 	'auto',
			'runningclass': 	'clgallery',
			'autoplay': 		false,
			'loop': 			true, 
			'nextlabel': 		"Next",
			'prevlabel': 		"Prev",
			'showhidenav': 		false,
			'showcaptions': 	true,
			'showhidecaptions': false,
			'children':         null
		};
		
		if (options) {
			$.extend(settings, options);
		}
		
		if (settings.children === null){
			var elements = $(container).children();
		} else {
			var elements = $(container).children(settings.children);
		}
			
		if (elements.length > 1) {
            $(container).wrap('<div class="'+settings.runningclass+'_container"></div>').css('position', 'relative').css('height', settings.containerheight).addClass(settings.runningclass);
			
			// Add pagination
			var gallery = $(container).parent();
			gallery.append('<div class="'+settings.runningclass+'_nav">' +
				'<div class="'+settings.runningclass+'_pagination"><div class="'+settings.runningclass+'_pages"><ul></ul></div></div>' +
				'<a class="'+settings.runningclass+'_prev">'+settings.prevlabel+'</a><a class="'+settings.runningclass+'_next">'+settings.nextlabel+'</a>' + 
				'</div>');
				
			if(settings.showcaptions){
				gallery.append('<div class="'+settings.runningclass+'_caption"></div>');
			}

			$(elements).find('img').each(function(){
				// Do resizing before hiding images, to work around IE issue
				resizeImage($(this), $(container).width(), settings);
			});
			
			var pagination = gallery.find('.'+settings.runningclass+'_pagination ul');

			for (var i = 0; i < elements.length; i++) {
				$(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute').hide();
				
				var newItem = $('<li>');
				$("<a>", {
					'href': $(elements[i]).find('img').attr('src'),
					'data-id': i+1,
					text: i+1,
					click: function(e){
						e.preventDefault();
						settings.autoplay = false;
						$.clgallery.next(elements, settings, $(this).attr('data-id')-1, $(this));
					}
				}).appendTo(newItem);
				
				newItem.appendTo(pagination);
			};
			
			updatePrevNext(elements, settings, 0, $(container));
			
			if(settings.showcaptions){
				updateCaption(elements, settings, 0, $(container));
			}

			gallery.find('.'+settings.runningclass+'_pagination li:first').addClass(settings.runningclass+'_active');
			
			gallery.find('a.'+settings.runningclass+'_prev, a.'+settings.runningclass+'_next').click(function(e){
				e.preventDefault();
				$.clgallery.handleNextPrev(elements, settings, $(this));
			});

			$(elements[0]).show();
			
			if(settings.containerheight == 'auto'){
				gallery.find('ul.'+settings.runningclass).height($(elements[0]).height());
			}
			
			if(settings.showhidenav == true){
				var gallerynav = gallery.find('div.'+settings.runningclass+'_nav');
				gallerynav.css({ opacity: 0 });
				gallery.hover(
					function(){
						gallerynav.stop().animate({ opacity: 1 });
					},
					function(){
						gallerynav.stop().animate({ opacity: 0 });
					}
				);
			}
			
			if(settings.showhidecaptions == true){
				var gallerycaption = gallery.find('div.'+settings.runningclass+'_caption');
				gallerycaption.css({ opacity: 0 });
				gallery.hover(
					function(){
						gallerycaption.stop().animate({ opacity: 1 });
					},
					function(){
						gallerycaption.stop().animate({ opacity: 0 });
					}
				);
			}
		}
    };

	$.clgallery.next = function(elements, settings, next, object) {
		updatePrevNext(elements, settings, next, object);
		var container = $(object).closest('.'+settings.runningclass+'_container');
		
		var pagination = container.find('.'+settings.runningclass+'_pagination ul li');
		pagination.removeClass(settings.runningclass+'_active');
		pagination.eq(next).addClass(settings.runningclass+'_active');
		
		if(settings.containerheight == 'auto'){
			container.find('ul.'+settings.runningclass).animate({ height: $(elements[next]).height() });
		}
		
		$(elements[currentIndex]).fadeOut(settings.speed);
		$(elements[next]).fadeIn(settings.speed, function() {
			removeFilter($(this)[0]);
		});
		
		if(settings.showcaptions){
			updateCaption(elements, settings, next, object, currentIndex);
		}
        
		currentIndex = next;
	};
	
	$.clgallery.handleNextPrev = function(elements, settings, object){

		var linktype = 'next';

		if($(object).hasClass(settings.runningclass+'_prev')){
			linktype = 'prev';
		}

		if(linktype=='next' && (currentIndex+1 < elements.length)){
			$.clgallery.next(elements, settings, currentIndex+1, $(object));
		} else if(linktype=='prev' && (currentIndex > 0)){
			$.clgallery.next(elements, settings, currentIndex-1, $(object));
		}
	}	

})(jQuery);

// **** remove Opacity-Filter in ie ****
function removeFilter(element) {
	if(element.style.removeAttribute){
		element.style.removeAttribute('filter');
	}
}

function updatePrevNext(elements, settings, next, object){
	if(object){
		var parent = $(object).closest('.'+settings.runningclass+'_container');
		var prevlink = parent.find('a.'+settings.runningclass+'_prev');
		var nextlink = parent.find('a.'+settings.runningclass+'_next');
		
		if (next+1 == elements.length) {
			nextlink.addClass(settings.runningclass+'_inactive_next');
			prevlink.removeClass(settings.runningclass+'_inactive_prev');
			prevlink.attr('href',$(elements[next-1]).find('img').attr('src'));
		} else if(next == 0) {
			prevlink.addClass(settings.runningclass+'_inactive_prev');
			nextlink.removeClass(settings.runningclass+'_inactive_next');
			nextlink.attr('href',$(elements[next]).find('img').attr('src'));
		} else {
			prevlink.removeClass(settings.runningclass+'_inactive_prev');
			nextlink.removeClass(settings.runningclass+'_inactive_next');
			nextlink.attr('href',$(elements[next+1]).find('img').attr('src'));
			prevlink.attr('href',$(elements[next-1]).find('img').attr('src'));
		}
	}
	
	if(settings.autoplay === true){
		var current_slide = next;
		setTimeout(function() {
			if(settings.autoplay === true){ // double-check in case nav was clicked after running 'next'
				if(current_slide+1 < elements.length){
					current_slide++;
					$.clgallery.handleNextPrev(elements, settings, parent.find('a.'+settings.runningclass+'_next'));
				} else {
					current_slide = 0;
					$.clgallery.next(elements, settings, 0, object);
				}	
			}
		}, settings.timeout);
	}
}

function resizeImage(image, maxWidth, settings){

	var img_w = image.attr('width');
	var img_h = image.attr('height');
	var ratio = img_h/img_w;
	
	var new_w = img_w;
	var new_h = img_h;
	
	if(img_w > maxWidth){
		new_h = Math.floor(maxWidth * ratio);
		new_w = maxWidth;
		image.width(new_w);
		image.height(new_h);
	}
	
	if(settings.containerheight != 'auto'){
		if(new_h > settings.containerheight){
			new_w = Math.floor(settings.containerheight / ratio);
			new_h = settings.containerheight;
			image.width(new_w);
			image.height(new_h);
		}
		
		/* Disabled for Cactuslab site — issues with IE returning 0 for height of some images, and not necessary anyway */
		// if(new_h < settings.containerheight){
		// 	var margin = Math.floor((settings.containerheight - new_h)/2);
		// 	image.css('margin-top', margin);
		// }
	}
}

function updateCaption(elements, settings, next, object){
	var parent = $(object).closest('.'+settings.runningclass+'_container');
	var caption = parent.find('.'+settings.runningclass+'_caption');
	caption.html('');
	var new_caption = $(elements[next]).find('img').attr('alt');
	caption.html(new_caption);
}
