function getEventTarget(evt)
{
	return (evt.target) 
		? evt.target
        : (evt.srcElement) 
		? evt.srcElement 
		: null;
}

function init ()
{
	panelsSetup();
}

/**********************************************/
/******* SETTINGS ****************************/

var _top_h = 27;
var _sub_h = 22;
/**********************************************/
/**********************************************/

var _z = 0;
var _intvl;
var _intvl_arr;

var _menu_open = false;

function panelsSetup()
{
	var panels = document.getElementById("SlidingVerticalMenu");

	var ypos = 0;
	var panel_btm = 0;
	var extra_panel = false;
	
	for (var i=0; i < _panels.length; i++)
	{
		// Create div to hold everything else:
		//
		var panel = document.createElement("div");
		
		panel.id = "panel-" + i;
		panel.className = "panel";

		// Create top expand/collapse bar:
		//
		var toptext = document.createElement("div");
		var topbtn = document.createElement("div");

		toptext.id = "paneltop-txt-" + i;
		topbtn.id = "paneltop-btn-" + i;

		toptext.className = "paneltop_txt";
		topbtn.className = "paneltop_btn_closed";
		
		toptext.innerHTML = _panels[i]['label'];

		var top = document.createElement("div");
		top.id = "paneltop-container-" + i;
		
		top.zIndex = _z;
		_z++;
		
		top.className = "paneltop";

		top.style.height = !BO["ie"]
			? (_top_h-1) + 'px'
			: _top_h;

		top.appendChild(toptext);
		top.appendChild(topbtn);

		//
		//top.onmouseover = function() { changePanelState(this) };
		//top.onclick = function() { getURL(this); };	
		top.onclick = _panels[i]['sub'] && _panels[i]['sub'].length > 0
			? function() { changePanelState(this) }
			: function() { getURL(this); };	
		//
		panel.appendChild(top);
			
		// Create lists
		//
		var ul = document.createElement("ul");
		
		ul.id = 'plist-' + i;
		ul.className = 'plist';

		var list = document.createElement("div");

		list.id = "panellist-" + i;
		list.className = "panellist";
		list.appendChild(ul);

		panel.appendChild(list);
		
		panels.appendChild(panel);
		
		// Populate global array:
		//
		_panels[i]['btn'] = top;
		_panels[i]['open'] = false;
	
		var sub_h = 0;
		
		if (_panels[i]['sub'])
		{
			for (var j=0; j < _panels[i]['sub'].length; j++)
			{
				appendList(i, j);
				
				sub_h += BO['ie']
                    ? _sub_h + 1
                    : _sub_h;
			}
		}
		
		panel.style.top = !BO["ie"]
			? ypos + 'px'
			: ypos;
			
		_panels[i]['h'] = _top_h + sub_h;
		_panels[i]['ypos'] = ypos;

		if ( ( ypos + _panels[i]['h'] ) > panel_btm)
		{
			panel_btm = ypos + _panels[i]['h'];
		}

		ypos += _top_h;
		
		if (i == _panels.length-1)
		{
			if (ypos < panel_btm)
			{
				var extra_panel = document.createElement("div");
				extra_panel.id = 'panel-' + (i+1);
				extra_panel.className = 'extra_panel';

				extra_panel.style.top = !BO["ie"]
					? ypos + 'px'
					: ypos;
				
				extra_panel.style.height = !BO["ie"]
					? (panel_btm-ypos)+12 + 'px'
					: (panel_btm-ypos)+12;

				extra_panel.zIndex = _z;
				_z++;
				
				panels.appendChild(extra_panel);
			}
		}
		
		panel.style.visibility = "visible";
	}
	
	if (extra_panel)
	{
		_panels[i] = new Array();
		_panels[i]['h'] = sub_h+12;
		_panels[i]['ypos'] = ypos;
	}
	
	if (_menu_open)
	{
		changePanelState(document.getElementById('paneltop-container-' + _menu_open));
	}
}

function appendList(panelnum, sub_id)
{
	var ul = document.getElementById('plist-' + panelnum);
	var li = document.createElement("li");

	li.style.height = !BO["ie"]
		? (_sub_h-1) + 'px'
		: _sub_h;

	li.onmouseover = function() { this.className = 'hover'; };	
	li.onmouseout = function() { this.className = ''; };	
	li.onclick = function() { getURL(this); };	

	var p = document.createElement('p');
	p.id = 'plabel-' + panelnum + '-' + sub_id;
	
	var label = document.createTextNode(_panels[panelnum]['sub'][sub_id]['label']);

	p.appendChild(label);
	li.appendChild(p);
	ul.appendChild(li);
	
	_panels[panelnum]['sub'][sub_id]['li'] = li;
	_panels[panelnum]['sub'][sub_id]['p'] = p;
}

function changePanelState(el)
{
	var spl = el.id.split('-');
	
	if (spl[1] != 'container')
	{
		return;
	}
	
	var panelnum = spl[2];
	
	if (!_panels[panelnum]['sub'])
	{
		return;
	}

	mouseoverState('off');
	
	var post = false;
	var open = false;
	var dif = 0;
	
	_intvl_arr = new Array();
	
	for (var i=0; i < _panels.length; i++)
	{
		var distance = 0;
		var panel = document.getElementById('panel-' + i);
		var open = false;
		
		if (i == panelnum)
		{
			if (_panels[i]['open'])
			{
				//
				//mouseoverState('on');
				mouseoverState('off');
				//
				return;
			}
			else
			{
				_panels[i]['open'] = true;
				
				var btn = document.getElementById("paneltop-btn-" + i);
				btn.className = "paneltop_btn_open";
			
				open = true;
			}
		}
		else
		{
			if (_panels[i]['open'])
			{
				open = true;
			}
			
			_panels[i]['open'] = false;
			
			var btn = document.getElementById("paneltop-btn-" + i);
			
			if (btn)
			{
				btn.className = "paneltop_btn_closed";
			}
		}

		if (post)
		{
			var ypos = _panels[i]['ypos'] + dif;

			if (panel.offsetTop > ypos)
			{
				distance = panel.offsetTop - ypos;
			}
			else if (panel.offsetTop < ypos)
			{
				distance = ypos - panel.offsetTop;
			}
			
			_panels[i]['ypos'] = ypos;
		}
		else
		{
			if (i == panelnum)
			{
				post = true;
			}

			var ypos = _panels[i]['ypos'] + dif;
			
			if (panel.offsetTop > ypos)
			{
				distance = panel.offsetTop - ypos;
			}
			else if (panel.offsetTop < ypos)
			{
				distance = ypos - panel.offsetTop;
			}

			_panels[i]['ypos'] = ypos;
		}

		if (distance > 0)
		{
			_intvl_arr.push(i);
		}
		
		if (open)
		{
			if (i != panelnum)
			{
				dif = dif - ( _panels[i]['h'] - _top_h );
			}
			else
			{
				dif = dif + ( _panels[i]['h'] - _top_h );
			}
		}
		
		open = false;
	}
	
	_intvl = setInterval('move()', 2);
}

function mouseoverState(status)
{
	// enable/disable mouseover events
	
	for (var i=0; i < _panels.length; i++)
	{
		if (_panels[i]['btn'])
		{
			_panels[i]['btn'].onmouseover = status == 'on'
				? function() { changePanelState(this); }
				: null;
		}
	}
}

function move()
{
	var speed = 4;
	
	for (var i=0; i < _intvl_arr.length; i++)
	{
		var panel = document.getElementById('panel-' + _intvl_arr[i]);
		var hit_targ = false;

		
		if ( panel.offsetTop  < _panels[_intvl_arr[i]]['ypos'] )
		{
			var dif = _panels[_intvl_arr[i]]['ypos'] - panel.offsetTop;
			
			if (dif < speed)
			{
				hit_targ = true;
			}
			else
			{
				panel.style.top = !BO["ie"]
					? ( panel.offsetTop + speed ) + 'px'
					: ( panel.offsetTop + speed );
			}
		}
		else if ( panel.offsetTop > _panels[_intvl_arr[i]]['ypos'] )
		{
			var dif = panel.offsetTop - _panels[_intvl_arr[i]]['ypos'];
			
			if (dif < speed)
			{
				hit_targ = true;
			}
			else
			{
				panel.style.top = !BO["ie"]
					? ( panel.offsetTop - speed ) + 'px'
					: ( panel.offsetTop - speed );
			}
		}
		else
		{
			hit_targ = true;
		}
		
		if (hit_targ)
		{
			panel.style.top = !BO["ie"]
				? _panels[_intvl_arr[i]]['ypos'] + 'px'
				: _panels[_intvl_arr[i]]['ypos'];
			
			var clear = true;
			
			_intvl_arr.splice(i, 1);

			if (_intvl_arr.length > 0)
			{
				i--;
			}
			else
			{
				clearInterval(_intvl);
				//
				//mouseoverState('on');
				mouseoverState('off');
				//
				return;
			}
		}
	}
}

function getURL(el)
{
	if (el.tagName != 'LI')
	{
		// top button clicked:
		var spl = el.id.split('-');
		document.location = _panels[spl[2]]['url'];
	}
	else
	{
		// submenu button clicked:
		var li = el;
		
		while (el.tagName != 'UL')
		{
			el = el.parentNode;
		}
		
		var spl = el.id.split('-');

		var idx = false;
		
		for (var i=0; i < el.childNodes.length; i++)
		{
			if (el.childNodes[i] == li)
			{
				idx = i;
			}
		}

        // do we need a ? or a & for the GET parameters?
        var sep = _panels[spl[1]]['sub'][idx]['url'].indexOf('?') == -1
            ? '?'
            : '&';

        document.location = _panels[spl[1]]['sub'][idx]['url'] + sep + "menu=" + spl[1];
	}
}
