function Menu() {
	var a=arguments;
	var objName=a[0];
	var id=a[1]||"Menu_"+(Menu.counter++);
	var config=Menu.MergeConfig(a[2],Menu.Config);
	var indicator;
	this.__className="Menu";
	extending(this,new DomObject(id,config.canvas.plain));
	this.indicator=new DomObject(id+"_indicator",config.indicator.plain);
	var self=this;
	this.indicator.onMouseover=function(e) {
		self.clearTimer();
	}
	this.indicator.onMouseout=function(e) {
		self.startTimer();
	}
//	this.indicator=new DomObject(id+"_krumme",config.indicator.plain);
	this.indicator.dominize();
	this.indicator.setMouseEvents(true);
	this.menu=this;
	this.config=config;
	this.canvasMap=new CMap();
	this.elementToCanvas=new CMap();
	this.canvasConfig=new Object();
	this.oldActive=new Array();	
	this.active=new Array();	
	this.timerId=0;
	this.addProperty("objName","string",objName);
	this.addProperty("index","number");
	this.addProperty("timeout","number",500);
	this.setMouseEvents(true);
}

Menu.counter=0;
Menu.Config= {
	canvas:{
		plain:'mainMenu',
		active:'mainMenu'
	},
	indicator : {	
		plain	: "menuIndicatorLeft",
		active	: "menuIndicatorLeftActive",
		anchorV:'Bottom',
		anchorH:'Left',
		dir: 'down'
	},
	indicator2: {	
		plain	: "menuIndicatorRight",
		active	: "menuIndicatorRightActive",
		anchorV:'Bottom',
		anchorH:'Center',
		dir: 'left'
	},
	krumme : {
		
	}
};
/*
Menu.Config= {
	canvas:{
		plain:'mainMenu',
		active:'mainMenu'
	},
	indicator : {	
		plain	: "menuIndicatorTop",
		active	: "menuIndicatorTopActive",
		anchorV:'Bottom',
		anchorH:'Left',
		dir: 'down'
	},
	krumme : {
		
	}
};
*/
// public
var p=Menu.prototype;
p.restore=function() {
	var c=this.config;
	this.elm.className=c.canvas.plain;
}

p.hideIndicator=function() {
	var c=this.config;
	this.indicator.elm.className=c.indicator.plain;	
}

p.addCanvasConfig=function(depth,config) {
	this.canvasConfig[depth]=config;
}
p.addElement=function() {
	var a =arguments;
	var index=a[0];
	var pindex=a[1]; 
	var depth=a[2]; 
	var content=a[3]||null;
	var cssclassName=a[4]||'';
	var item=this;
	var canvasMap,id;
	var element= new MenuElement(this,index,depth,content,cssclassName);
	var canvasConfig,config;
	if (pindex!=0) {
		canvasMap=this.canvasMap;
		item=canvasMap.getValueByKey(this.getId()+"_MC"+pindex);
		if (!item) {
			canvasConfig=this.canvasConfig;
			config=canvasConfig[depth];
			item= new MenuCanvas(this,pindex,depth,config);
			canvasMap.addPair(item.getId(),item);
		}
	} else {
		if(cssclassName.indexOf('topMenuElementSelected')!=-1) {
			this.selectedTop=element;
		}
	}
	item.addChild(element);
}

// private
Menu.MergeConfig= function (config,base) {
	if (config==null || typeof(config)=="undefined") {
		config=base;
	} else {
		for (var def in base) {
			switch (typeof(config[def])) {
				case "object":
					config[def]=Menu.MergeConfig(config[def],base[def]);
				break;
				case "undefined":
					config[def]=base[def];
				break;
					
			}
		}
	}
	return config;
}
p.timedOut=function() {
	var ty,o;
	this.timerId=0;
	this.invokeEvent('prehidden');
	for(var i in this.active) {
		o=this.active[i];
		ty=typeof(o);
		if (ty==="object" && o!=null)
			this.active[i].restore();
	}
	this.active.length=0;
	this.invokeEvent('hidden');
}
p.startTimer=function() {
	if (this.timerId==0)
		this.timerId=setTimeout(this.getObjName()+".timedOut()",this.getTimeout());
}
p.clearTimer=function() {
	if (this.timerId!=0) {
		clearTimeout(this.timerId);
		this.timerId=0;
	}
}

p.markActive=function(d,o) {
	var cur=this.active[d];
	var l=this.active.length,o;
	if (l==0) {
		this.invokeEvent("previsible");
	}
	this.clearTimer();
	
	if (!cur) {
		this.active[d]=o;
	}
	else {
		this.active[d].restore();
		this.active[d]=o;
		for (var i=d+1;i<l;i++) {
			this.active[i].restore();
		}
	}
	if (l==0) {
		this.invokeEvent("visible");
	}
}
p.build=function() {
	var canvas,canvasMap,l,children,mc_id;;
	canvasMap=this.canvasMap;
	l=canvasMap.getLength();
	for (var idx=0;idx<l;idx++) {
		canvas=canvasMap.getValueByIndex(idx);
		canvas.dominize();
	}
	this.dominize();
	
	this.invokeEvent("final");
}

p.placeSubSection=function(mEle,mCan) {
	var myBox,dispTop=0,dispLeft=0,indicator,c,newPos;
	var anchorV,anchorH,dir,topEle;
	var children=mCan.children,dispBox;
	
	myBox=this.getBox();
	if (children.getLength()>0) {
		dispBox=children.getAt(0).getBox();
		dispTop=-(dispBox.innerTop+Math.round(dispBox.height/2));
	}
	indicator=this.indicator;
	
	if (menu.children.findIndexOf(mEle)<menu.children.getLength()/2) {
		indicator.elm.className="menuIndicatorLeftActive";
		mCan.elm.className="menuCanvasActive";

		newPos=indicator.attachTo(mEle,"Bottom","LeftInner",myBox.innerBottom,0,0);
		indicator.moveTo(newPos.top,newPos.left);
		
		newPos=mCan.attachTo(indicator,"Bottom","Right",dispTop,0);
		// Browser dependent positioning---------
		if(is.b == "Safari"){
			mCan.moveTo(newPos.top+14,newPos.left);
		} else {
			mCan.moveTo(newPos.top,newPos.left);
			}
		//---------------------------------------

	} else {
		indicator.elm.className="menuIndicatorRightActive";
		mCan.elm.className="menuCanvasActive";
		
		newPos=indicator.attachTo(mEle,"Bottom","RightInner",myBox.innerBottom,0,"left");
		indicator.moveTo(newPos.top,newPos.left);
		
		newPos=mCan.attachTo(indicator,"Bottom","Left",dispTop,0,"left");
		// Browser dependent positioning---------
		if(is.b == "MSIE"){
			mCan.moveTo(newPos.top,newPos.left+14);
			} else if(is.b == "Safari") {
				mCan.moveTo(newPos.top+14,newPos.left);
				} else {
					mCan.moveTo(newPos.top,newPos.left);
					}
		//---------------------------------------
	}
	return indicator;
}

p.onMouseover=function(e) {
	this.menu.clearTimer();
}
p.onMouseout=function(e) {
	this.menu.startTimer();
}

function MenuCanvas() {
	var a=arguments;
	var menu=a[0];
	var index=a[1];
	var depth=a[2];
	var config=Menu.MergeConfig(a[3],MenuCanvas.Config);
	
	this.__className="MenuCanvas";
	extending(this,new DomObject(menu.getId()+"_MC"+index,config.canvas.plain));
	this.indicator=new DomObject(menu.getId()+"_indicator"+index,config.indicator.plain,'<img src="/images/menustreg.gif" border="0" alt="" width="8" height="1">');
	var self=this;
	this.indicator.onMouseover=function(e) {
		self.menu.clearTimer();
	}
	this.indicator.onMouseout=function(e) {
		self.menu.startTimer();
	}
	
	this.indicator.dominize();
	this.menu=menu;
	this.config=config;
	this.addProperty("index","number",index);
	this.addProperty("depth","number",depth);
	this.maxChildWidth=0;
	this.menu.addObserver(this,"final");
	this.setMouseEvents(true);
	this.indicator.setMouseEvents(true);


}
MenuCanvas.Config={
	'canvas': {
		plain:'menuCanvas',
		active:'menuCanvasActive',
		anchorV:'Center',
		anchorH:'Left',
		dir:'left'
		},
	'indicator' : {	
		plain	: 'menuIndicator',
		active	: 'menuIndicatorActive',
		anchorV:'Center',
		anchorH:'Left',
		dir		: 'left'
	}
}
/*
MenuCanvas.Config={
	'canvas': {
		plain:'',
		active:'',
		anchorV:'Center',
		anchorH:'Right',
		dir:'down'
		},
	'indicator' : {	
		plain	: 'menuIndicator',
		active	: 'menuIndicatorActive',
		anchorV:'Center',
		anchorH:'Right',
		dir		: 'down'
	}
}
*/
p=MenuCanvas.prototype;
MenuCanvas.counter=0;
p.restore=function() {
	this.elm.className=this.config.canvas.plain;
}

p.hideIndicator=function() {
	this.indicator.elm.className=this.config.indicator.plain;	
}

p.placeSubSection=function(mEle,mCan) {
	var myBox=this.getBox();
	var newPos;
	var dispLeft=0;
	var dispTop=0;
	var indicator=this.indicator;
	var menu=this.menu;
	var topEle;
	var children=mCan.children,dispBox;
	topEle=menu.active[0];
	if (children.getLength()>0) {
		dispBox=children.getAt(0).getBox();
		dispTop=-(dispBox.innerTop+Math.round(dispBox.height/2));
	}

	if (menu.children.findIndexOf(topEle)<menu.children.getLength()/2) {
		newPos=indicator.attachTo(mEle,"CenterInner","Right",0,0);
		if(is.b == "Safari"){
			indicator.moveTo(newPos.top+14,newPos.left);
			} else {
				indicator.moveTo(newPos.top,newPos.left);
				}
		indicator.elm.className="menuIndicatorActive";
		
		newPos=mCan.attachTo(indicator,"Center","Right",dispTop,dispLeft);
		// Browser dependent positioning---------
		if(is.b == "Safari"){
			mCan.moveTo(newPos.top+14,newPos.left);
		} else {
			mCan.moveTo(newPos.top,newPos.left);
			}
		//---------------------------------------
		mCan.elm.className="menuCanvasActive";
	} else {
		newPos=indicator.attachTo(mEle,"CenterInner","Left",0,0,"left");
		if(is.b == "Safari"){
			indicator.moveTo(newPos.top+14,newPos.left);
			} else {
				indicator.moveTo(newPos.top,newPos.left);
				}
		indicator.elm.className="menuIndicatorActive";
		
		newPos=mCan.attachTo(indicator,"Center","Left",dispTop,dispLeft,"left");
		// Browser dependent positioning
		if(is.b == "MSIE"){
			mCan.moveTo(newPos.top,newPos.left+14);
			} else if(is.b == "Safari") {
				mCan.moveTo(newPos.top+14, newPos.left);
				} else {
					mCan.moveTo(newPos.top,newPos.left);
					}
		mCan.elm.className="menuCanvasActive";
	}
	return indicator;
}

p.activateAgainst=function(mEle,depth) {
	var myBox=this.getBox();
	var dispBox;
	var dispLeft=0;
	var dispTop=0;
	var newPos;
	var children;
	var config_c=this.config.canvas;
	if (!depth) depth=0;
	switch (depth) {
		case 0:
			dispLeft=0;
			break;
		case 1:
		break;
		default:
			children=this.children;
			if (children.getLength()>0) {
				dispBox=children.getAt(0).getBox();
				dispTop-=(myBox.innerTop+(dispBox.height/2)+dispBox.innerTop);
			}
		break;
	}
	newPos=this.attachTo(mEle,config_c.anchorV,config_c.anchorH,dispTop,dispLeft,config_c.dir);
	this.moveTo(newPos.top,newPos.left)
	this.elm.className=config_c.active;
}
p.onfinal=function (e){
	//alert('here');
	var o=e.getSource();
	var child,children=this.children;
	var l=children.getLength();
	var lBox;
	for (var i=0;i<l;i++) {
		child=this.children.getAt(i);
		lBox=child.box;
		if (!lBox) lBox=child.getBox();
		this.maxChildWidth=Math.max(this.maxChildWidth,lBox.outerWidth);
		//alert(lBox.availWidth);
		//alert(this.maxChildWidth + ' | ' + lBox.offsetWidth);
		//alert(lBox);
	}
	this.setSize(this.maxChildWidth,null);
	for (var i=0;i<l;i++) {
		child=this.children.getAt(i);
		lBox=child.box;
		if (!lBox) lBox=child.getBox();
		if (lBox.outerWidth<this.maxChildWidth) {
			child.resizeBy(this.maxChildWidth-lBox.outerWidth,null);
		}
	}
}
p.onMouseover=function(e) {
	this.menu.clearTimer();
}
p.onMouseout=function(e) {
	this.menu.startTimer();
}

function MenuElement(menu,index,depth,content,cssClass) {
	this.__className="MenuElement";
	if (content) content=content;
	extending(this,new DomObject(menu.getId()+"_ME"+index,cssClass,content));
	this.menu=menu;
	this.addProperty("index","number",index);
	this.addProperty("depth","number",depth);
	this.addProperty("subCanvas","object",null,true);
	this.setMouseEvents(true);
}

MenuElement.Config= {
	
}
var p=MenuElement.prototype;

p.restore=function() {
	var mc;
	var mc_id;
	mc_id=this.menu.getId()+"_MC"+this.getIndex();
	if (mc=DomObject.all[mc_id]) {
		op=this.getParent();
		op.hideIndicator(this);
		mc.restore();
	}
	this.elm.className=this.getCssClassName();
	
}
p.onMouseover=function(e) {
	var o=e.getSource();
	var op,indicator,cls;
	var mc,idx,l;
	var depth=this.getDepth();
	var mc_id,menu=this.menu;
	
	menu.markActive(depth-1,this);
	cls=this.elm.className+"Active";
	this.elm.className=cls;
	mc_id=this.menu.getId()+"_MC"+this.getIndex();
	if (mc=DomObject.all[mc_id]) {
		op=o.getParent();
		indicator=op.placeSubSection(o,mc);
	}
	window.status="composite-"+this.getIndex()+".htm";
}

p.onMouseout=function(e) {
	window.status="";
//	document.getElementById("debug").innerHTML+="<br>Mouseout("+this.getId()+")["+e.origin.tagName+"]";
	this.menu.startTimer();
}
p.onMouseup=function(e) {
	var index=this.getIndex();
	document.location="composite-"+this.getIndex()+".htm";
}
p.ondominized=function(e) {
	var o=e.getSource();
	var lBox=o.getBox();
	var lWidth=null,lHeight=null;
	var lParent=o.getParent(),lPBox;
	if (lBox.offsetWidth<lBox.scrollWidth) {
		lWidth=lBox.scrollWidth;
	}
	if (lBox.offsetHeight<lBox.scrollHeight) {
		lHeight=lBox.scrollHeight;
	}
//	o.setSize(lWidth,lHeight);
}
p.onfinal=function(e) {
	
	//mc_id=this.menu.getId()+"_MC"+this.getIndex();
}

function getClassName(obj) {
	var s=obj.constructor.toString();
	var st =s.indexOf("function ")+9;
	var sl = s.indexOf("(");
	return s.substring(st,sl);;
}