﻿// IMPLEMENTAZIONE DI Array.indexOf
if( ! Array.indexOf ) {
	Array.prototype.indexOf = function( obj ) {
		for( var i = 0; i < this.length; i++ )
			if( this[ i ] == obj ) return i;
		return -1;
	}
}
// IMPLEMENTAZIONE DI appendEvent
var appendEvent = function( element, event, callback ) {
	var evt = "on" + event;
	var fnc = element[ evt ];
	if( typeof fnc != undefined ) {
		if( fnc )
			element[ evt ] = function() {
				fnc();
				callback();
			}
		else element[ evt ] = callback;
	}
}

var fedHead = {
	cont : false,
	tabIndex : 1,
	init : function() {
		var id = "fedHead";
		this.cont = document.getElementById( id );
		if( ! this.cont ) return;
		var ul = this.cont.getElementsByTagName("ul");
		if( ! ul.length ) return;
		this.setTop();
		this.callStyle();
		this.parseMenu( ul[0], this.cont );
		appendEvent( window, "load", this.transTabIndex );
	},
	callStyle : function() {
		/*
		if( ! this.cont ) return;
		var url = "fedHead.css";
		var head = document.getElementsByTagName( "head" )[0];
		var link = document.createElement( "link" );
		link.type = "text/css";
		link.rel = "Stylesheet";
		link.href = url;
		head.appendChild( link );
		*/
		/*
		var tmp = document.createElement( "div" );
		var style = '<style type="text/css">@import url("' + url + '");</style>';
		tmp.innerHTML = '<p>x</p>' + style;
		style = tmp.getElementsByTagName( "style" )[0];
		var body = this.getBody();
		body.insertBefore( style, this.cont );
		//document.writeln( style );
		*/
	},
	setTop : function( yTop ) {
		if( ! yTop ) yTop = 30;
		var body = this.getBody();
		var paddingTop = 0, paddingSum = [ "marginTop", "paddingTop" ];
		for( var i = 0; i < paddingSum.length; i++ ) {
			var tmp = this.getStyle( body, paddingSum[ i ] );
			if( tmp ) paddingTop += parseFloat( tmp.match( /\d+/ )[0] );
		}
		body.style.marginTop = "0px";
		if( paddingTop < yTop ) body.style.paddingTop = yTop + "px";
	},
	getStyle : function( el, css ) {
		var ret = false;
		if( window.getComputedStyle ) ret = window.getComputedStyle( el, null )[ css ];
		else if( el.currentStyle ) ret = el.currentStyle[ css ];
		return ret;
	},
	getBody : function() {
		return document.getElementsByTagName( "body" )[0];
	},
	parseMenu : function( ul, cont ) {
		if( ! ul || ! cont ) return;
		var lis = ul.getElementsByTagName( "li" );
		for( var i = 0; i < lis.length; i++ ) {
			var item = lis[ i ];
			if( item.parentNode != ul ) continue;
			appendEvent( item, "mouseover", function(){ fedHead.menuaction( this ); } );
			appendEvent( item, "mouseout", function(){ fedHead.menuaction( this, true ); } );
			if( i + 1 == lis.length )
				item.className += " fedHead_last";
			var submenu = a = field = false;
			var aas = item.getElementsByTagName( "a" );
			if( aas.length && aas[0].parentNode == item ) {
				a = aas[0];
				a.tabIndex = this.tabIndex++;
			}
			var submenus = item.getElementsByTagName( "ul" );
			if( submenus.length ) {
				submenu = submenus[0];
				submenu.isSubMenu = true;
				item.submenu = submenu;
				appendEvent( submenu, "mouseover", function(){ fedHead.menuaction( this ); } );
				appendEvent( submenu, "mouseout", function(){ fedHead.menuaction( this, true ); } );
			}
			var form = item.getElementsByTagName( "form" );
			if( form.length ) {
				form = form[0];
				for( var f = 0; f < form.elements.length; f++ ) {
					var field = form.elements[ f ];
					if( field.onfocus === undefined ) continue;
					if( field.type != "hidden" ) field.tabIndex = this.tabIndex++;
					field.submenu = ul;
					appendEvent( field, "focus", function(){ fedHead.menuaction( this ); } );
					appendEvent( field, "blur", function(){ fedHead.menuaction( this, true ); } );
				}
			}
			for( var x = 0; x < aas.length; x++ ) {
				if( aas[x].parentNode != item ) continue;
				if( aas[x] == a && submenu ) a.href = "javascript:void(0);";
				else a.target = "_blank";
				if( aas[x] != a ) aas[x].tabIndex = this.tabIndex++;
				aas[x].submenu = submenu || ul;
				appendEvent( aas[x], "focus", function(){ fedHead.menuaction( this ); } );
				appendEvent( aas[x], "blur", function(){ fedHead.menuaction( this, true ); } );
			}
			if( submenu ) this.parseMenu( submenu, item );
		}
		return true;
	},
	menuaction : function( source, out ) {
		var menu = source.submenu || source;
		if( ! menu.isSubMenu ) return;
		if( ! menu.over ) menu.over = [];
		var i = menu.over.indexOf( source );
		if( ! out && i < 0 ) menu.over.push( source );
		else if( out && i >= 0 ) menu.over.splice( i, 1 );
		var li = menu.parentNode;
		while( li.tagName != "LI" && li.parentNode ) li = li.parentNode;
		var cl = " hover";
		if( menu.over.length && li.className.indexOf( cl ) < 0 ) li.className += cl;
		else if( ! menu.over.length ) li.className = li.className.replace( cl, "" );
	},
	transTabIndex : function() {
		var all = fedHead.cont.getElementsByTagName( "*" );
		for( var i = 0; i < all.length; i++ ) all[ i ].isFromFedHead = true;
		var all = fedHead.getBody().getElementsByTagName( "*" );
		for( var i = 0; i < all.length; i++ )
			if( ! all[ i ].isFromFedHead
				&& all[ i ] != fedHead.cont
				&& all[ i ].getAttribute( "tabindex" ) > 0 )
				all[ i ].tabIndex += fedHead.tabIndex;
	}
}
fedHead.init();

