 
var aasMenu = {
 
	// private attributes
	_menus : new Array,
	_attachedElement : null,
	_menuElement : null,
	_menuElementDontHide : null,
	_preventDefault : true,
	_preventForms : true,
 
 
	// public method. Sets up whole context menu stuff..
	setup : function (conf) {
 
		if ( document.all && document.getElementById && !window.opera ) {
			aasMenu.IE = true;
		}
 
		if ( !document.all && document.getElementById && !window.opera ) {
			aasMenu.FF = true;
		}
 
		if ( document.all && document.getElementById && window.opera ) {
			aasMenu.OP = true;
		}
 
		if ( aasMenu.IE || aasMenu.FF ) {
 
			document.oncontextmenu = aasMenu._show;
			document.onclick = aasMenu._hide;
 
			if (conf && typeof(conf.preventDefault) != "undefined") {
				aasMenu._preventDefault = conf.preventDefault;
			}
 
			if (conf && typeof(conf.preventForms) != "undefined") {
				aasMenu._preventForms = conf.preventForms;
			}
 
		}
 
	},
 
 
	// public method. Attaches context menus to specific class names
	attach : function (classNames, menuId) {

		if (typeof(classNames) == "string") {
			aasMenu._menus[classNames] = menuId;
		}
 
		if (typeof(classNames) == "object") {
			for (x = 0; x < classNames.length; x++) {
				aasMenu._menus[classNames[x]] = menuId;
			}
		}
 
	},
  
 
	// public method. Popup specific menu
	popup : function ( menuElementId, e ) {

		e = e ? e : window.event;
		if ( !e ) {
			alert( "Kan ikke danne popup-menu (event mangler). Prøv højreklik." );
			return false;
		};

		aasMenu._hide();

		if (menuElementId) {
			var m = aasMenu._getMousePosition(e);
			var s = aasMenu._getScrollPosition(e);

			aasMenu._menuElement = document.getElementById(menuElementId);
			aasMenu._menuElementDontHide = aasMenu._menuElement;
			aasMenu._menuElement.style.left = m.x + s.x + 'px';
			aasMenu._menuElement.style.top = m.y + s.y + 'px';
			aasMenu._menuElement.style.display = 'block';
		};
		return true;
 
	},


	// private method. Get which context menu to show
	_getMenuElementId : function (e) {
 
		if (aasMenu.IE) {
			aasMenu._attachedElement = event.srcElement;
		} else {
			aasMenu._attachedElement = e.target;
		}
 
		while(aasMenu._attachedElement != null) {
			var className = aasMenu._attachedElement.className;
 
			if (typeof(className) != "undefined") {
				className = className.replace(/^\s+/g, "").replace(/\s+$/g, "")
				var classArray = className.split(/[ ]+/g);
 
				for (i = 0; i < classArray.length; i++) {
					if (aasMenu._menus[classArray[i]]) {
						return aasMenu._menus[classArray[i]];
					}
				}
			}
 
			if (aasMenu.IE) {
				aasMenu._attachedElement = aasMenu._attachedElement.parentElement;
			} else {
				aasMenu._attachedElement = aasMenu._attachedElement.parentNode;
			}
		}
 
		return null;
 
	},
 
 
	// private method. Shows context menu
	_getReturnValue : function (e) {
 
		var returnValue = true;
		var evt = aasMenu.IE ? window.event : e;
 
		if (evt.button != 1) {
			if (evt.target) {
				var el = evt.target;
			} else if (evt.srcElement) {
				var el = evt.srcElement;
			}
 
			var tname = el.tagName.toLowerCase();
 
			if ((tname == "input" || tname == "textarea")) {
				if (!aasMenu._preventForms) {
					returnValue = true;
				} else {
					returnValue = false;
				}
			} else {
				if (!aasMenu._preventDefault) {
					returnValue = true;
				} else {
					returnValue = false;
				}
			}
		}
 
		return returnValue;
 
	},
 
 
	// private method. Shows context menu
	_show : function (e) {

		e = e ? e : window.event;

		aasMenu._hide();
		var menuElementId = aasMenu._getMenuElementId(e);
 
		if (menuElementId) {
			var m = aasMenu._getMousePosition(e);
			var s = aasMenu._getScrollPosition(e);
 
			aasMenu._menuElement = document.getElementById(menuElementId);
			aasMenu._menuElement.style.left = m.x + s.x + 'px';
			aasMenu._menuElement.style.top = m.y + s.y + 'px';
			aasMenu._menuElement.style.display = 'block';
			return false;
		}
 
		return aasMenu._getReturnValue(e);
 
	},
 
 
	// private method. Hides context menu
	_hide : function () {

		if (aasMenu._menuElement && ( aasMenu._menuElement != aasMenu._menuElementDontHide ) ) {
			aasMenu._menuElement.style.display = 'none';
		};
		aasMenu._menuElementDontHide = null;
 
	},
 
 
	// private method. Returns mouse position
	_getMousePosition : function (e) {
 
		e = e ? e : window.event;
		var position = {
			'x' : e.clientX,
			'y' : e.clientY
		}
 
		return position;
 
	},
 
 
	// private method. Get document scroll position
	_getScrollPosition : function () {
 
		var x = 0;
		var y = 0;
 
		if( typeof( window.pageYOffset ) == 'number' ) {
			x = window.pageXOffset;
			y = window.pageYOffset;
		} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
			x = document.documentElement.scrollLeft;
			y = document.documentElement.scrollTop;
		} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			x = document.body.scrollLeft;
			y = document.body.scrollTop;
		}
 
		var position = {
			'x' : x,
			'y' : y
		}
 
		return position;

	}

 
}
