function slidemenu(){
	speed = 15;
	step = 32;
}
slidemenu.prototype = {
	speed: null,
	step: null,
	initialdelay: 2000,
	_queue: [],
	_sliding: 0,
	expandtext: "+",
	collapsetext: "-",
	expandclass: null,
	collapseclass: null,
	selectedexpandclass: null,
	selectedcollapseclass: null,
	onmouseoverexpandclass: null,
	onmouseovercollapseclass: null,
	selectedonmouseoverexpandclass: null,
	selectedonmouseovercollapseclass: null,
	
	_getElementPosition: function(element) { 
		var coords = { x: 0, y: 0 }; 
		while (element) { 
			coords.x += element.offsetLeft; 
			coords.y += element.offsetTop; 
			element = element.offsetParent; 
		} 
		return coords; 
	},
	
	_expand: function(_elementid, _spacer, _h){
		var _element = document.getElementById(_elementid);
		var _height = _element.offsetHeight;
		_element.style.clip="rect(auto auto " + _h + " auto)";
		_spacer.style.height = _h;
		for(var i=0; i < sublists.length; i++){
			var _pos = this._getElementPosition(sublists[i].spacer);
			document.getElementById(sublists[i].sublistid).style.top = _pos.y;
		}
		if(_h < _height){
			var th = this;
			window.setTimeout(function(){
				var _step = step;
				if(_h+step > _height){
					_step = _height - _h;
				}
				th._expand(_elementid, _spacer, _h + _step);
			},speed);
			
		}else{
			this._sliding--;
			this._next();
		}
	},
		
	_collapse: function(_elementid, _spacer, _h){
		var _element = document.getElementById(_elementid);
		var _height = _element.offsetHeight;
		_element.style.clip="rect(auto auto " + _h + " auto)";
		_spacer.style.height = _h;
		for(var i=0; i < sublists.length; i++){
			var _pos = this._getElementPosition(sublists[i].spacer)
			document.getElementById(sublists[i].sublistid).style.top = _pos.y;
		}
		if(_h > 0){
			var th = this;
			window.setTimeout(function(){
				var _step = step;
				if(_h - step < 0){
					_step = _h;
				}
				th._collapse(_elementid, _spacer, _h - _step);
			},this.speed);
			
		}else{
			this._getsubmenurow(_element).style.display = "none";
			this._sliding--;		
			this._next();
		}
	},
	
	_next: function(){
		//status = "next queue.length="+_queue.length+" s="+_sliding;
		if(this._sliding == 0 && this._queue.length > 0){
			var _elementid = this._queue[0].elementid;
			var _spacer = this._queue[0].spacer;
			var _element = document.getElementById(_elementid);
			if(this._queue[0].collapse){
				if(!_element.collapsed){	
					this._setexpandbutton(_element._buttonid);		
					_element.collapsed=true;
					this._sliding++;
					this._collapse(_elementid, _spacer, _element.offsetHeight);
				}
			}else{
				if(_element.collapsed){
					this._setcollapsebutton(_element._buttonid);
					this._getsubmenurow(_element).style.display = "";
					_element.collapsed=false;
					this._sliding++;
					this._expand(_elementid, _spacer, 0);
				}
			}
			this._queue.splice(0,1);
		}
	},
	
	expand: function(_elementid, _spacer){
		this._queue[this._queue.length]={
			elementid: _elementid,
			spacer: _spacer,
			collapse: false
		}
		this._next();
	},

	collapse: function(_elementid, _spacer){
		this._queue[this._queue.length]={
			elementid: _elementid,
			spacer: _spacer,
			collapse: true
		}
		this._next();
	},
	_setcollapsebutton: function(_buttonid){
		var btn = document.getElementById(_buttonid);
		btn.value = this.collapsetext;
		if(btn._selected && this.selectedcollapseclass){
			btn.className = this.selectedcollapseclass;
		}else if(this.collapseclass){
			btn.className = this.collapseclass;
		}
	},
	_setexpandbutton: function(_buttonid){
		var btn = document.getElementById(_buttonid);
		btn.value = this.expandtext;
		if(btn._selected && this.selectedexpandclass){
			btn.className = this.selectedexpandclass;
		}else if(this.expandclass){
			btn.className = this.expandclass;
		}
	},
	onmouseoverhandler: function(_button){
		if(document.getElementById(_button._elementid).collapsed){
			if(_button._selected && this.selectedonmouseoverexpandclass){
				_button.className = this.selectedonmouseoverexpandclass;
			}else if(this.onmouseoverexpandclass){
				_button.className = this.onmouseoverexpandclass;
			}
		}else{
			if(_button._selected && this.selectedonmouseovercollapseclass){
				_button.className = this.selectedonmouseovercollapseclass;
			}else if(this.onmouseovercollapseclass){
				_button.className = this.onmouseovercollapseclass;
			}
		}
	},
	onmouseouthandler: function(_button){
		if(document.getElementById(_button._elementid).collapsed){
			this._setexpandbutton(_button.id);
		}else{
			this._setcollapsebutton(_button.id);
		}
	},
	onmenuclickhandler: function(_id){
		if(this._sliding == 0){
			for(var i=0;i < sublists.length; i++){
				if(sublists[i].sublistid != _id){
					if(!document.getElementById(sublists[i].sublistid).collapsed){
						this.collapse(sublists[i].sublistid, sublists[i].spacer);
					}
				}
			}
			for(var i=0;i < sublists.length; i++){
				if(sublists[i].sublistid == _id){
					if(document.getElementById(sublists[i].sublistid).collapsed){
						this.expand(sublists[i].sublistid, sublists[i].spacer);
					}else{
						this.collapse(sublists[i].sublistid, sublists[i].spacer);
					}
					break;
				}
			}
		}
		return false;
	},
	_getsubmenurow: function(_element){
		var _row = _element;
		while (_row && _row.tagName != "TR") { 
			_row = _row.parentNode; 
		}
		return _row;
	},
	init: function(){
		if (document.getElementById && document.createElement){
			var th=this;
			for(var i=0;i < sublists.length; i++){
				var _elementid = sublists[i].sublistid;
				var _element = document.getElementById(_elementid);
				this._getsubmenurow(_element).style.display = "none";
				var _div = document.createElement("DIV");
				_element.parentNode.appendChild(_div);
				_div.style.height = 0; 
				_div.style.fontSize = 0;			
				sublists[i].spacer = _div;
				var btn = document.getElementById(sublists[i].buttonid);
				btn._elementid = _elementid;
				/// hide buttons
				btn.style.display = "none";
				btn.parentNode.style.display = "none";
				//for(o in btn.parentNode.nextSibling.style)
				//alert(o);//.style.width = parseInt(btn.parentNode.style.width)+parseInt(btn.parentNode.nextSibling.style.width)+"px";
				///
				_element._buttonid = btn.id;
				btn._selected = sublists[i].selected;
				btn.onclick = function(){
					th.onmenuclickhandler(this._elementid);
				};
				btn.onmouseover = function(){
					th.onmouseoverhandler(this);
				}
				btn.onmouseout = function(){
					th.onmouseouthandler(this);
				}
				this._setexpandbutton(sublists[i].buttonid);
				_element.style.position = "absolute";
				_element.collapsed=true;	
			}		
			window.setTimeout(function(){
				for(var i=0;i < sublists.length; i++){
					var _elementid = sublists[i].sublistid;
					var _element = document.getElementById(_elementid);
					var selected = sublists[i].selected
					if(selected && _element.collapsed){
						th.onmenuclickhandler(_elementid);			
					}
				}
			},this.initialdelay);
		}
	}
}

