var projectName = 'lex';
var _boolContextMenuJS = false;
var shadeEnabled = false;
var _clickX, _clickY;
var idToFocusAfterTimeout;
var firstField; var foundElement;
var currentEventArgument;
var listBuilderContextMenuVisible;
var isListBuilder = false;
var resetDiaryScroll;
var currentDiaryView;

// -------------------------------------------- CROSS-BROWSER COMPATIBILITY SCRIPTS --------------------------------------------
function getPosition(el) {
    var left = 0;
    var top = 0;

    while (el.offsetParent) {
        left += el.offsetLeft;
        top += el.offsetTop;
        el = el.offsetParent;
    }

    left += el.offsetLeft;
    top += el.offsetTop;

    return { x: left, y: top };
}

// ----------------------------------------- END OF CROSS-BROWSER COMPATIBILITY SCRIPTS ----------------------------------------


function sendServerRequest(eventTarget, eventArgument, containerId) {
    doAjaxWithIdWithoutFocus(sendServerRequest_complete, true, eventTarget, eventArgument, containerId);
}

function sendServerRequest_complete(containerId, responseText, responseXML) {
    var div = getElement(containerId); div.innerHTML = responseText;
}

function displayTime() {
	var timerDuration = getElement("displayTime");
	var now = new Date();
	timerDuration.innerHTML = now.toLocaleString();
	Header_timerId = setTimeout("displayTime()", 1000);
}

function loadFile(filename, filetype){
 if (filetype=="js"){
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
 }
 else if (filetype=="css"){
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
 }
 if (typeof fileref!="undefined")
  document.getElementsByTagName("head")[0].appendChild(fileref)
}

if (typeof(Page_Validators) == 'undefined') var Page_Validators = new Array();

function pageLoad()
{
	var one;
	if (st) { one = ((new Date()).valueOf() - st.valueOf()) + "ms"; }
	
	try
	{hideElement('loadingCon');setRememberedScrollPositionUnique('diaryInner'); if(!shadeEnabled) { setOnLoadFocus();calculateTabWidth(); } else { if (firstField) {if (firstField.indexOf("popupContainer")>=0) {setOnLoadFocus();} }}}
	catch(exc) {self.status='JS Error in iDesktop.pageLoad:' + exc;}
	
	if (st){two = ((new Date()).valueOf() - st.valueOf()) + "ms";self.status=one + ',' + two;}

	displayTime();
}

function hidePopup()
{
	disableShade();
	hideElement('popupContainer');
}
function p(eventTarget, eventArgument) {
	rememberScrollPositionUnique('diaryInner',eventArgument);

	var theform;
	if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
		theform = document.forms["form"];
	} else {
		theform = document.form;
	}
	theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
	theform.__EVENTARGUMENT.value = eventArgument;
	theform.submit();
}
function scrollToBottom(divId) { var div = getElement(divId); div.scrollTop = div.scrollHeight; }
function rememberScrollPos(divId) { var div = getElement(divId); if (div) { setCookie('scrollPosition', div.scrollTop); } }
function setRememberedScrollPos(divId) { var div = getElement(divId); if (div) {var position = getCookie('scrollPosition'); if (position) {div.scrollTop=position; } } }
function testMouseDown(evt) {
    if (!evt) evt = window.event || window.Event;
    _clickX = (evt && evt.pageX) ? evt.pageX : evt.x;
    _clickY = (evt && evt.pageY) ? evt.pageY : evt.y;
    if (startMenuVisible) { startMenuMouseDown(evt); }
    if (listBuilderContextMenuVisible) { listBuilderContextMenuMouseDown(evt); }
    if (_boolContextMenuJS) { contextMouseDown(evt); }
    try
    { predictiveMouseDown(evt); }
    catch (Error) {}
}
function testContextShow(evt) {
    if (!evt) evt = window.event || window.Event;
    if (_boolContextMenuJS) { return contextShow(evt); } 
}
function callBackError(status, statusText, responseText) { /*alert(responseText);*/ }
function enableShade() { shadeEnabled=true; showElement('shade'); }
function disableShade() { shadeEnabled=false; hideElement('shade'); }
function removeMessage() { getElement('popupAlert').style.display='none'; }
function getUniqueElementFromName(elementName)
{
	try
	{
		var elements = document.getElementsByTagName("*");
		var i=0;
		var length=elements.length;
		for( i; i<length; i++ )
		{
			element = elements[i];
			if(element)
			{
				if (element.name==elementName)
				{
					return element;
				}
			}
		}
	} 
	catch(err){alert('JS Error in iDesktop.js (getElementFromName) element not in page [' + elementName + ']');}
}

function getElementFromTabIndex(index)
{
	var element;
	
	var elements = document.getElementsByTagName("input");
	for( var i=0; i<elements.length; i++ )
	{
		element = elements[i];
		if(element){if (element.tabIndex==index){return element;}}
	}
	
	var elements = document.getElementsByTagName("textarea");
	for( var i=0; i<elements.length; i++ )
	{
		element = elements[i];
		if(element){if (element.tabIndex==index){return element;}}
	}
	
	var elements = document.getElementsByTagName("a");
	for( var i=0; i<elements.length; i++ )
	{
		element = elements[i];
		if(element){if (element.tabIndex > 0 && element.id != '') {if (element.tabIndex==index) {return element;}}}
	}
	
	var elements = document.getElementsByTagName("select");
	for( var i=0; i<elements.length; i++ )
	{
		element = elements[i];
		if(element){if (element.tabIndex > 0 && element.id != '') {if (element.tabIndex==index) {return element;}}}
	}
}

function toggleElement(elementId) { var el = getElement(elementId); if (!isElementHidden(el)) { el.style.display = 'none'; } else { el.style.display = 'block'; } }
function hideElement(elementId) { var el = getElement(elementId); if (el) { if (!isElementHidden(el)) { el.style.display = 'none'; } return el } }
function showElement(elementId) { var el=getElement(elementId); if (el) {if (isElementHidden(el)) {el.style.display='block';} return el }}
function isHidden(elementId) { if (getElement(elementId).style.display == 'none') {return true} else {return false}; }
function isElementHidden(element) { if (element) {if (element.style.display == 'none') {return true} else {return false}; }}
function hideCombos()
{
    try {
        var elements = document.getElementsByTagName("select");
        for (var i = 0; i < elements.length; i++) {
            if (elements[i].id.indexOf('popupContainer') == -1) {
                elements[i].style.visibility = "hidden";
            }
        }
    }
    catch (e) {   
    }
}

function showCombos()
{
	var elements = document.getElementsByTagName("select");
	for ( var i=0; i<elements.length; i++ )
	{
		elements[i].style.visibility = "visible";
	}
}
function rememberScrollPositionUnique(divId,eventArgument) {
	var div = getElement(divId); 
	if (div) { 
		setCookie('scrollPosition'+divId+currentDiaryView, div.scrollTop);
	}
}

function setRememberedScrollPositionUnique(divId) { 
	var div = getElement(divId); 
	if (div && !resetDiaryScroll) {
		var position = getCookie('scrollPosition'+divId+currentDiaryView); 
		if (position) {div.scrollTop=position;}
	}
}

var scrollTarget; var scrollDirection; var tabScrollWidth=0; var maximumTabScroll; var selectedTabPosition=0;

function calculateTabWidth()
{
	var tab = getElement('tab1'); var tabNumber = 1;

	scrollTarget = getElement('tabScroller');

	while (tab)
	{
		tabScrollWidth+=tab.offsetWidth+5;
		if (tab.className=='on')
		{
			selectedTabPosition = tabScrollWidth;
		}
		tabNumber+=1;
		tab = getElement('tab'+tabNumber);
	}
	maximumTabScroll = -(tabScrollWidth-(document.body.clientWidth))-10;
	if (tabScrollWidth<document.body.clientWidth-45) { hideElement('scrollControls'); }
	else { showElement('scrollControls'); }
	
	if (selectedTabPosition > document.body.clientWidth - 45) {
		var initialScroll = selectedTabPosition - (document.body.clientWidth - 45)
		scrollTarget.style.marginLeft = -initialScroll;
	}
	tabScroller.style.width = (tabScrollWidth + 3) + addNonIEPx();
}

function tabScroll(direction)
{
	scrollTarget = getElement('tabScroller');
	scrollDirection = direction;
	setTimeout('moveTabScroll()', 5);
}

function moveTabScroll()
{
	if (scrollTarget)
	{
		var currentScroll = parseInt(scrollTarget.style.marginLeft,10);
		if (scrollDirection>0)
		{
			if (currentScroll<0)
			{
				if (currentScroll+30>0) { scrollTarget.style.marginLeft=0;}
				else { scrollTarget.style.marginLeft = currentScroll+30;}
			}
		}
		else
		{
			if (currentScroll>maximumTabScroll-20) { scrollTarget.style.marginLeft = currentScroll-30; }
		}
		setTimeout('moveTabScroll()', 5);
	}
}

function cancelTabScroll() { scrollTarget = null; scrollDirection = null; }

function getElementFromName(elementName) 
{
	return document.getElementsByName(elementName)[0];
}

function setCookie(name, value, expires, path, domain, secure) {
	var newExpires = 31;
	var expdate = new Date ();
    //FixCookieDate (expdate); // Correct for Mac date bug - call only once for given Date object!
    expdate.setTime (expdate.getTime() + (newExpires * 24* 60 * 60 * 1000)); // 24 hrs from now 

    document.cookie= projectName + name + "=" + escape(value) +
        ((newExpires) ? "; expires=" + expdate.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function getCookie(name) {
    var dc = document.cookie;
    var prefix =  projectName + name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

function deleteCookie(name, path, domain) {
    if (getCookie(projectName + name)) {
        document.cookie = projectName + name + "=" +
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

var tabTarget;
function iTabClosing(target,argument)
{
	tabTarget = target;
	doAjaxWithoutFocus(iTabClosingComplete, false, target, 'HASTABCHANGED|' + argument)
}

function iTabClosingComplete(responseText, responseXML)
{
	if (responseText.length > 30)
	{
		showPopup(responseText);
	}
	else
	{
		p(tabTarget,'CLOSE|' + responseText);
	}
}

function showPopup(html)
{
	enableShade('shade');hideCombos();
	var popupDiv = getElement('popup');
	popupDiv.innerHTML=html;
}

function iCancelPopup(target,argument)
{
	disableShade('shade');showCombos();
	var popupDiv = getElement('popup');
	popupDiv.innerHTML='';
	doAjaxWithoutFocus(null, false, target, argument)
}

// AJAX FUNCTIONS
function CallBackObject() { this.id = null; this.progress = false; this.setFocus = true; }
CallBackObject.prototype.GetHttpObject = function()
{
	var currentHttp=null;
	try { currentHttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
	catch (e)
	{
		try { currentHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch (E) { currentHttp = false; }
	}
	if (!currentHttp && typeof XMLHttpRequest != 'undefined') { try { currentHttp = new XMLHttpRequest(); } catch (e) { currentHttp = false; } }
	return currentHttp;
}
CallBackObject.prototype.DoCallBack = function(eventTarget, eventArgument)
{
	if (this.Xmlhttp==null) {this.XmlHttp = this.GetHttpObject();}

	var theform = document.forms[0]; var thePage = window.location.pathname + window.location.search; var eName = '';
	if (thePage.charAt(0) != "/") { thePage = thePage.substring(thePage.indexOf("/")+1); }
	
	var theData = new CStringBuilder();
	theData.append('__EVENTTARGET=')
	theData.append(escape(eventTarget.split("$").join(":")));
	theData.append('&__EVENTARGUMENT=')
	theData.append(eventArgument);
	theData.append('&__VIEWSTATE=')
	theData.append(escape(theform.__VIEWSTATE.value).replace(new RegExp('\\+', 'g'), '%2b'));
	theData.append('&IsCallBack=true');
	
	for(var i=0; i<theform.elements.length; i++)
	{
		eName = theform.elements[i].name;
		if(eName && eName != '')
		{
			if(eName != '__EVENTTARGET' && eName != '__EVENTARGUMENT' && eName != '__VIEWSTATE')
			{
				// http://www.w3schools.com/TAGS/ref_urlencode.asp
				theData.append('&');
				theData.append(escape(eName.split("$").join(":")))
				theData.append('=');
				var data = theform.elements[i].value;
				data = data.replace(new RegExp('\\+', 'g'), '%2b');
				data = data.replace(new RegExp('\\&', 'g'), '%26');
				data = data.replace(new RegExp('\\<', 'g'), '%3c');
				data = data.replace(new RegExp('\\>', 'g'), '%3e');
				theData.append(data);
			}
		}
	}

	if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 )
	{ 
		var oThis = this;
		this.XmlHttp.open('POST', thePage, true);
		this.XmlHttp.onreadystatechange = function() { oThis.ReadyStateChange(); };
		this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.XmlHttp.send(theData.toString());
	}
}
CallBackObject.prototype.AbortCallBack = function() {}
CallBackObject.prototype.OnLoading = function() {}
CallBackObject.prototype.OnLoaded = function() {}
CallBackObject.prototype.OnInteractive = function() {} 
CallBackObject.prototype.OnComplete = function(responseText, responseXml) {}
CallBackObject.prototype.OnCompleteWithId = function(divId, responseText, responseXml) {}
CallBackObject.prototype.OnAbort = function() {}
CallBackObject.prototype.OnError = function(status, statusText) {}
CallBackObject.prototype.ReadyStateChange = function()
{
	if (this.XmlHttp.readyState==1) { if (this.progress) { showElement('loadingCon'); } this.OnLoading(); }
	else if (this.XmlHttp.readyState==2) { this.OnLoaded(); }
	else if (this.XmlHttp.readyState==3) { this.OnInteractive(); }
	else if (this.XmlHttp.readyState==4)
	{
		if (this.XmlHttp.status == 0) this.OnAbort();
		else if (this.XmlHttp.status == 200 && this.XmlHttp.statusText == "OK")
		{
			var result = this.XmlHttp.responseText;
			var commandsPresent = false;
			
			//if (result.indexOf('<HTML>')>=0)
			//{
			//	location.reload(true);
			//}
			
			if (result.indexOf('||^|^||')>=0)
			{
				var data=result.split('||^|^||');
				var data2=data[1].split('|||');
				result=data[0];
				commandsPresent=true;
			}
	
			if (this.id == null) {if (this.OnComplete) {this.OnComplete(result, this.XmlHttp.responseXML); }}
			else {this.OnCompleteWithId(this.id, result, this.XmlHttp.responseXML); }
			
			if (this.progress) { hideElement('loadingCon'); }
			if (this.setFocus) { setCurrentFocus(); }
		
			if (commandsPresent)
			{
				for( var i=0; i<data2.length; i++ )
				{
					if (data2[i].indexOf(':::')>=0)
					{
						var operations = data2[i].split(':::');
						switch (operations[0]) 
						{
							case "FOCUS":
								focusFieldFromAjaxPopup(operations[1]);
								break;
							
							case "EXECUTE":
								eval(operations[1]);
								break;	
								
							case"LOADCSS":
								loadFile(operations[1],'css');
								break;
								
							case"LOADJS":
								loadFile(operations[1],'js');
								break;
							
						}
					}
				}
			}
		}
		else
		{
			if (this.progress) { hideElement('loadingCon'); window.status="ERROR"; }
			this.OnError(this.XmlHttp.status, this.XmlHttp.statusText, this.XmlHttp.responseText);   
		}
	}
}

function doAjax(completeFunction, progress, target, argument)
{
	var ajaxCaller			= new CallBackObject();
    ajaxCaller.OnComplete	= completeFunction;
    ajaxCaller.OnError		= callBackError;
    ajaxCaller.progress		= progress;
	ajaxCaller.DoCallBack(target, argument);
}

function doAjaxWithoutFocus(completeFunction, progress, target, argument)
{
	var ajaxCaller			= new CallBackObject();
    ajaxCaller.OnComplete	= completeFunction;
    ajaxCaller.OnError		= callBackError;
    ajaxCaller.progress		= progress;
    ajaxCaller.setFocus		= false;
    ajaxCaller.DoCallBack(target, argument);
}

function doAjaxWithId(completeFunction, progress, target, argument, id)
{
	var ajaxCaller				= new CallBackObject();
    ajaxCaller.OnCompleteWithId	= completeFunction;
    ajaxCaller.OnError			= callBackError;
    ajaxCaller.progress			= progress;
    ajaxCaller.id				= id;
	ajaxCaller.DoCallBack(target, argument);
}

function doAjaxWithIdWithoutFocus(completeFunction, progress, target, argument, id)
{
	var ajaxCaller				= new CallBackObject();
    ajaxCaller.OnCompleteWithId	= completeFunction;
    ajaxCaller.OnError			= callBackError;
    ajaxCaller.progress			= progress;
    ajaxCaller.setFocus			= false;
    ajaxCaller.id				= id;
	ajaxCaller.DoCallBack(target, argument);
}

// FOCUS CONTROL
var fieldToFocusId = null;

// **************** called on page load *******************
function setOnLoadFocus()
{
	try {
		if (firstField)
		{
			var firstFieldInstance = getElement(firstField + '_input');
			if (firstFieldInstance) { firstFieldInstance.focus(); }
		} 
	}  
	catch(err) {}	
}
// ********************************************************

function setFocus(id) {
	try {
		idToFocusAfterTimeout = id; setTimeout('doFocus()', 5); 
	}  
	catch(err) {}
}


function doFocus() {
	try {
	    getElement(idToFocusAfterTimeout).focus()
	} 
	catch(exc) {
		setTimeout('doFocus()', 500);
	} 
}
var debug = false;
function debugInfo(text, toAppend) {
    if (!debug) return;

    var infoDiv = getElement("infoDiv");
    if (infoDiv) {
        if (toAppend) {
            setElementText(infoDiv, getElementText(infoDiv) + text);
        } else {
            setElementText(infoDiv, text);
        }
        return;
    }
    infoDiv = getElement("t_u_dashboard_search_input");
    if (toAppend) {
        infoDiv.value += text;
    } else {
        infoDiv.value = text;
    }
}

function clearDebugInfo() {
    if (!debug) return;

    var infoDiv = getElement("infoDiv");
    setElementText(infoDiv, "");
}

function focusField(id) {
	try {
		var label = getElement('label' + id); var input = getElement(id + '_input');
		if (label) { label.className='highlight'; } if (input) { input.className='highlight'; }
		setCookie('currentFocus',id);
	}  
	catch(err) {}

	try { customFocus(id) } catch (err) { }
}

function focusFieldFromAjaxPopup(id) {
    try {
        var label = getElement('label' + id);
        var input = getElement(id + '_input');
        if (label) { label.className = 'highlight'; } if (input) { input.className = 'highlight'; }
        setFocus(id + '_input');
	} catch (err) { }
    try {
        customFocus(id)
    } catch (err) { }
}

function unfocusField(id)
{
    try {
        var label = getElement('label' + id);
		var input = getElement(id + '_input');
		if (label) { label.className=''; } if (input) { input.className=''; }
	}  
	catch(err) {}	
}

function setCurrentFocus()
{
    try {
		// this function does not use getElementById because it seems not to work immediately after a postback
		// of the new contents.  instead we loop through the form until we find the reference we need then set focus
		var foundCookieField = false;
		var element;
		var elementId;
			
		if (fieldToFocusId == null)
		{
			fieldToFocusId = getCookie('currentFocus') + '_input';
		}

		if (fieldToFocusId != null)
		{
			var elements = document.getElementsByTagName("input");
			for( var i=0; i<elements.length; i++ )
			{
				elementId = elements[i].id;
				if (elementId==fieldToFocusId)
				{
					setFocus(elementId);
					return;
				}
			}
			
			var elements = document.getElementsByTagName("textarea");
			for( var i=0; i<elements.length; i++ )
			{
				elementId = elements[i].id;
				if (elementId==fieldToFocusId)
				{
					setFocus(elementId);
					return;
				}
			}
			
			var elements = document.getElementsByTagName("a");
			for( var i=0; i<elements.length; i++ )
			{
				elementId = elements[i].id;
				if (elementId==fieldToFocusId)
				{
					setFocus(elementId);
					return;
				}
			}
			
			var elements = document.getElementsByTagName("select");
			for( var i=0; i<elements.length; i++ )
			{
				elementId = elements[i].id;
				if (elementId==fieldToFocusId)
				{
					setFocus(elementId);
					return;
				}
			}
		}
		
		if (!foundCookieField)
		{
			// we didnt find a control to focus from the cookie so set the firstField to be focused
			if (firstField)
			{
				var firstFieldInstance = getElement(firstField + '_input');
				if (firstFieldInstance) { setFocus(firstFieldInstance.id); }
			}
		}
	}  
	catch(err) {}	
}

function selectCurrentFocus() {
	try {
		// this function does not use getElementById because it seems not to work immediately after a postback
		// of the new contents.  instead we loop through the form until we find the reference we need then set focus
		var foundCookieField = false;
		var element;
		var elementId;
			
		if (fieldToFocusId == null) {
			fieldToFocusId = getCookie('currentFocus') + '_input';
		}
		if (fieldToFocusId != null) {
			element = getElement(fieldToFocusId)
			if (element) {
				element.select()
			}
		}
	}  
	catch(err) {}	
}

// START MENU FUNCTIONS
var startMenuVisible = false;
var currentSelectedItem = null;
var currentSelectedItemAfter = '';
var currentSelectedNumber = null;
var currentMenuNumber = null;

function iStartBarToggleSearch()
{
	getElement('newSearch').className = 'newSearch'
	getElement('s_searchBox_input').value = '';
	setFocus('s_searchBox_input');
}

function iStartBarToggleQuickDate()
{
	getElement('iStartBarQuickSearchDiv').className = 'diaryDatePicker'
	getElement('s_quickDate_input').value = '';
	setFocus('s_quickDate_input');
}

function mouseActivateStartMenu(eventTarget, eventArgument)
{
	if (getElement('startMenu').innerHTML != '')
	{
		showElement('startMenu');
		hideCombos();
		document.onkeydown = startMenuKeyDownHandler;
	}
	else
	{
		document.onkeydown = startMenuKeyDownHandler;
		doAjaxWithoutFocus(mouseActivateStartMenu_complete, false, eventTarget, eventArgument);
	}
	startMenuVisible	= true;
}

function keyActivateStartMenu(eventTarget, eventArgument)
{
	document.onkeydown = startMenuKeyDownHandler;
	doAjaxWithoutFocus(keyActivateStartMenu_complete, true, eventTarget, eventArgument);
	startMenuVisible	= true;
}

function mouseActivateStartMenu_complete(responseText, responseXML)
{
	getElement('startMenu').innerHTML = responseText;
	hideCombos();
	document.onkeydown = startMenuKeyDownHandler;
	showElement('startMenu');
}

function keyActivateStartMenu_complete(responseText, responseXML)
{
	getElement('startMenu').innerHTML = responseText;
	hideCombos();
	currentSelectedItem = 'menu';
	currentSelectedNumber = 1;
	getElement('menu1').className = 'stHover';
	document.onkeydown = startMenuKeyDownHandler;
	showElement('startMenu');
}

function hideStartMenu() {
    document.onkeydown = KeyDownHandler;
    setCurrentFocus();
    startMenuVisible = false;
    showCombos(); //getElement('startMenu').innerHTML = '';
    hideElement('startMenu');
}


function dumpprops(obj,parent)
{
	for (var i in obj)
	{
		if (parent) {var msg = parent+"." + i + "\n" + obj[i];} else {var msg=i+"\n"+obj[i];}
		if(!confirm(msg)) {return;}
		if (typeof obj[i] == "object")
		{
			if (parent) {dumpprops(obj[i],parent+"."+i);} else {dumpprops(obj[i],i);}
		}
	}
}

function startMenuMouseDown(evt) {
    if (!evt) evt = window.event || window.Event;
    var target = evt.target != null ? evt.target : evt.srcElement;
	//dumpprops(target);
	if (target.id != "")
	{
		if (target.id.indexOf('start') >= 0) {} else { hideStartMenu(); return true; }
	}
}

function startMenuKeyDownHandler(evt) {
    if (!evt) evt = window.event || window.Event;
    var keyCode = getKeyPressedCode(evt);
    var key = getKeyPressed(evt);
	var currentElement = getElement(currentSelectedItem + currentSelectedNumber + currentSelectedItemAfter)

	if (keyCode == LEFT_ARROW_KEY) {
		if (currentSelectedItem == 'menu') {
			currentElement.className = '';
			currentSelectedItem = 's$context';
			currentSelectedNumber = 0;
			currentSelectedItemAfter = '_cm';
		} else if (currentSelectedItem == 's$context') {
		} else {
			currentElement.className = '';
			currentSelectedItem = 'menu';
			currentSelectedNumber = currentMenuNumber;
			currentSelectedItemAfter = '';
		}
		
		getElement(currentSelectedItem + currentSelectedNumber + currentSelectedItemAfter).className = 'stHover';
    } else if (keyCode == UP_ARROW_KEY) {
		var gotoElement = getElement(currentSelectedItem + (currentSelectedNumber-1) + currentSelectedItemAfter)
		if (gotoElement) {
			currentSelectedNumber -= 1;
			gotoElement.className = 'stHover';
			currentElement.className = '';
		}
    } else if (keyCode == RIGHT_ARROW_KEY) {
		if (currentSelectedItem == 's$context')	{
			currentElement.className = '';
			currentSelectedItem = 'menu';
			currentSelectedNumber = 1;
			currentSelectedItemAfter = '';
        } else if (currentSelectedItem == 'menu') {
			currentSelectedItem = 'menu' + currentSelectedNumber;
			currentMenuNumber = currentSelectedNumber;
			currentSelectedNumber = 1;
		}
		
		getElement(currentSelectedItem + currentSelectedNumber + currentSelectedItemAfter).className = 'stHover';
    } else if (keyCode == DOWN_ARROW_KEY) {
		var gotoElement = getElement(currentSelectedItem + (currentSelectedNumber+1) + currentSelectedItemAfter)
		if (gotoElement) {
			currentSelectedNumber += 1;
			gotoElement.className = 'stHover';
			currentElement.className = '';
		}
    } else if (keyCode == ESCAPE_KEY) {
		hideStartMenu();
    } else if (keyCode == ENTER_KEY) {
		eval(currentElement.name);
	}

	evt.cancelBubble = true;
	return false;
}

// KEY HANDLER FUNCTIONS
var isCtrl = false; var isShift = false;
var keyHandlerActive = true;
var lastKeyPressed;

function KeyDownHandler(evt) {
    if (!evt) evt = window.event || window.Event;
    var keyCode = getKeyPressedCode(evt);
    var key = getKeyPressed(evt);
	var keysArray;

	if (keyCode > DIVIDE_KEY) {
	    // Probably an F-key (F1-F12)
	    key = keyCode;
	}
	if (keyCode == ENTER_KEY || keyCode == ESCAPE_KEY || keyCode == LEFT_ARROW_KEY || keyCode == UP_ARROW_KEY || keyCode == RIGHT_ARROW_KEY || keyCode == DOWN_ARROW_KEY) {
	    key = keyCode;
	}
	lastKeyPressed = key;

	if (keyCode == CTRL_KEY) { isCtrl = true; }
	else if (keyCode == SHIFT_KEY) { isShift = true; }
	else if (isCtrl && isShift)
	{
		if (shadeEnabled) { 
			keysArray = popupKeysCtrlShift;
		} 
		else { 
			keysArray = arrHotKeysCtrlShift;
		}
	} else if (isCtrl) {
		if (shadeEnabled) {
			keysArray = popupKeysCtrl;
		} else { 
			keysArray = arrHotKeysCtrl;
		} 
	} else {
		if (shadeEnabled) { 
			keysArray = popupKeys;
		} else {		
			keysArray = arrHotKeys;
		}
	}

	if (keysArray && keyHandlerActive) {
		for (var i = 0; i < keysArray.length; i++) {
			var aTemp = keysArray[i].split("#");
			if (key == aTemp[0]) {
				self.setTimeout(aTemp[1],100);
				if (keyCode != ENTER_KEY) {
				    evt.cancelBubble = true;
				    setKeyPressedCode(0, evt);
					evt.returnCode = false; 
					evt.Cancel = true;
					return false;
					break;
				}						
			}
        }
        if (key == 'N' && isCtrl) {
            alert('CTRL + N is disabled');
            return false;
        }
    }
    else if (key == 'N' && isCtrl && keysArray) {
        for (var i = 0; i < keysArray.length; i++) {
            var aTemp = keysArray[i].split("#");
            if (key == aTemp[0]) {
                self.setTimeout(aTemp[1], 100);
                if (keyCode != ENTER_KEY) {
                    evt.cancelBubble = true;
                    setKeyPressedCode(0, evt);
                    evt.returnCode = false;
                    evt.Cancel = true;
                    return false;
                    break;
                }
            }
        }
        if (key == 'N' && isCtrl) {
            alert('CTRL + N is disabled');
            return false;
        }
    }	
}

function KeyUpHandler(evt) { if (lastKeyPressed != LEFT_ARROW_KEY && lastKeyPressed != RIGHT_ARROW_KEY) { isCtrl = false; isShift = false; }}
function ChangeCursor(type) { document.body.style.cursor = type; }
var arrHotKeys = new Array(); var arrHotKeysCtrl = new Array(); var arrHotKeysCtrlShift = new Array();
var popupKeys = new Array(); var popupKeysCtrl = new Array(); var popupKeysCtrlShift = new Array();
document.onkeydown = KeyDownHandler; document.onkeyup = KeyUpHandler;

// STRING BUILDER FUNCTIONS
function CStringBuilder(initialValue)
{
	this.append			= CStringBuilder_Append;
	this.clear			= CStringBuilder_Clear;
	this.length			= CStringBuilder_Length;
	this.toString		= CStringBuilder_ToString;
	this.buffer			= new Array();
	this.bufferLength	= 0;
	if(initialValue != null) this.append(initialValue);
}

function CStringBuilder_Append(appendValue) { if(appendValue == null) { return; }; this.bufferLength += appendValue.length; this.buffer.push(appendValue) }
function CStringBuilder_Clear() { this.buffer = new Array(); this.bufferLength = 0; }
function CStringBuilder_Length() { return this.bufferLength; }
function CStringBuilder_ToString() { return this.buffer.join(""); }

function formatAsMoney(mnt) {
    mnt -= 0;
    mnt = (Math.round(mnt*100))/100;
    return (mnt == Math.floor(mnt)) ? mnt + '.00' 
              : ( (mnt*10 == Math.floor(mnt*10)) ? 
                       mnt + '0' : mnt);
}
