/*	
	jQuery jmk slideshow 1.0
	Copyright 2009 James Kurczodyna	
*/

(function($) {
		
	$.fn.jmkslideshow = function (userSettings) {
		var settings = $.extend({
			url: null,
			inlineJSON: null,
			captionWrapper: '#captWrap',
			prevBtn: '#prevBtn',
			nextBtn: '#nextBtn',
			currentImgNum: '#currentImgNum',
			totalImgNum: '#totalImgNum',
			fadeSpeed: 500,
			autoRotate: false,
			rotateSpeed: 4000,
			startAtImg: 1
		}, userSettings || {});
		
		var slideWrap = $(this);
		var imageID = settings.startAtImg - 1;
		var gallery = {};
		var intervalCounter = 0;
		var timeoutVar = 0;
	
		loadImage = function(){
			// remove any deprecated image/content
			$(slideWrap).empty();
			// load 1st image
			$('<img/>')
				.attr('src',gallery.images[imageID].url)
				.attr('alt',gallery.images[imageID].caption)
				.appendTo(slideWrap);
			// load caption and image numbers	
			$(settings.captionWrapper).html(gallery.images[imageID].caption); 
			$(settings.currentImgNum).html(settings.startAtImg);
			$(settings.totalImgNum).html(gallery.images.length);
		};
		showPrevImg = function(){
			if (imageID == 0) { 
				imageID = gallery.images.length - 1;
			} else {
				imageID--;
			};
			updateImg();
		};
		showNextImg = function(){
			if (imageID == gallery.images.length - 1) { 
				imageID = 0;
			} else {
				imageID++;
			};
			updateImg();	
		};
		updateImg = function(){
			// preload next image
			var nextImage = new Image(); 
			nextImage.src = gallery.images[imageID].url;
			//fade out current image and caption
			$(settings.captionWrapper).fadeOut(settings.fadeSpeed);
			$(slideWrap).find('img').fadeOut(settings.fadeSpeed,function(){
				
				if (nextImage.complete) { // if next image has loaded
					// change the src of current image and fade it in
					$(slideWrap).find('img').attr('src',gallery.images[imageID].url)
						.attr('alt',gallery.images[imageID].caption)
						.fadeIn(settings.fadeSpeed);
					// change image number and fade in new caption	
					$(settings.currentImgNum).html(imageID + 1);
					$(settings.captionWrapper).html(gallery.images[imageID].caption).fadeIn(settings.fadeSpeed);
			
				} else {
					// add loader
					$('#slideshow').addClass('loading');

					nextImage.onload = function() { // when next image loads 
						// change the src of current image and fade it in
						$(slideWrap).find('img').attr('src',gallery.images[imageID].url)
							.attr('alt',gallery.images[imageID].caption)
							.fadeIn(settings.fadeSpeed);
						// change image number and fade in new caption	
						$(settings.currentImgNum).html(imageID + 1);
						$(settings.captionWrapper).html(gallery.images[imageID].caption).fadeIn(settings.fadeSpeed);
						// remover loader
						$('#slideshow').removeClass('loading');

					}
				}
				
			});
			
			
		};
		startInterval = function () {
			// triggers showNextImg() at set intervals
			intervalCounter = setInterval ( "showNextImg()", settings.rotateSpeed );
		};
		delayInterval = function () {
			// if prev and next btns are clicked, this triggers a pause
			// before startInterval() executes again
			if (settings.autoRotate) {
				clearInterval(intervalCounter);
				clearTimeout(timeoutVar);
				timeoutVar = setTimeout ( "startInterval()", settings.rotateSpeed );
			}
		};
		
		
		if (settings.inlineJSON != null) { // if inline JSON is specified
			// load JSON to gallery obj
			gallery = settings.inlineJSON;
			loadImage();
			// activate prev and next btns
			$(settings.prevBtn).click(function() { showPrevImg(); delayInterval(); return false; });
			$(settings.nextBtn).click(function() { showNextImg(); delayInterval(); return false; });
			// if autoRotate is set, start it up
			if (settings.autoRotate) { startInterval(); };
			
		} else {
			
			$.getJSON(settings.url,function(data){
				// get JSON from specified external file and load it to gallery obj
				gallery = data;
				loadImage();
				// activate prev and next btns
				$(settings.prevBtn).click(function() { showPrevImg(); delayInterval(); return false; });
				$(settings.nextBtn).click(function() { showNextImg(); delayInterval(); return false; });
				// if autoRotate is set, start it up
				if (settings.autoRotate) { startInterval(); };

			});
			
		}
		
	}	
		
})(jQuery);
