var lnkMenu = new Class({
	Implements:Options,
	
	options:{
		clickToOpen:false,
		openDelay:150,
		closeDelay:500,
		duration:250,
		link:'cancel',
		transition:Fx.Transitions.linear,
		mode:'horizontal'
	},

	initialize: function(menu,options){
		this.menu = menu;
		this.setOptions(options);
		if(this.options.mode != 'horizontal' && this.options.mode != 'vertical'){
			this.options.mode = 'horizontal';
		}
		
		if(Browser.Engine.webkit){
			window.addEvent('domready',this.domReady.delay(200,this));
		}else{
			window.addEvent('domready',this.domReady.bind(this));
		}
	},
	
	domReady:function(){
		this.menu = $(this.menu);
		if(!$defined(this.menu)){
			return false;
		}
		
		if(this.menu.get('tag')!='ul'){
			this.menu = this.menu.getElement('ul');
			if(!$defined(this.menu)){
				return false;
			}
		}
		
		if(this.menu.getStyle('direction') == 'rtl' || $(document.body).getStyle('direction') == 'rtl'){
			this.rtl = true;
			if(Browser.Engine.trident && $(document.body).getStyle('direction') == 'rtl'){
				this.menu.getParent().setStyle('direction','ltr');
				this.menu.setStyle('direction','rtl');
			}
		}
		
		this.menu.setStyles({
			visibility:'hidden',
			display:'block',
			overflow:'hidden',
			height:0,
			marginLeft:(Browser.Engine.trident?1:-1)
		});
		
		this.createSubmenu(this.menu);
		
		if(this.options.mode=='horizontal'){
			this.menu.getChildren('li').setStyles({
				'float':(this.rtl?'right':'left'),
				display:'block',
				top:0
			});
		
			
			var clear = new Element('li',{
				html:"&nbsp;",
				styles:{
					clear:(this.rtl?'right':'left'),
					display:(Browser.Engine.trident?'inline':'block'), 
					position:'relative',
					top:0,
					height:0,
					width:0,
					fontSize:0,
					lineHeight:0,
					margin:0,
					padding:0
				}
			}).inject(this.menu);
		}else{
			this.menu.getChildren('li').setStyles({
				display:'block',
				top:0
			});
		}
		this.menu.setStyles({
			height:'auto',
			overflow:'visible',
			visibility:'visible'
		});
		
		this.menu.getElements('a').setStyle('display',(Browser.Engine.trident?'inline-block':'block'));
	},
	
	createSubmenu:function(ul){
		
		var LIs = ul.getChildren('li');
		var offset = 0;
		
		LIs.each(function(li){
			li.setStyles({
				position:'relative',
				display:'block',
				top:-offset,
				zIndex:1
			});
			offset += li.getSize().y;
			var innerUl = li.getFirst('ul');
			
			if($defined(innerUl)){
				innerUl.setStyle('display','none');
				
				if(ul == this.menu && this.options.mode == 'horizontal'){
					var x = 0;
					var y = li.getSize().y;
					this.options.link='cancel';
					li.store('animation',new Fx.Elements($$(innerUl,innerUl.getChildren('li')).setStyle('opacity',0),this.options));
				
				}else{
					var x = li.getSize().x-(this.rtl&&!Browser.Engine.trident?2:1)*li.getStyle('border-left-width').toInt();
					var y = -li.getStyle('border-bottom-width').toInt();
					this.options.link='chain';
					li.store('animation',new Fx.Elements($$(innerUl,innerUl.getChildren('li')).setStyle('opacity',0),this.options));
					offset=li.getSize().y+li.getPosition(this.menu).y;
				}
				innerUl.setStyles({
					position:'absolute',
					display:'block',
					top:-18,
					opacity:0
				});
				if(this.rtl){
					innerUl.setStyles({
						right:x,
						marginRight:-x
					});
				}else{
					innerUl.setStyles({
						left:120,
						marginLeft:-x
					});
				}
				
				this.createSubmenu(innerUl);
				
				if(this.options.clickToOpen){
					li.addEvents({
						click:function(e){
							e.stop();
							$clear(li.retrieve('closeDelay'));
							this.showChildList(li);
						}.bind(this),
						mouseenter:function(){
							$clear(li.retrieve('closeDelay'));
						}.bind(this)
					});
				}else{
					li.addEvent('mouseenter',function(){
						$clear(li.retrieve('closeDelay'));
						li.store('openDelay',this.showChildList.delay(this.options.openDelay,this,li));
					}.bind(this));
				}
				li.addEvent('mouseleave', function(){
					$clear(li.retrieve('openDelay'));
					li.store('closeDelay',this.hideChildList.delay(this.options.closeDelay,this,li));
				}.bind(this)).addClass((this.options.mode=='horizontal'&&ul == this.menu?'submenu-down':'submenu-left'));
			}
		},this);
	},
	
	
	showChildList:function(li){
		var ul = li.getFirst('ul');
		var LIs =  $$(ul.getChildren('li'));
		var animation = li.retrieve('animation');
		
		if(li.getParent('ul')!=this.menu || this.options.mode == 'vertical'){
			animation.cancel();
			var anim ={
				0:{
					opacity:1
				},
				1:{
					opacity:1
				}
			};
			if(this.rtl){
				anim[0]['marginRight'] = 0;
			}else{
				anim[0]['marginLeft'] = 0;
			}
			animation.start(anim);
			var animobject={};
		
		}else{
			var animobject = {0:{opacity:1}};
		}
		LIs.each(function(innerli,i){
			animobject[i+1]={
				top:0,
				opacity:1
			};
		});
		li.setStyle('z-index',99);
		animation.start(animobject);
	},
	
	
	hideChildList:function(li){
		var animation = li.retrieve('animation');
		var ul = li.getFirst('ul');
		var LIs =  $$(ul.getChildren('li'));
		var offset = 0;
		var animobject={};
		LIs.each(function(innerli,i){
			animobject[i+1]={
				top:-offset,
				opacity:0
			};
			offset += innerli.getSize().y;
		});
		li.setStyle('z-index',1);
		
		if(li.getParent('ul')!=this.menu || this.options.mode == 'vertical'){
			animobject[1]=null;
			animation.cancel();
			animation.start(animobject);
			var anim = {
				0:{
					opacity:0
				},
				1:{
					opacity:0
				}
			};
			
			if(this.rtl){
				anim[0]['marginRight'] = -ul.getSize().x;
			}else{
				anim[0]['marginLeft'] = -ul.getSize().x;
			}
			animation.start(anim);
		
		}else{
			animobject[0]={opacity:0};
			animation.start(animobject);
		}
	}
});
