var _replaceContext = false; // replace the system context menu? 
var _mouseOverContext = false; // is the mouse over the context menu? 
var _noContext = false; // disable the context menu? 
var _divContext = null; // makes my life easier
var _openedContexts = [];
var _iframeTop = 123;
var _iframeLeft = 20;
var _currentTarget = null;
function InitContext() {
	_divContext = $("divContext");
	var iframe = $("text_tWidgIframe");
	if (iframe && iframe.contentWindow) {
		var iframeBody = iframe.contentWindow.document.getElementsByTagName("body")[0]
		//alert("iframeBody="+getElementTop(iframeBody));
		if (!iframeBody) {
			window.setTimeout("InitContext()", 100);
		}
		_iframeTop = getElementTop(iframe);
		_iframeLeft = getElementLeft(iframe);
		addListener(document.body, "mousedown", ContextMouseDown);
		addListener(iframeBody, "mousedown", ContextMouseDown);
		addListener(iframeBody, "click", ContextShow);
	}
}                                                                        // call from the onMouseDown event, passing the event if standards compliant 

function ContextShowFF(event) {
	if (event.button == 2) {
		ContextShow(event)
	} 
}

function ContextMouseDown(event) {
    if (_noContext || _mouseOverContext) return;                         // IE is evil and doesn't pass the event object 

    if (event == null) event = window.event;                             // we assume we have a standards compliant browser, but check if we have IE 

    var target = event.target != null ? event.target : event.srcElement; // only show the context menu if the right mouse button is pressed 
	var elem = target;
	var i=0;
	while (i<3 && elem.id!="divContext") {
		elem = elem.parentNode;
		i++;
	}
	if (elem && elem.id=="divContext") {
		return;
	}
    // and a hyperlink has been clicked (the code can be made more selective) 
    //if (event.button == 2 && target.tagName.toLowerCase() == 'a') _replaceContext = true;
    //_replaceContext = true;

    //else if (! _mouseOverContext) _divContext.style.display = 'none';
    _divContext.style.display = 'none';
	/*
	for (var i=0; i<_openedContexts.length; i++) {
		_openedContexts[i].style.display = 'none';
	}
	_openedContexts = [];
	*/
}

function CloseContext() {
    _mouseOverContext = false;
    _divContext.style.display = 'none';
} 

// call from the onContextMenu event, passing the event 
// if this function returns false, the browser's context menu will not show up 
function ContextShow(event) {
    if (_noContext || _mouseOverContext) return; // IE is evil and doesn't pass the event object 

    if (event == null) event = window.event;     // we assume we have a standards compliant browser, but check if we have IE 

    var target = event.target != null ? event.target : event.srcElement;
	if (target.getAttribute("contextMenu") != "true") {
		return;
	}
	var options = target.getAttribute("contextOptions").split(",");
	//window.status += options.join("-")+" ";
	_currentTarget = target;
	paintOptions(options);
	_replaceContext = true;
    if (_replaceContext) {
       // $('aContextNav').href = target.href;
        //$('aAddWebmark').href = 'http://luke.breuer.com/webmark/?addurl=' + encodeURIComponent(target.href) + '&title=' + encodeURIComponent(target.innerHTML); // document.body.scrollTop does not work in IE 
        var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
        var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;                                             // hide the menu first to avoid an "up-then-over" visual effect 
        _divContext.style.display = 'none';
        _divContext.style.left = -10 + _iframeLeft + event.clientX + scrollLeft + 'px';
        _divContext.style.top = 11 + _iframeTop + event.clientY + scrollTop + 'px';
        _divContext.style.display = 'block';
		_divContext.focus();
        //_replaceContext = false;
		_openedContexts.push(_divContext);
		//event.cancelBubble = true;
		//event.returnValue = false; 
        return false;
    }
	//event.stopPropagation() 
}

function paintOptions(options) {
	var ul = $("divContextUL");
	var out = [];
	var currentHtml = _currentTarget.innerHTML;
	currentHtml = currentHtml.toLowerCase();
	//alert(currentHtml)
	for (var i=0; i<options.length; i++) {
		out.push('<li')
		if (currentHtml == options[i]) {
			out.push(' class="selected_option"');
		}
		out.push('>')
		if (currentHtml != options[i]) {
			out.push('<a class="option" href = "#" onclick="selectOption(this);return false;">')
		}
		out.push(options[i]);
		if (currentHtml != options[i]) {
			out.push('</a>');
		}
		out.push('</li>');
	}
	ul.innerHTML = out.join("");
}

function selectOption(obj) {
	//alert("_currentTarget: "+_currentTarget.outerHTML)
	if (!_currentTarget || !_currentTarget.parentNode) {
		return;
	}
	var theOld = _currentTarget.innerHTML;
	_currentTarget.innerHTML = mimicCase(theOld, obj.innerHTML);
	_currentTarget.style.color = "#000000";
	_divContext.style.display = 'none';
}

function mimicCase(theOld, theNew) {
	var oldChars = theOld.split("");
	var newChars = theNew.split("");
	for (var i=0; i<newChars.length; i++) {
		var ord = oldChars[i].charCodeAt();
		if (ord >= 65 && ord <= 90) {
			newChars[i] = newChars[i].toUpperCase();
		}
	}
	return newChars.join("");
}

function DisableContext() {
    _noContext = true;
    CloseContext();
    //$('aEnable').style.display = '';
    return false;
}

function EnableContext() {
    _noContext = false;
    _mouseOverContext = false; // this gets left enabled when "disable menus" is chosen 
    //$('aEnable').style.display = 'none';
    return false;
} // comes from prototype.js; this is simply easier on the eyes and fingers 

function addListener(aElm,aEvent,aFunction) {
	if (aElm.attachEvent) {
		return aElm.attachEvent("on"+aEvent, aFunction);
	} else {
		return aElm.addEventListener(aEvent,aFunction,false);
	}
}

function getElementTop(elem) {
	yPos = elem.offsetTop;
	tempEl = elem.offsetParent;
	while (tempEl != null) {
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}

function getElementLeft(elem) {
	yPos = elem.offsetLeft;
	tempEl = elem.offsetParent;
	while (tempEl != null) {
		yPos += tempEl.offsetLeft;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}
