var TridentFix = new Class({
	tridentFix: function(item){
		item.addEvents({
			'mouseover':function(){
				this.addClass('iehover');
			},
			'mouseout':function(){
				this.removeClass('iehover');
			}
		});
	}
});

var DropMenu = new Class({
	Implements: [Options,TridentFix],
	options: {
		mode: 'vertical'
	},
	menu: null,
	initialize: function(menu,options){
		if(options) this.setOptions(options);
		this.menu = $(menu);
		if (this.menu) {
			var children = this.menu.getChildren();
			children.each(function(item,index){
				var fChild, list;
				list = fChild.getNext('ul');
				if(Browser.Engine.trident) this.tridentFix(item);
				if(list){
					item.mel = list;
					list.pel = item;
					new SubMenu(list);
				}
			},this);
		}
	}	
});

var SubMenu = new Class({
	Implements: [Options,TridentFix],
	options: {
		mode: 'horizontal'
	},
	menu: null,
	depth: 0,
	initialize: function(el,depth,options){
		if(options) this.setOptions(options);
		if(depth) this.depth = depth;
		this.menu = el;
		if(this.depth == 0)	this.menu.addClass('submenu');
		if(this.depth >= 1)	this.menu.addClass('sub_submenu');
		this.menu.fade('hide');
		this.menu.pel.addEvents(this.parentEvents);
		var children = this.menu.getChildren();
		children.each(function(item,index){
			var fChild, list;
			fChild = item.getFirst();
			list = fChild.getNext('ul');
			if(Browser.Engine.trident) this.tridentFix(item);
			if(list){
				var count = new Element('span').set('html','\&raquo;').addClass('counter');
				item.adopt(count);
				count.fade('hide');
				item.mel = list;
				item.count = count;
				list.pel = item;
				new SubMenu(list,this.depth+1);
			}
		},this);
	},
	
	parentEvents: {
		'mouseover': function(){
			if(this.count)
			this.count.get('fade', {property: 'in', duration: 'long'}).start(0);
			this.mel.get('fade', {property: 'in', duration: 'long'}).start(0);			
		},
		'mouseout': function(){
			if(this.count)
			this.count.get('fade', {property: 'out', duration: 'long'}).start(1);
			this.mel.get('fade', {property: 'out', duration: 'long'}).start(1);
		}
	}
});