
com_novaliance_TemplatedMenu=function(data,flashImage){
    this.id="com.novaliance.menu_2_0";
    this.isIe=document.all;
    this.hideDelay=1000;
    var self=this;
	this.timers=new Array(20);
	this.data=data;
	this.templates=new Array(20);
	this.flashImage='images/flash.png';
	
	if(flashImage)this.flashImage=flashImage;

    this.delayhide=null;
	
	this.$=function(elementId){
		return document.getElementById(elementId);
	}

	this.addEvent=function(object,event,listener){
			if(object==null)return;
			if(window.addEventListener){ // Mozilla, Netscape, Firefox
				object.addEventListener(event, listener, false);
			} else { // IE
				object.attachEvent('on'+event, listener);
			}
	}
	
		
    this.getPosOffsetLeft=function(obj){
        var totaloffset= obj.offsetLeft;
         var parentEl=obj.offsetParent;
         while (parentEl!=null){
            totaloffset+=parentEl.offsetLeft;
            parentEl=parentEl.offsetParent;
            if( parentEl==null || document.all && parentEl.currentStyle['position']=='relative'       
                || !document.all && document.defaultView.getComputedStyle(parentEl, '')['position']=='relative'){
                //break;
            }        
        }
        return totaloffset;
    }

    this.getPosOffsetTop=function(obj){
        var totaloffset= obj.offsetTop;
         var parentEl=obj.offsetParent;
         while (parentEl!=null){
            totaloffset+=parentEl.offsetTop;
            parentEl=parentEl.offsetParent;
            if(parentEl==null || document.all && parentEl.currentStyle['position']=='relative'       
                || !document.all && document.defaultView.getComputedStyle(parentEl, '')['position']=='relative'){
                //break;
            }
        }
        return totaloffset;
    }

    this.getIEDoc=function(){
        return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
    }

    this.hideMenu=function(elem){
        self.$(elem).style.visibility='hidden';
    }

    this.delayedHide=function(){        
        if(self.delayhide==null){
            self.delayhide=setTimeout(
                function(){
                    self.hideMenu();
                },
            self.hideDelay);
        }
    }
    
    this.fastHide=function(){        
        if(self.delayhide==null){
            self.delayhide=setTimeout(
                function(){
                    self.hideMenu();
                },
            1);
        }
    }

    this.clearHide=function(level){
        if (self.timers[level]!=null){
			self.log("clear:"+level);
            clearTimeout(self.timers[level]);
            self.timers[level]=null;
        }
    }
	
	
	this.getId=function(elem){
		for(var i=0;i<100;i++){
			var id=elem.novamenu;
			if(typeof(id)!='undefined')return id;
			elem=elem.parentNode;
			if(elem==null || elem.tagName=='body')break;
		}
		return null;
	}
	
	this.getData=function(id){
		var ids=(id+"").split(/_/);
		var data=self.data;
		for(var i=0;i<ids.length;i++){
			if(i==0)data=data[ids[i]];
				else data=data.items[ids[i]];
		}
		return data;
	}
	
	this.menuOver=function(event){
		var target=self.isIe?event.srcElement:event.target;		
		var id=self.getId(target);
		var menuData=self.getData(id);
		for(var i=0;i<menuData.level+1;i++){
			self.clearHide(i);
		}
		if (event.stopPropagation) event.stopPropagation();
	}
	
	this.menuOut=function(event){
		self.beginHideMenu(event);
		if (event.stopPropagation) event.stopPropagation();
	}
	
	
	this.onParentClick=function(event){
		var target=self.getTarget(event);		
		var id=self.getId(target);
		var menuData=self.getData(id);
		window.location = menuData.link;
	}
	
	this.showMenu=function(event){
		var target=self.getTarget(event);		
		var id=self.getId(target);
		var menuData=self.getData(id);
		
		if(menuData.type=='item'){
			//hide submenus
			for(var i=menuData.level;i<20;i++){
				if(self.templates[i]==null)break;
				self.hideMenu(self.templates[i]);
			}
			return;
			
		}		
		self.log("show menu:"+id+", level="+menuData.level);
		
		var menu=self.$(menuData.template);
		
		self.templates[menuData.level]=menuData.template
		
		self.addEvent(menu,"mouseover",self.menuOver);
		self.addEvent(menu,"mouseout",self.menuOut);
		
		

		if(menu.novamenu && id!=menu.novamenu){
			//hide submenus
			for(var i=menuData.level+1;i<20;i++){
				if(self.templates[i]==null)break;
				self.hideMenu(self.templates[i]);
			}
		}

		menu.novamenu=id;
		
		for(var i=0;i<menuData.level+1;i++){
			self.clearHide(i);
		}
		
		var result="<ul>";
		for(var j=0;j<menuData.items.length;j++){
			var item=menuData.items[j];
			if(item==null)continue;
			result+='<li id="nova_sub_item'+id+"_"+j+'" onmouseover="this.className=\'menu-selected\'" onmouseout="this.className=\'\'" onclick="window.location=\''+item.link+'\'">';
			if(item.type=="item"){
				result+='<a href="'+item.link+'">'+item.caption+'</a>';
			}else
			if(item.type=="submenu"){
				result+='<a href="'+(item.link?item.link:'#')+'">'+item.caption+'<img src="'+self.flashImage+'" border="0"></a>';
			}
			result+="</li>";
		}
		result+="</ul>";
		self.$(menuData.template+"_content").innerHTML=result;
		menu.style.left=self.getPosOffsetLeft(target) + (menuData.offLeft==-1?target.offsetWidth:menuData.offLeft) + 'px';
		menu.style.top=self.getPosOffsetTop(target)+menuData.offTop+'px';
		menu.style.display='block';
		menu.style.visibility='visible';

		
		for(var j=0;j<menuData.items.length;j++){
			var item=menuData.items[j];
			if(item==null)continue;
			var parentLink=self.$("nova_sub_item"+id+"_"+j);
			if(item.type=="submenu"){
				parentLink.novamenu=id+"_"+j;
				item.level=menuData.level+1;
				self.addEvent(parentLink,"mouseover",self.showMenu);
				self.addEvent(parentLink,"mouseout",self.beginHideMenu);		
			}else if(item.type=="item"){
				self.addEvent(parentLink,"mouseover",self.hideSubmenus);
			}
		}
	}
	
	this.hideSubmenus=function(event){
		var target=self.getTarget(event);		
		var id=self.getId(target);
		var menuData=self.getData(id);
		for(var i=menuData.level+1;i<20;i++){
			if(self.templates[i]==null)break;
			self.hideMenu(self.templates[i]);
		}
	}
	
	this.getTarget=function(event){
		var target=self.isIe?event.srcElement:event.target;
		for(var i=0;i<100;i++){
			if(target==null || typeof(target.novamenu)!='undefined')break;
			target=target.parentNode;
		}
		return target;
	}
	
	this.beginHideMenu=function(event){
		var target=self.getTarget(event);
		var id=self.getId(target);
		var menuData=self.getData(id);		
		self.programHide(menuData.level);
		
	}
	
	this.programHide=function(level){
		if(self.timers[level]==null || typeof(self.timers[level])=='undefined'){
			self.timers[level]=
				setTimeout(
					function(){
						self.hideMenu(self.templates[level]);
					},
					self.hideDelay
				);
				self.log("program to hide:"+level);
			if(level>0){
				self.log("chain next level");
				self.programHide(level-1);
			}
		}
	}
	
	this.log=function(message){
		//self.$("log_panel").innerHTML+=message+"<br>";
	}
		
	for(var i=0;i<data.length;i++){
		var menuData=data[i];
		if(menuData==null)break;
		//loop all menues
		var parent=this.$(menuData.attachTo);
		if(parent==null)continue;
		this.addEvent(parent,"mouseover",self.showMenu);
		this.addEvent(parent,"mouseout",self.beginHideMenu);
		if(menuData.link){
			this.addEvent(parent, "click", self.onParentClick);
		}
		parent.novamenu=i;
		menuData.level=0;
		this.templates[menuData.level]=menuData.template;
	}
	
	
}