// ================================================== Panel handling code
var _panelobj = null;
var _panelcaller = null;
var _paneliframe = null;
var _panelhasiframe = 0;
var _panelcaller_ct = 0;
var _panel_event_type = null;

function showpanel(elem, name, event, use_right) {
	// we need to know what event type triggered the showpanel action:
	if(!event) {
		event = window.event;
	}
	var event_type = 'click';
	if(event != null) {
		event_type = event.type;
	}

	// we turn off any mouseover triggered panels if there is currently a panel
	// open which was triggered by a click:
	if(event_type == 'mouseover' && _panel_event_type != null && _panel_event_type == 'click') {
		return false;
	}

	// hide any currently open panels:
	if ( _panelobj != null) {
		var curName = _panelobj.id;
		hidepanel();
		if(curName == name) {
			return;
		}
	}
	_panel_event_type = event_type;
	_panelobj = document.getElementById(name);
	if(_panelobj == null) {
		return false;
	}
// 	if(typeof(panel_show_callback) == 'function') {
// 		panel_show_callback(_panelobj.id);
// 	}
	
	initPanel();
	var elem_pos = getPosition(elem);
	
	var width_offest = 0;
	if(use_right != null) {
		width_offest = elem_pos.width;
	}
	
	_panelobj.style.top		= parseInt(elem_pos.top) + 'px';
	_panelobj.style.left	= parseInt(elem_pos.left + width_offest) + 'px';

	positionIFrame(name);

	// add the event handlers to handle click-off and mouseout events:
	addClickOff_handler(event_type);
	
	_panelcaller = elem;
	
	return false;
}

function hidepanel() {
	if(typeof(panel_hide_callback) == 'function') {
		panel_hide_callback(_panelobj.id);
	}
	if(_panelobj == null) {
		return false;
	}
	_panelobj.style.left = '-1000px';
	_panelobj = null;
	if(_panelhasiframe == 1 || _paneliframe != null ) {
		_paneliframe.style.left = '-1000px';
	}
	clearOff_handlers();
	_panelcaller_ct = 0;
	_panelcaller = null;
	_panel_event_type = null;
	
	return false;
}

function getPosition(elem) {
	var _pos = { top: 0, left: 0, width: 0, height: 0 };
	var stopLeft = 0;
	var stopTop = 0;
	if(elem.offsetParent) {
		_pos.width = parseInt(elem.offsetWidth);
		_pos.height = parseInt(elem.offsetHeight);
		do {
			if(elem.currentStyle && elem.currentStyle.position == 'absolute') {
				// in order to defeat a strange IE bug with offsets on absolutely positioned
				// items, we have to stop incrementing the offset in certain situations...
				// ie is the only browser that supports "currentStyle" so we'll use that
				// along with some voodoo to get the correct coordinates.
				_pos.left += elem.offsetLeft;
				_pos.top += elem.offsetTop;
				if(!stopLeft && elem.currentStyle.left == 'auto') {
					stopLeft = 1;
				}
				if(!stopTop && elem.currentStyle.top == 'auto') {
					stopTop = 1;
				}
			}
			else {
				if(stopLeft == 0) {
					_pos.left += elem.offsetLeft;
				}
				if(stopTop == 0) {
					_pos.top += elem.offsetTop;
				}
			}
		} while(elem = elem.offsetParent);
	}
	return _pos;
}

/* if there's an iframe for the panel we'll position it after determining the 
   coords of the panel.  The iframe is used to correct a display bug in IE
   that draws "select" elements over html elements.
   The iframe may not exist in the document however, so we set a flag if we've
   attempted to find it. */
function positionIFrame(name) {
	if(_panelhasiframe == 0 || _paneliframe == null || _panelobj == null) {
		return;
	}
	var top_modifier = 0;
	var sizeElem = document.getElementById(name + '_content');
	if(sizeElem) {
		_paneliframe.style.width	= parseInt(sizeElem.offsetWidth) + 'px';
		_paneliframe.style.height	= parseInt(sizeElem.offsetHeight) + 'px';
		top_modifier = parseInt(sizeElem.offsetTop);
	}
	else {
		if(_panelobj.offsetTop != null) {
			top_modifier = parseInt(_panelobj.offsetTop);
		}
		_paneliframe.style.width	= parseInt(_panelobj.offsetWidth) + 'px';
		if(top_modifier < _panelobj.offsetHeight) {
			_paneliframe.style.height	= (parseInt(_panelobj.offsetHeight) - top_modifier) + 'px';
		}
		else {
			_paneliframe.style.height	= parseInt(_panelobj.offsetHeight) + 'px';
		}
	}
	_paneliframe.style.top		= parseInt(_panelobj.style.top + top_modifier) + 'px';
	_paneliframe.style.left	= parseInt(_panelobj.style.left) + 'px';
}


function dump(obj, nonempty) {
	if(nonempty == null) {
		nonempty = 0;
	}
	var str = '';
	for(var i in obj) {
		if(!nonempty || obj[i]) {
			str += i + ': ' + obj[i] + "; ";
		}
	}
	alert(str);
}


/* Init each panel - we need to ensure the panel is not placed inside a
   position=relative parent, which would shift the positioning of the panel.
   To counteract this we pull the panel out of the document and re-insert it
   as the very last child of the body.
   We set a classname on the panel to show that we've called init on the panel */
function initPanel() {
	if(_panelobj == null) {
		return;
	}
	if(_panelobj.className.match('initpanel')) {
		return;
	}
	if(_panelhasiframe == 0 && _paneliframe == null) {
		_paneliframe = document.getElementById('paneliframe');
		
		if(_paneliframe != null) {
			_panelhasiframe = 1;
		}
	}
	var body = document.getElementsByTagName('BODY').item(0);
	body.appendChild(_panelobj);
	_panelobj.className += ' initpanel';
}

function nullEvent(e) {
	if(!e) {
		e = window.event;
	}
	e.cancelBubble = true;
	if(e.stopPropagation) {
		e.stopPropagation();
	}
}
function addClickOff_handler(event_type) {
	var _extra_handler = null;
	if(event_type == 'mouseover') {
		_extra_handler = panel_mouseOff_handler;
	}
	if(window.attachEvent) {
		// ie needs the event attached to an actual element, so window doesn't work:
		var html = document.getElementsByTagName('HTML').item(0);
		html.attachEvent('onclick',panel_clickOff_handler);
		if(_extra_handler != null) {
			html.attachEvent('onmouseout',_extra_handler);
		}
	}
	else {
		window.addEventListener('click',panel_clickOff_handler,false);
		if(_extra_handler != null) {
			window.addEventListener('mouseover',_extra_handler,false);
		}
	}

	return false;
}

function clearOff_handlers() {
	if(window.detachEvent) {
		var html = document.getElementsByTagName('HTML').item(0);
		html.detachEvent('onclick',panel_clickOff_handler);
		html.detachEvent('onmouseout',panel_mouseOff_handler);
	}
	else {
		window.removeEventListener('click',panel_clickOff_handler,false);
		window.removeEventListener('mouseover',panel_mouseOff_handler,false);
	}
}


function panel_clickOff_handler(e) {
	if(_panelobj != null) {
		var targ;
	
		if(!e) {
			var e = window.event;
		}
		_panelcaller_ct += 1;
		if(_panelcaller_ct == 1) {
		
			e.cancelBubble = true;
			if(e.stopPropagation) {
				e.stopPropagation();
			}
			return false;
		}
		if(e.target) {
			targ = e.target;
		}
		else if(e.srcElement) {
			targ = e.srcElement;
		}
		if(targ.nodeType == 3) { // safari adjustment
			targ = targ.parentNode;
		}
		var elem = targ;
		var in_elem = 0;
		if(elem.parentNode) {
			do {
				if(elem.id != null && elem.id == _panelobj.id) {
					in_elem = 1;
				}
			} while(elem = elem.parentNode);
		}
		if(!in_elem) {
			hidepanel();
		}
	}
	
	if(_panel_prevOnClick != null && typeof(_panel_prevOnClick) == 'function') {
		return _panel_prevOnClick();
	}
}

function panel_mouseOff_handler(e) {
	if(_panelobj != null) {
		var targ;
	
		if(!e) {
			e = window.event;
		}
		_panelcaller_ct += 1;
		if(_panelcaller_ct == 1) {
		
			e.cancelBubble = true;
			if(e.stopPropagation) {
				e.stopPropagation();
			}
			return false;
		}
		if(e.target) {
			targ = e.target;
		}
		else if(e.srcElement) {
			targ = e.srcElement;
		}
		if(targ.nodeType == 3) { // safari adjustment
			targ = targ.parentNode;
		}
		var elem = targ;
		var in_elem = 0;
		if(elem.parentNode) {
			do {
				if(elem.id != null && elem.id == _panelobj.id) {
					in_elem = 1;
				}
			} while(elem = elem.parentNode);
		}
		if(!in_elem) {
			hidepanel();
		}
	}
	
	if(_panel_prevOnMouseOut != null && typeof(_panel_prevOnMouseOut) == 'function') {
		return _panel_prevOnMouseOut();
	}
}
var _panel_prevOnClick = window.onclick;
var _panel_prevOnMouseOut = window.onmouseout;
