<!--
/* ---------------------------------------------
 * Created:		20.02.2007
 * Revision:		11.03.2007
 * Author:		Philippe Jos
 * Copyrights:		Philippe Jos
 * Email:		jos.philippe@wanadoo.fr
 * ---------------------------------------------
 */

function MenuSpecification( containerId, xmlDocURI, imgDir, width, height, margin ){
	this.ContainerId = containerId;							
	this.Name = containerId.slice(1).toLowerCase();					
	this.XmlDocURI = xmlDocURI;							
	this.ImgDirectory = imgDir;							
	this.Width = width;								
	this.Height = height;								
	this.Margin = margin;											
}

MenuFact = {
	Separator: null,									
	MenuInstance: null,									
 
	 
	Generate: function( menuInstance ){
		MenuFact.MenuInstance = menuInstance;						
		MenuFact.Separator = MenuFact.CreateSeparator();				
		
		if(browser.opera) MenuFact.Construct( XML.Load( MenuFact.MenuInstance.XmlDocURI ) );			
		else if( browser.explorer6 || !isHttpProtocol() )							
			XML.AsyncLoad( MenuFact.MenuInstance.XmlDocURI, MenuFact.Construct );				
		else{																				
			
			XML.HTTPAsyncLoad( MenuFact.MenuInstance.XmlDocURI, MenuFact.Construct );			
		}
	},

	Flush: function(){
		MenuFact.Separator = null; 
		MenuFact.MenuInstance = null;
	},

											 
	Construct: function( xmlDoc ){					
		var root = xmlDoc.documentElement;					
		var len = root.childNodes.length;					
		
		var i, j, node, nodeLen;
		for( i=0; i< len; i++ ){						
			node = root.childNodes[i];					
			MenuFact.CheckNodeType( node );					

			nodeLen = node.childNodes.length;				
			for( j=0; j< nodeLen; j++ )					
			MenuFact.CheckNodeType( node.childNodes[j] );			
		}

		MenuFact.Flush();
	},
	
	CheckNodeType: function( node ){					
		var type = node.nodeName;

		switch(type){
			case "menu":
			case "item":
				var brand = node.getAttribute("brand");
				var link = node.getAttribute("link");
				if(brand) link = encodeURI( link + "?brand=" + brand + "&range=" + node.getAttribute("range") );
				MenuFact.AppendMenuItem( type, node.getAttribute("name"), node.getAttribute("alt"), link );
			break;
			case "separator": MenuFact.AppendSeparator(); break;
			default: break;							
		}
	},

	
	AppendMenuItem: function( type, imgName, alt, link ){		
		var container = MenuFact.GetContainer();
		var menuItem, subContainer;

		if(type == "item"){											
			menuItem =  container.lastChild.appendChild( MenuFact.CreateLinkItem( imgName, link ) );	
			attachEventListener( menuItem, "mouseover",  MenuFact.ItemMouseOver, false ); 
			attachEventListener( menuItem, "mouseout",  MenuFact.ItemMouseOut, false );
		}else{													
			if(link != "")											
				menuItem = container.appendChild( MenuFact.CreateLinkItem( imgName, link ) );		
			else {												
				menuItem = container.appendChild( MenuFact.CreateToggleItem( imgName ) );		
				subContainer = document.createElement("div");						
				if( Cookie.Enabled() ){																
																							
					if( MenuFact.LoadMenuItemState( imgName ) == false ){				
						subContainer.style.display = "none";					
						menuItem.over = menuItem.expandover;					
						menuItem.out = menuItem.expandout;
						menuItem.src = menuItem.out.src;
						menuItem.expanded = false;
					}
				}
				container.appendChild( subContainer );											
			}
		 
			menuItem.style.margin = MenuFact.MenuInstance.Margin;
			attachEventListener( menuItem, "mouseover",  MenuFact.MenuMouseOver, false ); 
			attachEventListener( menuItem, "mouseout",  MenuFact.MenuMouseOut, false );
		}

		menuItem.className = "menuitem";
		menuItem.ref = imgName;
		menuItem.type = type;
		menuItem.title = alt;
		menuItem.alt = alt;
	},

	GetMenuContainer: function( node ){
		if( node.type == "item" ) return( node.parentNode.parentNode );
		else return( node.parentNode );
	},

	GetContainer: function(){
		return( document.getElementById( MenuFact.MenuInstance.ContainerId ) );
	},

	GetLastContainer: function(){
		var container = MenuFact.GetContainer();

		if(!container.hasChildNodes()) return(container);
		else{
			var last = container.lastChild;
 
			if( last.nodeName != "IMG" ) return(last);
			else return(container);
		}
	},

	
	CreateSeparator: function(){ 					
		var sep = createImage( MenuFact.MenuInstance.ImgDirectory + "separator.gif", MenuFact.MenuInstance.Width, 1 );
		sep.style.display = "block";
		return( sep );
	},
	
	AppendSeparator: function(){
		MenuFact.GetLastContainer().appendChild( MenuFact.Separator.cloneNode(false) );
	},


	CreateLinkItem: function( imgName, link ){
		var imgPath = MenuFact.MenuInstance.ImgDirectory + imgName;

		var item = createImage( imgPath + "_out.gif", MenuFact.MenuInstance.Width, MenuFact.MenuInstance.Height );
		item.link = link;

		item.over = loadImage( imgPath + "_over.gif" );
		item.out = loadImage( imgPath + "_out.gif" );

		attachEventListener( item, "mouseup",  MenuFact.GoToUrl, false );

		return(item);
	},

	CreateToggleItem: function( imgName ){
		var imgPath = MenuFact.MenuInstance.ImgDirectory + imgName;

		var item = createImage( imgPath + "_collapse_out.gif", MenuFact.MenuInstance.Width, MenuFact.MenuInstance.Height );
		item.expanded = true;

		item.collapseover = loadImage( imgPath + "_collapse_over.gif" );
		item.collapseout = loadImage( imgPath + "_collapse_out.gif" );

		item.expandover = loadImage( imgPath + "_expand_over.gif" );
		item.expandout = loadImage( imgPath + "_expand_out.gif" );

		item.over = item.collapseover;
		item.out = item.collapseout;
	
		attachEventListener( item, "mouseup",  MenuFact.Toggle, false );

		return(item);
	},

	MenuMouseOver: function(e) {
		try{ 
			var node = getEventTarget(e);
			node.src = node.over.src;
			trace(node.title);
		}catch(exp){}
	},

	MenuMouseOut: function(e) {
		try{ 
			var node = getEventTarget(e);
			node.src = node.out.src;
			trace("");
		}catch(exp){}
	},

	ItemMouseOver: function(e) {
		try{
			var node = getEventTarget(e);
			var menu = node.parentNode.previousSibling;
			node.src = node.over.src;
			menu.src = menu.over.src;
			trace( node.title );
		}catch(exp){}
	},

	ItemMouseOut: function(e) {
		try{ 
			var node = getEventTarget(e);
			var menu = node.parentNode.previousSibling;
			node.src = node.out.src;
			menu.src = menu.out.src;
			trace("");
		}catch(exp){}
	},

	Toggle: function (e) {
		try{
			var node = getEventTarget(e);

			if(node.expanded) MenuFact.Collapse(node);
			else MenuFact.Expand( node );
		}catch(exp){}
	},


	Collapse: function ( node ){
		try{ 
			node.over = node.expandover;
			node.out = node.expandout;
			node.src = node.over.src; 

			node.nextSibling.style.display = "none";
			node.expanded = false;
			MenuFact.SaveState( node );
		}catch(exp){}
	},

	Expand: function( node ){
		try{ 
			node.over = node.collapseover;
			node.out = node.collapseout;
			node.src = node.over.src;
			node.nextSibling.style.display = "block";
			node.expanded = true;
			MenuFact.SaveState( node );
		}catch(exp){}
	},

	GoToUrl: function(e) {
		try{
			goToURL( getEventTarget(e).link );
		}catch(exp){}
	},

	
	LoadMenuItemState: function( ref ){
		var cookie = new Cookie( MenuFact.MenuInstance.Name );
		
		var state = cookie[ ref ];
		
		if(state != null){
			if(state == "true" ) return(true);
			else return( false );
		} else return(true);
	},

	SaveState: function( node ){		
		if( !Cookie.Enabled() ) return;						

		var container = MenuFact.GetMenuContainer( node );			
		var len = container.childNodes.length;					
		var name = container.id.slice(1).toLowerCase();				
		var cookie = new Cookie( name );

		var child;
		for( var i=0; i< len; i++ ){
			child = container.childNodes[i];
			if(child.type == "menu" && !child.link) cookie[child.ref] = child.expanded;
		}

		cookie.Store( 90, "/" );
	}
};


