/**
 * TODO: bug må fikses nor stopAfterAction: true.
 */
(function ($) {
	$.fn.argoFeatured = function (options) {
		var defaults = {
			auto 				: true,
			allowAction 		: true,
			action 				: 'click',
			stopAfterAction 	: true,
			pauseLength 		: 3000,
			fadeSpeed 			: 1000
		}
		
		var options = $.extend (defaults, options);
		
		return this.each (function () {
			var obj 		= $(this);
			var element 	= "#" + obj.attr ('id');
			var intervallId = null;
			var denne;
			var forrige;
			var neste;
			
			// Init featured
			_init (element);
			
			// If user action
			if (options.allowAction) {
				$(element + " > ul > li").bind (options.action, function () {
					// Stop after user activation?
					if (options.stopAfterAction) {
						clearInterval(intervallId);
					}
					
					// Remove class 'valgt' on all li
					$(element + " ul > li").removeClass("valgt"); 
					
					// Add class 'valgt' on user chosen li
					$(this).addClass("valgt");
					
					// Hide all
					$(element + " > div.containerBox > div").stop(true, true).fadeOut (options.fadeSpeed);
					
					// Show selected
					$(element + " > div.containerBox > div:eq(" + $(this).index() + ")").stop(true, true).fadeIn(options.fadeSpeed);
					
					// Continue to run in intervals if not stopped
					if (!options.stopAfterAction) {
						intervallId = _intervallet (element, $(this), intervallId, options);
					}
				});
			}
			
			// Run in intervals if auto is true
			if (options.auto) {
				denne = $(element + " ul >li:first");
				intervallId = _intervallet (element, denne, intervallId, options);
			}
		});
	}
})(jQuery);



/**
 * Init 
 * @param element
 * @return void
 */
function _init (element) {
	// Set first ul li element class to "valgt"
	$(element + " ul > li:first").addClass('valgt');

	// Main div containing elements to show/hide add class "containerBox"
	$(element + " > div").addClass("containerBox");
	
	// Set position relative on class "containerBox"
	$(element + " > div.containerBox").css("position", "relative");
	
	// Set position absolute on "containerBox" children
	$(element + " > div.containerBox > *").css("position", "absolute");
	
	// Hide every element exept first
	$(element + " > div.containerBox > *:not(:first)").hide();
}



/**
 * Run the intervals
 * @params denne
 * @params aktivtBilde
 * @params intervallId
 * @params options
 * @return void
 */
function _intervallet (element, denne, intervallId, options) {
    nesteSlide = function (denne) {
    	if (denne.next().length) {
    		neste = denne.next();
    	} else {
    		neste = $(element + " ul >li:first");
    	}
    	return neste;
    }
    
    intervallId = setInterval(function() {
    	$(element + " ul >li").removeClass("valgt");
    	forrige = denne;
    	denne = nesteSlide (denne);

    	denne.addClass('valgt');
    	
    	// Hide all
		$(element + " > div.containerBox > div").fadeOut (options.fadeSpeed);

		// Show selected
		$(element + " > div.containerBox > div:eq(" + denne.index() + ")").fadeIn(options.fadeSpeed);
    }, options.pauseLength);
    
    return intervallId;
}
