var mySite = {};

mySite.sceneFlip = function(flipSelector){
	//*** Private
	var stopLoop = false;
	var config = {};
	config.time = {};
	config.time.interval = 5000; //ms
	config.time.animation = 600; //ms
	config.selectors = {};
	config.moduleName = "sceneFlip";
	config.selectors.mainContainer = "#Banners";
	config.selectors.flipItem = "> li";
	config.selectors.flipMenu = ".BannerButton";
	
	var lookup = {};
	lookup.selectors = {};
	lookup.selectors.mainContainer = config.selectors.mainContainer;
	lookup.selectors.flipItem = lookup.selectors.mainContainer + " " + config.selectors.flipItem;
	lookup.selectors.flipMenu = lookup.selectors.mainContainer + " " + config.selectors.flipMenu;
		
	if (flipSelector){
		config.selectors.mainContainer = flipSelector;
		refactorLookup();
	}
	
	setAllEvents();
	
	//*** Helper functions
	
	function refactorLookup(){
		lookup.selectors.mainContainer = config.selectors.mainContainer;
		lookup.selectors.flipItem = lookup.selectors.mainContainer + " " + config.selectors.flipItem;
		lookup.selectors.flipMenu = lookup.selectors.mainContainer + " " + config.selectors.flipMenu;
	}
		
	//The flip that is visible is the current. This function returns the next sibling or first if current is last.
	function getNextFlip($currentFlip){
		var $nextFlip = $currentFlip.next(lookup.selectors.flipItem);
		
		if(!$nextFlip.length){
			$nextFlip = $(lookup.selectors.flipItem).first()
		}
		
		return $nextFlip;
	}
	
	//Hide all flips, then show first.
	function initFlips(){		
		$(lookup.selectors.flipItem).hide().first().show();
	}
	
	//Clears any default items, then fills it with new items based on available flips.
	//initFlips need to be run before calling initMenu.
	function initMenu(){
		var $flips = $(lookup.selectors.flipItem);
		var $menu = $(lookup.selectors.flipMenu);
		
		if(!$flips.length){
			return false;
		}
		
		$menu.find("li").remove();
		$flips.each(function(){
			$menu.append(document.createElement("li"));
		});
		
		$menu.find("li:first-child").addClass("current");
	}
	
	//Menu items and flips are coordinatet by their sibling position. Fex 1st flip equals 1st menu item, 2nd flip equals 2nd menu item etc.
	function setMenuItem($currentFlip){
		var $flips = $(lookup.selectors.flipItem);
		var $menu = $(lookup.selectors.flipMenu);
		var index = $flips.index($currentFlip);
		
		$menu.find("li")
			.removeClass("current")
			.eq(index)
			.addClass("current");		
	}
	
	function setFlip($currentMenuItem){
		var $flips = $(lookup.selectors.flipItem);
		var $menuItems = $(lookup.selectors.flipMenu).find("li");
		var index = $menuItems.index($currentMenuItem);
		
		$flips.fadeOut().eq(index).fadeIn(config.time.animation, function(){
			setMenuItem(this);
		});	
	}
	
	//The show/hide loop
	function flipFlip(){		
		var $currentFlip = $(lookup.selectors.flipItem + ":visible").first();
		var $nextFlip = getNextFlip($currentFlip);
		
		if(stopLoop){
			return false;
		}
		
		$currentFlip.stop(true, true).fadeOut(config.time.animation, function(){
			$nextFlip.stop(true, true).fadeIn(config.time.animation, function(){
				setMenuItem(this);
				setTimeout(flipFlip, config.time.interval);
			});
		});
		
	}
	
	function killLoop(){		
		stopLoop = true;
		$(lookup.selectors.flipItem + ":animated").stop(true,true);
	}
	
	function stop(){
		///<summary>Stops the show and set current menu item to correnspond with the visible flip.</summary>
		var $currentFlip;
		killLoop();
		$currentFlip = $(lookup.selectors.flipItem + ":visible").first();
		setMenuItem($currentFlip);
		return this;
	}
	
	function start(){
		///<summary>Starts the show after init checks are done.</summary>
		if(isEverythingOk()){
			initFlips();
			initMenu();
			if($(lookup.selectors.flipItem).length > 1){
				stopLoop = false;
				setTimeout(flipFlip, config.time.interval);				
			}
			return this;
		}
		else{
			discretFeedback("cannot start because dom items are missing.");
		}
	}
	
	function discretFeedback(message){		
		console.log(config.moduleName + ": " + message);
	}
		
	function setAllEvents(){
		//click on menu items
		$(lookup.selectors.flipMenu).find("li").live("click", function(){
			var item = $(this);
			killLoop();
			setFlip(item);
		});
	}
	
	function setInterval(ms){
		///<summary>Set the time in ms between animations</summary>
		if(isNumber(ms)){
			config.time.interval = ms;
			return this;
		}
		else{
			discretFeedback("setInterval - input is not a number.")
		}
	}
	
	function isNumber(n){
		return !isNaN(parseFloat(n)) && isFinite(n);
	}
	
	//Check if we have a flip container and flips.
	function isEverythingOk(){
		var isOk = true;
		
		if(!$(config.selectors.mainContainer).length){
			isOk = false;
		}
		
		if(!$(config.selectors.flipItem).length){
			isOk = false;
		}
		
		if(!$(config.selectors.flipMenu).length){
			isOk = false;
		}
		
		return isOk;
	}
	
	//*** Public
	return {		
		start: start,
		setInterval: setInterval,
		stop: stop
	}
}



var eniAPI = {};

eniAPI.minScene = function () {

    var private = {};
    var public = {};


    private.EtEllerAnnet = function () {

    }

    public.test1 = function () {
        var dill = private.EtEllerAnnet();

        return dill;
    }

    public.test2 = function () {
        var dill = private.EtEllerAnnet();

        return dill;
    }


    return public;
}


