/**
 * Copyright 2007 (C) Sirius IT
 * All rights reserved.
 */

SubNode = function(_nodeName, _url) {
	this.name = _nodeName;
	this.url = _url;
	this.nodeId="0";
	this.parentNode=null;
	this.items=new Array();
	this.visible=false;
};

SubNode.prototype.addSubNode = function(_name, _url){
	var n = new SubNode(_name, _url);
	this.addNodes([n]);
	return n;
};

SubNode.prototype.addNodes = function(_nodes) {
	if (_nodes) 
		for (var i = 0; i < _nodes.length; i++) {
			var subNode = _nodes[i];
			this.items[this.items.length] = subNode;
			subNode.parentNode=this;
			subNode.nodeId=this.nodeId+":"+(this.items.length-1);	   	
	   }		
}

SubNode.prototype.addItem = function(_name, _url){
   return this.addSubNode(_name, _url);
};

SubNode.prototype.hasChild = function(){
   if(this.items.length>0) return true;
   else return false;
};

SubNode.prototype.isChildOf = function(_parentNode) {
   if(this.parentNode==null) return false;
   if(this.parentNode==_parentNode) return true;
   return this.parentNode.isChildOf(_parentNode);
};

Menu = function(rootNode, _menuId, _rendererType, _moduleId){
	this.rootNode = rootNode;
	this.menuId = _menuId;
	this.moduleId = _moduleId;
	if (_rendererType == "FoldOut" )
		this.renderer = new Renderer(this, 0);	
	else if (_rendererType == "DropDown") 
		this.renderer = new Renderer(this, 1);
	
	this.nodeIndex = {};
	this.createNodeIndex(this.rootNode);
};

Menu.prototype.createNodeIndex = function(_node){
	for(var j=0; j<_node.items.length; j++) {
		this.nodeIndex[this.menuId+":"+_node.items[j].nodeId]=_node.items[j];
		this.createNodeIndex(_node.items[j]);		
	}
};

Menu.prototype.renderMenu = function(){
	if (this.renderer && this.rootNode)
		this.renderer.renderMenu(this.rootNode);	
}

Menu.prototype.getId = function(node) {
	return this.menuId+":"+node.nodeId;
}

Renderer = function(_menu, layout){
	this.menu = _menu;
	this.VERTICAL = 0;
	this.HORIZONTAL = 1;
	this.layout = layout;
	
	this.visibleNodes = new Array();
	this.activeItemId = null;
	this.hidePopupsTimeout = null;
	this.usePopupHelperIFrame = document.getElementById && document.all && window.createPopup; //Only for IE
	
	var me = this;
	this.fClick = function() { window.location = this.firstChild.firstChild.href;}
	this.fEnter = function() { me.itemEnter(this, this.id.substring(4)); }
	this.fLeave = function() { me.itemLeave(this.id.substring(4)); }
	this.fEnter2 = function() { me.itemEnter(this.parentNode.parentNode, this.parentNode.parentNode.id.substring(4)); }
	this.fLeave2 = function() { me.itemLeave(this.parentNode.parentNode.id.substring(4)); }	
};

Renderer.prototype.Config = function(_mainFont, _mainArrow){
	this.mainArrow = _mainArrow;
	this.mainFont = _mainFont;
};

Renderer.prototype.popupConfig = function(_usePopupShadow, _popupFont, _closeTime){
	this.popupFont = _popupFont;
	this.usePopupShadow = _usePopupShadow;
	this.closeTime = _closeTime || 150;
};

Renderer.prototype.renderMenu = function(rootNode){
	var menuFrame = this.newEl("div",{className:"menuFrame"}, {width: "100%"});
	document.getElementById(this.menu.moduleId).appendChild(menuFrame);
	this.createNodes(rootNode, menuFrame, false, 0);
};

Renderer.prototype.setActiveItem = function(itemId){
	var tmpid;
	if (this.activeItemId) {
		var node = this.getNode(this.activeItemId);
		while (node && node.parentNode) {
			var item = this.getItem(node).firstChild;
			item.className = item.className.replace(/(menu|popup)(Active|Selected)Item/, "$1Item");
			node = node.parentNode;
		}
	}
	if (itemId) {
		var node = this.getNode(itemId);
		var n1 = node; 
		
		while (node && node.parentNode) {
			var item = this.getItem(node).firstChild;
			item.className = item.className.replace(/(menu|popup)Item/,"$1"+(node == n1 ? "Active":"Selected")+ "Item");
			node = node.parentNode;
		}
	}
	this.activeItemId = itemId;
};

Renderer.prototype.getItem = function(node) {
	return document.getElementById("sub:"+this.menu.getId(node));
}
Renderer.prototype.getNode = function(itemId) {
	return itemId ? this.menu.nodeIndex[itemId] : null;
}

Renderer.prototype.showPopup = function(elem, itemId) {
	var itemId = this.activeItemId;
	
	var popup = document.getElementById(itemId);
	if (!popup || popup.style.visibility == "visible")
		return;
		
	var xpos, ypos;
	
	var node=this.getNode(itemId);  
	if(this.layout==this.HORIZONTAL && node.parentNode.nodeId=="0") {
		xpos = elem.offsetLeft + elem.offsetParent.offsetLeft;
		ypos = elem.offsetHeight;
	}
	else { //this.layout==this.VERTICAL
		xpos = elem.offsetWidth;
		ypos = elem.offsetTop;
	}

	popup.style.left = xpos+"px";
	popup.style.top  = ypos+"px";
	popup.style.visibility = "visible";
	
	var helperiframe = document.getElementById(itemId+"_helperiframe");
	if(helperiframe){
		helperiframe.style.left = (xpos)+"px";
		helperiframe.style.top  = (ypos)+"px";
		helperiframe.style.height = popup.offsetHeight+"px";
		helperiframe.style.width  = popup.offsetWidth+"px";		

		helperiframe.style.visibility = "visible";
	}
	var shadow = document.getElementById(itemId+"_shadow");
	if(shadow){
		shadow.style.left = (xpos+3)+"px";
		shadow.style.top  = (ypos+3)+"px";
		shadow.style.height = popup.offsetHeight+"px";
		shadow.style.width  = popup.offsetWidth+"px";	
		
		shadow.style.visibility = "visible";
	}

	this.visibleNodes[this.visibleNodes.length]=node;
};

Renderer.prototype.hidePopups = function(){
	var node= this.getNode(this.activeItemId);
	var newVisibleNodes = [];

	for(var i=0; i < this.visibleNodes.length; i++){
		var visibleNode = this.visibleNodes[i];
		var itemId = this.menu.getId(visibleNode);
		
		if(!node || (!node.isChildOf(visibleNode) && itemId != this.activeItemId)){

			var popup = document.getElementById(itemId);
			if(popup){ 
				popup.style.visibility="hidden";
				
				if(this.usePopupHelperIFrame){
					var helperelement = document.getElementById(itemId+"_helperiframe");
					if(helperelement)
						helperelement.style.visibility="hidden";
				}
				
				if(this.usePopupShadow){
					var shadowelement = document.getElementById(itemId+"_shadow");
					if(shadowelement)
						shadowelement.style.visibility="hidden";
				}
			}
		}
		else 
			newVisibleNodes[newVisibleNodes.length]=visibleNode;
	}	
	this.visibleNodes=newVisibleNodes;
};

Renderer.prototype.itemEnter = function(elem, itemId){
	if(typeof document.readyState == "undefined" || document.readyState=="complete"){
		if(this.hidePopupsTimeout)
			clearTimeout(this.hidePopupsTimeout);

		
		
		if (this.activeItemId != itemId) {
			this.setActiveItem(itemId);
			this.hidePopups();	
			this.showPopup(elem, this.activeItemId);
		}
	 }
};

Renderer.prototype.itemLeave = function(itemId){
	if(typeof document.readyState == "undefined" || document.readyState=="complete"){
		if (this.activeItemId == itemId) {				
			var me = this;		
			this.hidePopupsTimeout = setTimeout(function() {
				me.setActiveItem(null);
				me.hidePopups();
			}, this.closeTime);
		}		
	}
};

Renderer.prototype.createNodes = function(nodes, targetEl, isPopup, level) {
	if(this.layout==this.HORIZONTAL && level == 0) {
		var tr = this.newEl("tr");
		
		for(var i=0; i < nodes.items.length; i++) {
			var node = nodes.items[i];
			/*if (this.mainArrow)
				tr.appendChild(this.newEl("td", {className:"menuItem"},false,[
					this.newEl("img", {alt: "",	src: this.mainArrow})
				]));*/
				
			var td = this.newEl("td");
					
			tr.appendChild(td);
			this.createNode(node, td, false, level, i == nodes.items.length-1);		
		}
		
		targetEl.appendChild(
			this.newEl("table",{
				cellPadding: "0",
				cellSpacing: "0",
				border: "0"
			}, {
				width: "100%",
				padding:"0px 0px 0px 0px"		
			}, [
				this.newEl("tbody",{},{},[tr])
			]));		
	}
	else {
		for(var i=0; i < nodes.items.length; i++) { 
			var node = nodes.items[i];
			this.createNode(node, targetEl, isPopup, level, i == nodes.items.length-1);
		}
	}
}

Renderer.prototype.createNode = function(node, targetEl, isPopup, level, isLast) {
	var id = this.menu.getId(node);
	targetEl.appendChild(
		this.newEl("div",{
			id: "sub:"+id,
			onclick: this.fClick,
			onmouseover: this.fEnter,
			onmouseout:  this.fLeave,
			className: (node.hasChild() ? "parentItem": "leefItem") +
					(!isLast && isPopup ? " popupSeparator" : "")+
					(!isLast && !isPopup ? " menuSeparator" : "")		
		}, {
			width: "100%",
			cursor: "pointer"
		}, [
			this.newEl("div",{
				className : (isPopup ? "popupItem" : "menuItem") 		
			},{},[
				this.newEl("a", {
					className: isPopup ? this.popupFont : this.mainFont,
					href : node.url,
					onfocus: this.fEnter2,
					onblur: this.fLeave2						
				},{},[
					this.mainArrow && level==0? 
						this.newEl("img", {alt: "", src: this.mainArrow}) : null,
					' '+node.name+' '
				])
			])
		])
	);
	
	if (node.hasChild()) {
		var popup = this.createPopupContainer(id, level + 1);
		this.createNodes(this.getNode(id), popup, true, level + 1);
	
		targetEl.appendChild(popup);
		
		if(this.usePopupHelperIFrame)
			targetEl.appendChild(this.createPopupHelperIFrameContainer(id));
		if(this.usePopupShadow)
			targetEl.appendChild(this.createPopupShadowContainer(id));
	}
}

Renderer.prototype.createPopupContainer = function(itemId, level) {
	var elem = this.newEl("div", {
		className: "popupFrame popupLevel"+level,
		id : itemId
	}, {
		position: "absolute",
		zIndex: "10000000",
		visibility: "hidden"
	});
	return elem;
};

Renderer.prototype.createPopupHelperIFrameContainer = function(itemId) {
   	var elem = this.newEl("iframe", {
   		className: "popupIframe",
   		id : itemId+"_helperiframe",
   		frameBorder: 0,
   		scrolling: "no",
   		disabled: true   		
   	}, {
   		borderStyle:"none",
   		position: "absolute",
   		zIndex: "9999998",
   		visibility: "hidden"
   	});
	return elem;
};

Renderer.prototype.createPopupShadowContainer = function(itemId) {
	  var elem = this.newEl("div", {
   		className: "popupShadow",
   		id : itemId+"_shadow"
   	}, {
   		position: "absolute",
   		zIndex: "9999999",
   		visibility: "hidden"
   	});
	return elem;
};
// ------- end of Renderer -------


Renderer.prototype.newEl = function(tagName, attributes, styles, children) {
	var el = document.createElement(tagName);

	if (attributes) {
		for (var x in attributes) {
			/*if (typeof attributes[x] == 'function')
				addEvent(el, x, attributes[x]);
			else*/
				el[x] = attributes[x];
		}
	}
	if (styles) {
		for (var x in styles) {
			el.style[x] = styles[x];
		}
	}
	if (children) {
		for (var i = 0; i < children.length; i++) {
			if (children[i]) {
				if (typeof children[i] != 'object')
					el.innerHTML += children[i];
					//el.appendChild(document.createTextNode(children[i]));
				else				
					el.appendChild(children[i]);
			}
		}
	}
	return el;
}
/*
var eventList = [];

function addEvent( obj, type, fn ) {
	if ( obj.attachEvent ) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){ return obj['e'+type+fn]( window.event );}
		obj.attachEvent( 'on'+type, obj[type+fn] );
	} 
	else if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
	}
	
	eventList.push([obj, type, fn]);
}

function removeEvent( obj, type, fn ) {
	if ( obj.detachEvent ) {
		obj.detachEvent( 'on'+type, obj[type+fn] );
		obj[type+fn] = null;
		obj['e'+type+fn] = null;
	} else if (obj.removeEventListener) {
		obj.removeEventListener( type, fn, false );
	}
}

addEvent(window, 'unload', function() {
	var evnt;
	while(evnt = eventList.pop()) {
		removeEvent(evnt[0], evnt[1], evnt[2]);
	}
});*/
