function getElementStyle(elem, IEStyleProp, CSSStyleProp) {
    if (elem.currentStyle) {
        return elem.currentStyle[IEStyleProp];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(elem, "");
        return compStyle.getPropertyValue(CSSStyleProp);
    }
    return "";
}
 
// create hash table-like lookup for menu objects with id string indexes
function makeHashes( ) {
    for (var i = 0; i < menus.length; i++) {
        menus[menus[i].elemId] = menus[i];
        menus[menus[i].mBarImgId] = menus[i];
    }
}

// assign menu label image event handlers
function assignLabelEvents( ) {
    var elem;
    for (var i = 0; i < menus.length; i++) {
        elem = document.getElementById(menus[i].mBarImgId);
        elem.onmouseover = swap;
        elem.onmouseout = swap;
    }
}
  
// invoked from initMenu( ), generates the menu div elements and their contents.
// all this action is invisible to user during construction
function makeMenus( ) {
    var menuDiv, menuItem, itemLink, mbarImg, textNode, offsetLeft, offsetTop;
    
    // determine key adjustment factors for the total height of menu divs
    var menuItemH = 0;
    var bodyFontSize = parseInt(getElementStyle(document.body, "fontSize", "font-size"));
    // test to see if browser's font size has been adjusted by the user
    // and that the new size registers as an applied style property
    if (bodyFontSize == parseInt(CSSRuleValues.defaultBodyFontSize)) {
        menuItemH = (parseFloat(CSSRuleValues.menuItemHeight));
    } else {
        // works nicely in Netscape 7
        menuItemH = parseInt(parseFloat(CSSRuleValues.menuItemLineHeight) * bodyFontSize);
    }
    var heightAdjust = parseInt(CSSRuleValues.menuWrapperPadding) + 
        parseInt(CSSRuleValues.menuWrapperBorderWidth);
    if (navigator.appName == "Microsoft Internet Explorer" && 
        navigator.userAgent.indexOf("Win") != -1 && 
        (typeof document.compatMode == "undefined" || 
        document.compatMode == "BackCompat")) {
        heightAdjust =- heightAdjust;
    }
    
    // use menus array to drive div creation loop
    for (var i = 0; i < menus.length; i++) {
        menuDiv = document.createElement("div");
        menuDiv.id = "popupmenu" + i;
        // preserve menu's ID as property of the menus array item
        menus[i].elemId = "popupmenu" + i;
        menuDiv.className = "menuWrapper";
        if (menus[i].menuItems.length > 0) {
            //menuDiv.style.height = (menuItemH * menus[i].menuItems.length) - 
            heightAdjust + "px";
        } else {
            // don't display any menu div lacking menu items
            menuDiv.style.display = "none";
        }
        // define event handlers
        menuDiv.onmouseover = keepMenu;
        menuDiv.onmouseout = requestHide;
  
        // set stacking order in case other layers are around the page
        menuDiv.style.zIndex = 99;
        
				if (navigator.appName == "Microsoft Internet Explorer")
					var menuItemWidth = 124;
				else
					var menuItemWidth = 129;

				// assemble menu item elements for inside menu div
        for (var j = 0; j < menus[i].menuItems.length; j++) {
            menuItem = document.createElement("div");
            menuItem.id = "popupmenuItem_" + i + "_" + j;
            menuItem.className = "menuItem";
            menuItem.onmouseover = toggleHighlight;
            menuItem.onmouseout = toggleHighlight;
            menuItem.onclick = hideMenus;
            menuItem.style.top = (menuItemH * (j%2) + 2) + "px";
						menuItem.style.left = menuDiv.style.left + (Math.floor(j/2) * menuItemWidth) + "px";
            itemLink = document.createElement("a");
            itemLink.href = menus[i].menuItems[j].href;
            itemLink.className = "menuItem";
            itemLink.onmouseover = toggleHighlight;
            itemLink.onmouseout = toggleHighlight;
            textNode = document.createTextNode(menus[i].menuItems[j].text);
            itemLink.appendChild(textNode);
            menuItem.appendChild(itemLink);
            menuDiv.appendChild(menuItem);
        }
        // append each menu div to the body
        document.body.appendChild(menuDiv);
    }
    makeHashes( );
    assignLabelEvents( );
    // pre-position menu
    for (i = 0; i < menus.length; i++) {
        positionMenu(menus[i].elemId);
    }
    menuReady = true;
}


// initialize global that helps manage menu hiding
var timer;
  
// invoked from mouseovers inside menus to cancel hide
// request from mouseout of menu bar image et al.
function keepMenu( ) {
    clearTimeout(timer);
}
  
function cancelAll() {
    keepMenu( );
    menuReady = false;
}
  
// invoked from mouseouts to request hiding all menus
// in 1/4 second, unless cancelled
function requestHide() {
    timer = setTimeout("hideMenus( )", 700);
}
  
// "brute force" hiding of all menus and restoration
// of normal menu bar images
function hideMenus() {
    for (var i = 0; i < menus.length; i++) {
       document.getElementById(menus[i].mBarImgId).src = menus[i].mBarImgNormal.src;
       var menu = document.getElementById(menus[i].elemId)
       menu.style.visibility = "hidden";
    }
}
  
// set menu position just before displaying it
function positionMenu(menuId){
    // use the menu bar image for position reference of related div
    var mBarImg = document.getElementById(menus[menuId].mBarImgId);
    var offsetTrail = mBarImg;
    var offsetLeft = 0;
    var offsetTop = 0;
    while (offsetTrail) {
				var ext_left = 0;
				if (menus[menuId].mBarImgId=='menuImg_admin') {
					if (navigator.appName == "Microsoft Internet Explorer")
						var ext_left = - 54;
					else 
						var ext_left = - 55;
				}
				offsetLeft += offsetTrail.offsetLeft + ext_left;
				offsetTop += offsetTrail.offsetTop;
        offsetTrail = offsetTrail.offsetParent;
    }
    if (navigator.userAgent.indexOf("Mac") != -1 && 
        typeof document.body.leftMargin != "undefined") {
        offsetLeft += document.body.leftMargin + ext_left;
        offsetTop += document.body.topMargin;
    }
    var menuDiv = document.getElementById(menuId);
    menuDiv.style.left = offsetLeft + "px";
    menuDiv.style.top = offsetTop + mBarImg.height + "px";
}
  
// display a particular menu div
function showMenu(menuId) {
    if (menuReady) {
        keepMenu( );
        hideMenus( );
        positionMenu(menuId);
        var menu = document.getElementById(menuId);
        menu.style.visibility = "visible";
    }
}
  
// menu bar image swapping, invoked from mouse events in menu bar
// swap style sheets for menu items during rollovers
function toggleHighlight(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    if (typeof menuReady != "undefined") {
        if (menuReady && evt) {
            var elem = (evt.target) ? evt.target : evt.srcElement;
            if (elem.nodeType == 3) {
                elem = elem.parentNode;
            }
            if (evt.type == "mouseover") {
                keepMenu();
                elem.className = "menuItemOn";
            } else {
                elem.className = "menuItem";
                requestHide();
            }
            evt.cancelBubble = true;
        }
    }
}

function swap(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    if (typeof menuReady != "undefined") {
        if (evt && (document.getElementById && document.styleSheets) && menuReady) {
            var elem = (evt.target) ? evt.target : evt.srcElement;
            if (elem.className == "menuImg") {
                if (evt.type == "mouseover") {
                    showMenu(menus[elem.id].elemId);
                    elem.src = menus[elem.id].mBarImgHilite.src;
                } else if (evt.type == "mouseout") {
                    requestHide( );
                }
                evt.cancelBubble = true;
            }
        }
    }

}
  
// create menus only if key items are supported
function initMenus() {
    if (document.getElementById && document.styleSheets) {
        setTimeout("makeMenus( )", 5);
        window.onunload=cancelAll;
    }
}

var gd_mouse_coords;
function moveToClick(evt) {
	evt = (evt) ? evt : event;
	gd_mouse_coords = getPageEventCoords(evt);
}

function getPageEventCoords(evt) {
    var coords = {left:0, top:0};
    if (evt.pageX) {
        coords.left = evt.pageX;
        coords.top = evt.pageY;
    } else if (evt.clientX) {
        coords.left = 
            evt.clientX + document.body.scrollLeft - document.body.clientLeft;
        coords.top = 
            evt.clientY + document.body.scrollTop - document.body.clientTop;
        // include html element space, if applicable
        if (document.body.parentElement && document.body.parentElement.clientLeft) {
            var bodParent = document.body.parentElement;
            coords.left += bodParent.scrollLeft - bodParent.clientLeft;
            coords.top += bodParent.scrollTop - bodParent.clientTop;
        }
    }
    return coords;
}

function ChangeRowCheck(rowid, chkid, alt) {
	if ($(chkid).checked)
		$(rowid).className = "alt5";
	else {
		$(rowid).className = alt;
	}
}

function ChangeRowMouseOver(rowid, chkid, alt) {
	if (!$(chkid).checked)
		$(rowid).className = alt;
}

function SetDisplay(id, stat) {
	if (document.getElementById) 
		var elem = document.getElementById(id); 
	else {
		if (document.all ) 
			var elem = document.all[ id ]; 
		else 
			var elem = new Object();
	}
	if (!elem )  
		return; 
	if (elem.style ) 
		elem = elem.style;
	if (typeof( elem.display ) == 'undefined' && !(window.ScriptEngine && ScriptEngine().indexOf( 'InScript' ) + 1)) { 
		window.alert( 'Hidden does not work in this browser.' ); 
		return; 
	}
	if (stat=='block' || stat =='none') {
		elem.display = stat;
		return;
	}
	if (elem.display == 'none') 
		elem.display = 'block';
	else 
		elem.display = 'none';
}	

function OpenWindow(url,window_name) {
	window.open(url,window_name,'scrollbars,resizeable,width=600,height=400');
}	

function SetTinyMCEContent(id, data, stat) {
	tinyMCE.activeEditor = tinyMCE.get(id);
	if (stat == 'append')
		tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent() + data + '<br/>');
	else
		tinyMCE.activeEditor.setContent(data);
}

function ShowLoader() {
    var loader = document.body;
    var inside = document.createElement("span");
    inside.setAttribute('id','loader');
    inside.innerHTML = "Loading...";
    loader.appendChild(inside);
}

function HideLoader() {
	var loader = document.body;
	var inside = document.getElementById("loader");
	loader.removeChild(inside);
}

var toggle_check = true;

function ToggleCheckAll(form, row, stat) {
	var num = 0;
	for (i=0; i<form.length; i++)	{
		e = form.elements[i];
		if (e.type == 'checkbox') { 
			if (stat == 'all') {
				e.checked = true;
				toggle_check = false;
			}
			else if (stat == 'none') {
				e.checked = false;
				toggle_check = true;
			}
			else
				e.checked = toggle_check;
			if (row) {
				num++;
				var alt = num%2==0?'alt1':'alt2';
				rowid = row + num;
				if (e.checked) {
					$(rowid).className = "alt5";
				}
				else {
					$(rowid).className = alt;
				}
			}
		}
	}
	if (!stat)
		toggle_check = !toggle_check;
	return false;
}

function FilterForm(form) {
	ShowLoader();
	xajax_FilterForm(form);
	return false;
}

function ResetFilter() {
	ShowLoader();
	xajax_ResetFilter();
	return false;
}

function MoveOffset(offset) {
	ShowLoader();
	xajax_MoveOffset(offset);
	return false;
}

function ShowErrorDiv(message) {
	Effect.Appear('error_div', 0.3); 
	$('error_msg').innerHTML = message;
}

function HideErrorDiv() {
	Effect.Fade('error_div', 0.3); 
}

function ShowRetDiv(message) {
	Effect.Appear('ret_div', 0.3); 
	$('ret_msg').innerHTML = message;
}

function HideRetDiv() {
	Effect.Fade('ret_div', 0.3); 
}
