/**
 * @author dirk
 * Funtkionalitaet der Navigation:
 * Die Reiter/Tabs teilen sich jeweils links und rechts den Punkt. Dieses betrifft das Mouseover-Event und auch den
 * aktiven Tab. Die Farben links und rechts vom Tab bei Mouseover werden per CSS gesteuert, indem die UL eine ID bekommt:
 * z.B. s2_over  ... s2_over  weist dem linken und rechten Punkt den korrekt Farbwert hinzu.
 * Da bei aktiven Tab auch auch die Nachbarn entsprechend hervorgehoben sein sollen, wird nach dem Laden der Seite 
 * an der UL zusaetzlich eine Klasse gesetzt. Diese gewaehrleistet, dass auch bei einem aktiven Tab und einem zusaetzlichen Mouseover
 * Ueber einen anderen Tab die Nachbarn des aktiven Tabs gesezt bleiben.
 * Die CSS-Steuerung uebernimmt die /static/css/navigation.css
*/

$(document).ready(function(){ 
	sortNavigation();
	highlightNeighboursOfActiveTab();
});

defaultMilli = 300;
longMilli	 = 800;
navTimer = null;

// Status Objekt Konstruktor
function SortNavStatus() {
	this.tabToShow = null;
	this.tabToHide = null;
	this.lastEvent = null;
	this.activeTab = null;	
}
sortNavStatus = new SortNavStatus();


function sortNavigation() {

	// Tabualtor
	$("#sortNav li.sort a").mouseover(			
		function() {
			if (sortNavStatus.tabToShow == null || isVisbile(sortNavStatus.tabToShow) ) {
				sortNavStatus.tabToShow = $(this);		
				startTimer();
			}
			sortNavStatus.lastEvent = "over";
			saveActiveTab();
		}		
	);

	$("#sortNav li.sort a").mouseout( 
		function() {
			if (sortNavStatus.tabToHide == null || !isVisbile(sortNavStatus.tabToHide) ) {				
				sortNavStatus.tabToHide = $(this);		
				startTimer();				
			}

			if ( sortNavStatus.tabToShow != null && (sortNavStatus.tabToShow.parent().attr("id") == $(this).parent().attr("id"))) {				
				sortNavStatus.tabToShow = null;
			}
			sortNavStatus.lastEvent = "out";
		} 
	);

	// additional layer	
	$("#triggerNav").mouseover(
		function() {
			clearTimeout(navTimer);
			$.log("longMilli: " + longMilli);
			startTimer(longMilli);
			sortNavStatus.lastEvent = "out";		
		}
	);

	$("#triggerNav").mouseout(
		function() {
			clearTimeout(navTimer);
			startTimer();
			sortNavStatus.lastEvent = "out";		
		}
	);

	
	// Layer
	$("#sortNav ul ul").mouseover(			
		function() {
			clearTimeout(navTimer);
		}
	);
	$("#sortNav ul ul").mouseout(			
		function() {			
			sortNavStatus.tabToHide = $(this).siblings();
			startTimer();			
		}
	);	

}

function highlightNeighboursOfActiveTab() {
	$("#sortNav .active").parent("ul").addClass(getActiveTabID() + "_over");
}

function getActiveTabID() {
	return $("#sortNav .active").attr("id");
}

function saveActiveTab() {
	if ( $("#sortNav .active").size() > 0 ) {
		sortNavStatus.activeTab = getActiveTabID();
		$.log("ActiveTab set to: " + sortNavStatus.activeTab);
	}
}

function isVisbile(tabToShow) {
	return tabToShow.css("display") == 'block';
}

function setMouseOverOnTab(elem) {
	elem.addClass("over");
	elem.parent().parent().attr("id", elem.parent()[0].id + "_over" ); 
} 

function resetMouseOverOnTab(elem) {
	elem.removeClass("over");
	elem.parent().parent().attr("id", "" );
}

function showSortNavLayer(elem) {
	liID = elem.parent().attr("id");
	eval(' $("#' + liID +' > ul").show() ');	
}

function hideSortNavLayer(elem) {
	liID = elem.parent().attr("id");
	eval(' $("#' + liID +' > ul").hide() ');	
}

function startTimer(milli) {
	if ( milli == undefined ) {
		milli = defaultMilli;
	}
	$.log("Start timer ...");
	if (navTimer != null) {
		clearTimeout(navTimer);
	}
	navTimer = setTimeout("sortNavControl()", milli);	
}

function sortNavControl() {
	hideAsRequiredByStatus(); 
	showAsRequiredByStatus();
	if ( sortNavStatus.lastEvent == "over" ) { 
		startTimer();
	}		
}

function hideAsRequiredByStatus() {
	if (sortNavStatus.tabToHide != null) {
		elem = sortNavStatus.tabToHide;
		resetMouseOverOnTab(elem);		
		hideSortNavLayer(elem);
		sortNavStatus.tabToHide = null;
	}
}
	
function showAsRequiredByStatus() {
	if (sortNavStatus.tabToShow != null) {
		elem = sortNavStatus.tabToShow;
		setMouseOverOnTab(elem);		
		showSortNavLayer(elem);
		sortNavStatus.tabToShow = null;
	}	
}
