//24.09.2008 menu_level
function menu_level(root, items, settings, iterators, vars){
	this.elem = this.root = this.parent = root;
	this.elem.model = this;
	this.items = items;
	this.settings = this.init_settings(settings);
	this.iterators = this.init_iterators(iterators);
	this.vars = vars || {};
	this.init_events();

	this.root_clone = this.root.cloneNode(false);

	this.here_item = null;
	this.item_pattern = null;
	this.elem = this.iterate(this.elem, 'level');

	this.init();
}
Object.extend(menu_level.prototype, default_prototype_functions);//init_events, init_settings, init_iterators, iterate
menu_level.prototype.init = function(){
	this.items.each(this.init_item.bind(this));
};
menu_level.prototype.init_item = function(item, ind){
	if(!this.item_pattern){
		this.create_pattern(item);
	}
	if(!this.PARENT){
		this.parent = $Node(item.parentNode) || this.elem;
		this.PARENT = true;
	}
	if(item.hasClass(this.settings.hereClass)){
		this.set_here(item);
	}
	item.index = ind;
	item.model = this;
	item.parent = this.elem;
	Object.extend(item, this.constructor.item_funcs);
	item = this.iterate(item, "item");
	return item;
};
menu_level.prototype.set_here = function(item){
	item.HERE = 1;
	item.addClass(this.settings.hereClass);
	this.here_item = item;
};
menu_level.prototype.unset_here = function(item){
	item.HERE = 0;
	item.removeClass(this.settings.hereClass);
	this.here_item = null;
};
menu_level.prototype.create_pattern = function(item){
	this.item_pattern = $Node(item.cloneNode(true));
	this.unset_here(this.item_pattern);
};
menu_level.prototype.select = function(item){
	if(this.here_item && item != this.here_item){
		this.deselect(this.here_item);
	}
	return this._select(item);
};
menu_level.prototype._select = function(item){
	this.set_here(item);
}
menu_level.prototype.deselect = function(item){
	this.unset_here(item);
};
menu_level.prototype.toggle = function(item){
	if(item.HERE){
		this.deselect(item);
	}else{
		this.select(item);
	}
};
menu_level.prototype.reinit = function(items){
	this.items = items;
	this.here_item = null;
	this.item_pattern = null;
	this.init();
};
menu_level.prototype.add_item = function(item, pos){
	this.dom_add(item, pos);
	this.items.insert(item, pos);
	this.init_item(item);
};
menu_level.prototype.remove_item = function(item){
	this.items.remove_v(item);
	this.dom_remove(item);
};
menu_level.prototype.dom_add = function(item, pos){
	if(typeof pos == "undefined"){
		this.parent.app(item);
	}else{
		var b_item = this.items[pos];
		if(b_item){
			this.parent.prep(item, b_item);
		}else{
			this.parent.app(item);
		}
	}
};
menu_level.prototype.dom_remove = function(item){
	this.parent.remove(item);
};
menu_level.prototype.rename_item = function(item, name){
	item.print(name, 1);
};
menu_level.prototype.replace_item = function(item, pos){
	this.dom_add(item, pos);
	this.items.replace(item, pos);
};
menu_level.prototype.create_item = function(){
	return $Node(this.item_pattern.cloneNode(true));
};
menu_level.prototype._events = [
	{name: "select", type: "before", func_name: "_select"}, 
	{name: "deselect", type: "before", func_name: "deselect"},
	{name: "afterinsert", type: "after", func_name: "add_item"},
	{name: "afterremove", type: "after", func_name: "remove_item"},
	{name: "insert", type: "before", func_name: "add_item"},
	{name: "remove", type: "before", func_name: "remove_item"},
	{name: "replace", type: "after", func_name: "replace_item"}
];
menu_level.prototype.__name = "menu_level";
menu_level.item_funcs = {
	before: function(){
		return this.model.items.before(this);
	},
	after: function(){
		return this.model.items.after(this);	
	},
	next: function(LOOP){
		return this.model.items.next(this, LOOP);
	},
	previous: function(LOOP){
		return this.model.items.previous(this, LOOP);
	},
	select: function(){
		return this.model.select(this);
	}
};
menu_level.__default = {
	hereClass: "here",
	hoverClass: "hover",
	mergeVars: false
};
menu_level.def_item_onclick = function(e){
	stopPropagation(e || window.event);
	return this.model.select(this);
};
menu_level.copyListeners = function(level1, level2){
	level1._events.each(function(obj){
		var d_event1 = level1['on' + obj.name];
		var d_event2 = level2['on' + obj.name];
		DOMEvent.copyListeners(d_event1, d_event2);
	});
};
menu_level.HELP = {
	iterators: {
		table_cell_click: {
			name: "table cell click",
			func: function(row){
				if(!row._cells){
					row._cells = $T("TD", row);
				}
				row._cells.each(function(cell){
					cell.onclick = menu_level.def_item_onclick.bind(row);
				});
				return row;
			}
		},
		default_click: {
			name: "default click",
			func: function(item){
				item.onclick = function(){
					return this.model.select(this);
				};
				return item;
			}
		},
		table_hover: {
			name: "table hover",
			func: function(row){
				if(!row._cells){
					row._cells = $T("TD", row);
				}
				row._cells.each(function(cell){
					cell.onmouseover = function(){
						if(!this.HERE){
							this.addClass(this.model.settings.hoverClass);
						}
					}.bind(row);
					cell.onmouseout = function(){
						this.removeClass(this.model.settings.hoverClass);					
					}.bind(row);
				});
				return row;
			}
		}
	}
};
menu_level.__iterators = {
	item: [menu_level.HELP.iterators.default_click],
	level: []
};
