/// <reference path="..\docs\jQuery.js" />
/// <reference path="..\docs\MicrosoftAjax.js" />

// Java script for Exact controls
// ------------------------------

// Code documentation
//
// see also http://weblogs.asp.net/bleroy/archive/2007/04/23/the-format-for-javascript-doc-comments.aspx
//
// Function documentation:
//
/// <summary></summary>
/// <param name="" type=""></param>
/// <returns type="undefined">undefined</returns>
//
// optional summary attributes: 
//      locid="descriptionID"
// optional param attributes: 
//      mayBeNull="true|false" 
//      optional="true|false"
//      parameterArray="true|false"
//      integer="true|false" 
//      domElement="true|false"
//      elementType="ArrayElementType" 
//      elementInteger="true|false"
//      elementDomElement="true|false"
//      elementMayBeNull="true|false"
// optional returns attributes
//      mayBeNull="true|false" 
//      optional="true|false"
//      parameterArray="true|false"
//      integer="true|false" 
//      domElement="true|false"
//      elementType="ArrayElementType" 
//      elementInteger="true|false"
//      elementDomElement="true|false"
//      elementMayBeNull="true|false"
//
// Object documentation
/// <summary></summary>
/// <param name="" type=""></param>
/// <field name="" type=""></field>
//
// Used, but not (yet) supported by MS
/// <remarks></remarks>



if ($ && $.fn && $.fn.jquery === "1.2.6") {
	$.extend($.expr[":"], {
		/// <summary>Extenders of the jQuery object. Targets 1.2.6, not compatible with 1.3.x. As of 1.3.2 the <code>
		/// :hidden</code> and <code>:visible</code> selectors include the behaviour of these extenders.</summary>
		/// <field name="reallyHidden">Includes the 'hidden' state of parent elements in the search.</field>
		/// <field name="reallyVisible">Includes the 'visible' state of parent elements in the search.</field>
		reallyHidden: "(jQuery(a).is(':hidden') || jQuery(a).parents(':hidden').length > 0)",
		reallyVisible: "!(jQuery(a).is(':hidden') || jQuery(a).parents(':hidden').length)"
	});
}

if ($ && $.fn && $.fn.jquery === "1.3.2") {
	$.extend($.expr[':'], {
		readonly: function(a) {
			return !!a.readOnly;
		}
	});
}

// Limited to input fields a) because in ff focus/blur events are only defined on input elements and not on e.g.
// <td> and b) to not kill responsiveness with binding hundreds of elements (especially since the blur does not 
// propagate, which is probably also the reason why not the $.live does not support blur/focus).
var _BINDQUERY = ":input:not(:hidden)";
function _BindSaveCurEl(context) {
	/// <summary>Not intended for public use.</summary>

	$(_BINDQUERY, context || document).bind("blur", _SaveCurEl);
}

function _UnbindSaveCurEl(context) {
	/// <summary>Not intended for public use.</summary>

	// The following is a workaround for IE: when saveHistory is added to an element's class IE 'disables' / removes
	// the element's removeAttribute function, which is called in the jquery unbind.
	var hist = $(":input.saveHistory");
	hist.removeClass("saveHistory");
	hist.unbind("blur", _SaveCurEl);
	hist.addClass("saveHistory");	
	$(_BINDQUERY + ":not(.saveHistory)", context || document).unbind("blur", _SaveCurEl);
}

function _SaveCurEl() {
	/// <summary>Not intended for public use.</summary>

	document.previousElement = this;
}

SysColors = {
	ActiveCaption: "#0054E3",
	CaptionText: "#FFFFFF"
};


BrowseInputType = {
	/// <summary>'Enumerator' to specify the type of input used in combination with browsing/searching based on something 
	/// entered by the user.</summary>
	InputField:		"I",
	Browser:			"B",
	SearchField:	"S",
	InputList:		"L",
	Tag:				"T"
};

// General functions
// -----------------
var sysIsSubmitted = false;
var sysWasSubmitted = false;
function SysSubmit(wm) {
	/// <summary>Submits a form</summary>
	/// <param name="wm" type="Boolean">Flag to denote whether to show the Wait message</param>
	/// <returns type="Boolean">Returns true if the submit was successful</returns>	

	if (!sysWasSubmitted) {
		if (wm != null) SysShowWaitMessage();
		var isSubmitted = sysIsSubmitted;
		sysIsSubmitted = true;
		sysWasSubmitted = true;
		try {
			return document.forms[0].submit();
		}
		catch (ex) {
			if (wm != null) SysWaitMessage(false);
			sysIsSubmitted = isSubmitted
			sysWasSubmitted = false;
			// BR 23.495.185
			// [choo225643]: review if this also works in Macs/ Linux
			var msg = '';
			switch (ex.number) {
				case -2147024891:
					{
						msg = SysTerm(20006, 'Invalid') + ': ' + SysTerm(1011, 'File path');
						break;
					}
				default:
					{
						msg = e.message;
						break;
					}
			}

			SysConfirm(5, null, msg, null, null, SysTerm(35240, 'The form couldn\'t be submitted.'));
			return false;
		}
	}
	else
		return false;
}

function SysShowWaitMessage() {
	/// <summary>Shows the wait message</summary>

	SysWaitMessage(true);
}

function SysWaitMessage(show) {
	/// <summary>Toggles the wait message</summary>
	/// <param name="show" type="Boolean">True to show the wait message, false to hide</param>

	if (show)
		$('#WaitMessage').show();
	else
		$('#WaitMessage').hide();
}

function SysAuto(id) {
	/// <summary>Triggers a post back</summary>
	/// <param name="id" type=""></param>
	
	SysSet('sysFocus', id);
	return SysSubmit(1);
}

function SysAutoTab(e) {
	/// <summary>Triggers a tab (key)</summary>
	/// <param name="e" type="DOMEvent"></param>

	if (SysGetKey(e) == SysHandleKey.Key.tab) { SysSet('sysTab', true); }
}

// [choo225643]: change this?
function SysFocusTab(id) {
	var found = false;
	var next = 0;
	var nextEl;
	var nElems = document.forms[0].length;

	// BR 24.785.272: add try catch block
	try {
		for (i = 0; i < nElems; i++) {
			if (document.forms[0][i].name == id || found) {
				next = i;
				if (next < nElems && found == false) { next++; }

				nextEl = document.forms[0][next];
				if (nextEl.tabIndex >= 0 && nextEl.type != 'hidden') {
					SysFocus(nextEl.id);
					break;
				}
				found = true;
			}
		}
	}
	catch (ex) { }
}

function SysLocation(url) {
	/// <summary>Sets the document's location, effectively redirecting to a new document</summary>
	/// <param name="url" type="String">The URL to navigate to</param>

	sysIsSubmitted = true;
	window.location.assign(url);
}

function SysForward() {
	/// <summary>Navigates to the next document in the browser's history</summary>

	sysIsSubmitted = true;
	history.forward();
}

function SysBack() {
	/// <summary>Navigates to the previous document in the browser's history</summary>

	sysIsSubmitted = true;
	history.back();
}

function SysFocus(id) {
    /// <summary>Sets focus on the element specified</summary>
    /// <param name="id" type="String">The element to set focus</param>
    var el = SysGetElement(id);
    if (el != null) {
        if (el.tagName == 'INPUT' && el.type == 'radio') {
            var c = document.getElementsByName(id);
            if (c != null) {
                for (i = 0; i < c.length; i++) {
                    if (c[i].checked) {
                        el = c[i];
                        break;
                    }
                }
            }
        }

        try {
            document.focus();
            el.focus();
            if (el.setActive) el.setActive();
            SysSelect(el);
        }
        catch (ex) { }
    }
}

// CT 23.719.192, BR 23.742.168
function SysDefaultFocus() {
	/// <summary>Sets focus on the element specified in [sysDefaultFocus].[value]</summary>

	var el = SysGetElement('sysDefaultFocus');
	if (!el) return;
	if (el.value == '') return;
	el = SysGetElement(el.value);
	if (!el) return;
	SysFocus(el.id);
}

function SysSelect(el) {
	// [choo225643]: verify select all

	/// <summary>Selects all the text in provided element</summary>
	/// <param name="el" type="Object">The element to perform a selection on</param>

    if (el.tagName != 'INPUT' || el.type == 'radio' || el.type == 'checkbox' || el.type == 'hidden') return;
    if ($(el).is(':hidden')) return;
	var sel = new SysSelection(el);
	sel.SetSelection();
}

function SysFocusFirst(doc) {
	/// <summary>Sets the focus to the first non-input field and non-hidden element in the provided [document] object</summary>
	/// <param name="doc" type="Object">The [document] element to work with</param>

	if (doc == null) doc = document;
	if (doc.forms.length == 0) return;
	try {
		var f = doc.forms[0];
		var el;
		for (var i = 0; i < f.elements.length; i++) {
			el = $(f.elements[i]);
			if (el.is('input') || el.is(':hidden')) {
				el.focus();
				return;
			}
		}
	}
	catch (ex)
	{ }
}

function SysURLEncode(s) {
	/// <summary>URI encodes a given string</summary>
	/// <param name="s" type="String">The URI to encode</param>
	/// <returns type="String">The encoded string</returns>

	return (encodeURIComponent(s));
}

// BR 30.479.178
function SysPageInIFrame(win) {
	// [choo225643]: [frameElement] doesn't work in safari

	return ((win != null) && (win.frameElement != null) && (win.frameElement.nodeName.toLowerCase() == 'iframe'));
}

var sysButtonClose = null;
function SysBackUrl(e, url) {
	/// <summary>Triggers the [Close] button, or navigate to a previous URI</summary>
	/// <param name="url" type="String">The URI to navigate to</param>

	if (!new SysHandleEvent(e).IsEventStopped() && new SysHandleKey(e).IsEscapeKey()) {
		// BR 30.479.178
		var isIframe = false;
		var par = null;
		if (SysPageInIFrame(window)) {
			isIframe = true;
			par = window.parent;
			while (SysPageInIFrame(par)) { par = par.parent; }
		}

		if ((isIframe) && (par != null)) {
			if (par.sysButtonClose == null) {
				if (par.GetSysBackUrl) {
					var newurl = par.GetSysBackUrl();
					if (newurl != null)
						par.location.assign(newurl);
					else
						window.location.assign(url);
				}
				else
					window.location.assign(url);
			}
			else {
				var b = SysGetElement(par.sysButtonClose, par); //par.document.getElementById(par.sysButtonClose);
				if (b) b.click();
			}
		}
		else {
			if (sysButtonClose == null)
				window.location.assign(url);
			else {
				var b = SysGetElement(sysButtonClose);
				if (b) b.click();
			}
		}

		SysCancelBubble(e);
	}
}

//FC 23.768.833
var sysDefaultEnter = null;
function SysDefaultEnter(e) {
	/// <summary>Triggers the element defined in [sysDefaultEnter]</summary>
	/// <param name="e" type="DOMEvent"></param>

	var el = $(SysSrcElement(e));
	if (el.is('textarea') || el.is('select') || el.is('button') || el.is('a')) return;

	var hdl = new SysHandleKey(e);
	var key = hdl.GetKey();
	if (key === SysHandleKey.Key.enter && !(key === SysHandleKey.Key.alt)) {

		if (!sysXmlHttpAborted) {
			SysCancelBubble(e);
			SysPreventDefault(e);
			SysCallbackAbort();
			//return; //BR 30.905.164
		}

		if (sysDefaultEnter != null) {
			var b = SysGetElement(sysDefaultEnter);
			if (b) b.click();

			SysCancelBubble(e);
			SysPreventDefault(e);
		}
	}
}

function SysCancelClose(e) {
	/// <summary>Closes the current window and cancels the provided event</summary>
	/// <param name="e" type="DOMEvent"></param>

	if (!new SysHandleEvent(e).IsEventStopped() && new SysHandleKey(e).IsEscapeKey()) {	
		window.close(); // window.parent.close(); 
		SysCancelBubble(e);
	}
}

function SysClickTag(e) {
	/// <summary>(Re)direct the hyperlink when pressing the space bar. The link is redirected to the MainWindow</summary>
	/// <param name="e" type="DOMEvent"></param>	

	var el = $(SysSrcElement(e));
	var hdl = new SysHandleKey(e);

	if (hdl.GetKey() === SysHandleKey.Key.space && el.is("a")) {
		// TODO: move below to Sys.... (see also SysHelp, which also needs to use a.o. contentWindow.
		// Note: FF knows also contentDocument, IE does not.
		el.click();
		//parent.document.getElementById("MainWindow").contentWindow.location = el.attr("href");
	}
}

function SysEnable(id) {
	/// <summary>
	/// Obsolete, please use SysElement(id).SetDisabled(false) instead. 
	/// Enables the element with the id provided
	/// </summary>
	/// <param name="id" type="String">The id of the element to enable/ disable</param>

	var el = new SysElement(id);
	el.SetDisabled(false);
}

function SysDisable(id) {
	/// <summary>
	/// Obsolete, please use SysElement(id).SetDisabled(true) instead. 
	/// Disables the element with the id provided
	/// </summary>
	/// <param name="id" type="String">The id of the element to enable</param>

	var el = new SysElement(id);
	el.SetDisabled(true);
}

function SysSetImage(id, imgs) {
	/// <summary>Sets the image source of an element</summary>
	/// <param name="id" type="String">The id of the element to set</param>
	/// <param name="imgs" type="String">The source of the image</param>

	var img = SysGetElement(id);
	if (img != null) {
		img.src = imgs;
	}
}

// [choo225643]: verify name? 
function SysSetDisplay(name, style) {
	/// <summary>Sets the css display of an element</summary>
	/// <param name="name" type="String">The name of the element to set</param>
	/// <param name="style" type="String">The style to set</param>

	var ctl = SysGetElement(name);
	if (ctl != null) {
		$(ctl).css("display", style);
	}
}

// [choo225643]: provide summary
//Check back history
function SysCheckBackHistory() {
	var ne = SysGet('SysNoBack');
	if (ne == null || ne == '') {
		SysSet('SysNoBack', 1);
	}
	else {
		SysForward();
	}
}

// Format number
// -------------
// Events
function SysNumKeyDown(e, el, dec, neg) {
	/// <summary>Numeric keyDown event handler</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="el" type="object">Element object</param>
	/// <param name="dec" type=""></param>
	/// <param name="neg" type=""></param>

	// BR 34.661.101
	if ($(el).attr("readonly") == true) return;

	var hdl = new SysHandleKey(e);
	switch (hdl.GetKey()) {
		case SysHandleKey.Key.del:
			{
				SysNumDelete(el, dec, neg);
				SysCancelBubble(e);
				break;
			}
		case SysHandleKey.Key.backspace:
			{
				SysNumBackSpace(el, dec, neg);
				SysCancelBubble(e);
				break;
			}
		case SysHandleKey.Key.dot:
			{
				SysNumStep(el);
				SysCancelBubble(e);
				break;
			}
	}
}

function SysNumKeyPress(e, el, dec, neg, ch) {
	/// <summary>Numeric keyPress event handler</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="el" type="object">Element object</param>
	/// <param name="dec" type=""></param>
	/// <param name="neg" type=""></param>
	/// <param name="ch" type=""></param>

	if ($(el).get(0).readOnly) return;

	// FF sends control keys (a.o. arrow keys) through to the keypress unlike other browsers
	if (SysProcessKey(e)) {
		if (ch == null) {
			SysCancelBubble(e);
			ch = String.fromCharCode(SysGetKey(e));
		}
		if (ch >= '0' && ch <= '9')
			SysNumInput(el, dec, ch, neg);
		else if (ch == sysFormatDecSep)
			SysNumStep(el);
		else if (ch == '-' && neg)
			SysNumToggleSign(el, dec);
	}
}

// [choo225643]: add summary
function SysNumPaste(el, dec, neg) {

	if (window.clipboardData) {
		SysCancelBubble(e);
		var ch = window.clipboardData.getData("Text");
		if (ch == null) return;
		var v = SysNumClearSelection(el);
		if (v != '' && v != null) {
			var pos = SysGetCaretPosition(el);
			el.value = v;
			SysSetCaretPosition(el, pos);
		}
		var f = SysNumUnFormat(ch, neg);
		var n = neg && (f.substr(0, 1) == '-');
		if (n) f = f.substr(1);
		if (el.value != '' && el.value != null)
			ch = f;
		else if (n) {
			SysNumKeyPress(e, el, dec, neg, '-');
			ch = ch.replace(/-/g, '');
		}
		for (var i = 0; i < ch.length; i++) {
			SysNumKeyPress(e, el, dec, neg, ch.charAt(i));
		}
	} else {
		// [choo225643]: SysClipboard?
		// TODO: fill in for ff
	}
}

// [choo225643]: add summary
function SysNumCut(el, dec) {

	if (window.clipboardData) {
		document.execCommand('Copy');
		var v = SysNumClearSelection(el);
		if (v == '') return;
		var pos = SysGetCaretPosition(el);
		var num = SysNumUnFormat(v, true);
		v = SysNumFormat(num, dec);
		el.value = v;
		SysSetCaretPosition(el, pos);
		sysInputChanged = true;
	}
	else {
		// [choo225643]: SysClipboard?
		// TODO: fill in for ff
	}
}

function SysNumUnFormat(val, neg) {
	/// <summary>Strip the formatting from the given value (such as decimal/thousand separators) </summary>
	/// <param name="val" type="String">value to unformat</param>
	/// <param name="neg" type="boolean">Preserve the negativity of the value, i.e. if this is false and val is 
	/// a negative, this is omitted from the result, otherwise a minus sign is prepended to the unformatted value.</param>
	/// <returns type="String">Unformatted value</returns>

	if (val == null)
		return '0';
	var t = '';
	var i;
	var n = false;
	var first = true;
	for (i = 0; i < val.length; i++) {
		var c = val.charAt(i)
		if (!first || c != '0') {
			if (c >= '0' && c <= '9') {
				first = false;
				t += c;
			}
			if (neg && (c == '-' || c == '(' || c == ')')) {
				n = true;
			}
		}
	}
	if (t.length == 0) {
		t = '0';
	}
	if (n) {
		t = '-' + t;
	}
	return t;
}

// [choo225643]: provide summary
function SysNumFormat(num, dec) {
	var n = (num.substr(0, 1) == '-');
	if (n) {
		num = num.substr(1);
	}
	if (dec == null) {
		dec = 2;
	}
	var v = '';
	var i = num.length - 1;
	var j = 0;
	for (; j < dec && i >= 0; i--, j++) {
		var l = num.substr(i, 1);
		v = l + v;
	}
	if (j < dec || num.length == dec) {
		if (dec == 0) {
			v = '0';
		}
		else {
			for (; j < dec; j++) {
				v = '0' + v;
			}
			v = '0' + sysFormatDecSep + v;
		}
	}
	else {
		if (dec != 0) {
			v = sysFormatDecSep + v;
		}
		var j = 0;
		for (; i >= 0; i--, j++) {
			if (j == 3) {
				v = sysFormatSep + v;
				j = 0;
			}
			var l = num.substr(i, 1);
			v = l + v;
		}
	}
	if (n) {
		return SysFormatNegative(v, sysFormatNegative);
	}
	else {
		return v;
	}
}

function SysFormatNegative(num, fmt) {
	/// <summary>Returns a negative number with the specified format</summary>
	/// <param name="num" type="Int">The number to format</param>
	/// <param name="fmt" type="Int">
	/// The format to use:
	///   0: [(number)]
	///   1: [-number]
	///   2: [- number]
	///   3: [number-]
	///   4: [number -]
	/// </param>

	switch (fmt) {
		case 0: // (100)
			return '(' + num + ')';
		case 1: // -100
			return '-' + num;
		case 2: // - 100
			return '- ' + num;
		case 3: // 100-
			return num + '-';
		case 4: // 100 -
			return num + ' -';
	}
	return num;
}

// [choo225643]: provide summary
function SysNegativeChars(fmt) {
	var nc = new Array();
	nc[0] = 0; nc[1] = 0;
	switch (fmt) {
		case 0: // (100)
			{ nc[0] = 1; nc[1] = 1; break; }
		case 1: // -100
			{ nc[0] = 1; break; }
		case 2: // - 100
			{ nc[0] = 2; break; }
		case 3: // 100-
			{ nc[1] = 1; break; }
		case 4: // 100 -
			{ nc[1] = 2; break; }
	}
	return nc;
}

// [choo225643]: verify this is multibrowser compliant
function SysNumStep(el) {
	var v = el.value;
	var c = v.indexOf(sysFormatDecSep);
	if (c >= 0)
		SysSetCaretPosition(el, c + 1);
}

// [choo225643]: provide summary
function SysNumClearSelection(el) {
	var t;
	var pos = SysGetCaretPosition(el);
	var el2 = $(el).get(0);
	if (el2.selectionStart != undefined) {
		if (el2.selectionStart == el2.selectionEnd) {
			return null;
		}
		var val = el.value;
		t = el.value.substring(el2.selectionStart, el2.selectionEnd);
		el.value = val.substring(0, el2.selectionStart) + val.substring(el2.selectionEnd);
	} else {
		if (document.selection.type != "Text") {
			return null;
		}
		t = document.selection.createRange().text;
		document.selection.clear();
	}

	var v = el.value;
	if (v == '' || v == null) {
		el.value = '';
		SysSetCaretPosition(el, 1);
		sysInputChanged = true;
		return '';
	}
	var c = v.indexOf(sysFormatDecSep);
	if (c >= 0 && pos > c) {
		t = t.replace(/-|\)| /g, '');
		for (var length = t.length; length > 0; length--) {
			v += '0';
		}
	}
	return v;
}

// [choo225643]: provide summary
function SysNumDelete(el, dec, neg) {
	var ch;
	var pos = SysGetCaretPosition(el);
	var v = SysNumClearSelection(el);
	if (v == '')
		return;
	else if (v == null) {
		v = el.value;
		if (pos == v.length) return;
		ch = v.substr(pos, 1);
		if (ch == sysFormatDecSep || ch == sysFormatSep || ch == ' ' || ch == '(')
			pos++;
		var c = v.indexOf(sysFormatDecSep);
		v = v.substr(0, pos) + v.substr(pos + 1) + ((c >= 0 && pos > c) ? '0' : '');
	}
	var p = v.length - pos;
	var num = SysNumUnFormat(v, neg);
	v = SysNumFormat(num, dec);
	el.value = v;
	pos = v.length - p;
	ch = v.substr(pos, 1);
	if (ch == sysFormatSep || '( -'.indexOf(ch) >= 0)
		pos++;
	SysSetCaretPosition(el, pos);
	sysInputChanged = true;
}

// [choo225643]: provide summary
function SysNumBackSpace(el, dec, neg) {
	var pos = SysGetCaretPosition(el);
	var p;
	var v = SysNumClearSelection(el);
	if (v == '')
		return;
	else if (v == null) {
		if (pos == 0) return;
		v = el.value;
		var ch = v.substr(pos - 1, 1);
		if (ch == sysFormatDecSep || ch == sysFormatSep || ch == ' ' || ch == ')')
			pos--;
		p = v.length - pos;
		var c = v.indexOf(sysFormatDecSep);
		v = v.substr(0, pos - 1) + v.substr(pos);
		if (c >= 0 && pos > c && ch != '-') {
			v += '0';
			p++;
		}
	}
	else
		p = v.length - pos;
	var num = SysNumUnFormat(v, neg);
	v = SysNumFormat(num, dec);
	el.value = v;
	pos = v.length - p;
	SysSetCaretPosition(el, pos);
	sysInputChanged = true;
}

function SysNumZeros(dec) {
	/// <summary>
	/// Returns a string of zeroes corresponding to the number provided in parameter [dec]. 
	/// eg [dec] = 2, return '00'
	/// </summary>
	/// <param name="dec" type="Int">The number of zeroes to return</param>

	var v = '';
	for (; dec > 0; dec--)
		v += '0';
	return v;
}

function SysNumToggleSign(el, dec) {
	/// <summary>Toggle the value of el between positive and negative, preserving the format defined by sysFormatNegative 
	/// and the selected text.</summary>
	/// <param name="el" type="jQuery"></param>
	/// <param name="dec" type="number"></param>
	/// <returns type="undefined">undefined</returns>

	var sel = new SysSelection(el);

	var pos = sel.GetCaretPosition(el);
	sel.DeleteSelection();
	var v = el.value;

	var num = SysNumUnFormat(v, true);
	var n = (num.substr(0, 1) == '-');
	if (n)
		num = num.substr(1);
	else {
		if (num == '0' && pos == 0)
			pos++;
		num = '-' + num;
	}
	el.value = SysNumFormat(num, dec);
	sel.SetCaretPosition(pos + (n ? -1 : 1) * SysNegativeChars(sysFormatNegative)[0]);
	sysInputChanged = true;

	sel = null;
}

// [choo225643]: provide summary
function SysNumInput(el, dec, ch, neg) {
	var pos = SysGetCaretPosition(el);
	var v = SysNumClearSelection(el);
	if (v == null) v = el.value;
	if (v == '' || v == null) {
		el.value = SysNumFormat(ch + SysNumZeros(dec), dec);
		SysSetCaretPosition(el, 1);
	}
	else {
		var c = v.indexOf(sysFormatDecSep);
		var add = true;
		var n = false;
		if (c >= 0 && pos > c) {
			if (neg) {
				var f = SysNumUnFormat(v, neg);
				n = (f.substr(0, 1) == '-')
			}
			if (v.length <= pos + (n ? SysNegativeChars(sysFormatNegative)[1] : 0))
				return;
			add = false;
		}
		var p = v.length - pos;
		var l = v.substr(0, pos);
		var r;
		if (add)
			r = v.substr(pos);
		else {
			r = v.substring(pos, c + dec);
			if (n)
				r += v.substr(v.length - SysNegativeChars(sysFormatNegative)[1]);
		}
		var num = SysNumUnFormat(l + ch + r, neg);

		var maxlength = el.maxLength;
		//    BR 31.910.936	start
		//		if ((maxlength > 0) && (dec > 0)) {
		//			if ((num.length + 1) > el.maxLength) return; 
		//		}
		if (maxlength > 0) {
			if (dec > 0) {
				if ((num.length + 1) > el.maxLength) return;
			}
			else {
				if (num.length > el.maxLength) return;
			}
		}
		//    BR 31.910.936	end

		v = SysNumFormat(num, dec);
		el.value = v;
		pos = v.length - p;
		if (!add)
			pos++;
		SysSetCaretPosition(el, pos);
	}
	sysInputChanged = true;
}

// Validation
// ----------

// [choo225643]: provide summary
// this function basically takes over this: return (key <= 31) || (s.indexOf(c) >= 0);
function ValidateKey(e, s) {
	var ev = SysEvent(e);
	var key = SysGetKey(ev);
	var c = String.fromCharCode(key);

	if (SysProcessKey(e)) {
		if (!((key <= 31) || (s.indexOf(c) >= 0))) {
			ev.preventDefault();
		}
	}
}

// [choo225643]: provide summary
function SysValidateNumber(e, bInteger, bNegative, bThoSep) {
	var s = '1234567890';
	var key = SysGetKey(e);

	if (!bInteger) s += sysFormatDecSep;
	if (bNegative) s += '-() ';
	if (bThoSep) s += sysFormatSep;
	// [choo225643]: 46 = delete... was it changed to 127? 
	if (!bInteger && sysFormatDecSep == ',' && key == 46)
		SysSetKey(e, 44); // 44 = comma
	else
		ValidateKey(e, s);
}

function SysValidateDate(e) {
	/// <summary>Validates that the keyCode in [e] is within the allowed range for dates</summary>
	/// <param name="e" type="DOMEvent"></param>	
	/// <returns type="Boolean">True if validation passed, false otherwise</returns>

	var s = '.-/1234567890';
	ValidateKey(e, s);
}

function SysValidateTime(e, b12) {
	/// <summary>Validates that the keyCode in [e] is within the allowed range for time</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="b12" type="Boolean">True for 12-hour time (eg. 1:00 PM), false for 24-hour time (eg 1300)</param>
	/// <returns type="Boolean">True if validation passed, false otherwise</returns>

	var s = ':1234567890';
	if (b12) { s += ' apmAPM'; }
	ValidateKey(e, s);
}

function SysAddClass(el, className) {
	/// <summary>Adds a class to the specified element's [className] property</summary>
	/// <param name="el" type="Object">The element to add a class</param>
	/// <param name="className" type="String">The class to add</param>

	if (!$(el).hasClass(className)) $(el).addClass(className);
}
function SysRemoveClass(el, className) {
	/// <summary>Removes a class from the specified element's [className] property</summary>
	/// <param name="el" type="Object">The element to remove a class</param>
	/// <param name="className" type="String">The class to remove</param>

	if ($(el).hasClass(className)) $(el).removeClass(className);
}

function SysResetInvalidFlag(ctl) {
	/// <summary>Resets the specified control by removing the [notValid] class</summary>
	/// <param name="ctl" type="Object">The element to reset</param>

	var c = SysGetElement('InvalidFlag_' + ctl);
	if (c != null)
		c.innerHTML = '';

	c = SysGetElement(ctl);
	if (c != null) {
		SysRemoveClass(c, 'notValid');
	}

	c = SysGetElement(ctl + '_alt');
	if (c != null) {
		SysRemoveClass(c, 'notValid');
	}
}

function SysSetInvalidFlag(ctl) {
	/// <summary>Adds the [notValid] class to the specified control</summary>
	/// <param name="ctl" type="Object">The element to add the [notValid] class</param>

	var c = SysGetElement(ctl);
	if (c != null) {
		SysAddClass(c, 'notValid');
	}
}

function SysSetDate(parts) {
	/// <summary>Returns a formatted date based on [sysFormatDate]</summary>
	/// <param name="parts" type="Array">
	/// The 'parts' that make up a date:
	///   parts[0]: Year
	///   parts[1]: Month
	///   parts[2]: Day
	/// </param>
	/// <returns type="Date">Date with the provided values corresponding to [sysFormatDate]</returns>

	switch (sysFormatDate) {
		case '1': //DateMonthYear
			return SetDate(parts[2], parts[1], parts[0]);

		case '2': //MonthDateYear
			return SetDate(parts[2], parts[0], parts[1]);

		case '3': //YearMonthDate
			return SetDate(parts[0], parts[1], parts[2]);

	}
}

function SetDate(y, m, d) {
	/// <summary>Returns a date object based on the provided input</summary>
	/// <param name="y" type="int">The year</param>
	/// <param name="m" type="int">The month</param>
	/// <param name="d" type="int">The day</param>	
	/// <returns type="date">Returns the date based on the provided input</returns>

	if (y >= 0 && y <= 99) {
		if (y < 50) // [choo225643]: y2050 bug... 
			y += 2000;
		else
			y += 1900;
	}
	if (y > 9999) y = 9999;
	if (m > 12) m = 12;
	var md = 31; // max number of days in the month specified
	switch (m) {
		case 2:
			{
				md = (SysLeapYear(y)) ? 29 : 28;
				break;
			}
		case 4:
		case 6:
		case 9:
		case 11:
			{
				md = 30;
				break;
			}
	}
	if (d > md) d = md;

	var dt = new Date();
	dt.setFullYear(y, m - 1, d); 	//decrease month because offset is 0
	dt.setHours(0, 0, 0, 0);
	return dt;
}

function SysLeapYear(y) {
	/// <summary>Determines if input is a leap year</summary>
	/// <param name="y" type="int">The year to check</param>
	/// <returns type="bool">Returns true if the input is a leap year, false otherwise</returns>
	/// <remarks>
	/// Years divisible by 4 are generally leap years, except for years divisible by 100. 
	/// However, years divisible by 400 are leap years. 
	/// </remarks>

	return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
}

// [choo225643]: what is expr?!
function SysFormatDate(expr) {
	/// <summary>Returns a formatted date based on [sysFormatDate]</summary>
	/// <param name="expr" type="">
	/// </param>
	/// <returns type="String">String with the provided values corresponding to [sysFormatDate], separated by [sysFormatDateSep]</returns>

	var sdate = expr.getDate();
	if (sdate.toString(10).length == 1) sdate = '0' + sdate;
	var smonth = expr.getMonth() + 1;
	if (smonth.toString(10).length == 1) smonth = '0' + smonth;
	var syear = expr.getFullYear();
	if (syear.toString(10).length == 3) syear = ' ' + syear;
	switch (sysFormatDate) {
		case '1': { return (sdate + sysFormatDateSep + smonth + sysFormatDateSep + syear); }

		case '2': { return (smonth + sysFormatDateSep + sdate + sysFormatDateSep + syear); }

		case '3': { return (syear + sysFormatDateSep + smonth + sysFormatDateSep + sdate); }
	}
}

function SysDateParts(val) {
	/// <summary>Returns the provided date as an array</summary>
	/// <param name="val" type="Date"></param>
	/// <returns type="Array">
	/// Returns an array consisting of the parts of the provided date</returns>

	//first retrieve values from string
	var parts = new Array();
	var sDt = val, pos, sub
	var separator = sysFormatDateSep;
	if (separator == '.') separator = '\\.';
	pos = sDt.search(separator);
	if (pos != -1) {
		sub = SysStrip(sDt.substr(0, pos));
		parts[0] = parseInt(sub);
		sDt = sDt.substr(pos + 1);
	}
	pos = sDt.search(separator);
	if (pos != -1) {
		sub = SysStrip(sDt.substr(0, pos));
		parts[1] = parseInt(sub);
		sDt = sDt.substr(pos + 1);
	}
	parts[2] = parseInt(SysStrip(sDt));

	for (var i = 0; i < 3; i++) {
		if (isNaN(parts[i])) parts[i] = 0;
	}
	return parts;
}

// [choo225643]: provide summary
function SysSetDateCursor(el) {
	if (el.value == SysMask(sysDateMask, "")) {
		SysSetCaretPosition(el, 0);
	}
}

function SysStrip(val) {
	/// <summary>Removes all spaces and 0 from [val]</summary>
	/// <param name="val" type="string">Value to strip</param>
	/// <returns type="string">Stripped [val]</returns>
	if (val == null) return '';
	val = val.replace(/ /g, '');
	for (; val.length > 1 && val.substr(0, 1) == '0'; val = val.substr(1)) { }
	return val;
}

// [choo225643]: provide summary
function SysUnFormatDate(val) {
	var parts = SysDateParts(val);
	if (parts[0] == 0 || parts[1] == 0 || parts[2] == 0)
		return null;
	else
		return SysSetDate(parts);
}

function _SysMClearSelection(el, sel) {
	/// <summary>Intended for internal use only</summary>
	/// <param name="el" type="jQuery"></param>
	/// <param name="sel" type="SysSelection"></param>
	/// <returns type="boolean">true if a selection was cleared, false otherwise</returns>

	var selTxt = sel.GetSelection();
	if (selTxt.length > 0) {
		var pos = sel.GetCaretPosition();
		var value = el.value;
		var v = value.substr(0, pos);
		for (; v.length < selTxt.length + pos; v += '#') { }
		v += value.substr(pos + selTxt.length);
		var mask = sysDateMask;
		v = SysUnmask(mask, v, pos).replace(/#/g, ' ');
		el.value = SysMask(mask, v);
		sel.SetCaretPosition(pos - sysMaskEnd);
		sysInputChanged = true;
		return true;
	}
	return false;
}

//function SysMClearSelection(el) {
//	if (el.createTextRange) {
//		var length = document.selection.createRange().text.length
//		if (length > 0) {
//			var pos = SysGetCaretPosition(el);
//			var value = el.value;
//			var v = value.substr(0, pos);
//			for (; v.length < length + pos; v += '#') { }
//			v += value.substr(pos + length);
//			var mask = sysDateMask;
//			v = SysUnmask(mask, v, pos).replace(/#/g, ' ');
//			el.value = SysMask(mask, v);
//			SysSetCaretPosition(el, pos - sysMaskEnd);
//			sysInputChanged = true;
//			return true
//		}
//	}
//	return false
//}

var sysMaskPos, sysMaskEnd
// [choo225643]: provide summary
function SysUnmask(mask, value, pos) {
	sysMaskEnd = 0;
	sysMaskPos = pos;
	var v = '';
	var maskEnd = true;
	for (var i = mask.length - 1; i >= 0; i--) {
		switch (mask.charAt(i)) {
			case 'a': // lower case only
			case 'A': // upper case only
			case '9': // '0'=48, '9'=57
			case '#': // all chars
				{
					v = value.charAt(i) + v;
					if (i < pos) maskEnd = false;
					break;
				}
			default:
				{
					if (i < pos) {
						sysMaskPos--;
						if (maskEnd) sysMaskEnd++;
					}
					break;
				}
		}
	}
	return v;
}

// [choo225643]: provide summary
function SysMask(mask, value) {
	var v = '';
	var j = 0;
	for (var i = 0; i < mask.length; i++) {
		switch (mask.charAt(i)) {
			case 'a': // lower case only
			case 'A': // upper case only
			case '9': // '0'=48, '9'=57
			case '#': // all chars
				{
					if (j < value.length)
						v += value.charAt(j);
					else
						v += ' ';
					j++;
					break;
				}
			default:
				{
					v += mask.charAt(i);
					break;
				}
		}
	}
	return v;
}

function SysMKeyDown(e, el) {
	/// <summary>Handles keyDown events on 'date type' input elements (DateField controls)</summary>
	/// <param name="e" type="DOMEvent">Can be a browser specefic event object or a Sys.UI.DomEvent</param>
	/// <param name="el" type="jQuery">The element upon which the keypress applies</param>

	var hdl = new SysHandleKey(e);
	switch (hdl.GetKey()) {
		case SysHandleKey.Key.del:
			{
				_SysMDelete(el);
				SysCancelBubble(e);
				break;
			}
		case SysHandleKey.Key.backspace:
			{
				_SysMBackSpace(el);
				SysCancelBubble(e);
				break;
			}
	}
}

function SysMKeyPress(e, el) {
	/// <summary>Handles keypress events on 'date type' input elements (DateField controls)</summary>
	/// <param name="e" type="DOMEvent">Can be a browser specefic event object or a Sys.UI.DomEvent</param>
	/// <param name="el" type="jQuery">The element upon which the keypress applies</param>
	/// <remarks>if the pressed key is handled propagation of the event is stopped en the default action
	/// is prevented.</remarks>

	if (SysProcessKey(e)) {
		var sel = new SysSelection(el);
		_SysMPassChar(el, SysGetKey(e), sel);
		SysCancelBubble(e);
	}
}

function _SysMDelete(el) {
	/// <summary>Intended for internal use only</summary>
	/// <param name="el" type="jQuery"></param>

	var sel = new SysSelection(el);

	if (_SysMClearSelection(el, sel)) {
		return;
	}

	var pos = sel.GetCaretPosition();
	var value = el.value;
	var mask = sysDateMask;
	var v = SysUnmask(mask, value, pos);
	for (; v.charAt(sysMaskPos) == ' '; sysMaskPos++) { }
	v = SysMPutChar(sysMaskPos, ' ', v);
	el.value = SysMask(mask, v);
	sel.SetCaretPosition(pos);
	if (value != el.value) {
		sysInputChanged = true;
	}
}

function _SysMBackSpace(el) {
	/// <summary>Intended for internal use only</summary>
	/// <param name="el" type="jQuery"></param>

	var sel = new SysSelection(el);

	if (_SysMClearSelection(el, sel)) {
		return;
	}

	var pos = sel.GetCaretPosition();
	if (pos > 0) {
		var mask = sysDateMask;
		var value = el.value;
		var v = SysUnmask(mask, value, pos);
		v = SysMPutChar(sysMaskPos - 1, ' ', v);
		el.value = SysMask(mask, v);
		sel.SetCaretPosition(pos - sysMaskEnd - 1);
		sysInputChanged = true;
	}
}

function SysMPutChar(pos, ch, value) {
	/// <summary>Inserts [ch] in [value], at position [pos]. Flags [sysInputChanged] as well</summary>
	/// <param name="pos" type="int">Position in [value] to insert [ch]</param>
	/// <param name="ch" type="string">String to insert into [value]</param>
	/// <param name="value" type="string">String to insert [ch]</param>
	/// <returns type="string">Modified [value]</returns>
	
	var l = value.substr(0, pos);
	var r = value.substr(pos + 1);
	sysInputChanged = true;
	return l + ch + r;
}

function _SysMPassChar(el, key, sel, pass) {
	/// <summary>Intended for internal use only</summary>
	/// <param name="el" type="jQuery"></param>
	/// <param name="key" type="number">character code of a pressed key</param>
	/// <param name="sel" type="SysSelection" optional="true"></param>
	/// <param name="pass" type="number" optional="true">should only be assigned from inside this function</param>
	/// <remarks>There is recursion in this function, and when this function is recursively called the pass argument
	/// should be filled.</remarks>
	/// <returns type="number">(new) position of the caret</returns>

	// This is intended as fail safe terminating condition to the recursion inside this function (which could happen
	// if the pos variable does not get increased with every iteration
	var iteration = 1;
	if (typeof pass === "number") {
		iteration = pass;
	}

	_SysMClearSelection(el, sel);

	var pos = sel.GetCaretPosition();
	var mask = sysDateMask;
	var value = el.value;
	var ch = String.fromCharCode(key);

	// (one of the) recursion terminating condition(s)
	if (pos >= mask.length || iteration > mask.length) {
		return;
	}

	var done = true;
	switch (mask.charAt(pos)) {
		case 'a': // lower case only
			{
				if (ch >= 'a' && ch <= 'z') {
					el.value = SysMPutChar(pos, ch, value);
					pos += 1;
					sel.SetCaretPosition(pos);
				}
				else done = false;
				break;
			}
		case 'A': // upper case only
			{
				if (ch >= 'A' && ch <= 'Z') {
					el.value = SysMPutChar(pos, ch, value);
					pos += 1;
					sel.SetCaretPosition(pos);
				}
				else done = false;
				break;
			}
		case '9': // '0'=48, '9'=57
			{
				if (ch >= '0' && ch <= '9') {
					el.value = SysMPutChar(pos, ch, value);
					pos += 1;
					sel.SetCaretPosition(pos);
				}
				else done = false;
				break;
			}
		case '#': // all chars
			{
				el.value = SysMPutChar(pos, ch, value);
				pos += 1;
				sel.SetCaretPosition(pos);
				break;
			}
		default:
			{
				pos += 1;
				sel.SetCaretPosition(pos);
				if (mask.charAt(pos - 1) != (('.-/'.indexOf(ch) >= 0) ? sysFormatDateSep : ch)) {
					_SysMPassChar(el, key, sel, iteration + 1);
				}
				break;
			}
	}
	if (!done && '.-/'.indexOf(ch) >= 0) {
		// Try to set cursor right after first matching separator
		for (var i = pos; i < mask.length; i++) {
			if (mask.charAt(i) == sysFormatDateSep) {
				pos = ++i;
				sel.SetCaretPosition(pos);
				break;
			}
		}
	}
	return pos;
}

// [choo225643]: provide summary
function SysMCut(e, el) {
	document.execCommand('Copy');
	var sel = new SysSelection(el);
	_SysMClearSelection(el, sel);
	SysCancelBubble(e);
}

// [choo225643]: provide summary
function SysMPaste(e, el) {
	if (window.clipboardData) {
		SysCancelBubble(e);
		var ch = window.clipboardData.getData("Text");
		if (ch == null) {
			return;
		}

		var sel = new SysSelection(el);
		for (var i = 0; i < ch.length; i++) {
			_SysMPassChar(el, ch.charCodeAt(i), sel);
		}
	}
	else {
		// [choo225643]: provide implementation for firefox... 
	}
}

// [choo225643]: provide summary
function SysParseDate(el) {
	var parts = SysDateParts(el.value);
	var zc = 0;
	for (var i = 0; i < 3; i++) {
		if (parts[i] == 0) zc++
	}
	switch (zc) {
		case 3:
			{
				break;
			}
		case 2:
			{
				var dt = new Date();
				var m = dt.getMonth() + 1;
				var y = dt.getFullYear();
				for (var i = 0; i < 3; i++) {
					if (parts[i] != 0)
						el.value = SysFormatDate(SetDate(y, m, parts[i]));
				}
				break;
			}
		case 1:
			{
				var dt = new Date();
				var d, m
				var y = dt.getFullYear();
				var first = true
				for (var i = 0; i < 3; i++) {
					if (parts[i] != 0) {
						if (first ^ (sysFormatDate != '1')) {
							d = i;
						} else
							m = parts[i];
						first = false;
					}
				}
				el.value = SysFormatDate(SetDate(y, m, parts[d]));
				break;
			}
		case 0:
			{
				el.value = SysFormatDate(SysSetDate(parts));
				break;
			}
	}
}

// Format number
// [choo225643]: provide summary
function SysUnFormatNumber(val) {
	if (val == null)
		return 0;
	var t = '';
	var i;
	var n = false;
	for (i = 0; i < val.length; i++) {
		var c = val.charAt(i)
		if (c >= '0' && c <= '9')
			t += c;
		if (c == sysFormatDecSep)
			t += '.';
		if (c == '-' || c == '(' || c == ')')
			n = true;
	}
	if (t.length == 0)
		return 0;
	if (n)
		t = '-' + t;
	return parseFloat(t);
}

// [choo225643]: provide summary
function SysFormatNumber(num, prec) {
	if (prec == null)
		prec = 2;
	return SysFormatNumberEx(num, prec);
}

// [choo225643]: provide summary
function SysFormatNumberEx(num, prec) {
	var pow = Math.pow(10, prec);

	if (num == null) num = '0';
	num = num.toString().replace(/\$|\,/g, '');
	if (isNaN(num)) num = "0";

	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num * pow + 0.50000000001);

	// BR 29.405.493
	if ((num + "").length >= 15) {
		var url = 'SysCallBack.aspx?Action=5&num=' + num + '&pow=' + pow;
		cents = parseInt(SysCallback(url));
	}
	else {
		cents = num % pow;
	}

	num = Math.floor(num / pow).toString();

	// set precision
	if (cents < pow) {
		if (cents == 0) {
			cents = "";
		}
		var x = prec - cents.toString().length;
		for (var i = 0; i < x; i++) {
			cents = "0" + cents;
		}
	}

	// format
	var sep = sysFormatSep;
	var decsep = sysFormatDecSep;
	for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
		num = num.substr(0, num.length - (4 * i + 3)) + sep + num.substr(num.length - (4 * i + 3));
	if (prec > 0)
		num = num + decsep + cents;
	return ((sign) ? num : SysFormatNegative(num, sysFormatNegative));
}

// Dialog handling
// FROM: XXX
// ---------------
// One object tracks the current modal dialog opened from this window.
var SysDialog = new Object()

// Event handler to inhibit Navigator form element 
function SysDialogDeadend() {
	if (SysDialog.win && !SysDialog.win.closed) {
		SysDialog.win.focus();
		return false;
	}
}
// Invoked by onFocus event handler of EVERY frame, return focus to dialog window if it's open.
function SysDialogCheckModal() {
	if (SysDialog.win && !SysDialog.win.closed) {
		SysDialog.win.focus();
	}
}
// Grab all Navigator events that might get through to form elements while dialog is open.
function SysDialogBlockEvents() {
	window.captureEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS)
	window.onclick = SysDialogDeadend;
	window.onfocus = SysDialogCheckModal;
}
// As dialog closes, restore the main window's original event mechanisms.
function SysDialogUnblockEvents() {
	window.releaseEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS)
	window.onclick = null;
	window.onfocus = null;
}

function SysShowModalDialog(url, args, options) {
	/// <summary>Shows a modal dialog and returns the dialog result</summary>
	/// <param name="url" type="String">The URI of the dialog</param>
	/// <param name="args" type="String">The arguments to pass to the dialog</param>
	/// <param name="options" type="String">The options to pass to the dialog</param>
		
	if (window.showModalDialog) {
		return window.showModalDialog(url, args, options);
	}
	else {
		// [choo225643]: Internet Explorer is not the only browser supporting [showModalDialog] now
		alert('Your browser does not support this feature.');
		return null;
	}
}

// [choo225643]: provide summary

// Header
// ------
function SysShowFavorite(title, url, root) {
	/// <summary>Opens up the Add Favorites page</summary>
	/// <param name="title" type="String">The title of the pop up window</param>
	/// <param name="url" type="String">The URL to use</param>	
	/// <param name="root" type="String">The URL where the favorites page is located</param>

	if (root == undefined) { root = ''; }
	var u = root + 'SysFavoriteAddContent.aspx?IsModal=1';
	var options = 'dialogHeight:' + "225px" + ';dialogWidth:' + "500px" + ';status:no;unadorned:yes;help:no;resizable:yes;';
	try {
		SysDialog.returnValue = window.showModalDialog(u, new Array(title, url), options);
	}
	catch (ex) {
		window.alert(SysTerm(15693, 'Pop-up blocked. Please enable pop-ups for this site.'))
	}
	return SysDialog.returnValue;
}

function SysShowHelp(title, topic, filter, root) {
	/// <summary>Opens up Exact's help page</summary>
	/// <param name="title" type="String">The title of the pop up window</param>
	/// <param name="topic" type="String">The help file topic to show</param>
	/// <param name="filter" type="String">The topic filter to use</param>
	/// <param name="root" type="String">The root of the URL to use</param>

	if (root == undefined) { root = ''; }
	var url = "SysHelp.aspx?Title=" + SysURLEncode(title) + "&Topic=" + SysURLEncode(topic) + "&TopicFilter=" + filter;
	var windowX = (screen.width - 800) / 2;
	var windowY = (screen.height - 500) / 2;
	window.open(root + url, null, "width=800,height=500,left=" + windowX + ",top=" + windowY + ",resizable=yes,scrollbars=yes,status=yes,toolbar=yes,menubar=no,location=no");
}

var sysPageUrl;
function SysPrintPage(url, root) {
	/// <summary>Opens up a printer-friendly version of the specified page</summary>
	/// <param name="url" type="String">The URL to print</param>	
	/// <param name="root" type="String">Not used</param>

	window.open(url, null, "width=200,height=200,titlebar=no,resizable=yes,scrollbars=yes,status=yes,toolbar=yes,menubar=yes,location=no");
}

function SysAddUrl(url, parm) {
	/// <summary>Concatenates the provided URL and [parm]</summary>
	/// <param name="url" type="String"></param>	
	/// <param name="parm" type="String"></param>

	if (url.indexOf('?') < 0)
		return url + "?" + parm;
	else
		return url + "&" + parm;
}

function SysPrint() {
	/// <summary>Opens up a printer-friendly version of the specified page</summary>

	SysPrintPage(SysAddUrl(sysPageUrl, 'SysDoPrinting=1'));
}

function SysExport(e) {
	/// <summary>Makes a request for the specified page with the [SysExporting] flag set to [e]</summary>
	/// <param name="e" type="String">Parameter for the [SysExporting] flag</param>

	window.location = SysAddUrl(sysPageUrl, 'SysDoPrinting=1&SysExporting=' + e);
}

function SysSendMail(ss, root) {
	/// <summary>Opens up the specified page in an [Outlook] New Email window. Internet Explorer only</summary>
	/// <param name="ss" type=""></param>
	/// <param name="root" type=""></param>

	//BR 26.627.152 - Added param root
	SysSendPage(SysAddUrl(sysPageUrl, 'SysDoPrinting=1&SysExporting=2'), ss, root);
}

// Values
// ------
function SysGetElement(id, doc) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>
	/// <param name="id" type="String">the element's id</param>
	/// <param name="doc" type="DOMElement" optional="true">Optionally a context (preferably a document) can be 
	/// specified in which to search.</param>
	/// <returns> Returns the DOM element. NOTE: this will be a different type of object with a different interface,
	/// depending on the user agent.</returns>
	var el = doc;
	if (doc) {
		if (typeof (doc.nodeName) !== 'string') {
			el = doc.document;
		}
	}
	//WorkItem 3930
	if (id != null) {
	    return $get(id, el);
	}
	return null;
	
//		if (doc == undefined)
//			return document.getElementById(id);
//		else
//			doc.getElementById(id);
}

function SysSet(ctl, v) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>

	SysSetValue(ctl, v);
}

function SysSetValue(ctl, v) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>
	//new SysElement(ctl).Value(v);
	var el = SysGetElement(ctl);
	//BR 32.747.113
	if (el != null) {
		if (el.tagName.toLowerCase() == "span") {
			SysSetInnerText(el, v);
		} else {
			$(el).val(v);
        	//el.value = v;
    	}
	}
}

function SysGet(ctl) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>

	return SysGetValue(ctl);
}

function SysGetValue(ctl) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>

	//return new SysElement(ctl).Value();
	var el = SysGetElement(ctl); 
	if (el != null) return $(el).val(); 
}

function SysTrim2(val, onlySpace) {
	/// <summary>Obsolete, use SysTrim() instead.</summary>

	return SysTrim(val, onlySpace);

	//	if (onlySpace == undefined) onlySpace = false; 

	//	if (val == null)
	//		return '';
	//	var t = '';
	//	var b = false;
	//	var i;
	//	for (i = 0; i < val.length; i++) {
	//		var c = val.charAt(i);
	//		onlySpace = onlySpace && (c == ' ');
	//		b = b || (c != ' ');
	//		if (b)
	//			t += c;
	//	}
	//	if (onlySpace) return val;
	//	var s = '';
	//	b = false;
	//	for (i = t.length - 1; i >= 0; i--) {
	//		var c = t.charAt(i);
	//		b = b || (c != ' ');
	//		if (b)
	//			s = c + s;
	//	}
	//	return s;
}

function SysTrim(val, onlySpace) {
	/// <summary>Returns specified string with the start and end spaces trimmed</summary>
	/// <param name="val" type="String">The string to trim</param>
	/// <param name="onlySpace" type="Boolean">If flagged true, returns the original string if [val] consists of only spaces</param>
	
	if (val == null) return '';
	var t = jQuery.trim(val); // [choo225643]: trims /t/r/n as well...
	
	if (t.length == 0) {
		if (onlySpace == undefined) onlySpace = false;
		return (onlySpace) ? val : t;
	}
	else return t;

	//if (!onlySpace) onlySpace = false; 
	//return SysTrim2(val, onlySpace);
}

// Set Default
// -----------
function SysDef(ctl, v) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>
	
	var elm = SysGetElement(ctl);
	if (elm !== undefined && elm !== null) elm.value = v;
}

// [choo225643]: revamp this? 
function SysDefName(ctl, i, v) {
	var a = document.getElementsByName(ctl);
	if (a != null && a.length >= (i - 1)) {
		var c = a(i);
		if (c != null) c.value = v;
	}
}

function SysDefCheck(ctl, v) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>

	new SysElement(ctl).SetChecked(v);
}

// [choo225643]: provide summary
function SysDefCheckList(ctl, v) {
	var c = document.getElementsByName(ctl);
	if (c == null)
		return;
	var ar;
	if (v != null && v != '') {
		ar = v.split(',');
	}

	for (i = 0; i < c.length; i++) {
		var b = false;
		var el = new SysElement(c[i]);
		if (SysElement.IsNotNothing(ar)) {
			var j = 0;
			while (!b && j < ar.length) {
				if (el.Value() == ar[j]) {
					b = true;
					break;
				}
				j++;
			}
		}
		el.SetChecked(b);
	}
}

function SysDefRadioList(ctl, v) {
	/// <summary>Obsolete, use the SysElement object instead.</summary>

	//new SysElement(ctl).Value(v);
	//BR 36.606.547
	//SysGetElement(ctl).value = v;
	$('[name="' + ctl + '"]').each(function() { 
      this.checked = (this.value == v);
	});
}

// ConfirmBox
// ----------
function SysAsk(ctl, question) {
	/// <summary>Shows a pop up dialog with the question provided</summary>
	/// <param name="ctl" type="Object">The control that will store the user's answer to the question</param>
	/// <param name="question" type="String">The question to show in the dialog</param>

	if (window.confirm(question))
		SysSet(ctl, 1);
	else
		SysSet(ctl, 0);
	SysSubmit();
}

// Color Field
// -----------
function SysBrowseColor(ctl, script, allowempty) {
	/// <summary>Shows a color picker dialog</summary>
	/// <param name="ctl" type="Object"></param>
	/// <param name="script" type="String">The script to run on the OnChange event</param>
	/// <param name="allowempty" type="Boolean">Toggles the AllowEmpty parameter</param>

	SysDialog.ctl = ctl;
	SysDialog.onchange = script;
	var u = "SysPopupColorPicker.aspx";
	if (allowempty != null && allowempty != 'undefined' && (allowempty == 1 || allowempty == true)) u += "?AllowEmpty=1";
	SysShowModal(u, "", "480px", "400px", "SysBrowseColorHandler();", false);
}

// [choo225643]: provide summary
function SysBrowseColorHandler() {
	var c = SysDialog.ctl;
	var d = SysDialog.returnValue;
	if (d != null) {
		SysGetElement(c).value = d[0];
		if (d[0] == -1) {
			SysGetElement(c + '_color').style.background = "url(images\\ColorEmpty.png)";
			SysGetElement(c + '_color').title = d[1];
		}
		else {
			SysGetElement(c + '_color').style.background = "";
			SysGetElement(c + '_color').style.backgroundColor = d[1];
			SysGetElement(c + '_color').title = d[1] + '(' + d[0] + ')';
		}

		if (SysDialog.onchange != null && SysDialog.onchange != '') {
			var onc = new Function(SysDialog.onchange);
			onc();
		}
	}
}

// Switch Division
// [choo225643]: provide summary
function SysSwitchDivision(division, url, nomsg, remember) {
	if (nomsg || SysConfirm(8)) {
		window.top.allowSwitch = true;
		SysLogOff(division, url, remember);
	}
}

function SysLogOff(division, url, remember) {
	/// <summary>Logs out the current user</summary>
	/// <param name="division" type=""></param>
	/// <param name="url" type=""></param>
	/// <param name="remember" type=""></param>

	var qsp = '';
	if (division != null)
		qsp = qsp.concat('&Division='.concat(division));
	if (url != null)
		qsp = qsp.concat('&App='.concat(url));
	if (remember != null)
		qsp = qsp.concat('&Remember='.concat(remember));
	try {
		window.top.location = 'ClearSession.aspx'.concat(qsp.replace('&', '?'));
	}
	catch (ex) { }
}

// Button Ask
var _sysDirtyChecks;
var _sysDirtyIDs;
var sysNoBeforeUnloadCheck = false;
// [choo225643]: provide summary
function SysDirtyBeforeUnload(e, txt) {	
	if (sysNoBeforeUnloadCheck) {
		sysIsSubmitted = false;
	}
	else if (SysIsDirty() && !sysIsSubmitted) {
		sysIsSubmitted = false;
		SysPreventDefault(e, txt);
		//event.returnValue = txt;
	}
}

// [choo225643]: provide summary
function SysIsDirty() {
	try {
		if (typeof (SysCheckDirty) == 'function' && SysCheckDirty()) return true;
	}
	catch (ex) { }

	if (_sysDirtyIDs != null && _sysDirtyChecks != null) {		
		for (i = 0; i < _sysDirtyIDs.length; i++) {
			var e = SysGetElement(_sysDirtyIDs[i]);
			if (e != null) {
				if (e.tagName == 'INPUT' && e.type == 'checkbox') {
					if (_sysDirtyChecks[i] != e.checked)
						return true;
				}
				else {
					if ($(e).hasClass('CuteEditorTextArea')) {						
						return EditorEdited;
					}					

					if (_sysDirtyChecks[i] != e.value)
						return true;
				}
			}
		}
	}
	return false;
}

// [choo225643]: provide summary
function SysSaveDirtyValues() {	
	if (_sysDirtyIDs != null) {
		_sysDirtyChecks = new Array();
		for (i = 0; i < _sysDirtyIDs.length; i++) {
			var e = SysGetElement(_sysDirtyIDs[i]);
			if (e != null) {
				if (e.tagName == 'INPUT' && e.type == 'checkbox')
					_sysDirtyChecks[i] = e.checked;
				else
					_sysDirtyChecks[i] = e.value;
			}
			else
				_sysDirtyChecks[i] = "";
		}
	}
}

// [choo225643]: provide summary
function SysSetDirtyFalse(ctrlid) {
	if (_sysDirtyIDs != null && _sysDirtyChecks != null) {
		for (i = 0; i < _sysDirtyIDs.length; i++) {
			if (_sysDirtyIDs[i] == ctrlid) {
				var e = SysGetElement(_sysDirtyIDs[i]);
				if (e != null) {
					if (e.tagName == 'INPUT' && e.type == 'checkbox') {
						_sysDirtyChecks[i] = e.checked;
					}
					else {
						_sysDirtyChecks[i] = e.value;
					}
				}
				break;
			}
		}
	}
	return false;
}

function SysButtonAsk(e, url, f) {
	/// <summary>Calls SysConfirm.aspx if [SysIsDirty] returns true</summary>
	/// <param name="e" type="">Not used</param>
	/// <param name="url" type="String">The URL to redirect to, also the URL to pass to [SysDialog]</param>
	/// <param name="f" type="String">The function to pass to [SysDialog]</param>

	if (!SysIsDirty()) {
		if (url == null)
			window.close();
		else
			SysLocation(url);
	}
	else {
		SysDialog.func = f;
		SysDialog.url = url;
		SysShowModal("SysConfirm.aspx", null, "300px", "150px", 'SysButtonHandler()', null, "scroll:no;"); // FC 23.842.030
	}
}

// [choo225643]: provide summary
function SysButtonHandler() {
	var a = SysDialog.returnValue;
	if (a == 1) {
		var f = SysDialog.func;
		if (f != null && !f()) return;
		SysSet('BCAction', 6);
		SysSubmit(1);
	}
	else {
		if (a == 0) {
			if (SysDialog.url == null) {
				sysIsSubmitted = true;
				window.close();
			}
			else
				SysLocation(SysDialog.url);
		}
	}
}

// [choo225643]: provide summary
function SysColumnDirty(b) {
	if (b)
		return true;
	else {
		SysConfirm(3);
		return false;
	}
}

// [choo225643]: provide summary
function SysColumnDeleteAsk(b) {
	if (b)
		return SysConfirm();
	else {
		SysConfirm(3);
		return false;
	}
}
// SysAlert
//FC 30.314.780
// [choo225643]: provide summary
function SysAlert(captionid, caption, width, height, explanation, htmlencode) {
	return SysConfirm(5, captionid, caption, width, height, explanation, htmlencode)
}

// SysConfirm
//FC 30.314.780
// [choo225643]: provide summary
function SysConfirm(mode, captionid, caption, width, height, explanation, htmlencode) {
	var sUrl;
	sUrl = "SysConfirm.aspx?";
	if (mode == null)
		mode = 2;
	if (width == null)
		width = "300px";
	if (height == null)
		height = "150px";
	if (mode > 3) {
		sUrl += "Caption=" + SysURLEncode(caption) + "&CaptionID=" + captionid + "&";
		if (explanation != null)
			sUrl += "Explanation=" + SysURLEncode(explanation) + "&";
	}
	//FC 30.314.780
	if (htmlencode == false) {
		sUrl += 'htmlencode=0&';
	}
	SysShowModal(sUrl + "mode=" + mode, null, width, height, null, null, "scroll:no;"); // FC 23.842.030

	if (SysDialog.returnValue == null) return false;

	return SysDialog.returnValue;
}

// [choo225643]: ensure logic is unchanged, provide summary
function SysErrorMessage(el) {
	var j = el.jquery ? el : $(el);
	if (j.length > 0) {
		var g = SysGuid();
		var msg = $("<span id='" + g + "' style='display:none'>" + j.html() + "</span>");
		$("body").append(msg);

		var re = /px/g;
		var height = new Number(j.css("height").replace(re, ""));
		if (isNaN(height)) height = j.height();

		var a = SysShowModal("SysErrorMessage.aspx?ID=" + g, window, "500px", height + "px", null, true);
		if (a)
			SysLocation(a);
		else
			msg.remove();
	}
}

//function SysErrorMessage(id) {
//	var el = SysGetElement(id);
//	if (el) {
//		var a = SysShowModal("SysErrorMessage.aspx", el.outerHTML, "500px", "50px");
//		if (a)
//			SysLocation(a);
//	}
//}

// Date Field
// ----------
// [choo225643]: provide summary
function SysPopupDate() {
	SysCallback("SysInputSearch.aspx?TextType=" + sysInputTextType + "&Text=" + sysInputText, "", SysInputCallback);
}

// [choo225643]: provide summary
function SysBrowseDate(ctl, linkedCtl, script) {
	var curDate = SysGet(ctl);
	var calurl = '../docs/SysPopupCalendar.aspx';
	if (curDate != null) {
		var UnFormatDate = SysUnFormatDate(curDate);
		if (UnFormatDate) {
			var yr = UnFormatDate.getFullYear();
			var mt = UnFormatDate.getMonth() + 1;
			mt = (mt < 10) ? ("0" + mt) : mt;
			var dd = UnFormatDate.getDate();
			dd = (dd < 10) ? ("0" + dd) : dd;
			UnFormatDate = yr + '-' + mt + '-' + dd;
			calurl = calurl + '?Date=' + UnFormatDate;
		}
		else {
			calurl = calurl + '?Date=' + curDate;
		}
	}
	SysDialog.ctl = ctl;
	SysDialog.linkedCtl = linkedCtl;
	SysShowModal(calurl, null, '265px', '290px', 'SysBrowseDateHandler(\'' + script + '\');');
}

// [choo225643]: provide summary
function SysBrowseDateHandler(script) {
	var ctl = SysDialog.ctl;
	var curDate = SysGet(ctl);
	var linkedCtl = SysDialog.linkedCtl;
	var d = SysDialog.returnValue;
	if (d != null) {
		SysGetElement(ctl).value = d;
		if (linkedCtl != undefined) {
			var l = SysGetElement(linkedCtl);
			if (l.value == curDate) { l.value = d; }
		}
		if (script != '') {
			var f = new Function(script);
			f();
		}
		return true;
	}
	return false;
}

// Browse Field
// ------------
var F2pressed;
function SysBrowserKeyDown(e, allowEmpty) {
	/// <summary>'Special' key handling of tab, enter, F2, ... keys in input search controls. Is usually automatically
	/// added by the BrowseField control to the key down event.</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <returns type="undefined">undefined</returns>
	var hdl = new SysHandleKey(e);
	var key = hdl.GetKey();

	if (key === SysHandleKey.Key.tab) {
		SysCancelInputSearch();
	}

	var el = $(SysSrcElement(e));
	// Cancel propagation / default behaviour before firing the event: otherwise the event propagates anyway, 
	// because of the browser window popup.
	if (allowEmpty) {
		if (hdl.IsF2Key()) {
			F2pressed = true;
			SysCancelBubble(e);
			el.dblclick();
		}
	}
	else {
		if (hdl.IsF2Key() ||
           ((el.val() == "undefined" || el.val().length == 0) && (key === SysHandleKey.Key.enter || hdl.IsTabKey()))) {
			if (hdl.IsF2Key()) F2pressed = true;
			SysCancelBubble(e);
			el.dblclick();
		}
	}
}

function SysBrowserKeyUp(e) {
	/// <summary>Handles browser specific key.</summary>
	/// <param name="e">Event argument. Preferably a DOMEvent, but a browser specific event object is also acceptable.</param>
	var hdl = new SysHandleKey(e);
	if (hdl.IsEscapeKey()) {
		window.parent.close();
	}
	// Insert
	else if (hdl.IsInsertKey()) {
		BrowseNew();
	}
}

// [choo225643]: provide summary
// CMDM - Add entityEGBrowser
function SysBrowseData(ctl, params, refurl, bAltKey, bKeyInRef, altParam, onchangeScript, extraResults, multiple, bEnterpriseSearch, backOfficeDivisionCode, entityEGBrowser, backOfficeSetting) {
	var c;
	if (altParam != null) {
		c = SysGetElement(ctl + '_alt');
		if (c != null && c.value != null) {
			var val = SysTrim(c.value);

			// [choo225643]: funny logic... find out more
			var i; var ok = false; var str = '0123456789 .';
			for (i = 0; i < val.length; i++) {
				if (str.indexOf(val.charAt(i)) < 0) {
					ok = true;
					break;
				}
			}
			if (ok)
				params = params + '&BRS_' + altParam + '=' + SysURLEncode(val);
		}
	}

	//FC 26.556.647, Enterprise Search
	//var el = SysSrcElement(ctl);
	var el = SysGetElement(ctl);
	if (bEnterpriseSearch && !F2pressed && el.tagName == 'INPUT') {
		c = SysGetElement(ctl + '_alt');
		if (c == null)
			c = SysGetElement(ctl);

		if (c != null && c.value != '')
			params = params + '&BRS_QuickSearch=' + c.value + '&ClickSearch=1';
	}
	F2pressed = null;

	if (multiple != 1 && backOfficeDivisionCode != null) {
		params = params + '&BRS_BackOfficeDivisionCode=' + SysURLEncode(backOfficeDivisionCode);
	}

	// CMDM - Add entityEGBrowser
	if (entityEGBrowser != null) {
		params = params + '&BRS_EntityEGBrowser=' + SysURLEncode(entityEGBrowser);
	}
    
    if (backOfficeSetting != null) {
        params = params + '&BRS_BackOfficeSetting=' + SysURLEncode(backOfficeSetting);
    }

	var u;
	var args;
	if (multiple == 1) {
		u = 'SysMultiBrowser.aspx?' + params;
		args = SysGet(ctl);
	}
	else
		u = 'SysBrowser.aspx?' + params;

	SysDialog.ctl = ctl;
	SysDialog.bKeyInRef = bKeyInRef;
	SysDialog.refurl = refurl;
	SysDialog.onchangeScript = onchangeScript;
	SysDialog.extraResults = extraResults;
	SysShowModal(u, args, '850px', '600px', 'SysBrowseDataHandler();', true);
}

//FC 26.556.647, Enterprise Search
function SysBrowserMouseDown(el) {
	/// <summary>Sets the [mouseclicked] property in specified element to true</summary>
	/// <param name="el" type="Object">The element to set</param>	

	if (el != null) el.mouseclicked = true;
}

function SysBrowserReset(el) {
	/// <summary>Resets the [mouseclicked] property in specified element to null</summary>
	/// <param name="el" type="Object">The element to set</param>	

	if (el != null) el.mouseclicked = null;
}

function SysBrowserCheckKeyDown(el) {
	/// <summary>Checks the [mouseclicked] property in specified element</summary>
	/// <param name="el" type="Object">The element to check</param>
	/// <returns type="Boolean">True if [mouseclicked] is set, false otherwise</returns>	

	if (el != null) {
		if (el.mouseclicked)
			return false;
		else
			return true;
	}
}

// [choo225643]: provide summary
function SysBrowseDataHandler() {
	var ctl = SysDialog.ctl;
	var bKeyInRef = SysDialog.bKeyInRef;
	var refurl = SysDialog.refurl;
	var v = SysDialog.returnValue;
	var extraResults = SysDialog.extraResults;
	var c;
	
	if (typeof (v) != 'undefined') {
		if (v == null) {
			c = SysGetElement(ctl); if (c != null) { c.value = ''; }
			c = SysGetElement(ctl + '_alt'); if (c != null) { c.value = ''; }
			c = SysGetElement(ctl + '_ref'); if (c != null) { SysSetInnerText(c, ''); } 
			c = SysGetElement(ctl + '_ref_ref'); if ((c != null) && (c.nodeName.toLowerCase() == 'a')) { SysSetInnerText(c, ''); } // BR 26.863.222 
			if (extraResults != null) {
				var er = extraResults.split(',');
				for (j = 0; j < er.length; j++) {
					c = SysGetElement(er[j]); if (c != null) { SysSet(er[j], ''); }
				}
			}
		}
		else {
			var f = 1;
			var r = '';
			var erc = 0;
			if (extraResults != null) {
				var er = extraResults.split(',');
				erc = er.length;
			}
			if (typeof (v) != 'object') { v = Array(v) };

			if (v[0] == 'multi' || v[0] == 'query') {
				SysSet(ctl, v[1]);
				SysSet(ctl + '_alt', '');
				c = SysGetElement(ctl + '_ref');
				if (c != null) {
					c.removeAttribute('href');
					SysSetInnerText(c, v[2]);
				}
			}
			else {
				c = SysGetElement(ctl);
				if (c != null) { c.value = SysTrim(v[0]); }
				c = SysGetElement(ctl + '_alt');
				if (c != null) { c.value = SysTrim(v[1]); f++ }
				c = SysGetElement(ctl + '_ref');
				if (c != null) {

					// BR 26.863.222
					if (c.nodeName.toLowerCase() == 'input') {
						var a = SysGetElement(c.id + '_ref');
						if (a) { c = a; }
					}

					if (refurl.length > 0) { c.href = refurl + SysURLEncode(v[0]); }
					if (bKeyInRef) { r = SysTrim(v[0]); }
					for (j = f; j < (v.length - erc); j++) {
						if (r.length > 0) { r += ' - '; }
						r += SysTrim(v[j]);
					}
					SysSetInnerText(c, r);
					$(c).css("color", "");
					if (er != null) {
						for (k = 0; k < er.length; k++) {
							SysSet(er[k], v[j + k]);
						}
					}
				}
			}
		}		
		if (SysDialog.onchangeScript != null && SysDialog.onchangeScript != '') {
			var f = new Function(SysDialog.onchangeScript);
			f();
		}
		try {
			HlpHtHandleBrowser(ctl);
		}
		catch (ex) { }
		return true;
	}
	else if (SysGetElement('Editor_Editor') != null)	//BR 23.617.461
		SysFrameDocument(Editor_Editor).body.focus();

	return false;
}

function SysBrowserClear(id) {
	/// <summary>Clears the values in the specified browser</summary>
	/// <param name="id" type="String">The id of the browser to clear</param>	

	SysSet(id, '');
	SysSet(id + '_alt', '');
	var c = SysGetElement(id + '_ref');
	if (c != null) {
		SysSetInnerText(c, '');
		c.href = '';
	}
}

function SysMultiBrowserSingleSelect(e, toggle) {
	/// <summary>Toggle the checkbox when clicking in a row</summary>
	/// <param name="e">Event object</param>
	/// <param name="toggle">True: the checkmark is toggled, false the check mark is set.</param>
	
	var ev = SysEvent(e);
	var el = $(ev.target).parent("tr").children("td").find(":checkbox");
	el.attr("checked", !toggle || !el.attr("checked"));
}

function SysBrowserDef(ctl) {
	/// <summary>Clears the values of the specified browseField</summary>
	/// <param name="ctl">The browseField to clear</param>	

	SysBrowserClear(ctl);
}

function SysBrowserClear(id) {
	/// <summary>Clears the values of the specified browseField</summary>
	/// <param name="ctl">The browseField to clear</param>	

	SysSet(id, '');
	SysSet(id + '_alt', '');
	var c = SysGetElement(id + '_ref');
	if (c != null) {
		SysSetInnerText(c, '');
		c.href = '';
	}
}

// [choo225643]: provide summary
function SysBrowserURL(url, value) {
	var re = new RegExp('<[A-Z](.+?)>', 'g');
	var r = url.match(re);
	if (r != null) {
		var v;
		for (i = 0; i < r.length; i++) {
			var c = SysGetElement(r[i].slice(1, -1));
			if (c != null) { v = SysURLEncode(c.value); } else { v = ''; }
			url = url.replace(r[i], v);
		}
	}
	return url + SysURLEncode(value);
}

function SysBrowseDateParam(parm, name) {
	var p = SysGetValue(parm);
	if (p != null) {
		var parts = SysDateParts(p);
		if (parts[0] == 0 || parts[1] == 0 || parts[2] == 0)
			return "&ParamName=" + name + "&ParamValue=";
		else {
			var expr = SetDate(parts[2], parts[1], parts[0]);
			var sdate = expr.getDate();
			if (sdate.toString(10).length == 1) sdate = '0' + sdate;
			var smonth = expr.getMonth() + 1;
			if (smonth.toString(10).length == 1) smonth = '0' + smonth;
			var syear = expr.getFullYear();
			if (syear.toString(10).length == 3) syear = ' ' + syear;
			return "&ParamName=" + name + "&ParamValue=" + SysURLEncode(syear + '-' + smonth + '-' + sdate);
		}
	}
	else
		return "&ParamName=" + name + "&ParamValue=";
}

// [choo225643]: provide summary
function SysBrowseParam(parm, name) {
	var p = SysGetValue(parm);
	if (p != null)
		return "&ParamName=" + name + "&ParamValue=" + SysURLEncode(p);
	else
		return "&ParamName=" + name + "&ParamValue=";
}

// [choo225643]: provide summary
function SysBrowseList(ctl, params, options, refurl, bAltKey, bKeyInRef, altParam) {
	var c;
	var u = 'SysBrowser.aspx?' + params; // DO NOT CHANGE: Different application name
	var v = window.showModalDialog(u, window, options);
	if (typeof (v) != 'undefined' && v != null) {
		var f = 1;
		var r = '';
		if (typeof (v) != 'object') { v = Array(v) };

		if (bKeyInRef || v.length == 1) { r = v[0]; }
		for (j = 1; j < v.length; j++) {
			if (r.length > 0) { r += ' - '; }
			r += v[j];
		}
		var rl = SysGetElement(ctl.substr(0, ctl.length - 4));
		var rlv = rl.value;
		if (rlv != null && rlv.length > 0 && rlv.substr(rlv.length - 1, 1) != ';')
			rlv += ';';
		rlv += r;
		rl.value = rlv;
	}
	return false;
}

// [choo225643]: provide summary
function SysBrowseEdit(page, resultcols) {
	var u = page + (page.indexOf('?') < 0 ? '?' : '&') + 'BCAction=1&Resultcols=' + resultcols;
	var v = SysShowModal(u, null, window.screen.availWidth + 'px', window.screen.availHeight + 'px', null, true);
	if (v != null)
		ListCurrent();
}

// [choo225643]: provide summary
function SysBrowseNew(page, resultcols, resultformats) {
	var u = page + (page.indexOf('?') < 0 ? '?' : '&') + 'BCAction=0&Resultcols=' + resultcols + '&Resultformats=' + resultformats;
	SysShowModal(u, null, window.screen.availWidth + 'px', window.screen.availHeight + 'px', 'SysBrowseNewHandler("' + resultformats + '");', true);
}

// [choo225643]: provide summary
function SysBrowseNewHandler(resultformats) {
	var v = SysDialog.returnValue;
	if (v != null) {
		// BR 26.882.701 
		var query = sysPageUrl.substr(sysPageUrl.indexOf('?') + 1).replace('&IsModal=1', '');
		var url = 'SysInputSearch.aspx?InputType=B' + '&' + query + '&Check=1&Rf=' + SysURLEncode(resultformats);
		for (var k = 0; k < v.length; k++) {
			if (SysTrim(v[k]) != '') url += '&Text' + (k + 1) + '=' + SysURLEncode(v[k]);
		}
		var result = SysCallback(url, '', null, true);
		if (result == '-1') {
			SysAlert(0, SysTerm(33814, 'Validation error') + ': ' + SysTerm(16120, 'Please contact your system administrator for more information.'));
			return;
		}
		else if (result == '0') {
			SysAlert(0, SysTerm(18483, 'New data') + ': ' + SysTerm(5842, 'No valid criteria entered.'))
			return;
		}

		var pw = window.parent;
		pw.returnValue = v;
		window.parent.close();
	}
}

// [choo225643]: provide summary
function SysBrowse(name) {
	try {
		SysGetElement('p' + name).click();
		return SysGet(name);
	}
	catch (ex) { }
}

// File Field
// ----------
// [choo225643]: provide summary
function SysFileFieldToggle(ctl) {
	var tdName = $(SysGetElement(ctl + '_tdName'));
	var tdFile = $(SysGetElement(ctl + '_tdFile'));

	//if (tdName.is(":hidden")) {
	if (tdName.css("display") == "none") {
		tdName.show();
		tdFile.hide();
	}
	else {
		tdName.hide();
		tdFile.show();
	}
}

// Files Field
// -----------
// [choo225643]: provide summary
function SysFilesFieldAddFile(s) {
	// Get File
	var ctl = SysFilesFieldGetTopFile(s);
	// check for valid control and value
	if (ctl == null || ctl.value == null || ctl.value.length == 0) return;	

	// Add to list
	SysFilesFieldAddToList(s);

	// Show File Number   
	var ctlfn = SysGetElement(s + '_fileNumber');
	if (ctlfn != null) {
		SysSetInnerText(ctlfn, SysFilesFieldGetFileNumber(s));
	}	
}

function SysFilesFieldSetBorder(s) {
	/// <summary>Sets the border-bottom style & size of the file controls</summary>
	/// <param name="s" type="String">The prefix of the file control</param>

	var tblList = $('#' + s + '_List');
	var tblListRows = tblList.find('tr');

	if (tblListRows.length == 0)
		tblList.parent().css('border', '0');
	else {
		tblList.parent().css('border', '1px solid Black');
		// remove border-bottom style from TDs in the last TR 
		tblListRows.last().children().css('border-bottom', '0');

		if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) tblList.parent().css('overflow', 'none');
		tblList.parent().css('height', '');

		var totalHeight = 0;		
		tblListRows.each(function () {
			totalHeight += $(this).outerHeight();
		});

		if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) {
			if (totalHeight >= 84) {
				tblList.parent().css('height', '84px');
				tblList.parent().css('overflow', 'auto');
			}
		}
		else if (totalHeight >= 96) tblList.parent().css('height', '96px');	
	}
}

// [choo225643]: provide summary
function SysFilesFieldGetFileNumber(s) {
	var tblList = SysGetElement(s + '_List');

	if (tblList != null) {
		return tblList.rows.length;
	}
	else {
		return 0;
	}
}

function SysGetFileSize(ctl) {
	/// <summary>Returns the size of the file listed in the specified control</summary>
	/// <param name="ctl" type="Object">The element that contains the file</param>
	/// <returns type="Integer">The size of the file</returns>

	if (ctl.files && ctl.files.length > 0) {
		if (ctl.files[0])
			return ctl.files[0].fileSize;
		else if (ctl.files.item(0))
			return ctl.files.item(0).fileSize;
	}
	else if (ctl.value && ctl.value.length > 0) {
		try {
			var fso = new ActiveXObject("Scripting.FileSystemObject");
			var size = fso.GetFile(ctl.value).Size;
			fso = null;
			return size;
		} catch (ex) { }
	}

	return 0;

//	if (HTMLParser.classid)
//		return HTMLParser.GetFileSizeExt(ctl.value);
//	else {
//		if (ctl.files && ctl.files.length > 0) { 
//			if (ctl.files[0])
//				return ctl.files[0].fileSize; 
//			else
//				return ctl.files.item(0).fileSize;
//		}
//		else
//			return -1;
//	}
}

// [choo225643]: provide summary
function SysFilesFieldAddToList(s) {
	var tblList = SysGetElement(s + '_List');
	var ctl = SysFilesFieldGetTopFile(s);
	var iSize;
	var strSize;

	// Filename & Size
	var nSplit = ctl.value.split('\\');
	var nFilename = nSplit[nSplit.length - 1];
	var nFileCell = document.createElement('div');
	nFileCell.style.backgroundColor = '#ffffff';
	nFileCell.style.fontWeight = 'normal';
	nFileCell.style.textAlign = 'left';
	nFileCell.style.verticalAlign = 'middle';
	//nFileCell.style.height = '16px';
	nFileCell.title = ctl.value;
	nFileCell.value = ctl.id;

	// BR 32.487.279 Start
	if (nFilename.length > 128) {
		var divFiles = SysGetElement(s + '_divFile');
		divFiles.removeChild(ctl);
		var bFileNumber = SysFilesFieldCheckMaxFileNumber(s);
		var nFileUpload = SysFilesFieldCreateFile(s, bFileNumber);
		// BR 32.457.785 End
		SysAlert(0, SysTerm(409, 'Attachment filename') + ' : ' + SysTerm(18637, 'Exceeded') + ' - ' + SysTerm(33551, 'Max. number of characters') + '(128)');
		return false;
	}

	// BR 32.487.279 End

	// FC 30.027.297
	//BR 31.046.151 - adding th Try/Catch
//	try {
//		iSize = SysGetFileSize(ctl);
//	} catch (e) {
//		errMsg = e.message;
//		if (e.number == -2146828235) {
//			SysAlert(0, errMsg);
//			return false;
//		} else if (e.number == -2146827859) {
//			SysAlert(0, errMsg);
//			return false;
//		} else if (e.number == -2147221472) {
//			// BR 32.457.785 Start
//			//ctl.value = "";
//			var divFiles = SysGetElement(s + '_divFile');
//			divFiles.removeChild(ctl);
//			var bFileNumber = SysFilesFieldCheckMaxFileNumber(s);
//			var nFileUpload = SysFilesFieldCreateFile(s, bFileNumber);
//			// BR 32.457.785 End
//			errMsg = HTMLParser.GetErrorMessage(e.number);
//			SysAlert(0, SysGetElement("ErrMsgAttachment").value);
//			return false;

//		} else if (e.number == -2147221483 || e.number == -2147221501) {
//			//Start: BR 32.155.321
//			//- Add support for: When user only enter a Directory path for example, C:\ and click on Browse button, navigate the user to specified root directory instead show error message.
//			//- "-2147221483" number will return when there are ONLY directory path entered in filefield inputfield control.
//			return false;
//			//End: BR 32.155.321          

//		} else if (e.number == -2147221502) {
//			//Start: BR 32.155.321
//			//- Add support for: When user enter invalid filename, show specified error message to user.
//			//- "-2147221502" number will return when the entered filename is invalid.
//			SysAlert(30879, "Invalid file name");
//			return false;
//			//End: BR 32.155.321

//		} else {
//			//Start: BR 32.155.321
//			//- Do not show alert popup windows if there are no error message returned.
//			if (errMsg.length > 0) {
//				SysAlert(0, errMsg);
//			}
//			//End: BR 32.155.321   
//			return false;
//		}
//	}

//	if (iSize > 0) {
//		if (iSize < 1024) {
//			strSize = String(iSize) + ' bytes';
//		} else if (iSize < 1048576) {
//			iSize = iSize / 1024;
//			strSize = String(iSize.toFixed(2)) + ' KB';
//		} else {
//			iSize = iSize / 1048576;
//			strSize = String(iSize.toFixed(2)) + ' MB';
//		}

//	nFileCell.innerHTML = nFilename  + " (" + strSize + ")";
//	}

	nFileCell.innerHTML = nFilename;

	// Delete Icon
	var nDeleteCell = document.createElement('div');
	nDeleteCell.style.backgroundColor = '#ffffff';
	nDeleteCell.style.fontWeight = 'normal';
	nDeleteCell.style.textAlign = 'center';
	nDeleteCell.style.verticalAlign = 'middle';
	nDeleteCell.style.height = '16px';
	//BR 28.711.311
	var RemoveMsg = SysTerm(26102, 'Remove') + ': ' + nFilename;
	//nDeleteCell.title = ctl.value;
	nDeleteCell.title = RemoveMsg;
	nDeleteCell.value = ctl.id;
	var nImage = document.createElement('img');
	nImage.src = 'images/delete.png';
	nImage.onclick = function() { SysFilesFieldRemoveRow(s, this); SysFilesFieldSetBorder(s); };
	nDeleteCell.appendChild(nImage);

//	// Size BR28.709.036
//	var errMsg;
//	try {
//		var nFileSize = SysGetFileSize(ctl);
//	} catch (ex) {
//		errMsg = ex.message;
//		if (ex.number == -2146828235) {
//			nFileSize = -1
//		} else if (ex.number == -2146827859) {
//			nFileSize = -2
//		} else if (ex.number == -2147221472) {
//			//BR 31.046.151
//			// BR 32.457.785 Start
//			//ctl.value = "";
//			var divFiles = SysGetElement(s + '_divFile');
//			divFiles.removeChild(ctl);
//			var bFileNumber = SysFilesFieldCheckMaxFileNumber(s);
//			var nFileUpload = SysFilesFieldCreateFile(s, bFileNumber);
//			// BR 32.457.785 End
//			errMsg = HTMLParser.GetErrorMessage(ex.number);
//			SysAlert(0, SysGetElement("ErrMsgAttachment").value);
//			return false;
//		}
//	}

	// Insert Cell	
	var nRow = tblList.insertRow(0);	
	var nCell0 = nRow.insertCell(0);
	nCell0.style.width = '90%';
	nCell0.style.borderBottom = '1px solid #777777';
	nCell0.appendChild(nFileCell);
	var nCell1 = nRow.insertCell(1);
	nCell1.style.textAlign = 'right';
	nCell1.style.borderBottom = '1px solid #777777';
	nCell1.appendChild(nDeleteCell);	
	var nCell2 = nRow.insertCell(2);

	//nCell2.value = nFileSize;
	//nCell2.style.display = 'none';

//	// BR28.709.036 Check invalid file size
//	// BR 28.709.040 Check zero file size
//	if (nFileSize == 0) {
//		SysAlert(0, SysTerm(37, 'Attachment') + ': ' + SysTerm(5810, 'Size') + ' = 0 ' + SysTerm(309, 'Bytes'));
//		SysFilesFieldRemoveRow(s, nImage);
//	}

//	if (nFileSize == -1) {
//		SysAlert(16965, 'Invalid file');
//		SysFilesFieldRemoveRow(s, nImage);
//	}

//	if (nFileSize == -2) {
//		SysAlert(0, errMsg);
//		SysFilesFieldRemoveRow(s, nImage);
//	}

	// Check Extension
	var bFileFormat = SysFilesFieldCheckFileFormat(s, nFilename);
	if (!bFileFormat) {
		var msg = SysTerm(36174, 'has invalid file format.');
		SysAlert(0, nFilename + ' ' + msg);
		SysFilesFieldRemoveRow(s, nImage);
		SysFilesFieldSetBorder(s);
	}
	
//	// Check FileSize
//	var bFileSize = SysFilesFieldCheckMaxFileSize(s, nFileSize);
//	if (!bFileSize) {
//		var max = SysGetElement(s + '_MaxFileSize');
//		//SysAlert(0, nFilename + ' exceeds ' + (max.value) + ' bytes');
//		//FC 32.075.868
//		SysAlert(0, nFilename + ' exceeds ' + SysConvertFileSizeFromBytes(max.value));
//		SysFilesFieldRemoveRow(s, nImage);
//	}
//	// Check Total File Size
//	var bTotalFileSize = SysFilesFieldCheckMaxTotalFileSize(s);	
//	if (!bTotalFileSize) {
//		var max = SysGetElement(s + '_MaxTotalFileSize');
//		//SysAlert(0, 'The size of your attachments should not exceed ' + (max.value) + ' bytes');
//		// FC 32.075.868
//		SysAlert(0, 'The size of your attachments should not exceed ' + SysConvertFileSizeFromBytes(max.value));
//		SysFilesFieldRemoveRow(s, nImage);
//	}
	// Check Maximum File
	var bFileNumber = SysFilesFieldCheckMaxFileNumber(s);

	// Create Next File Upload
	var nFileUpload = SysFilesFieldCreateFile(s, bFileNumber);
	return false;
}

//FC 32.075.868
function SysConvertFileSizeFromBytes(s) {
	/// <summary>Converts a string of a file size in bytes to MB or KB</summary>
	/// <param name="s" type="String">Bytes to convert</param>
	/// <returns type="String">Bytes in MB or KB</returns>

	var iSize;
	var strSize;

	if (s < 1024) {
		strSize = String(s) + ' bytes.';
	} else if (s < 1048576) {
		iSize = s / 1024;
		strSize = String(iSize.toFixed(2)) + ' KB.';
	} else {
		iSize = s / 1048576;
		strSize = String(iSize.toFixed(2)) + ' MB.';
	}
	return strSize;
}

// [choo225643]: provide summary
function SysFilesFieldCreateFile(s, val) {
	var divFiles = SysGetElement(s + '_divFile');
	var fileCount = SysGetElement(s + '_FileCount');
	var tFile = SysFilesFieldGetTopFile(s);

	fileCount.value = parseInt(fileCount.value) + 1;
	var nFileId = s + '_File' + (fileCount.value);

	var nFile = document.createElement('input');
	nFile.id = nFile.name = nFileId;
	nFile.type = 'file';
	nFile.style.width = '100%';
	nFile.style.display = ''
	nFile.onchange = function () { SysFilesFieldAddFile(s); SysFilesFieldSetBorder(s); };
	if (val == false) { nFile.disabled = 'true'; }
	divFiles.appendChild(nFile);

	if (tFile != null) { tFile.style.display = 'none'; }

	return nFile;
}

// [choo225643]: provide summary
function SysFilesFieldGetTopFile(s) {
	var fileCount = SysGetElement(s + '_FileCount');
	var FileId = s + '_File' + fileCount.value;
	var topFile = SysGetElement(FileId);
	return topFile;
}

// [choo225643]: provide summary
function SysFilesFieldRemoveRow(s, node) {
	var divFiles = SysGetElement(s + '_divFile');
	var tblList = SysGetElement(s + '_List');
	var divFile = SysGetElement(node.parentNode.value);
	divFiles.removeChild(divFile);
	tblList.deleteRow(node.parentNode.parentNode.parentNode.rowIndex);

	// Check Maximum File
	var bFileNumber = SysFilesFieldCheckMaxFileNumber(s);
	if (bFileNumber) {
		var tFile = SysFilesFieldGetTopFile(s);
		if (tFile != null) { tFile.disabled = ''; }
	}

	// Show File Number   
	var ctlfn = SysGetElement(s + '_fileNumber');
	if (ctlfn != null) {
		SysSetInnerText(ctlfn, SysFilesFieldGetFileNumber(s));
	}
}

// [choo225643]: provide summary
function SysFilesFieldCheckFileFormat(s, fn) {

	var fileFormat = SysGetElement(s + '_FileFormat').value;
	if (fileFormat == "*" || fileFormat.length == 0) { return true; }

	var idxLast = fn.lastIndexOf('.');
	if (idxLast < 0) { return false; }

	var fe = fn.substr(idxLast + 1);
	var fileExt = fileFormat.split('|');
	for (i = 0; i < fileExt.length; i++) {
		if (fileExt[i].toUpperCase() == fe.toUpperCase()) {
			return true;
		}
	}

	return false;
}

// [choo225643]: provide summary
function SysFilesFieldCheckMaxFileNumber(s) {
	var tblList = SysGetElement(s + '_List');
	var max = SysGetElement(s + '_MaxFileNumber');
	if (max.value <= 0) {
		return true;
	}
	if (tblList.rows.length >= max.value) {
		return false;
	}
	else {
		return true;
	}
}

// [choo225643]: provide summary
function SysFilesFieldCheckMaxFileSize(s, val) {
	var max = SysGetElement(s + '_MaxFileSize');
	if (max.value <= 0) {
		return true;
	}
	else if (val > max.value) {
		return false;
	}
	else {
		return true;
	}
}

// [choo225643]: provide summary
function SysFilesFieldCheckMaxTotalFileSize(s) {
	var tblList = SysGetElement(s + '_List');
	var max = SysGetElement(s + '_MaxTotalFileSize');

	if (max.value > 0) {
		var total = 0;
		for (var i = 0; i < tblList.rows.length; i++) {
			total = total + tblList.rows.item(i).children.item(2).value;
		}

		return (total <= max.value);
	}
	else
		return true;
}

// Combobox
function SysComboUp(id) {
	/// <summary>Selects the previous item in the specified combo box</summary>
	/// <param name="id">The id of the combo box</param>	

	var ctl = SysGetElement(id);
	if (ctl != null && ctl.selectedIndex > 0)
		ctl.selectedIndex -= 1;
}
function SysComboDown(id) {
	/// <summary>Selects the next item in the specified combo box</summary>
	/// <param name="id">The id of the combo box</param>	

	var ctl = SysGetElement(id);
	if (ctl != null && ctl.selectedIndex < (ctl.options.length - 1))
		ctl.selectedIndex += 1;
}

// Memo Field
// ----------

// helpers for insert at the cursor
// [choo225643]: provide summary
// [choo225643]: verify ctl is jQuery element
function SysGetCaretPosition(ctl) {
	if (window.getSelection) {
		// [choo225643]: fill in for ff
		return $(ctl).get(0).selectionStart;
	} else {
		var i = $(ctl).val().replace(/\n/g, '').length + 1;
		var objCaret = document.selection.createRange().duplicate();
		while (objCaret.parentElement() == $(ctl).get(0) && objCaret.move("character", 1) == 1) {
			--i;
		}
		return --i;
	}
}

// [choo225643]: provide summary
function SysSetCaretPosition(ctl, pos) {
	var el = $(ctl).get(0);
	if (window.getSelection) {
		// TODO: fill in for ff
		el.selectionStart = pos;
		el.selectionEnd = pos;
	} else {
		// Put the cursor in the correct position
		var objSelectedRange = el.createTextRange();
		objSelectedRange.move("character", pos)
		objSelectedRange.select();
	}
}

// [choo225643]: provide summary
function SysInsertAtCaret(ctl, text) {
	//if (ctl.createTextRange && ctl.caretPos) {	
	if (ctl.caretPos) {
		var caretPos = ctl.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
	}
	else {
		ctl.focus();
		if (ctl.value.length > 0)
			if (ctl.value.substring(ctl.value.length - 1, ctl.value.length) != '\n') {
			ctl.value = ctl.value + ' ' + text;
		}
		else {
			ctl.value = ctl.value + text;
		}
		else
			ctl.value = text;
	}
}

//function _SysInsertAtCaret(ctl, text) {
//	/// <remarks>IE only</remarks>
//	if (ctl.createTextRange && ctl._caretPos) {
//		var caretPos = ctl._caretPos;
//		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? text + ' ' : text;
//	}
//	else {
//		ctl.focus();
//		if (ctl.value.length > 0)
//			ctl.value = ctl.value + ' ' + text;
//		else
//			ctl.value = text;
//	}
//}

// [choo225643]: provide summary
function SysStoreCaret(ctl) {
	if (ctl.createTextRange)
		ctl.caretPos = document.selection.createRange().duplicate();
}

// [choo225643]: provide summary
function SysSetTimestamp(tag) {
	/// <summary>
	/// Inserts a timestamp in the specified element.
	/// The timestamp is formatted like such: [username date time (timezone)]
	/// An example: [choo225643 18-01-2010 14:52 (GMT +08:00)]
	/// </summary>
	/// <param name="tag">The element to insert a timestamp</param>	
	
	var d = new Date();
	//FC 22.467.573 - Start
	//var s = '[' + SysUserName() + ' ' + SysDateFormat(d) + ' ' + d.toTimeString().substr(0, 5) + ']'

	var intTimeZoneOffset = parseInt(d.getTimezoneOffset());
	var sTimezoneOffset = "(GMT ";

	if (intTimeZoneOffset <= 0) sTimezoneOffset += "+";
	else sTimezoneOffset += "-";

	if (Math.abs(intTimeZoneOffset) < 10 * 60) sTimezoneOffset += "0";
	sTimezoneOffset += Math.floor(Math.abs(intTimeZoneOffset) / 60) + ":";
	if (Math.abs(intTimeZoneOffset % 60) < 10) sTimezoneOffset += "0";
	sTimezoneOffset += Math.abs(intTimeZoneOffset) % 60;
	sTimezoneOffset += ")";

	var s = '[' + SysUserFullName() + ' ' + SysDateFormat(d) + ' ' + SysTimeFormat(d.toTimeString()) + ' ' + sTimezoneOffset + ']'
	//FC 22.467.573 - End
	//	var c = SysGetElement(tag);
	//	if (c != null) {
	//		SysInsertAtCaret(c, s);
	//		c.focus();
	//	}

	//Start: 33.970.789
	//var el = SysElement.GetDomElement(tag);	
	var el = SysGetElement(tag);
	//End: 33.970.789
		
	if (window.getSelection) {
		var sel = new SysSelection(SysGetElement(tag));
		sel.ReplaceSelection(s);
	}
	else if (document.selection) {
		SysInsertAtCaret(el, s);
	}
	new SysElement(el).Focus();
}

//Memo
// [choo225643]: provide summary
function SysPopupMemo(tag, buttonid, imgMemo, imgNoMemo, fullScreen, readOnly) {
	if (readOnly == null) readOnly = 0;
	var rc = SysGetElement(tag);
	var arglen = rc.value.length;
	var dlgargs = new Array();
	var block = 4096;
	if (arglen <= block) {
		dlgargs[0] = rc.value;
	}
	else {
		var nParts = Math.floor((arglen / block) + 1);
		dlgargs[0] = rc.value.substr(0, block);
		for (i = 2; i < nParts; i++) {
			dlgargs[i - 1] = rc.value.substr((i - 1) * block, block);
		}
		dlgargs[nParts - 1] = rc.value.substr((nParts - 1) * block);
	}
	var left;
	var top;
	var height;
	var width;
	if (fullScreen) {
		height = window.screen.availHeight;
		width = window.screen.availWidth;
		top = 0;
		left = 0;
	}
	else {
		height = 300;
		width = 500;
		left = window.screenLeft + 400;
		top = window.screenTop + 200;
	}
	var options = 'dialogTop:' + top + 'px;dialogLeft:' + left + 'px;dialogHeight:' + height + 'px;dialogWidth:' + width + 'px;status:yes;resizable:yes'
	var newtext = window.showModalDialog('SysPopupMemo.aspx?Mode=' + readOnly, dlgargs, options);
	if (readOnly == 0 && newtext != null) {
		rc.value = newtext;
		var button = SysGetElement(buttonid);
		if (button != null) {
			if (newtext.length > 160) {
				button.title = newtext.substr(0, 157) + ' ...';
			}
			else {
				button.title = newtext;
			}
			if ((arglen > 0 && newtext.length == 0) || (arglen == 0 && newtext.length > 0)) {
				var i1 = $(SysGetElement(imgMemo));
				var i2 = $(SysGetElement(imgNoMemo));
				if (newtext.length == 0) {
					i1.hide();
					i2.show(); 
				}
				else {
					i1.show();
					i2.hide(); 
				}
			}
		}
	}
}

// [choo225643]: provide summary
function SysSetFullscreen(tag) {
	SysPopupMemo(tag, null, null, null, true);
}

// Image button lists
// [choo225643]: provide summary
function SysImageRadioButton(ctl, n) {
	var v = SysGetElement(ctl).value;
	SysGetElement(ctl + v).className = 'unselected';
	SysGetElement(ctl + n).className = 'selected';
	SysGetElement(ctl).value = n;
}

// [choo225643]: provide summary
function SysImageToggleButton(ctl, val, img, txt) {
	var c = SysGetElement(ctl);
	var i = 0;
	var ix;
	while (i < val.length) {
		if (val[i] == c.value) {
			ix = i;
			break
		}
		i++;
	}
	if (ix == val.length - 1)
	{ ix = 0 }
	else
	{ ix++ }
	c.value = val[ix];
	var im = SysGetElement(ctl + '_img');
	if (im != null) {
		im.src = img[ix];
		im.title = txt[ix];
	}
	var btn = SysGetElement(ctl + '_btn');
	if (btn != null) {
		btn.title = txt[ix];
	}
}

// [choo225643]: provide summary
function SysImageToggleButtonReset(ctl, val, img, txt, value) {
	var c = SysGetElement(ctl);
	var i = 0;
	var ix;
	while (i < val.length) {
		if (val[i] == value) {
			ix = i;
			break
		}
		i++;
	}
	c.value = val[ix];
	var im = SysGetElement(ctl + '_img');
	if (im != null) {
		im.src = img[ix];
		im.title = txt[ix];
	}
}


// Security level control
// ----------------------
function SysSetSecurity(ctl) {
	/// <summary>Sets the specified security level field's value to its appropriate value</summary>
	/// <param name="ctl" type="Object">The security level field to set</param>	

	SysSetValue(ctl, SysGetValue(ctl + '_select'));
}

function SysSetSecuritySelect(ctl) {
	/// <summary>Sets the specified security level field's selected value to its appropriate value</summary>
	/// <param name="ctl" type="Object">The security level field to set</param>

	var val = SysGetValue(ctl);
	switch (val) {
		case null:
		case "":
			return;
		case "0":
		case "1":
		case "2":
		case "3":
		case "4":
		case "10":
		case "100":
		case "101":
			SysSetValue(ctl + '_select', val);
			break;
		default:
			SysSetValue(ctl + '_select', '10');
			if (!(val >= 10 && val < 100))
				SysSetValue(ctl, '10');
			break;
	}
}

// Description field
// -----------------
// [choo225643]: provide summary
function SysBrowseTerm(ctl) {
	var t = SysGetElement(ctl + '_Term');
	var s = 'SysTerms.aspx';
	if (t.value != null)
		s += '?_ID=' + t.value;
	SysDialog.ctl = ctl;
	SysShowModal(s, "", "800px", "500px", "SysBrowseTermhandler()", true);
}

// [choo225643]: provide summary
function SysBrowseTermhandler() {
	var v = SysDialog.returnValue;
	var ctl = SysDialog.ctl;
	var t = SysGetElement(ctl + '_Term');
	if (typeof (v) != "undefined") {
		var d = SysGetElement(ctl)
		var r = SysGetElement(ctl + '_Ref')
		if (v == null) {
			d.value = '';
			t.value = 0;
			SysSetInnerText(r, '');
		}
		else {
			d.value = v[1];
			t.value = v[0];
			r.href = 'SysTerm.aspx?_ID=' + v[0];
			var text = v[2]
			SysSetInnerText(r, text);
		}
	}
}

function SysSetReadOnly(el, readonly) {
	/// <summary>Toggles the [readOnly] status of the specified element</summary>
	/// <param name="el">The element to set</param>
	/// <param name="readonly" type="Boolean">Flag true to set the element's [readOnly] status to true, false otherwise</param>

	if (el) {
		el.readOnly = readOnly;
		el.style.backgroundColor = readOnly ? '#e7e7e7' : '';
		el.tabIndex = readOnly ? -1 : 0;
	}
}

// Document Category
// -----------------
// Selectable: 0=Subcategories, 1=all
// DO NOT CHANGE: Category browser is a different logic
//BR 23.940.084
//Include extra parameter for differential that category view right
//function SysDocumentCategory(Ctl, script, selectable, browserwhereclause) {
//BR 30.317.465 - Added onChangeScript parameter
function SysDocumentCategory(Ctl, script, selectable, browserwhereclause, viewall, onChangeScript) {

	var catUrl = 'DocCategoryBrowser.aspx?dummy=0';

	var e = SysGetElement(Ctl);
	SysDialog.Ctl = e;

	if (browserwhereclause != 0) {
		catUrl = catUrl + '&browserwhereclause=' + browserwhereclause;
	}

	if (selectable != 0) {
		catUrl = catUrl + '&selectable=' + selectable;
	}

	//BR 23.940.084
	catUrl = catUrl + '&viewall=' + viewall;

	// Main Category
	var mce = SysGetElement(Ctl + '_MainCat');
	SysDialog.mcCtl = mce;
	if (mce.value != null && mce.value.length > 0) {
		catUrl = catUrl + '&MainCategory=' + mce.value;
	}

	// Category
	var ce = SysGetElement(Ctl + '_Cat');
	SysDialog.cCtl = ce;
	if (ce.value != null && ce.value.length > 0) {
		catUrl = catUrl + '&Category=' + ce.value;
	}

	// SubCategory
	var sce = SysGetElement(Ctl + '_SubCat');
	SysDialog.scCtl = sce;
	if (sce.value != null && sce.value.length > 0) {
		catUrl = catUrl + '&SubCategory=' + sce.value;
	}

	SysDialog.refCtl = SysGetElement(Ctl + '_ref');
	//BR 30.317.465
	SysDialog.onChangeScript = onChangeScript;

	SysShowModal(catUrl, "", "600px", "500px", "SysDocumentCategoryHandler();" + script, true);
}

function SysDocumentCategoryHandler() {
	var v = SysDialog.returnValue;
	if (typeof (v) != "undefined") {
		var mc = SysDialog.mcCtl;
		var c = SysDialog.cCtl;
		var sc = SysDialog.scCtl;
		var r = SysDialog.refCtl;
		var e = SysDialog.Ctl;

		if (v != null) {
			e.value = v[0];
			mc.value = v[1];
			c.value = v[2];
			sc.value = v[3];
			SysSetInnerText(r, v[4]);
		}
		else {
			e.value = '';
			mc.value = '';
			c.value = '';
			sc.value = '';
			SysSetInnerText(r, '');
		}
	}
	//BR 30.317.465 - Execute onChangeScript
	if (SysDialog.onChangeScript != null && SysDialog.onChangeScript != '') {
		var f = new Function(SysDialog.onChangeScript);
		f();
	}
}

// Multilevel grouping: FinancialLayoutField
function SysFinancialLayoutField(Ctl, script, selectable, browserwhereclause, onchangeScript, allowempty) {
	var catUrl = 'FinLayoutBrowser.aspx?dummy=0';

	var e = SysGetElement(Ctl);
	SysDialog.Ctl = e;

	if (browserwhereclause != 0) {
		catUrl = catUrl + '&browserwhereclause=' + browserwhereclause;
	}

	if (allowempty != 0) {
		catUrl = catUrl + '&allowempty=' + allowempty;
	}

	if (e.value.length > 0) {
		catUrl = catUrl + '&selectable=' + SysURLEncode(e.value);
	}

	// ClassID
	var mce = SysGetElement(Ctl + '_ClassID');
	SysDialog.mcCtl = mce;
	if (mce.value != null && mce.value.length > 0) {
		catUrl = catUrl + '&ClassID=' + SysURLEncode(mce.value);
	}

	SysDialog.refCtl = SysGetElement(Ctl + '_ref');
	SysDialog.onchangeScript = onchangeScript;
	SysShowModal(catUrl, "", "600px", "500px", "SysFinancialLayoutFieldHandler();" + script, true);
}

function SysFinancialLayoutFieldHandler() {
	var v = SysDialog.returnValue;
	if (typeof (v) != "undefined") {
		var r = SysDialog.refCtl;
		var e = SysDialog.Ctl;

		if (v != null) {
			e.value = v[0];
			SysSetInnerText(r, v[1]);
		}
		else {
			e.value = '';
			SysSetInnerText(r, '');
		}
		if (SysDialog.onchangeScript != null && SysDialog.onchangeScript != '') {
			var f = new Function(SysDialog.onchangeScript);
			f();
		}
	}
}

//BR 23.660.584
var onChangeTriggered = false;
var onFocusValue = '';
function SysCheckFocus(el) {
	/// <summary>Saves the value in the element specified into [onFocusValue]</summary>
	/// <param name="el" type="Object">The element</param>	

	onChangeTriggered = false;
	onFocusValue = SysGetValue(el.id);
}

function SysCheckOnChange(el) {
	/// <summary>Triggers the Change event for the element specified if the element's value is different from [onFocusValue]</summary>
	/// <param name="el" type="Object">The element</param>	

	if (onChangeTriggered == true) {
		onChangeTriggered = false;
		return;
	}

	var onBlurValue = SysTrim(el.value);
	if (onBlurValue != '' && SysTrim(onFocusValue) != onBlurValue) {
		new SysElement(el).FireEvent("change");
	}
	
	onChangeTriggered = false;
}

// BR 26.199.594
function SetEmptyDate(el) {
	/// <summary>Sets an empty date string (eg [  -  -    ]) into the specified element</summary>
	/// <param name="el" type="Object">The element to set</param>	

	if (SysTrim(el.value) != '') return;

	switch (sysFormatDate) {
		case '1':
		case '2':
			{
				el.value = "  " + sysFormatDateSep + "  " + sysFormatDateSep + "    ";
				break;
			}
		case '3':
			{
				el.value = "    " + sysFormatDateSep + "  " + sysFormatDateSep + "  ";
				break;
			}
	}
}

function SysInputOnFocus(el) {
	/// <summary>Input field onFocus event handler</summary>
	/// <param name="el" type="Object">The element triggered in the event</param>

	SysAddClass(el, 'selected');
}

function SysInputOnBlur(el) {
	/// <summary>Input field onBlur event handler</summary>
	/// <param name="el" type="Object">The element triggered in the event</param>

	SysRemoveClass(el, 'selected');
}

var sysInputChanged = false;
function SysChangeOnBlur(el) {
	/// <summary>Input field onBlur event handler, used to trigger onChange</summary>
	/// <param name="el" type="Object">The element triggered in the event</param>	

	if (sysInputChanged) {
		new SysElement(el).FireEvent("change");
		sysInputChanged = false;
	}
}

// Dual ListBox
// ------------
// Transfer an item
function SysDualListTransfer(ctl, dir) {
	var f = SysGetElement(ctl + (dir ? '_list' : '_selected'));
	var t = SysGetElement(ctl + (dir ? '_selected' : '_list'));
	if (t == null || f == null)
		return;
	if (f.length <= 0)
		return;
	var i;
	var l;
	for (i = 0; f.options.length > i; i++) {
		var o = f.options[i];
		if (o.selected)
			l = SysDualListInsert(t, o.value, o.text);
	}
	for (i = f.options.length - 1; i >= 0; i--) {
		var o = f.options[i];
		if (o.selected)
			SysDualListRemove(f, i);
	}
	SysDualListOptions(ctl);
	if (l != null)
		t.selectedIndex = l.index;
	t.focus();
}
function SysDualReset(ctl, values) {
	var f = SysGetElement(ctl + '_list');
	var t = SysGetElement(ctl + '_selected');

	if (f == null || t == null)
		return;
	for (i = t.options.length - 1; i >= 0; i--) {
		var o = t.options[i];
		SysDualListInsert(f, o.value, o.text);
		SysDualListRemove(t, i);
	}
	if (values != null) {
		var vs = values.split(',');
		for (i = 0; vs.length > i; i++) {
			var val = vs[i];
			var j;
			for (j = 0; f.options.length > j; j++) {
				var o = f.options[j];
				if (o.value == val) {
					SysDualListInsert(t, o.value, o.text);
					SysDualListRemove(f, j);
				}
			}
		}
	}
	SysDualListOptions(ctl);
}
// Move items in the list up/down
function SysDualListMove(ctl, dir) {
	var el = SysGetElement(ctl + '_selected');
	if (el.length <= 0)
		return;

	//BR 23.472.037, disable move up for first item or move down for last item
	if ((el.selectedIndex == el.length - 1 && dir == 0) || (el.selectedIndex == 0 && dir == 1))
		return;

	var idx = el.selectedIndex;
	if (idx == -1)
		return;
	var nxidx = idx + (dir ? -1 : 1)
	if (nxidx < 0)
		nxidx = el.length - 1;
	if (nxidx >= el.length)
		nxidx = 0;
	var oldVal = el[idx].value;
	var oldText = el[idx].text;
	el[idx].value = el[nxidx].value;
	el[idx].text = el[nxidx].text;
	el[nxidx].value = oldVal;
	el[nxidx].text = oldText;
	el.selectedIndex = nxidx;

	SysDualListOptions(ctl);
	return false;
}

// Insert in list
function SysDualListInsert(c, value, text) {
	var o = new Option(text, value);
	c.options[c.length] = o;
	return o;
}
// Remove from list
function SysDualListRemove(c, i) {
	if (c.length <= 0)
		return;
	//var i = c.selectedIndex;
	if (i != -1)
		c.options[i] = null;
}
// Build options list
function SysDualListOptions(ctl) {
	var c = SysGetElement(ctl + '_selected');
	var o = SysGetElement(ctl);
	var n = c.options.length;
	var s = '';
	for (var i = 0; i < n; i++) {
		s += c.options[i].value + ',';
	}
	o.value = s;
}

// Dual List Box with images
function SysDualImgUnSelect(me) {
    //BR 36.366.409
    if (Sys.Browser.agent === Sys.Browser.Firefox)
    {
	    for (var i = 0; i < me.options.length; i++) {
		    var tr = me.options[i];
		    tr.className = "DataLight";	
	    }	
    }
    else
    { 
	    for (var i = 0; i < me.rows.length; i++) {
		    var tr = me.rows[i];
		    tr.className = "DataLight";		
	    }
    }
}

function SysDualImgSelect(e, me) {
	var single = true;
	var ev = SysEvent(e);

	if (ev.ctrlKey || ev.ctrlLeft)
	{ }
	else
		if (ev.shiftKey || ev.shiftLeft) {
		single = false;
	}
	else
		SysDualImgUnSelect(me);

	var tr = ev.target; // event.srcElement;
	while (tr != null && tr.tagName != 'TR')
		tr = tr.parentNode;
	if (tr == null)
		return;
	var tb = tr;
	while (tb != null && tb.tagName != 'TABLE')
		tb = tb.parentNode;
	if (tb == null || tb != me)
		return;

	//if (single)	
	//BR 23.675.146 - Perform this checking later
	//	var d = tr.getAttribute('dummy');
	//	if (d!='1')
	//		tr.className = "Selected";
	//End BR 23.675.146   
}

//BR 23.675.146
function SysDualImgMultipleHandler(me, ListBoxFirstSelection) {
	var single = true;
	if (event.shiftKey || event.shiftLeft)
		single = false;

	var tr = event.srcElement;
	while (tr != null && tr.tagName.toLowerCase() != 'tr')
		tr = tr.parentNode;
	if (tr == null)
		return ListBoxFirstSelection; ;
	var tb = tr;
	while (tb != null && tb.tagName.toLowerCase() != 'table')
		tb = tb.parentNode;
	if (tb == null || tb != me)
		return ListBoxFirstSelection; ;

	if ((!single) && (ListBoxFirstSelection != null)) {
		SysDualImgSelectMulti(me, tb, tr, ListBoxFirstSelection);
		return ListBoxFirstSelection;
	}

	var d = tr.getAttribute('dummy');
	if (d != '1') {
		tr.className = "Selected";
		return tr;
	}
}

function SysDualImgSelectMulti(clickedListBox, clickedTable, currSelectedRow, ListBoxFirstSelection) {
	//Previous selected row
	var rows = clickedTable.getElementsByTagName('TR');
	var prevSelectedRow = ListBoxFirstSelection;

	//Determine which row come first
	var prevSelectionFirst = false;
	for (i = 0; i < rows.length - 1; i++) {
		if (rows[i].value == currSelectedRow.value) {
			break;
		}
		if (rows[i].value == prevSelectedRow.value) {
			prevSelectionFirst = true;
			break;
		}
	}

	//If mouse click on same row
	if (currSelectedRow.value == prevSelectedRow.value) {
		SysDualImgUnSelect(clickedListBox);
		prevSelectedRow.className = "Selected";
		return;
	}

	if ((prevSelectedRow != null)) {
		var selectionStarted = false;
		if (prevSelectionFirst) {
			//Action: Highlighted row from Top-to-Bottom
			for (i = 0; i < rows.length - 1; i++) {
				if (rows[i].value == prevSelectedRow.value)
					selectionStarted = true;

				if (selectionStarted)
					rows[i].className = "Selected";
				else
					rows[i].className = "DataLight";

				if (rows[i].value == currSelectedRow.value)
					selectionStarted = false;
			}
		} else {
			//Action: Highlighted row from Bottom-to-Top
			for (i = 0; i < rows.length - 1; i++) {
				if (rows[i].value == currSelectedRow.value)
					selectionStarted = true;

				if (selectionStarted)
					rows[i].className = "Selected";
				else
					rows[i].className = "DataLight";

				if (rows[i].value == prevSelectedRow.value)
					selectionStarted = false;
			}
		}
	}
}
//End BR 23.675.146


function SysDualImgListTransfer(ctl, dir) {
	var f = SysGetElement(ctl + (dir ? '_list' : '_selected'));
	var t = SysGetElement(ctl + (dir ? '_selected' : '_list'));
	if (t == null || f == null)
		return;

    //BR 36.366.409
    if (Sys.Browser.agent === Sys.Browser.Firefox)
	{
		if (f.options.length <= 0)
			return;	
	}
	else
	{
		if (f.rows.length <= 0)
			return;
	}

	//BR 23.472.928, reset all the selected in target first
	//BR 36.366.409
	if (Sys.Browser.agent === Sys.Browser.Firefox)
	{
		for (i = t.options.length - 1; i >= 0; i--) {
			var o = t.options[i];
			if (o.className == "Selected")
				o.className = "DataLight";
		}
		for (i = f.options.length - 1; i >= 0; i--) {
			var l = t.options[t.options.length - 1];
			var o = f.options[i];
			if (o.className == 'Selected') {
				var d = o.getAttribute('dummy');
				if (d != '1')
					l.insertAdjacentElement("beforeBegin", o);
			}
		}	
	}
	else
	{	
		for (i = t.rows.length - 1; i >= 0; i--) {
			var o = t.rows[i];
			if (o.className == "Selected")
				o.className = "DataLight";
		}
		for (i = f.rows.length - 1; i >= 0; i--) {
			var l = t.rows[t.rows.length - 1];
			var o = f.rows[i];
			if (o.className == 'Selected') {
				var d = o.getAttribute('dummy');
				if (d != '1')
					l.insertAdjacentElement("beforeBegin", o);
			}
		}
	}
	


	SysDualImgListOptions(ctl);
}
// Move items in the list up/down
function SysDualImgListMove(ctl, dir) {
	var el = SysGetElement(ctl + '_selected')
	var tr = null;
	var i = 0;
	while (i < el.rows.length && tr == null) {
		var tr = el.rows[i];
		if (tr.className != 'Selected')
			tr = null;
		i++;
	}
	if (tr != null) {
		var d = tr.getAttribute('dummy');
		if (d != '1') {
			//BR 23.472.037, disallow up when index = 1 or down when index = length - 1
			if (dir && i != 1)
				SysDualImgListMoveUp(tr);
			else {
				if (!dir && i != el.rows.length - 1)
					SysDualImgListMoveDown(tr);
			}
		}
		SysDualImgListOptions(ctl, dir);
	}
}
function SysDualImgListMoveDown(tr) {
	if (tr == null)
		return;
	//BR 36.366.409
	var sib = tr.nextSibling;
	if (navigator.appName != 'Microsoft Internet Explorer')
	{
		if (sib.nodeType != Node.ELEMENT_NODE)
			sib = tr.nextElementSibling;
	}
	
	if (sib == null)
		return
	var sib = sib.nextSibling;
	var tab = tr.parentNode;
	if (sib == null)
		tab.insertBefore(tr);
	else
		tab.insertBefore(tr, sib);
}

function SysDualImgListMoveUp(tr) {
	if (tr == null)
		return;
	if (tr.fieldIndex == 1)
		return;

    //BR 36.366.409
	var sib = tr.previousSibling;
	if (navigator.appName != 'Microsoft Internet Explorer')
	{	
		if (sib.nodeType != Node.ELEMENT_NODE)
			sib = tr.previousElementSibling;
	}
	
	var tab = tr.parentNode;
	tab.insertBefore(tr, sib);
}

function SysDualImgListOptions(ctl, dir) {
	var el = SysGetElement(ctl + '_selected');
	var o = SysGetElement(ctl);
	var n = el.rows.length;
	var s = '';
	var i = 0;
	while (i < n) {
		var tr = el.rows[i];
		var d = tr.getAttribute('dummy');
		if (d != '1') {
			var a = tr.getAttribute('value')
			if (s != '') s += ',';
			s += a;
		}
		i++;
	}
	o.value = s;
}

//FC 21.580.310- Implement default button in customize menu
function SysDualImgListReset(ctl, values) {
	var f = SysGetElement(ctl + '_list');
	var t = SysGetElement(ctl + '_selected');
	if (f == null || t == null)
		return;

    //BR 36.366.409
    if (Sys.Browser.agent === Sys.Browser.Firefox)
	{
		for (i = t.options.length - 1; i >= 0; i--) {
			var o = t.options[i];
			var l = f.options[f.options.length - 1];
			var a = o.getAttribute('dummy');
			if (a != '1')
				l.insertAdjacentElement("beforeBegin", o);
		}
		if (values != null) {
			var vs = values.split(',');
			for (i = 0; vs.length > i; i++) {
				var val = vs[i];
				var j;
				for (j = 0; f.options.length > j; j++) {
					var o = f.options[j];
					var l = t.options[t.options.length - 1];
					if (o.value == val)
						l.insertAdjacentElement("beforeBegin", o);
				}
			}
		}	
	}
	else
	{
		for (i = t.rows.length - 1; i >= 0; i--) {
			var o = t.rows[i];
			var l = f.rows[f.rows.length - 1];
			var a = o.getAttribute('dummy');
			if (a != '1')
				l.insertAdjacentElement("beforeBegin", o);
		}
		if (values != null) {
			var vs = values.split(',');
			for (i = 0; vs.length > i; i++) {
				var val = vs[i];
				var j;
				for (j = 0; f.rows.length > j; j++) {
					var o = f.rows[j];
					var v = o.getAttribute('value');
					var l = t.rows[t.rows.length - 1];
						if (v == val)
							l.insertAdjacentElement("beforeBegin", o);
				}
			}
		}	
	}
		
	SysDualImgListOptions(ctl);
}

// Files
function SysFileName(doc) {
	var pn = doc.location.pathname;
	var li = pn.lastIndexOf('/')
	var dot = pn.lastIndexOf('.')
	if (li < 0 || dot < 0)
		return null;
	return pn.substring(li + 1, dot);
}
// Date Range
// ----------
function SysDateRangeSelect(ctl) {
	var dF, dT;
	var c = SysGetElement(ctl + '_Selection');
	var x = c[c.length - 1].value;
	if (x.substr(0, 2) == 'S_') {
		c.options[c.length - 1] = null;
		var v = SysGetElement(ctl + '_SelectionValue');
		if (v != null) {
			v.value = '';
		}
	}
	var i = c.selectedIndex - 1;
	if (i >= 0) {
		dF = SysDateRange[i][0]; dT = SysDateRange[i][1];
		var f = SysGetElement(ctl + '_From');
		if (f != null) {
			if (dF == null) {
				f.value = sysDateMask.replace(/9/g, ' ');
			}
			else {
				f.value = SysDateFormat(dF);
			}
		};
		var t = SysGetElement(ctl + '_To'); if (t != null) { if (dT == null) { t.value = sysDateMask.replace(/9/g, ' '); } else { t.value = SysDateFormat(dT); } };
		//var v = document.getElementById(ctl + '_SelectionValue'); if (v!=null) {v.value=c.options[i+1].value;}
	}
	var a = (c[i + 1].value >= 1000);
	var n = SysGetElement(ctl + '_More'); if (n != null) { n.disabled = a; };
	var b = SysGetElement(ctl + '_Less'); if (b != null) { b.disabled = a; };

	if (dF != null && dT != null) { return new Array(dF, dT); } else { return null; }
}

function SysDateRangeNavigate(ctl, d, dF, dT) {
	if (ctl == null || dF == null || dT == null)
		return;
	// set the navigation interval
	var c = SysGetElement(ctl + '_Selection');
	var x = c[c.length - 1].value;
	var i = c.selectedIndex - 1;
	if (x.substr(0, 2) != 'S_') {
		if (i >= 0) {
			c.options[c.length] = new Option('-- ' + SysDateRange[i][2] + ' --', 'S_' + c.options[i + 1].value);
			c.selectedIndex = c.length - 1;
			var v = SysGetElement(ctl + '_SelectionValue');
			if (v != null) {
				v.value = c.options[i + 1].value;
			}
		}
	}

	// based on interval, calculate next in range
	i = c.selectedIndex; x = c[i].value;
	if (x.substr(0, 2) == 'S_') {
		x = x.substr(2);
	}
	x = parseInt(x);
	if (x > 0) {
		switch (x) {
			case 1:
				dF = new Date(dF.getFullYear(), dF.getMonth(), dF.getDate() + d);
				dT = new Date(dF.getFullYear(), dF.getMonth(), dF.getDate());
				break;
			case 7:
				dF = new Date(dF.getFullYear(), dF.getMonth(), dF.getDate() + (7 * d));
				dT = new Date(dF.getFullYear(), dF.getMonth(), dF.getDate() + 6);
				break;
			case 30:
				dF = new Date(dF.getFullYear(), dF.getMonth() + d, 1);
				dT = new Date(dF.getFullYear(), dF.getMonth() + 1, 0);
				break;
			case 90:
				dF = new Date(dF.getFullYear(), dF.getMonth() + (3 * d), 1);
				dT = new Date(dF.getFullYear(), dF.getMonth() + 3, 0);
				break;
			case 365:
				dF = new Date(dF.getFullYear() + d, 0, 1);
				dT = new Date(dF.getFullYear(), 11, 31);
				break;
		}
	}
	else {
		x = -1 * x;
		dF = new Date(dF.getFullYear(), dF.getMonth(), dF.getDate() + (x * d));
		dT = new Date(dT.getFullYear(), dT.getMonth(), dT.getDate() + (x * d));
	}

	var f = SysGetElement(ctl + '_From');
	if (f != null) {
		if (dF == null)
			f.value = '';
		else
			f.value = SysDateFormat(dF);
	}
	var t = SysGetElement(ctl + '_To');
	if (t != null) {
		if (dT == null)
			t.value = '';
		else
			t.value = SysDateFormat(dT);
	}

	if (dF != null && dT != null) { return new Array(dF, dT); } else { return null; }
}

function SysDateRangeClearNavigator(ctl) {
	try {
		SysGetElement(ctl + '_Selection').value = 1000;
		SysGetElement(ctl + '_SelectionValue').value = '';
		SysGetElement(ctl + '_NLess').disabled = true;
		SysGetElement(ctl + '_NMore').disabled = true;
	}
	catch (ex) { }
}

// Search framework
// ----------------
function SysSearchSubmit(search, action) {
	SysSet('SCAction', action);
	SysSubmit();
}

function SysCheckTemplateLength(tbid) {
	if (tbid.length == 0) return;
	var tb = SysGetElement(tbid);
	if (!tb) return;
	var max = 255;
	/* BR24.634.119: Allow Advanced Search > 255	
	var memoflds = tb.getElementsByTagName('textarea');
	for (var k=0; k < memoflds.length; k++){
	if (SysTrim(memoflds[k].value).length > max){
	return memoflds[k];
	}
	}*/
	var inps = tb.getElementsByTagName('input');
	for (var k = 0; k < inps.length; k++) {
		if ((inps[k].type != 'text') || (inps[k].disabled) || (inps[k].readOnly)) continue;
		if (SysTrim(inps[k].value).length > max) { return inps[k]; }
	}
}

function SysSearchSaveTemplate(search, key, template, tbid) {
	var inp = SysCheckTemplateLength(tbid);
	if (inp) {
		SysAlert(0, 'Unable to save template: one of the criteria exceeds maximum size of 255 characters.');
		if ((inp) && (inp.id != '')) SysFocus(inp.id);
		return;
	}

	SysDialog.search = search;
	var url = 'SysSearchSaveTemplate.aspx?Code=' + key + '&Template=' + template;
	SysShowModal(url, null, "360px", "240px", "SysSearchSaveTemplateHandler()");
}
function SysSearchSaveTemplateHandler() {
	var res = SysDialog.returnValue;
	var search = SysDialog.search;
	if (res != null) {
		SysGetElement(search + '_Template').value = res[1];
		SysGetElement(search + '_SaveName').value = res[2];
		SysGetElement(search + '_SavePrivate').value = res[0];
		SysSearchSubmit(search, 5);
	}
}

function SysSearchSelectAll(cb) {

	var el = cb;
	while (el != null && el.tagName != 'TR')
		el = el.parentNode;
	if (el == null)
		return;

    el = el.nextSibling;
    //BR 36.944.422
    while (el.nodeType != "1") {
        el = el.nextSibling;
    }

	while (el != null && el.className != "SectionHeader") {
		var cbs = SysGetElementsByTagName(el, "INPUT");
		for (i = 0; i < cbs.length; i++) {
			var cbn = cbs[i];
			if (cbn.type == "checkbox")
				cbn.checked = cb.checked;
		}
		el = el.nextSibling;
		////BR 36.944.422
		while (el.nodeType != "1") {
		    el = el.nextSibling;
		}		
	}
}


function SysSearchFieldSelect(cb, headerCbId) {
	var bCheckALL = true
	var elHeader = SysGetElement(headerCbId + "_CB");

	if (!cb.checked) {
		elHeader.checked = false
	}
	else {
		var el = elHeader;
		while (el != null && el.tagName != 'TR')
			el = el.parentNode;
		if (el == null)
			return;
		el = el.nextSibling;
		while (el != null && el.className != "SectionHeader") {
			var cbs = SysGetElementsByTagName(el, "INPUT");
			for (i = 0; i < cbs.length; i++) {
				var cbn = cbs[i];
				if (cbn.type == "checkbox")
					if (!cbn.checked) {
					bCheckALL = false;
					break;
				}
			}
			if (!bCheckALL)
				break;
			el = el.nextSibling;
		}
		if (bCheckALL)
			elHeader.checked = true
	}
}

function SysSearchTemplateChange(action) {
	SysSet("SCAction", action);
	SysSubmit();
}
function SysSearchTempSwitch(ctl) {
	var s = SysGetElement(ctl + '_ShowTemp');
	var h = SysGetElement(ctl + '_HideTemp');
	var th = SysGetElement('SeaTemplateHide');
	if (s == null || h == null || th == null)
		return;
	var d = s.style.display;
	s.style.display = h.style.display;
	h.style.display = d;
	if (d == 'none')
		th.value = '1';
	else
		th.value = '0';
}

function SysSearchFldColEx(id, ctl, hid) {
	var TRs = document.getElementsByTagName('TR');

	if (TRs != null) {
		//Count total no of rows 
		var Count = 0;
		for (var no = 0; no < TRs.length; no++) {
			if (TRs[no].id.substring(0, id.length) == id) {
				Count = Count + 1;
			}
		}

		if (Count > 0) {
			var elID;
			var elNo = 0;

			var i = SysGetElement(ctl);
			for (var no = 0; no < Count; no++) {
				//Get each child row ID
				elNo = no + 1;
				if (elNo.toString().length == 1) {
					elNo = '0' + elNo;
				}
				elID = id + elNo;

				el = SysGetElement(elID);
				if (el != null) {
					if (el.style.display == 'block' || el.style.display == '') {
						el.style.display = 'none';
						i.src = 'images/webpart_expand.png';
						SysSet(hid, '0');
					} else {
					    el.style.display = '';		
						i.src = 'images/webpart_collapse.png';
						SysSet(hid, '1');
					}
				}
			} //End Loop
		} //End If   
	}
}

function SysSearchFldShowHide(id, ctl, hid, IsHide) {
    var TRs = document.getElementsByTagName('TR');

    if (TRs != null) {
        //Count total no of rows 
        var Count = 0;
        for (var no = 0; no < TRs.length; no++) {
            if (TRs[no].id.substring(0, id.length) == id) {
                Count = Count + 1;
            }
        }

        if (Count > 0) {
            var elID;
            var elNo = 0;

            var i = SysGetElement(ctl);
            for (var no = 0; no < Count; no++) {
                //Get each child row ID
                elNo = no + 1;
                if (elNo.toString().length == 1) {
                    elNo = '0' + elNo;
                }
                elID = id + elNo;

                el = SysGetElement(elID);
                if (el != null) {
					if (IsHide == 1){
						el.style.display = 'none';
                        i.src = 'images/webpart_expand.png';
                        SysSet(hid, '0');
					}else{						
						el.style.display = '';
                        i.src = 'images/webpart_collapse.png';
                        SysSet(hid, '1');
					}
                }
            } //End Loop
        } //End If   
    }
}

function SysSearchColExAll(Action, State) {
	//Collapse OR Expand all
	var TRs = document.getElementsByTagName('TR');

	for (var no = 0; no < TRs.length; no++) {
		if (TRs[no].id.substring(0, 5) == 'trSH_') {
			if (Action == '0') {
				//Expand  
				TRs[no].style.display = 'none';
			} else {
				//Collapse  
			    TRs[no].style.display = '';
			}
		}
	}

	//Swap icon (+/-)
	var imgs = document.getElementsByTagName('IMG');

	for (var no = 0; no < imgs.length; no++) {
		if (imgs[no].id.substring(0, 5) == 'imgSC') {
			if (Action == '0') {
				//Expand    
				imgs[no].src = "images/webpart_expand.png";
			} else {
				//Collapse
				imgs[no].src = "images/webpart_collapse.png";
			}
		}
	}

	//Reset All CollapseExpand Hidden Field
	var inputs = document.getElementsByTagName('INPUT');

	for (var no = 0; no < inputs.length; no++) {

		if (inputs[no].id.substring(0, 5) == 'SFCE_') {
			if (Action == '0') {
				//Collapse                
				inputs[no].value = "0";
			} else {
				//Expand
				inputs[no].value = "1";
			}
		}
	}
}

function SysSearchHidePane(pane) {
	$(SysGetElement(pane)).hide();
}

function SysSearchShowPane(pane) {
	$(SysGetElement(pane)).show();
}

function SysSearchSwitchTab(tab) {
	var t = SysGetElement(tab);
	if (t == null)
		return;
	SysSearchHidePane(sysSearchCurrent);
	SysSearchShowPane(t.value);
	sysSearchCurrent = t.value;
}
var sysSearchCurrent;

// ListBox
// ----------------
function LbxReset(ctl, values) {
	var c = SysGetElement(ctl);
	if (c == null)
		return;
	var i;
	for (i = 0; i < c.options.length; i++) {
		var o = c.options[i];
		o.selected = false;
	}

	var i;
	var vs = values.split(',');
	for (i = 0; vs.length > i; i++) {
		var val = vs[i];
		var i;
		for (i = 0; i < c.options.length; i++) {
			var o = c.options[i];
			if (o.value == val)
				o.selected = true;
		}
	}
}

function LbxMoveUp(boxId) {
	var box = SysGetElement(boxId);
	if (box == null || box.selectedIndex <= 0)
		return;
	var i = box.selectedIndex;
	var o = box.options[i];
	box.options.remove(i);
	LbxAdd(box, o, i - 1);
}
function LbxMoveDown(boxId) {
	var box = SysGetElement(boxId);
	if (box == null || box.selectedIndex < 0 || box.selectedIndex == (box.options.length - 1))
		return;
	var i = box.selectedIndex;
	var o = box.options[i];
	box.options.remove(i);
	LbxAdd(box, o, i + 1);
}
function LbxAdd(box, option, index) {
	if (index != null)
		box.options.add(option, index);
	else
		box.options.add(option);
	LbxStore(box);
}
function LbxRemove(boxId) {
	var box = SysGetElement(boxId);
	if (box == null || box.selectedIndex < 0)
		return;
	var i = box.selectedIndex;
	box.options.remove(i);
	LbxStore(box);
}
//
function LbxStore(box) {
	var boxlist = SysGetElement(box.id + "_List");
	if (boxlist == null)
		return;
	var val = "";
	for (i = 0; i < box.options.length; i++) {
		if (val != "")
			val += ",";
		val += box.options(i).value;
	}
	boxlist.value = val;
}

// DataList

function SysDataList(colFunc, val, url) {
	if (val == '666') {
		SysSet('BCAction', 10);
		SysSubmit();
		return;
	}
	if (SysColumnDirty(colFunc)) {
		SysSet('BCUrl', url);
		SysSet('BCAction', 9);
		SysSubmit();
	}
}
function SysDataListEdit(id, colFunc, val, url) {
	if (SysColumnDirty(colFunc)) {
		SysSet(id, val);
		SysSet('BCUrl', url);
		SysSet('BCAction', 1);
		SysSubmit();
	}
}
// ---- Context SysMenu ----------------------------------------------------------------

function PopupCoordinates(e, offsetX, offsetY, width, height, anchor) {
	/// <summary></summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="offsetX" type="Number"></param>
	/// <param name="offsetY" type="Number"></param>
	/// <param name="width" type="Number"></param>
	/// <param name="height" type="Number"></param>
	/// <param name="anchor" type="Any" optional="true">A 'reference' to a DOM Element.</param>
	/// <remarks>Default position will be the lower left corner of the parent control / cursor. 
	/// determine the available width between the left edge of the control and the right edge of the window.
	/// If insufficient, we will stick the div to the right edge. </remarks>
	///	<returns type="Object">An object with two Integer properties, 'top' and 'left'.</returns>

	var IE6 = (Sys.Browser.agent === Sys.Browser.InternetExplorer && Sys.Browser.version < 7);
	var IE7 = (Sys.Browser.agent === Sys.Browser.InternetExplorer && Sys.Browser.version >= 7);

	var body = $(document.body);
	var docElement = $(document.documentElement);

	var xCoord, yCoord, xDiff, yDiff;

	var anch = new SysElement(anchor);

	var scrollLeft = body.scrollLeft() + docElement.scrollLeft();
	var scrollTop = body.scrollTop() + docElement.scrollTop();
	var frameXEdge;
	var frameYEdge;
	if (IE6) {
		frameXEdge = docElement[0].clientWidth + scrollLeft;
		frameYEdge = docElement[0].clientHeight;
	}
	else {
		frameXEdge = body.innerWidth() + scrollLeft;
		frameYEdge = body.innerHeight();
	}
	if (IE7 || IE6) {
		// take the width of a possible scrollbar into account

		// The documentElement points to the root of the document (the html element), whereas in normal situations
		// all visible content is displayed inside the form element -> if there is a difference in available width
		// we must have a vertical scrollbar (or someone rendered out something they shouldn't have.
		frameXEdge -= Math.abs((document.documentElement.clientWidth - document.body.clientWidth));
		frameYEdge -= Math.abs((document.documentElement.clientHeight - document.body.clientHeight));
	}

	if (anch.empty) {
		xCoord = e.clientX + offsetX;
		yCoord = e.clientY + offsetY;

		xCoord += scrollLeft;
	}
	else {
		xCoord = anch.Left() + offsetX;
		yCoord = anch.Top() + anch.Height() + offsetY;
		yCoord -= scrollTop;
	}

	xDiff = xCoord + width - frameXEdge;
	if (xDiff > 0) {
		xCoord -= xDiff < xCoord ? xDiff : xCoord;
	}
	// In IE >= 7 the position of the scrollbar is not to be included.
	if (IE7) {
		xCoord -= scrollLeft;
		if (xCoord <= 0) {
			xCoord = 5;
		}
	}
	else {
		if (xCoord <= scrollLeft) {
			xCoord = scrollLeft + 5;
		}
	}

	yDiff = yCoord + height - frameYEdge;
	if (yDiff > 0) {
		// if need be put the popup above the cursor iso below.
		var newYCoord = yCoord - height - offsetY - 5;
		if (newYCoord > 0) {
			yCoord = newYCoord;
			if (!anch.empty) {
				yCoord -= anch.Height();
			}
		}
	}
	if (!(IE7 || IE6)) {
		yCoord += scrollTop;
	}

	return { top: yCoord, left: xCoord };
}

var sysCxMenu = null;
var sysCxMenuTable = null;
var sysCxMenuFrame = null; 
var sysCxMenuName;
var sysCxRowCurrent = 0;

//function SysMenuHide(e) {
//	if (sysCxMenu != null) {
//		sysCxMenu.hide();
//	}
//}
function SysMenuHide(e) {
	/// <summary>Hides the visible popup menu</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <returns type="undefined">undefined</returns>

	//Just kill it to avoid positioning problems 
	try {
		if (sysCxMenu !== null) {
//			if (InMenuLeft()) {
//				parent.prtSetFrameCols();
//			}

			var menu = new SysElement(sysCxMenu);
			menu.DetachEvent("onkeydown", SysMenuOnKeyDown);
			menu.DetachEvent("onmouseout", _DoValidateMouseOut);
			menu.DetachEvent("onmouseover", _DoMnuMouseOver);
			menu = null;

			sysInputMenu = null;

			document.body.removeChild(sysCxMenu[0]);
			sysCxMenu = null;			

			if (sysCxMenuFrame !== null) {
				document.body.removeChild(sysCxMenuFrame[0]);
				sysCxMenuFrame = null;
			}
		}
	}
	catch (ex) {
		alert('Unable to handle SysMenuHide properly.');
	}
}

function SysMenuShouldShow(e, SysMenuName, func, ctlID) {
	/// <summary>Shows the popup menu</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="SysMenuName" type="String"></param>
	/// <param name="func" type=""></param>
	/// <param name="ctlID" type="String"></param>	
	
	if ((!e || !e.ctrlKey) && top == window.parent) {
		SysMenuShowW(SysMenuName, func, ctlID, e);
		SysCancelBubble(e);
	}
}

function SysMenuShow(SysMenuName, func, ctlID, e) {
	SysMenuShowW(SysMenuName, func, ctlID, e)
}

function SysMenuShowW(SysMenuName, func, ctlID, e) {
	SysMenuHide(e);

	if (e != null) {
		if (e.ctrlKey)
			return;
	}
		
	_CreateMenuContainer();

	if (func != null) {
		var f = new Function('return ' + func);
		if (!f()) {
			SysMenuHide(e);
			return;
		}
	}
	var sysCmxBody = SysGetElement(SysMenuName + '_MenuDiv');
	if (sysCmxBody == null) {
		SysMenuHide(e);
		return false;
	}

	var sHTML = $(sysCmxBody).html();

	sysCxMenu.html(sHTML);

	var d = SysGetElement(SysMenuName + '_Menu', sysCxMenu[0]);
	if (d != null) {
		var h = d.offsetHeight;
		var w = d.offsetWidth;
		var coords;

		if (ctlID == null) {
			if (e != null && e != undefined)
				coords = PopupCoordinates(e, 0, 0, w, h, SysSrcElement(e));
			else 
				coords = PopupCoordinates(e, 0, 0, w, h);
		}
		else {
			var par = $(SysGetElement(ctlID));
			if (w < par.width()) {
				w = par.width();
				$(d).css('width', w);
			}
			coords = PopupCoordinates(e, 0, 0, w, h, par);
		}

		sysCxMenu.css({
			'left': coords.left,
			'top': coords.top,
			'width': w,
			'height': h
		});

		if (sysCxMenuFrame !== null) {
			sysCxMenuFrame.css({
				'left': coords.left,
				'top': coords.top,
				'width': w,
				'height': h
			});
		}

//		if (InMenuLeft()) {
//			parent.prtBroadenFrameCols(w);
//		}

		sysCxRowCurrent = -1;
		if (sysCxMenuFrame !== null) {
			sysCxMenuFrame.show();
		}
		sysCxMenu.show();
		$(d).focus();
	}

	sysCxMenuName = SysMenuName;
	if (e) {
		e.cancelBubble = true;
		e.returnValue = false;
	}

	return true;
}

//function SysMenuShowW(SysMenuName, func, ctlID, e) {
//	var ev = new SysEvent(e);

//	SysMenuHide();
//	if (e == null) return;
//	if (ev.IsCtrlKey()) return;
//	//if (e.ctrlKey) return;
//	if (sysCxMenu == null)
//		sysCxMenu = createPopup();
//	sysCxMenu.show(ev.screenX, ev.screenY, 200, 200);
//	//sysCxMenu.show(e.screenX, e.screenY, 200, 200);
//	if (func != null) {
//		var f = new Function('return ' + func);
//		if (!f()) {
//			SysMenuHide();
//			return;
//		}
//	}
//	var sysCmxBody = SysGetElement(SysMenuName + '_MenuDiv');
//	if (sysCmxBody == null)
//		return false;
//	var s1 = '<html><head><link rel="stylesheet" type="text/css" href="' + sysCmxStyleSheet + '"></head>' +
//	'<body scroll="auto" style="border-top-style: none; border-right-style: none; border-left-style: none; border-bottom-style: none" ' +
//	'onkeydown=SysMenuOnKeyDown(event) onload="SysMenuOnload(event, ' + SysMenuName + '_Menu)">'; // +
//	//	'<script type="text/javascript" src="MicrosoftAjax.js"></script>' + 
//	//	'<script type="text/javascript" src="jQuery.js"></script>' + 
//	//	'<script type="text/javascript" src="SysControls.jQuery.js"></script>';
//	var s2 = '</body></html>';
//	sysCxMenu.document.write(s1 + sysCmxBody.innerHTML + s2);
//	sysCxMenu.document.close();

//	var d = sysCxMenu.document.getElementById(SysMenuName + '_Menu');
//	if (d != null) {
//		var h = d.offsetHeight;
//		var w = d.offsetWidth;
//		var x;
//		var y;
//		if (ctlID == null) {
//			x = e.screenX;
//			y = e.screenY;
//		}
//		else {
//			var par = SysGetElement(ctlID);
//			if (w < par.offsetWidth) {
//				w = par.offsetWidth;
//				d.width = w;
//			}
//			x = window.screenLeft;
//			y = window.screenTop + par.offsetHeight;
//			while (par != null) {
//				x += par.offsetLeft;
//				y += par.offsetTop;
//				par = par.offsetParent;
//			}
//		}
//		sysCxMenu.show(x, y, w, h);
//		d.setActive()
//	}
//	sysCxMenuName = SysMenuName;
//	e.cancelBubble = true;
//	e.returnValue = false;
//	return true;
//}

function SysMenuOnload(e, table) {
	try {
		if (parent.LastSelectedRow != null) {
			SysMenuHighlight(e, parent.LastSelectedRow, table);
		}
	} catch (ex) { }
}

function SysMenuOnKeyDown(e) {
	var menu = $(SysSrcElement(e));
	if (!menu.hasClass("contextmenu")) {
		menu = menu.parents(".contextmenu");
	}
	if (menu.length > 0) {
		var tb = menu[0];
		if (tb != null) {
			var hdl = new SysHandleKey(e);
			var keyCode = hdl.GetKey();

			switch (keyCode) {
				case SysHandleKey.Key.up:
					if (sysCxRowCurrent >= 0) {
						for (i = sysCxRowCurrent - 1; i >= 0; i--) {
							if (tb.rows[i].className == "contextmenuitems") {
								SysMenuHighlight(e, i, tb);
								break;
							}
						}
					}
					break;
				case SysHandleKey.Key.down:
					if (sysCxRowCurrent < tb.rows.length - 1) {
						for (i = sysCxRowCurrent + 1; i < tb.rows.length; i++) {
							if (tb.rows[i].className == "contextmenuitems") {
								SysMenuHighlight(e, i, tb);
								break;
							}
						}
					}
					break;
				case SysHandleKey.Key.tab:
				case SysHandleKey.Key.enter:
					$(tb.rows[sysCxRowCurrent]).click();
					break;
				case SysHandleKey.Key.end:
					for (i = tb.rows.length - 1; i > 0; i--) {
						if (tb.rows[i].className == "contextmenuitems") {
							SysMenuHighlight(e, i, tb);
							break;
						}
					}
					break;
				case SysHandleKey.Key.home:
					for (i = 0; i < tb.rows.length; i++) {
						if (tb.rows[i].className == "contextmenuitems") {
							SysMenuHighlight(e, i, tb);
							break;
						}
					}
					break;
				default: //find the one(s) beginning with typed character
					var key;
					var found = 0;
					if (keyCode >= 96 && keyCode <= 105) {
						// numbers 0 .. 9 on numeric keypad
						key = keyCode - 48;
					} else if (keyCode >= 106 && keyCode <= 111) {
						// "*", "/", "-", "+", "." on numeric keypad
						key = keyCode - 64;
					} else {
						key = keyCode;
					}
					for (i = sysCxRowCurrent + 1; i < tb.rows.length; i++) {
						if (tb.rows[i].className == "contextmenuitems" &&
							SysGetInnerText(tb.rows[i].children[1]).toUpperCase().substring(0, 1).charCodeAt(0) == key) {
							SysMenuHighlight(e, i, tb);
							found = 1;
							break;
						}
					}
					if (!found) {
						for (i = 0; i < sysCxRowCurrent && i < tb.rows.length; i++) {
							if (tb.rows[i].className == "contextmenuitems" &&
								SysGetInnerText(tb.rows[i].children[1]).toUpperCase().substring(0, 1).charCodeAt(0) == key) {
								SysMenuHighlight(e, i, tb);
								break;
							}
						}
					}
					break;
			}
		}
		SysCancelBubble(e);
	}
}

function SysMenuFindElement(el) {
	while (el != null && el.className != "contextmenuitems") {
		el = el.parentNode;
	}
	return el;
}

function SysMenuSwitchColor(item) {
	if (item != null) {
		var el = $(item);
		var clr = el.css("backgroundColor");
		el.css("backgroundColor", el.css("color"));
		el.css("color", clr);
	}
}

// [choo225643]: from EOL, uses SysColors
//function SysMenuHighlight(e, row, table) {
//	if (row == null || table == null) {
//		var el = SysMenuFindElement(SysSrcElement(e));
//		if (el != null && el.className == "ContextMenuItems") {
//			if (sysCxRowCurrent >= 0 && sysCxRowCurrent < el.parentNode.rows.length) {
//				el.parentNode.rows[sysCxRowCurrent].style.backgroundColor = "";
//				el.parentNode.rows[sysCxRowCurrent].style.color = "";
//			}
//			el.style.backgroundColor = SysColors.ActiveCaption;
//			el.style.color = SysColors.CaptionText;
//			sysCxRowCurrent = el.rowIndex;
//		}
//	} else if (table.rows[row].className == "ContextMenuItems") {
//		if (sysCxRowCurrent >= 0) {
//			table.rows[sysCxRowCurrent].style.backgroundColor = "";
//			table.rows[sysCxRowCurrent].style.color = "";
//		}
//		table.rows[row].style.backgroundColor = SysColors.ActiveCaption;
//		table.rows[row].style.color = SysColors.CaptionText;
//		sysCxRowCurrent = row;
//	}
//}

function SysMenuHighlight(e, row, table) {
	if (row == null || table == null) {
		var el = SysMenuFindElement(SysSrcElement(e));
		if (el != null && el.className == "contextmenuitems") {
			if (sysCxRowCurrent >= 0 && sysCxRowCurrent < el.parentNode.rows.length) {
				el.parentNode.rows[sysCxRowCurrent].style.backgroundColor = "";
				el.parentNode.rows[sysCxRowCurrent].style.color = "";
			}
			el.style.backgroundColor = SysColors.ActiveCaption;
			el.style.color = SysColors.CaptionText;
		sysCxRowCurrent = el.rowIndex;
		}
	} else if (table.rows[row].className == "contextmenuitems") {
		if (sysCxRowCurrent >= 0) {
			table.rows[sysCxRowCurrent].style.backgroundColor = "";
			table.rows[sysCxRowCurrent].style.color = "";
		}
		table.rows[row].style.backgroundColor = SysColors.ActiveCaption;
		table.rows[row].style.color = SysColors.CaptionText;
		sysCxRowCurrent = row;
	}
}

function SysMenuLowlight(e) {
	var el = SysMenuFindElement(SysSrcElement(e));
	if (el != null && el.className == "contextmenuitems") {
		el.style.backgroundColor = "";
		el.style.color = "";
	}
}

function SysMenuCmxClick(el, val, url) {
	/// <summary>Redirects the current page to the URI specified</summary>
	/// <param name="el" type="Object">Not used</param>
	/// <param name="val" type="Object">Not used</param>
	/// <param name="url" type="String">The URI to redirect to</param>

	if (url != null && url != '') {
		SysLocation(url);
	}
}

function SysMenuClick(e, val, url) {
	SysMenuHide(e);
	if (val != '')
		SysSetValue(sysCxMenuName, val);

	if (url != null && url != '') {
		var attValue = SysRowGetCellKey(e, sysRowCurrent);
		if (attValue == null) {
			var p = sysRowCurrent.previousSibling;
			while (p != null && sysRowCurrent.className == p.className) {
				attValue = SysRowGetCellKey(e, p);
				p = p.previousSibling;
			}
		}
		if (attValue != null)
			SysLocation(url + attValue);
	}

//	window.alert(SysRowGetCellDescription(event));

//	//var currentrow = sysRowCurrent;
//	SysMenuHide();
//	if (val != '')
//		SysSetValue(sysCxMenuName, val);

//	if (url != null && url != '') {
//		var attValue = SysRowGetCellKey(event);
//		SysLocation(url + attValue);
//	}
}

function SysHideSelect() {
	/// <summary>Hides all <SELECT> elements.</summary>        

	$('SELECT').css({ 'visibility': 'hidden' });
}

function SysShowSelect() {
	/// <summary>Shows all <SELECT> elements.</summary>

	$('SELECT').css({ 'visibility': 'visible' });
}

var sysCmxMenu;
function SysMenuStd(e) {
	sysCmxMenu = new SysEvent(e).target;
	//sysCmxMenu = event.srcElement;

	if (sysCmxMenu.tagName == 'A') {
		var cmx = sysCmxMenu.getAttribute('cmx');
		if (cmx != null) {
			SysMenuShow('stdCmx' + cmx);
			return true;
		}
	}
	var p = sysCmxMenu;
	while (p != null && p.oncontextmenu == null) {
		p = p.parentNode; //parentElement;
	}

	SysMenuShow('pgCmx');

	return true;
}

function SysMenuStdCall(val, url) {
	SysMenuHide();
	if (sysCmxMenu.tagName == 'A') {
		var href = sysCmxMenu.href;
		var i = href.lastIndexOf("=");
		if (i > 0) {
			var key = href.substr(i + 1);
			window.location = url + key;
		}
	}
}

function SysMenuPage(val, url) {
	SysMenuHide();
	if (val == '1') {
		var txt = SysGetInnerText(sysCmxMenu);
		SysShowModal("HlpGlossaryPopUp.aspx?term=" + txt, "", "300px", "250px", null, 1)
	}
	else if (val == '2')
		SysPrint()
	else if (val == '3')
		SysExport(2)
	else if (val == '4')
		SysExport(1)
	else if (val == '5') {
		var txt = SysGetInnerText(sysCmxMenu);
		SysSearch(txt)
	}
}

function SysSearch(txt) {
	/// <summary>Redirects to [SysSearch.aspx] with the provided parameters</summary>
	/// <param name="txt" type="String">The value to use with the [txt] parameter</param>

	window.location = "SysSearch.aspx?txt=" + txt
}

// --- Selected Row ------------------------------------------
function SysRowGetCellKey(el) {
	if (el == null && event != null)
		el = event.srcElement;
	var SysMenuCurrentKey = null;
	while (el != null && SysMenuCurrentKey == null) {
		SysMenuCurrentKey = el.getAttribute("CmxKey");
		el = el.parentNode;
	}
	return SysMenuCurrentKey;
}
function SysRowGetCellDescription(el) {
	if (el == null && event != null)
		el = event.srcElement;
	var SysMenuCurrentKey = null;
	while (el != null && SysMenuCurrentKey == null) {
		SysMenuCurrentKey = SysGetInnerText(el); //el.innerText();
		el = el.parentNode;
	}
	return SysMenuCurrentKey;
}
function SysRowSelect() {
	sysRowCurrent = sysListPrevRow;
	return sysRowCurrent != null;
}

// TabPages
// Tab Strip
// ---------
function SysSetTab(me, ctl, tab) {
	var e = me;
	if (e.parentNode.className == 'tabClear' || e.parentNode.className == 'extendedTabClear') {
		var t = SysGetElement(ctl); t.value = tab;
		for (i = 0; i < e.parentNode.parentNode.childNodes.length; i++) {
			var el = e.parentNode.parentNode.childNodes[i]
			if (el.className == 'tabSelected') { el.className = 'tabClear' }
			if (el.className == 'extendedTabSelected') { el.className = 'extendedTabClear' }
		}
		e.parentNode.className = 'tabSelected';
		if (e.parentNode.className == 'extendedTabClear') { e.parentNode.className = 'extendedTabSelected'; }
	}
}
function SysTabHide(pane) {
	/// <summary>Hides a tab</summary>
	/// <param name="pane" type="Object">The tab to hide</param>

	$(SysGetElement(pane)).hide();
}

function SysTabShow(pane) {
	/// <summary>Shows a tab</summary>
	/// <param name="pane" type="Object">The tab to show</param>

	$(SysGetElement(pane)).show();
}

function SysTabSwitch(tab) {
	/// <summary>Switches the focus to the specified tab</summary>
	/// <param name="tab" type="Object">The tab to switch to</param>

	var t = SysGetElement(tab);
	if (t == null) return;
	SysTabShow(t.value);
}

function SysWizNext(tab) {
	var t = SysGetElement(tab);
	if (t == null) return;
	var v = SysWizGetNext(tab, t.value);
	if (v != null) {
		t.value = v;
		SysTabShow(v);
	}
}
function SysWizGetNext(tab, value) {
	switch (t.value) {
		case "pane0": { return "pane1"; }
	}
}
function SysWizCheckFirst(tab, pane, first) {
	var b = SysGetElement(tab + '_Prev');

	if (b == null)
		return;
	b.disabled = pane == first;
}

function SysWizCheckLast(tab, pane, last) {
	var b = SysGetElement(tab + '_Next');

	if (b == null)
		return;
	b.disabled = pane == last;
}
function SysWizChkButton(tab, first, last) {
	var t = SysGetElement(tab);
	if (t == null) return;
	SysWizCheckFirst(tab, t.value, first);
	SysWizCheckLast(tab, t.value, last);
}

// Tree - DO NOT CHANGE
function SysTreeFindElement(el, tagName) {
	while (el != null && el.tagName != tagName)
		el = el.parentNode;
	return el;
}
function SysTreeCollapseOrExpand(ev, treeID) {
	var e = SysSrcElement(ev);
	var vID = e.getAttribute("treeid");
	var pTree = SysGetElement(vID);
	var bCollapse = (pTree.style.display == "block");
	var img = SysGetElement("i" + vID);
	if (bCollapse) {
		pTree.style.display = "none";
		e.style.backgroundImage = "url('Images/treeexpand.png')";
		if (img != null)
			img.src = img.getAttribute("collapsed");
		SysTreeRemoveExpandState(treeID, vID.substring(1));
	}
	else {
		pTree.style.display = "block";
		e.style.backgroundImage = "url('Images/treecollapse.png')";
		if (img != null)
			img.src = img.getAttribute("expanded");
		SysTreeAddExpandState(treeID, vID.substring(1));
	}
}
function SysTreeAddExpandState(treeID, id) {
	var val = SysGet(treeID + "_Expanded");
	if (val.length > 0) val += ":";
	val += id;
	SysSet(treeID + "_Expanded", val);
}
function SysTreeRemoveExpandState(treeID, id) {
	var val = SysGet(treeID + "_Expanded");
	var aStates = val.split(":");
	val = "";
	for (i = 0; i < aStates.length; i++) {
		if (aStates[i] != id) {
			val += ":" + aStates[i];
			if (i == 0) val = aStates[i];
		}
	}
	SysSet(treeID + "_Expanded", val);
}
function SysTreeMouseOver(ev) {
	var e = SysSrcElement(ev);
	var a = SysTreeFindElement(e, "A");
	if (a == null) return;
	if (a.className == "NoEvents") return;
	if (a.className == "Selected") {
		a.className = "SelectedMouseOver";
	}
	else {
		a.className = "MouseOver";
	}
}
function SysTreeMouseOut(ev) {
	var e = SysSrcElement(ev);
	var a = SysTreeFindElement(e, "A");
	if (a == null) return;
	if (a.className == "NoEvents") return;
	if (a.className == "SelectedMouseOver" || a.className == "Selected") {
		a.className = "Selected";
	}
	else {
		a.className = "";
	}
}

function SysTreeRuleOver(ev) {
	var e = SysSrcElement(ev);
	var td = SysTreeFindElement(e, "TD")
	if (td == null) return;
	if (td.className == "NoEvents") return;
	if (td.className == "MouseOver" || td.className == "Text") {
		td.className = "MouseOver";
		if (sysTreeLastSelected != null) {
			sysTreeLastSelected.className = "Text";
			sysTreeLastSelected = null;
		}
	}
}
function SysTreeRuleOut(ev) {
	var e = SysSrcElement(ev);
	var td = SysTreeFindElement(e, "TD");
	if (td == null) return;
	if (td.className == "NoEvents") return;
	if (td.className == "MouseOver") {
		td.className = "Text";
	}
}

var sysTreeLastSelected;
function SysTreeSelect(ev, treeID) {
	var e = SysSrcElement(ev);

	if (e != null) {
		e = SysTreeFindElement(e, "A");
		if (e != null) {
			while (e.tagName != 'A' || (e.tagName == 'A' && e.name != 'Selected')) {
				e = e.parentNode;
				if (e == null)
					break;
			}
		}
	}

	if (e != null) {
		if (e.tagName == "A") {
			if (e.className == "NoEvents") return;
			if (sysTreeLastSelected != null) {
				sysTreeLastSelected.className = "";
			}
			else {
				var t = SysGetElement(treeID + "_Tree");
				if (t != null)
					SysTree_Clear(t.childNodes);
			}
			e.className = "SelectedMouseOver";
			sysTreeLastSelected = e;
			var tr = SysTreeFindElement(e, "TR");
			SysSet(treeID, tr.getAttribute('value'));
			var td = tr.cells[2];
			if (td != null)
				SysSet(treeID + '_text', SysGetInnerText(td));
			return true
		}
		if (e.tagName == "BUTTON") {
			SysTree_SaveNodes(treeID);
		}
	}
	return false;
}
function SysTree_Clear(nodes) {
	for (var i = 0; i < nodes.length; i++) {
		var n = nodes[i];
		if (n != null) {
			if (n.tagName == "A" && n.getAttribute("name") == "SelCat" && n.className != "NoEvents")
				n.className = "";
			SysTree_Clear(n.childNodes);
		}
	}
}
function SysTree_InitSelected(nodes, treeID) {
	if (nodes == null) {
		var t = SysGetElement(treeID + "_Tree");
		if (t != null)
			nodes = t.childNodes;
	}

	if (nodes == null) return;

	for (var i = 0; i < nodes.length; i++) {
		var n = nodes[i];
		if (n != null) {
			if ((n.tagName == "A" || n.tagName == "TD") && n.className == "Selected") {
				sysTreeLastSelected = n;
				//if(n.tagName == "TD")
				//n.className == "MouseOver"
			}
			SysTree_InitSelected(n.childNodes, treeID);
		}
	}
}
function SysTree_SaveNodes(treeID) {
	var t = SysGetElement(treeID);
	var v = "";
	v = SysTree_SaveNodes(t.childNodes, v);
	SysSet(treeID + "_Expanded", v.substr(0, (v.length - 1)));
}
function SysTree_SaveNodes(nodes, v) {
	if (nodes == null) return v;
	for (var i = 0; i < nodes.length; i++) {
		var n = nodes[i];
		if (n != null) {
			if (n.tagName == "TR" && n.name == "TableRow")
				if (n.style.display == "block")
				v += n.getAttribute("ID") + ":";
			v = SysTree_SaveNodes(n.childNodes, v);
		}
	}
	return v;
}

function SysTreeStartDrag() {
	var MoveID = window.event.srcElement.getAttribute("id");
	var dragData = window.event.dataTransfer;
	dragData.setData('Text', "@tree@-" + MoveID);
	dragData.effectAllowed = 'linkMove';
	dragData.dropEffect = 'move';
}
function SysTreeStopDrag() {
	window.event.dataTransfer.clearData();
}
function SysTreeOverDrag() {
	window.event.returnValue = false;
}
function SysTreeEnterDrag() {
	window.event.dataTransfer.getData('Text');
}
function SysTreeDrop(treeID, postback) {
	var MoveID = window.event.dataTransfer.getData("Text")
	// eliminate default action of ondrop so we can customize:
	window.event.returnValue = false;

	if (MoveID && MoveID.substr(0, 7) == "@tree@-") {
		var MoveID = MoveID.substr(7);
		var MoveValue;
		var t = window.event.srcElement;
		while (t.getAttribute("name") != (treeID + "_Tree"))
			t = t.parentNode;
		if (t != null) {
			for (i = 0; i < t.all.length; i++)
				if (t.all(i).tagName == "TR" && t.all(i).getAttribute("id") == MoveID)
				MoveValue = t.all(i).getAttribute("value");
		}
		var e = SysTreeFindElement(window.event.srcElement, "TR");
		SysSet(treeID + "_DropTarget", e.getAttribute("value"));
		SysSet(treeID + "_DropSource", MoveValue);
		SysSet("BCAction", 4);
		SysSubmit();
		return true;
	}
}
// Menu
function MnuActivate(e) {
	/// <summary>Menu mouseOver event handler</summary>
	/// <param name="e" type="DOMEvent"></param>	

	var me = SysSrcElement(e);
	if (me.tagName == 'A')
		me.setActive();
}

function MnuOnKeyDown(e) {
	/// <summary>Menu keyDown event handler</summary>
	/// <param name="e" type="DOMEvent"></param>	

	var me = SysSrcElement(e);
	var td = me.parentNode;
	var tr = td.parentNode;
	var tbody = tr.parentNode;
	var table = tbody.parentNode;
	var rIndex = tr.rowIndex;
	var mainTableTD = table.parentNode;
	var mainTableRow = mainTableTD.parentNode;
	var mainTable = mainTableRow.parentNode;

	var tableColumnIndex = mainTableTD.cellIndex;
	var tableRowIndex = mainTableRow.rowIndex;

	var hdl = new SysHandleKey(e);
	switch (true) {
		case hdl.IsLeftKey(): //arrowleft
			var result;
			if (tableColumnIndex == 0) {
				tableColumnIndex = mainTableRow.cells.length - 1;
				result = MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex);
			}
			else {
				tableColumnIndex--;
				result = MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex);
			}
			if (!result) {
				while (!MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex) && rIndex > 0) {
					rIndex--;
				}
				if (rIndex == 0) {
					rIndex = 1;
					while (MnuActiveCell(mainTable, tableRowIndex - 1, tableColumnIndex, rIndex) && rIndex > 0) {
						rIndex++;
					}
				}
			}
			break;

		case hdl.IsUpKey(): //arrowup
			if (rIndex == 1) {
				tableRowIndex--;
				if (!MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, 1)) {
					tableRowIndex = mainTable.rows.length - 1;
					if (!MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, 1)) {
						tableRowIndex--;
						MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, 1);
					}
				}
				//get last because of up
				while (MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex)) {
					rIndex++;
				}
			}
			else {
				MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex - 1);
			}
			break;

		case hdl.IsRightKey(): //arrowright
			var result;
			if (tableColumnIndex == mainTableRow.cells.length - 1) {
				tableColumnIndex = 0;
				result = MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex);
			}
			else {
				tableColumnIndex++;
				result = MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex);
			}
			if (!result) {
				while (!MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex) && rIndex > 0) {
					rIndex--;
				}
				if (rIndex == 0) {
					rIndex = 1;
					while (MnuActiveCell(mainTable, tableRowIndex - 1, tableColumnIndex, rIndex) && rIndex > 0) {
						rIndex++;
					}
				}
			}
			break
		case hdl.IsDownKey(): //arrowdown
			if (!MnuActiveCell(mainTable, tableRowIndex, tableColumnIndex, rIndex + 1)) {
				if (!MnuActiveCell(mainTable, tableRowIndex + 1, tableColumnIndex, 1)) {
					MnuActiveCell(mainTable, 0, tableColumnIndex, 1);
				}
			}
			break;

		default:
			break;
	}
}

function MnuActiveCell(Table, RowIndex, ColIndex, ItemIndex) {
	try {
		var a = $(Table.rows[RowIndex].childNodes[ColIndex].childNodes[0].rows[ItemIndex].childNodes[0].childNodes[0]);
		if (a.is("a")) {
			// [choo225643]: [focus] is not exactly the same as [setActive]... to check the effects of doing this
			a.focus();
			//a.setActive();
			return true;
		}
	}
	catch (ex) { }

	return false;
}

//FC 24.848.171, Shortcut to appearance 08 menu
function SysKeyMenuLeft08(e) {
	/// <summary>Calls [MenuLeft]'s MenuKey() function</summary>
	/// <param name="e" type="DOMEvent"></param>
	
	var frame = window.top.MenuLeft;
	if (frame != null) {
		if ((frame.MenuKey) != null) {
			frame.MenuKey(e);
		}
	}
}

function SysSendPage(url, styleSheet, root) {
	var ok = false;
	var sOriBody;
	try {
		// JC: todo: replace this... 
		var myOlApp = new ActiveXObject("Outlook.Application");
		if (myOlApp != null) {
			ok = true;
			var myItem = myOlApp.CreateItem(0);
			var body = SysCallback(url);
			if (styleSheet != null) {
				var css = SysCallback(styleSheet);
				var i = body.indexOf('<head>');
				if (i > 0) {
					body = body.substr(0, i + 6) + "<STYLE>" + css + "</STYLE>" + body.substr(i + 7);
					//BR 26.627.152 - Added new param root and include it to header section
					body = body.substr(0, i + 6) + "<base href='" + root + "' />" + body.substr(i + 6);
				}
			}

			body = SysParsePictures(body, myItem);

			if (myOlApp.Version.substring(0, 2) != "12") //for office 2007
			{
				myItem.Display();
				sOriBody = myItem.HtmlBody;
			}
			else {
				myItem.Display();
				sOriBody = myItem.HtmlBody;
			}

			var i, signature;

			if (myOlApp.Version.substring(0, 1) == "9") //for office 2000
			{
				if (sOriBody.length > 0) {
					i = sOriBody.toLowerCase().indexOf("<body");
					if (i > -1) i = sOriBody.indexOf(">", i);
					if (i > -1) signature = sOriBody.substring(i, sOriBody.length);
				}
				else {
					signature = myItem.Body;
					if (signature.length > 0) {
						signature.replace(/\r\n/g, "<BR>");
					}
				}
			}
			else {
				i = sOriBody.toLowerCase().indexOf("<body");
				if (i > -1) i = sOriBody.indexOf(">", i);
				if (i > -1) signature = sOriBody.substring(i + 1, sOriBody.length);
			}

			if (signature.length > 0) {
				i = -1;
				do {
					i = body.indexOf("</body>", i + 1);
				}
				while (body.indexOf("</body>", i + 1) > -1);

				body = body.substring(0, i - 1) + signature;
			}
			myItem.HTMLBody = body;
		}
	}
	catch (e) {
		ok = false;
	}
	if (!ok) {
		window.alert("Unable to e-mail. \r" +
		"Please ensure that the Microsoft Outlook is installed " +
		"and the option 'Initialize and script ActiveX controls not marked as safe' " +
		"is enabled in Internet Explorer Security options.");
	}
}

function SysParsePictures(body, myItem) {
	try {
		// JC: replace this...  
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		var pictures = new Array();
		var picDoc = window.createPopup();
		picDoc.document.write(body);
		picDoc.document.close();
		var doc = picDoc.document;
		var imgs = doc.images;
		for (var i = 0; i < imgs.length; i++) {
			var img = imgs[i];
			var src = img.src;
			var imgURL = img.nameProp;
			if (!SysFindPicture(pictures, src)) {
				pictures[pictures.length] = src;
				var fileName = SysAddPicture(fso, src, myItem, i);
				var rs = new RegExp(SysReplaceRegEx(src), "gim");
				var rs1 = new RegExp(SysReplaceRegEx('images/' + fileName), "gim");
				var rs2 = imgURL.replace(/&/g, "&amp;");
				body = body.replace(imgURL, fileName);
				body = body.replace(rs, fileName);
				body = body.replace(rs1, fileName);
				body = body.replace(rs2, fileName);
				body = body.replace(new RegExp(fileName, "g"), "cid:" + fileName); //BR 26.627.152
			}
		}
	}
	catch (e) {
		window.alert("Unable to add pictures. \r" +
			"Please ensure that the Microsoft Outlook is installed " +
			"and the option 'Initialize and script ActiveX controls not marked as safe' " +
			"is enabled in Internet Explorer Security options.");
	}
	return body;
}

function SysReplaceRegEx(r) {
	/// <summary>Escapes the regex string provided.</summary>
	/// <param name="r" type="string">Regex string to escape.</param>
	/// <returns type="string">The escaped Regex string.</returns>

	var rr = '';
	for (var i = 0; i < r.length; i++) {
		var c = r.charAt(i);
		switch (c) {
			case '\\':
				{
					rr += '\\\\';
					break;
				}
			case '.':
				{
					rr += '\\.';
					break;
				}
			case '$':
				{
					rr += '\\$';
					break;
				}
			default:
				{
					rr += c;
					break;
				}
		}
	}
	return rr;
}
function SysFindPicture(pictures, u) {
	for (var i = 0; i < pictures.length; i++) {
		if (u == pictures[i])
			return true;
	}
	return false;
}

// [choo225643]: not ready, replace fso
function SysAddPicture(fso, pictureUrl, myItem, i) {
	var fileName;
	if (pictureUrl.indexOf('?') >= 0)
		fileName = 'picture' + i.toString();
	else {
		var p = 0;
		var l = pictureUrl.lastIndexOf('\\');
		var r = pictureUrl.lastIndexOf('/');
		if (l > p)
			p = l + 1;
		if (r > p)
			p = r + 1;
		fileName = pictureUrl.substr(p);
	}
	var sFile = fso.GetSpecialFolder(2) + "\\" + fileName;
	var picture = SysCallback(pictureUrl, null, null, true, true);
	var tf = fso.CreateTextFile(sFile, true);
	tf.Write(BinaryToString(picture));
	tf.Close();
	var colAttach = myItem.Attachments;
	colAttach.Add(sFile);
	var f = fso.GetFile(sFile);
	f.Delete();
	return fileName;
}

// Cookies
function SysSetCookie(name, value, expires, path, domain, secure) {
	/// <summary>Creates and sets a cookie with the values specified</summary>
	/// <param name="name" type="string">Name of the cookie</param>
	/// <param name="value" type="string">Value of the cookie</param>
	/// <param name="expires" type="string">Expiry date of the cookie</param>
	/// <param name="path" type="string">Path of the cookie</param>
	/// <param name="domain" type="string">Domain of the cookie</param>
	/// <param name="secure" type="string">Secure flag</param>

	var curCookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
	document.cookie = curCookie;
}

function SysGetCookie(name) {
	/// <summary>Returns the cookie that matches the name specified</summary>
	/// <param name="name" type="string">Name of the cookie</param>
	/// <returns type="Object">The cookie that matches the name specified</returns>
	
	var dc = document.cookie;
	var prefix = 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 SysDeleteCookie(name, path, domain) {
	/// <summary>Deletes the cookie that matches the parameters specified</summary>
	/// <param name="name" type="string">Name of the cookie</param>
	/// <param name="path" type="string">Path of the cookie</param>
	/// <param name="domain" type="string">Domain of the cookie</param>

	if (SysGetCookie(name)) {
		document.cookie = name + "=" +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-1970 00:00:01 GMT";
	}
}

function SysDiv(div) {
	var products = SysGetElement('Products', parent);  //parent.document.getElementById('Products');
	if (products != null) {
		var d = products.contentWindow; //products.contentWindow.document;
		var dd = SysGetElement('Division', d); //d.getElementById('Division')
		if (dd != null && div != dd.value) {
			SysSwitchDivision(dd.value, 'Portal.aspx', true);
		}
	}
}

// ToolBox
function SysToolBoxClick(me, id, val) {
	/// <summary>Tool box Click event handler</summary>
	/// <param name="me" type="string"></param>
	/// <param name="id" type="string">The ID of the tool box</param>
	/// <param name="val" type="string"></param>

	SysSet(id, val);
	var t = me.parentNode.parentNode;	
	for (i = 0; i < t.rows.length; i++) {		
		var tr = t.rows[i];
		if (tr.height == '100%') {
			$('#' + tr.id).css({ 'display': 'none', 'height': '1' });
			//tr.runtimeStyle.display = 'none';
			//tr.height = '1';
		}
	}
	var n = me.nextSibling;
	$('#' + n.id).css({ 'display': 'block', 'height': '100%' });
	//n.runtimeStyle.display = 'block';
	//n.height = '100%';

}

function SysToolBoxHide(id) {
	/// <summary>Hides the tool box</summary>
	/// <param name="id" type="string">The ID of the tool box</param>    

	$('#' + id).hide(); 
}

// Animation - DO NOT REMOVE
var SysAnimationKey;
var SysAnimationTimer;
function SysAnimate(beat, valFrom, valTo, duration, callback) {
	var nDiff = Math.abs(valFrom - valTo);
	var nFDuration = duration / nDiff;
	var nStep = duration;
	var bDesc = valFrom > valTo;
	if (SysAnimationKey == null) SysAnimationKey = valFrom;
	if (bDesc) {
		SysAnimationTimer = setInterval(function() {
			if (SysAnimationKey > valTo) {
				SysAnimationKey -= nStep;
				if (SysAnimationKey < valTo) SysAnimationKey = valTo;
				beat();
			}
			else {
				clearInterval(SysAnimationTimer);
				SysAnimationKey = null;
				if (callback != null) callback();
			}
		}, 5);
	}
	else {
		SysAnimationTimer = setInterval(function() {
			if (SysAnimationKey < valTo) {
				SysAnimationKey += nStep;
				if (SysAnimationKey > valTo) SysAnimationKey = valTo;
				beat();
			}
			else {
				clearInterval(SysAnimationTimer);
				SysAnimationKey = null;
				if (callback != null) callback();
			}
		}, 5);
	}
}

function SysNumStrPaste(el) {
	event.cancelBubble = true;
	event.returnValue = false;
	// JC: try out this for non-IE browsers: http://userscripts.org/scripts/review/58296
	var ch = window.clipboardData.getData("Text");
	var t = '';
	var s = '1234567890';

	for (var i = 0; i < ch.length; i++) {
		if (s.indexOf(ch.charAt(i)) >= 0) {
			t += ch.charAt(i);
		}
	}
	el.value = t;
}

function GetActiveXCode(filename, w, h, type, ExtraParams) {
	var clsid;
	var codebase;
	var fileparamname;
	switch (type) {
		case 0: 	//Flash
			{
				fileparamname = "movie";
				clsid = "D27CDB6E-AE6D-11cf-96B8-444553540000";
				codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
				break;
			}
		case 1: 	//Media Player
			{
				fileparamname = "url";
				clsid = "6BF52A52-394A-11d3-B153-00C04F79FAA6";
				codebase = "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715"
				break;
			}
	}
	var activexcode = '';
	activexcode = '<object classid="clsid:' + clsid + '" codebase="' + codebase + '" width="' + w + '" height="' + h + '">';
	activexcode += '<param name="' + fileparamname + '" value="' + filename + '" />';
	if (ExtraParams != null) {
		for (var key in ExtraParams) {
			activexcode += '<param name="' + key + '" value="' + params[key] + '" />';
		}
	}

	activexcode += '<embed src="' + filename + '" width="' + w + '" height="' + h + '"';
	if (ExtraParams != null) {
		for (var key in ExtraParams) {
			activexcode += ' ' + key + '="' + params[key] + '"';
		}
	}
	activexcode += ">";
	activexcode += '</object>';
	document.write(activexcode);
}

// BR 26.114.861
function SysAddEvent(obj, evType, fn) {
	if (obj.attachEvent) {
		var r = obj.attachEvent("on" + evType, fn);
		return r;
	}
	else if (obj.addEventListener) {
		obj.addEventListener(evType, fn, true);
		return true;
	}
	else { return false; }
}

// Start: From SysIE.js

function SysGetElementsByTagName(ctl, tagName) {
	/// <summary>Returns all the child elements in [ctl] that matches [tagName]</summary>
	/// <param name="ctl" type="Object">The element to search</param>
	/// <param name="tagName" type="String">The tag name to search</param>
	/// <returns type="Array">The collection of elements that match the parameters specified</returns>

	return ctl.getElementsByTagName(tagName);
}

function SysGetInnerText(element) {
	/// <summary>Returns the inner text of the element specified</summary>
	/// <param name="element" type="Object"></param>
	/// <returns type="String">The inner text of the element specified</returns>

	// [choo225643]: added .replace() because jQuery's .text() uses 0xA0 for spaces,
	// while .innerText uses 0x20. SQLServer doesn't trim 0xA0 properly.
	return $(element).text().replace(/\xa0/gi, ' ');
}

function SysGetInnerTextID(elId) {
	/// <summary>Returns the inner text of the element specified</summary>
	/// <param name="element" type="Object"></param>
	/// <returns type="String">The inner text of the element specified</returns>

	return SysGetInnerText(SysGetElement(elId));
	//return elId.innerText;
}

function SysSetInnerText(element, txtStr) {
	/// <summary>Sets the inner text of the element specified</summary>
	/// <param name="element" type="Object">The element to set</param>
	/// <param name="txtStr" type="String">The text to set</param>

	if (txtStr == null) txtStr = '';

	//Start: 33.970.789
	if ($.browser.msie) {
		//MSIE specific approach. [InnerText] only available for Internet Explorer browser.      
		element.innerText = txtStr;
	} else {
		//This approach only workable for Non-MSIE browser.
		//MSIE will throw exception [] by calling this method to set innerText value.
		// [choo225643] Note: only when the element is in a grid? 
		$(element).text(txtStr);
	}
	//End: 33.970.789
}

function SysSetInnerTextID(elId, txtStr) {
	/// <summary>Sets the inner text of the element specified</summary>
	/// <param name="elId" type="Object">The id of the element to set</param>
	/// <param name="txtStr" type="String">The text to set</param>

	if (elId == null) return;
	return SysSetInnerText(SysGetElement(elId), txtStr);
}

function SysSetInnerHtmlID(elId, txtStr) {
	/// <summary>Sets the inner html of the element specified</summary>
	/// <param name="elId" type="Object">The id of the element to set</param>
	/// <param name="txtStr" type="String">The html to set</param>

	if (txtStr == null) txtStr = '';
	$(SysGetElement(elId)).html(txtStr);
}

function SysGetOuterHtmlID(elId) {
	/// <summary>Gets the outer html of the element specified</summary>
	/// <param name="elId" type="Object">The id of the element to get</param>
	/// <returns type="String">The outer html of the element specified</returns>

	return $('<div>').append($(SysGetElement(elId)).clone()).html();
}

function SysFrame(frameName) {
	return document.frames[frameName];
}

// JC: only works for IE... 
function SysFrameDocument(frame) {
	return frame.document;
	// sysNetscape code:
	// return frame.contentDocument;
}

function SysFinalizeModal() {
	/// <summary>Calls [SysDialog].[returnFunc]</summary>
	
	if (!window.event) {
		if (SysDialog != null && SysDialog.returnFunc != null)
			SysDialog.returnFunc();
	}
}

// Placing
// -------
function SysLeft(el) {
	x = window.screenLeft;
	while (el != null) {
		x += el.offsetLeft;
		x -= el.scrollLeft;
		el = el.offsetParent;
	}
	return x;
}

function SysTop(el) {
	y = window.screenTop;
	while (el != null) {
		y += el.offsetTop;
		y -= el.scrollTop;
		el = el.offsetParent;
	}
	return y;
}

function SysBottom(el) {
	return el.offsetHeight + SysTop(el);
}

function SysRight(el) {
	return el.offsetWidth + SysLeft(el);
}

function SysButton(e, url) {
	/// <summary>Launches the URL specified in the current window or a new window, depending on whether the [Shift] key was pressed</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="url" type="String">The URL</param>

	if (new SysHandleKey(e).IsShiftKey())
		window.open(url);
	else { 							//else{window.open(url);}	OA2007
		try {
			window.location = url;
		} catch (ex) { }
	}
}

function SysTerm(id, cap, sufid, suf) {
	/// <summary>Returns the term as specified by the parameters</summary>
	/// <param name="id" type="Integer">The term id</param>
	/// <param name="cap" type="String">The default caption</param>
	/// <param name="sufid" type="Integer">The term suffix id</param>
	/// <param name="suf" type="String">The default caption suffix</param>
	/// <returns type="String">The term</returns>

	var url = "SysCallBack.aspx?Action=3";
	if (id != null) url += "&CaptionID=" + id;
	if (cap != null) url += "&Caption=" + cap;
	if (sufid != null) url += "&SuffixID=" + sufid;
	if (suf != null) url += "&Suffix=" + suf;
	return SysCallback(url);
}

// Modal dialog
//-------------
function SysShowModal(url, args, width, height, returnFunc, withFrame, ops) {
	/// <summary>Shows a modal dialog with the specified parameters</summary>
	/// <param name="url" type="String">The URI of the page to show in the dialog</param>
	/// <param name="args" type="String">The arguments to use with [window.showModalDialog]</param>
	/// <param name="width" type="String">The desired width of the dialog</param>
	/// <param name="height" type="String">The desired height of the dialog</param>
	/// <param name="returnFunc" type="">The callback function to trigger upon completion</param>
	/// <param name="withFrame" type="Boolean">Flag false to wrap [url] in [SysPopupFrame.aspx]</param>
	/// <param name="ops" type="String">The options to use with [window.showModalDialog]</param>
	/// <returns type="String">The [returnValue] from the dialog</returns>

	if (url.indexOf('?') > 0)
		url += '&IsModal=1';
	else
		url += '?IsModal=1';
	var rf;
	var re = /px/g;

	var left = '';
	if (width) {
		left = (window.top.screenLeft ? window.top.screenLeft : window.top.screenX) +
			((window.top.document.body.clientWidth - new Number(width.replace(re, ""))) / 2);
		left = "dialogLeft:" + left + ";";
	}
	var top = '';
	if (height) {
		var h = new Number(height.replace(re, ""));
		top = (window.top.screenTop ? window.top.screenTop : window.top.screenY) +
			((window.top.document.body.clientHeight - h) / 2);
		top = "dialogTop:" + top + ";";
	}

	if (returnFunc != null)
		rf = new Function(returnFunc);
		
	var options = left + top + 'dialogHeight:' + height + ';dialogWidth:' + width + ';status:no;unadorned:yes;help:no;resizable:yes;';
	
	if (ops != null)
		options = options + ops;

	if (withFrame != null)
		url = "SysPopupFrame.aspx?Page=" + encodeURIComponent(url);

	try {
		//		27.432.614
		//		  SysDialog.returnValue = window.showModalDialog(decodeURIComponent(url), args, options);
		SysDialog.returnValue = window.showModalDialog(url, args, options);		
	}
	catch (ex) {
		window.alert(SysTerm(15693, 'Pop-up blocked. Please enable pop-ups for this site.'))
	}
	
	if (rf != null)
		rf();

	return SysDialog.returnValue;
}

// Mimic statics

SysElement.IsJQuery = function(el) {
	/// <summary>Static method to Determine if the provided parameter is a jQuery object.<summary>
	if (el && el.jquery !== undefined) {
		return true;
	}
	else {
		return false;
	}
};
SysElement.IsSysElement = function(el) {
	/// <summary>Static method to determine if the provided parameter is a SysElement object.<summary>
	if (el && el.syselement !== undefined) {
		return true;
	}
	else {
		return false;
	}
};
SysElement.IsNothing = function(el) {
	/// <summary>Static method to determine if the provided parameter is either undefined or null.<summary>
	return (el === undefined || el === null);
};
SysElement.IsNotNothing = function(el) {
	/// <summary>Static method to determine if the provided parameter is not undefined or null.<summary>
	return !(SysElement.IsNothing(el));
};
var _SysElement;
SysElement.GetDomElement = function(el) {
	/// <summary>Static method to get the DOM element, regardless of what <paramref name="el"/> is (DOM element, jQuery object, ...)</summary>

	if (!_SysElement) {
		_SysElement = new SysElement(el);
	}
	_SysElement._Init(el);
	return _SysElement._el;
};

// Constructor
function SysElement(el, domain) {
	/// <summary>Wraps a DOM element and provides an interface to manipulate it. Initially it is intended to operate
	/// on a single DOM element, but as it accepts jQuery objects it could also work on a range of DOM elements.
	/// </summary>
	/// <param name="el" type="Object">el can be any from:
	///     - an element's id (i.e. a String)
	///     - jQuery object
	///     - DOM element object
	///     - SysElement object
	/// </param>
	/// <param name="domain" optional="true">Optionally limit the range in which to look for the specified element.</param>
	/// <field name="element" type="jQuery">a jQuery wrapped DOM element</field>
	/// <field name="empty" type="Boolean">Indicates if this instance wraps a DOM Element.</field>
	/// <field name="syselement" type="String">contains a version number and identifies any instance as being an instance
	/// of SysElement.</field>
	/// <remarks>If no element is supplied to operate on this object defaults to the document.</remarks>

	if (SysElement._initialized === undefined) {

		SysElement.prototype.Top = function(val) {
			if (SysElement.IsNothing(val)) {
				return this.element.offset().top;
			}
			else {
				this.element.css("top", val);
			}

		};

		SysElement.prototype.Left = function(val) {
			if (SysElement.IsNothing(val)) {
				return this.element.offset().left;
			}
			else {
				this.element.css("left", val);
			}
		};


		SysElement.prototype.Width = function(val) {
			if (SysElement.IsNothing(val)) {
				return this.element.width();
			}
			else {
				this.element.width(val);
			}
		};

		SysElement.prototype.Height = function(val) {
			if (SysElement.IsNothing(val)) {
				return this.element.height();
			}
			else {
				this.element.height(val);
			}
		};

		SysElement.prototype.SetChecked = function(checked) {
			if (checked) {
				this.element.attr("checked", "checked");
			} else {
				this.element.removeAttr("checked");
			}
		};

		SysElement.prototype.SetDisabled = function(disabled) {
			if (disabled) {
				this.element.attr("disabled", "disabled");
			} else {
				// Note: not using removeAttr is intentional
				this.element.attr("disabled", "");
			}
		};

		SysElement.prototype.SetReadonly = function(readonly) {
			if (readonly) {
				this.element.attr("readonly", "readonly");
			} else {
				this.element.removeAttr("readonly");
			}
		};

		SysElement.prototype.SetSelected = function(selected) {
			if (selected) {
				this.element.attr("selected", "selected");
			}
			else {
				this.element.removeAttr("selected");
			}
		};

		SysElement.prototype.SetDisplay = function(display) {
			this.element.css("display", display);
		};

		SysElement.prototype.AddClass = function(className) {
			this.element.addClass(className);
		};

		SysElement.prototype.RemoveClass = function(className) {
			this.element.removeClass(className);
		};

		SysElement.prototype.HasClass = function(className) {
			return this.element.hasClass(className);
		};

		SysElement.prototype.IsChecked = function() {
			return this.element.is(":checked");
		};

		SysElement.prototype.IsDisabled = function() {
			return this.element.is(":disabled");
		};

		SysElement.prototype.IsReadonly = function() {
			return this.element.is(":readonly");
		};

		SysElement.prototype.IsSelected = function() {
			return this.element.is(":selected");
		};

		SysElement.prototype.Show = function() {
			this.element.show();
		};

		SysElement.prototype.Hide = function() {
			this.element.hide();
		};

		SysElement.prototype.Focus = function() {
			var el = this.element;
			if (el.is(":radio")) {
				el = $("[name='" + this.element[0].id + "']:checked");
			}
			el.focus();
		};

		SysElement.prototype.Select = function() {
			// Note: is(":input,:text,... did not yield correct results, therefore the filter
			if (this.element.filter(":input").not(":hidden").is(":text,:password,:file")) {
				new SysSelection(this.element).SetSelection();
			}
		};

		SysElement.prototype.Value = function(value) {
			if (SysElement.IsNothing(value)) {
				var retVal;
				// Get the value
				if (this.element.length > 0) {
					if (this.element.is("input:radio")) {
						var el = this.element[0];
						var name = el.name || el.id;
						retVal = $("input[name=" + name + "]:radio:checked").val();
					}
					else if (this.element.is("input:checkbox")) {
						retVal = this.IsChecked();
					}
					else {
						retVal = this.element.val();
					}
				}
				else if (typeof this._org === "string") {
					retVal = $("input[name=" + this._org + "]:radio:checked").val();
				}
				return retVal;
			}
			else {
				// Set the value
				if (this.element.length > 0) {
					if (this.element.is(":checkbox")) {
						this.SetChecked(value);
					}
					else if (this.element.is(":radio")) {
						this._SetValueRadio(value);
					}
					else {
						this.element.val(value);
					}
				}
				else if (typeof this._org === "string") {
					this._SetValueRadio(value);
				}
			}
		};

		SysElement.prototype.AttachEvent = function(event_name, func, contentWindow) {
			var evName = event_name;
			if (event_name.startsWith("on")) {
				evName = event_name.substr(2);
			}
			$addHandler2(this._el, evName, func, contentWindow);
		};

		SysElement.prototype.DetachEvent = function(event_name, func) {
			var evName = event_name;
			if (event_name.startsWith("on")) {
				evName = event_name.substr(2);
			}
			$removeHandler(this._el, evName, func);
		};


		// DOM Level 2 Events Specification
		//
		// User Interface event types:
		//      hasFeature("UIEvents", "2.0"), createEvent("UIEvents"):
		//          initUIEvent(<typeArg>, ...): DOMFocusIn, DOMFocusOut, DOMActivate
		// Mouse event types:
		//      hasFeature("MouseEvents", "2.0"), createEvent("MouseEvents"):
		//          initMouseEvent(<typeArg>, ...): click, mousedown, mouseup, mouseover, mousemove, mouseout
		// Key events:
		//      N/A
		// Mutation event types:
		//      hasFeature("MutationEvents", "2.0"), createEvent("MutationEvents"):
		//          initMutationEvent(<typeArg>, ...): DOMSubtreeModified, DOMNodeInserted, DOMNodeRemoved, 
		//          DOMNodeRemovedFromDocument, DOMNodeInsertedIntoDocument, DOMAttrModified, DOMCharacterDataModified
		// HTML event types:
		//      hasFeature("HTMLEvents", "2.0"), createEvent("HTMLEvents"):
		//          initEvent(<typeArg>, ...): load, unload, abort, error, select, change, submit, reset, focus, blur, resize, scroll
		//
		//
		// DOM Level 3 Events Specification -> <createEvent - eventType arg>: <init...Event - typeArg>
		//
		// Note: DOM Level 3 has been published as a Working Draft 21 February 2003, a 'Working Group Note' 07 November
		// 2003,  and as a 'Working draft' in December 2007
		//
		// 
		// User Interface event types:
		//      hasFeature("UIEvents", "3.0"), createEvent("UIEvent"):
		//          initUIEventNSDOMFocusIn, DOMFocusOut, DOMActivate, focus, blur
		// Text events types (applies only to characters and is designed for use with any text input devices, not just keyboards):
		//      hasFeature("TextEvents", "3.0"), createEvent("TextEvent"):
		//          initTextEventNStextInput
		// Keyboard event types:
		//      hasFeature("KeyboardEvents", "3.0"), createEvent("KeyboardEvent"):
		//          initKeyboardEventNS(<typeArg>, ...): keydowm, keyup
		// Mouse event types:
		//      hasFeature("MouseEvents", "3.0"), createEvent("MouseEvent"):
		//          initMouseEventNS(<typeArg>, ...): click, dblclick, mousedown, mouseup, mouseover, mousemove, mouseout
		// Mouse multi wheel event types:
		//      hasFeature("MouseMultiWheelEvents", "3.0"), createEvent("MouseMultiWheelEvent"):
		//          initMouseMultiWheelEventNSmousemultiwheel
		// Mouse wheel event types:
		//      hasFeature("MouseWheelEvents", "3.0 "), createEvent("MouseWheelEvent") :
		//          initMouseWheelEventNSmousewheel
		// Mutation event types:
		//      hasFeature("MutationEvents", "3.0"), createEvent("MutationEvent"):
		//          initMutationEventNS(<typeArg>, ...): DOMSubtreeModified, DOMNodeInserted, DOMNodeRemoved,
		//          DOMNodeRemovedFromDocument, DOMNodeInsertedIntoDocument, DOMAttrModified, DOMCharacterDataModified
		// Mutation name event types:
		//      hasFeature("MutationNameEvents", "3.0"), createEvent("MutationNameEvent"):
		//          initMutationNameEventNS(<typeArg>, ...): DOMElementNameChanged, DOMAttributeNameChanged
		// Basic event types:
		//      hasFeature("BasicEvents", "3.0"), createEvent("BasicEvent"):
		//          initEventNS(<typeArg>, ...): load, unload, abort, error, select, change, submit, reset, resize, scroll

		// Note: the click on an <a> does not work.
		SysElement.prototype.FireEvent = function(eventName) {			
			var evName = eventName;
			var evtObj;

			if (document.createEvent) {
				// initMutationEvent

				if (evName.startsWith("on") === true) {
					evName = evName.substr(2);
				}

				switch (evName) {
					case "click":
					case "mousedown":
					case "mouseup":
					case "mouseover":
					case "mousemove":
					case "mouseout":
						evtObj = document.createEvent("MouseEvents");
						// type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, 
						// altKey, shiftKey, metaKey, button, relatedTarget);           
						evtObj.initMouseEvent(evName, true, true, this._el.ownerDocument.defaultView,
                            0, 0, 0, 0, 0, false, false, false, false, 0, null);
						break;
					case "load":
					case "unload":
					case "abort":
					case "error":
					case "select":
					case "change":
					case "submit":
					case "reset":
					case "focus":
					case "blur":
					case "resize":
					case "scroll":
						evtObj = document.createEvent("HTMLEvents");

						// type, canBubble, cancelable
						evtObj.initEvent(evName, true, true);
						break;
				}
				this._el.dispatchEvent(evtObj);
			} else if (document.createEventObject) {

				if (evName.startsWith("on") === false) {
					evName = "on" + evName;
				}

				evtObj = document.createEventObject();
				this._el.fireEvent(evName, evtObj);
			}

		};

		SysElement.prototype.HandleAccessKey = function(e) {
			var ret = this.element.click();
			if (SysElement.IsJQuery(ret)) {
				if (ret.length > 0) {
					SysCancelBubble(e);
					return false;
				}
				else {
					return true;
				}
			}
			return ret;
		};

		SysElement.prototype.GetDomElement = function() {
			return this._el;
		};

		// Local interface
		SysElement.prototype._Init = function(el, domain) {
			var dom = domain;
			if (SysElement.IsSysElement(dom)) {
				dom = dom.element;
			}

			// originally supplied element (indicator)
			this._org = el;
			// originally supplied context
			this._ctx = domain;

			if (SysElement.IsSysElement(el)) {
				this.element = el.element;
			}
			else if (SysElement.IsJQuery(el)) {
				this.element = el;
			}
			else if (typeof el === "string") {
				// ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of
				// letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
				// For jQuery the colons and periods have to be escaped.
				this.element = $("#" + el.replace(/(\.|:)/g, '\\$1'), dom);
			}
			else if (SysElement.IsNotNothing(el)) {
				this.element = $(el, dom);
			}

			if (SysElement.IsNotNothing(this.element)) {
				this._el = this.element[0];
				this.empty = false;
			}
		};

		SysElement.prototype._SetValueRadio = function(value) {
			var els = $(String.format("input[name={0}]", this._org));
			els.each(function(i) {
				var cur = new SysElement(this);
				if (cur.element.val() === value.toString()) {
					cur.SetChecked(true);
					return false;
				}
				else {
					return true;
				}
			});
		};

		SysElement._initialized = true;
	};

	this._Init(el, domain);
}

// Provides an interface to work with events.

// Interface
SysHandleKey.prototype = {
	event: null,
	syshandlekey: "1.0.0",

	GetKey: function() {
		/// <summary>Returns the keycode of the pressed key.</summary>
		/// <remarks>To call this should not be necessary, key handling funcitonality should be provided through
		/// individual interfaces.</remarks>
	},
	HandleEnter: function(force) {
		/// <summary>If the pressed key was the enter key it is handled as though it was a tab.</summary>
		/// <param name="force" type="Boolean" optional="true"></param>
		/// <returns>true, if the pressed key was an enter key and it has been handled, otherwise false</returns>
	},
	IsEscapeKey: function() {
		/// <summary>Returns true if the pressed key was the escape key (and escape only).</summary>
	},
	IsEnterKey: function() {
		/// <summary>Returns true if the pressed key was the Enter key (and Enter only).</summary>
	},
	IsInsertKey: function() {
		/// <summary>Returns true if the pressed key was the Insert key (and Insert only).</summary>
	},
	IsLeftKey: function() {
		/// <summary>Returns true if the pressed key was the Left key (and Left only).</summary>
	},
	IsRightKey: function() {
		/// <summary>Returns true if the pressed key was the Right key (and Right only).</summary>
	},
	IsUpKey: function() {
		/// <summary>Returns true if the pressed key was the Up key (and Up only).</summary>
	},
	IsDownKey: function() {
		/// <summary>Returns true if the pressed key was the Down key (and Down only).</summary>
	},
	IsHomeKey: function() {
		/// <summary>Returns true if the pressed key was the Home key (and Home only).</summary>
	},
	IsEndKey: function() {
		/// <summary>Returns true if the pressed key was the End key (and End only).</summary>
	},
	IsPageUpKey: function() {
		/// <summary>Returns true if the pressed key was the Page Up key (and Page Up only).</summary>
	},
	IsPageDownKey: function() {
		/// <summary>Returns true if the pressed key was the Page Down key (and Page Down only).</summary>
	},
	IsF1Key: function() {
		/// <summary>Returns true if the pressed key was the F1 key (and F1 only).</summary>
	},
	IsF2Key: function() {
		/// <summary>Returns true if the pressed key was the F2 key (and F2 only).</summary>
	},
	IsTabKey: function() {
		/// <summary>Returns true if the pressed key was the tab key (and tab only).</summary>
	},
	IsSingleKey: function(key) {
		/// <summary>Returns if a single key was pressed without any of the control keys.</summary>
		/// <param name="key" type="SysHandleKey.Key" optional="true"></param>
		/// <returns type="boolean">if a single key was pressed.</returns>
	},
	IsAltKey: function() {
		/// <summary>Returns if any of the alt keys was pressed. If the key being handled is the Alt key itself it 
		/// will return false.</summary>
		/// <returns type="Boolean"></returns>
	},
	IsCtrlKey: function() {
		/// <summary>Returns if any of the Ctrl keys was pressed. If the key being handled is the Ctrl key itself it
		/// will return false.</summary>
		/// <returns type="Boolean"></returns>
	},
	IsShiftKey: function() {
		/// <summary>Returns if any of the shift keys was pressed. If the key being handled is the Shift key itself it
		/// will return false.</summary>
		/// <returns type="Boolean"></returns>
	}
};

SysHandleKey.Key = {
	/// <summary>'Enumerator' containing keycodes</summary>
	backspace: 8,
	tab: 9,
	enter: 13,
	shift: 16,
	ctrl: 17,
	alt: 18,
	esc: 27,
	space: 32,
	pageUp: 33,
	pageDown: 34,
	end: 35,
	home: 36,
	left: 37,
	up: 38,
	right: 39,
	down: 40,
	ins: 45,
	// Note: keycode 46 will be changed into 127 by Sys.UI.DomEvent
	// del: 46,
	dot: 110,
	F1: 112,
	F2: 113,
	del: 127,
	numlock: 144,
	fslash: 191
};

// Constructor
function SysHandleKey(ev) {
	/// <summary>Provides an interface to identify pressed keys.</summary>
	/// <param name="ev" type="Object">user agent specific or DOMEvent event object</param>
	/// <field name="event" type="Sys.UI.DomEvent"></field>
	/// <field name="syshandlekey" type="String">contains a version number and identifies any instance as being an instance of
	/// SysHandleKey.</field>

	if (SysHandleKey._initialized === undefined) {

		SysHandleKey.prototype.HandleEnter = function(force) {

			if (force || this.IsEnterKey()) {
				SysCancelInputSearch();
				if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {
					SysSetKey(ev, SysHandleKey.Key.tab);
				}
				else {
					SysCancelBubble(this.event);
					SysFocusNext(SysSrcElement(this.event));
				}
				return true;
			}
			else {
				return false;
			}
		};

		SysHandleKey.prototype.IsEscapeKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.esc);
		};

		SysHandleKey.prototype.IsEnterKey = function() {
			return this.IsSingleKey(Sys.UI.Key.enter);
		};

		SysHandleKey.prototype.IsInsertKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.ins);
		};

		SysHandleKey.prototype.IsLeftKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.left);
		};

		SysHandleKey.prototype.IsRightKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.right);
		};

		SysHandleKey.prototype.IsUpKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.up);
		};

		SysHandleKey.prototype.IsDownKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.down);
		};

		SysHandleKey.prototype.IsHomeKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.home);
		};

		SysHandleKey.prototype.IsEndKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.end);
		};

		SysHandleKey.prototype.IsPageUpKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.pageUp);
		};
		SysHandleKey.prototype.IsPageDownKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.pageDown);
		};

		SysHandleKey.prototype.IsF1Key = function() {
			return this.IsSingleKey(SysHandleKey.Key.F1);
		};

		SysHandleKey.prototype.IsF2Key = function() {
			return this.IsSingleKey(SysHandleKey.Key.F2);
		};

		SysHandleKey.prototype.IsTabKey = function() {
			return this.IsSingleKey(SysHandleKey.Key.tab);
		};

		SysHandleKey.prototype.IsSingleKey = function(key) {
			var isSingle = !(this.IsAltKey() || this.IsShiftKey() || this.IsCtrlKey());
			if (isSingle && key) {
				isSingle = this.GetKey() === key;
			}
			return isSingle;
		};

		SysHandleKey.prototype.IsAltKey = function() {
			return this.event.altKey;
		};

		SysHandleKey.prototype.IsCtrlKey = function() {
			return this.event.ctrlKey;
		};

		SysHandleKey.prototype.IsShiftKey = function() {
			return this.event.shiftKey;
		};

		SysHandleKey.prototype.GetKey = function() {
			if (this.event.type == "keypress") {
				return this.event.charCode;
			} else if (this.event.type == "keyup" || this.event.type == "keydown") {
				return this.event.keyCode;
			} else {
				return this.event.keyCode; // Should not occur.
			}
		}

		SysHandleKey.prototype._Init = function(ev) {
			if (ev === undefined) {
				throw new Error("You must supply an event to operate on");
			}

			this.event = SysEvent(ev);
		}

		SysHandleKey._initialized = true;
	}

	this._Init(ev);
}

function SysSrcElement(e) {
	return new SysHandleEvent(e).target;
}

// Provides an interface to work with events.

// Interface
SysHandleEvent.prototype = {
	event: null,
	syshandleevent: "1.0.0",
	target: null,

	IsEventStopped: function() {
		/// <summary>Indicates if any further processing should take place. Where StopPropagation influences the
		/// flow of events from handler to handler, this could be used within functions within the same
		/// handler.</summary>
		/// <returns type="undefined">undefined</returns>
	},
	StopEvent: function() {
		/// <summary>Where StopPropagation stops the event flow AFTER all listeners on the current target have
		/// been called, StopEvent is used to indicate that no further processing of the event should take place.
		/// This should be checked using the IsEventStopped interface.</summary>
		/// <returns type="undefined">undefined</returns>
	},
	StopPropagation: function() {
		/// <summary>The stopPropagation method is used prevent further propagation of an event during event flow. 
		/// If this method is called by any EventListener the event will cease propagating through the tree. 
		/// The event will complete dispatch to all listeners on the current EventTarget before event flow stops
		/// (DOM level 2 definition).</summary>
		/// <returns type="undefined">undefined</returns>
	},
	PreventDefault: function(txt) {
		/// <summary>Signifies that the event is to be canceled, meaning any default action normally taken by the 
		/// implementation as a result of the event will not occur (DOM level 2 definition). Optionally it sets
		/// a text that can be displayed. (such as 'Your changes will not be saved.')</summary>
		/// <param name="txt" type="String" optional="true">Sets the event's 'returnValue'</param>
		/// <returns type="undefined">undefined</returns>
	},
	StopAll: function() {
		/// <summary>Stop any further processing of the event.</summary>
		/// <returns type="undefined">undefined</returns>
	}
};

// Mimic enumerators

// Mimic statics

// Constructor
function SysHandleEvent(ev) {
	/// <summary>Under construction: handle/manage events</summary>
	/// <param name="ev" type="Event"></param>
	/// <field name="event" type="Event">The Event object currently being worked on.</field>
	/// <field name="syshandleevent" type="String">contains the version number of this instance of SysHandleEvent 
	/// and identifies the object as being a SysHandleEvent.</field>
	/// <field name="target" type="EventTarget">Used to indicate the EventTarget to which the event was originally
	/// dispatched. On demand we may want to extend the interface to support currentTarget as well.</field>

	if (SysHandleEvent._initialized === undefined) {

		SysHandleEvent.prototype.IsEventStopped = function() {
			return (this.event.rawEvent || this.event).stopEvent === true;
		};

		SysHandleEvent.prototype.StopPropagation = function() {
			// This is the interface defined by the standard, but not supported by IE.
			if (this.event.stopPropagation) {
				this.event.stopPropagation();
			}
			// This is the interface used by IE, Safari and FF have adopted as a flag to indicate if propagation
			// has been stopped. BUT, Safari does not immediately toggle it upon a stopPropagation. Therefore we set 
			// it manually for all browsers. 
			this.event.cancelBubble = true;
		};

		SysHandleEvent.prototype.PreventDefault = function(txt) {
			var hasTxt = typeof txt === "string" && txt.length > 0;

			if (this.event.preventDefault) {
				this.event.preventDefault();
				if (hasTxt && this.event.rawEvent) {
					this.event.rawEvent.returnValue = txt;
				}
			} else {
				if (hasTxt) {
					this.event.returnValue = txt;
				}
				else {
					this.event.returnValue = false;
				}
			}
		};

		SysHandleEvent.prototype.StopEvent = function() {
			(this.event.rawEvent || this.event).stopEvent = true;
		};

		SysHandleEvent.prototype.StopAll = function() {
			this.StopPropagation();
			this.PreventDefault();
			this.StopEvent();
		};

		// Local interface
		SysHandleEvent.prototype._Init = function(ev) {
			this.event = ev;

			if (this.event.target) {
				this.target = this.event.target;
			}
			else {
				this.target = this.event.srcElement;
			}
		};

		SysHandleEvent._initialized = true;
	};

	this._Init(ev);
}

function SysEvent(e) {
	/// <summary>Provides cross-browser access to fields and methods that are associated with handlers for DOM-element events</summary>
	/// e = The event to initialize from.
	/// returns a new instance of the Sys.UI.DomEvent class
	if (e && !e.rawEvent) return new Sys.UI.DomEvent(e);
	else return e;
}

function SysIsCancelBubble(e) {
	return e.cancelBubble;
}

function SysStopPropagation(e) {
	new SysHandleEvent(e).StopPropagation();
}

function SysPreventDefault(e, txt) {
	new SysHandleEvent(e).PreventDefault(txt);
}

function SysCancelBubble(e) {
	new SysHandleEvent(e).StopAll();
}

function SysDetachEvent(element, event_name, func) {
	/// <summary>Obsolete, use SysElement.DetachEvent.Detach an event handler, which was previously attached with 
	/// SysAttachEvent.</summary>
	/// <param name="element" type="DOMElement"></param>
	/// <param name="event_name" type="String">Event type with/without the IE 'on' prefix.</param>
	/// <param name="func" type="Function">The handler that should no longer be called when the event fires.</param>
	/// <returns type="undefined">undefined</returns>

	var el = new SysElement(element);
	el.DetachEvent(event_name, func);
}

function SysAttachEvent(element, event_name, func, contentWindow) {
	/// <summary>Obsolete, use SysElement.AttachEvent. Attach an event handler to an element.</summary>
	/// <param name="element" type="DOMElement" domElement="true"></param>
	/// <param name="event_name" type="String">Event type with/without the IE 'on' prefix.</param>
	/// <param name="func" type="Function">The handler that will be called when the event fires.</param>
	/// <param name="contentWindow" type="Window" optional="true">Supply the element's parent window, especially when 
	/// attaching events that are located inside a frame / outside the current window object.</param>
	/// <returns type="undefined">undefined</returns>

	var el = new SysElement(element);
	el.AttachEvent(event_name, func, contentWindow);
}

var $addHandler2 = Sys.UI.DomEvent.addHandler2 =
function Sys$UI$DomEvent$addHandler(element, eventName, handler, contentWindow) {
	/// <summary>Version 2 of the $addHandler, which fixes the ASP.NET AJAX BUG: $addHandler Can't Attach to Element Inside 
	/// an IFrame in Internet Explorer.</summary>
	/// <param name="element" domElement="true" type="DOMElement"></param>
	/// <param name="eventName" type="String">The DOM compliant event name (i.e. without the IE prefix).</param>
	/// <param name="handler" type="Function"></param>
	/// <returns type="undefined">undefined</returns>
	var e = Function._validateParams(arguments, [
       { name: "element", domElement: true },
       { name: "eventName", type: String },
       { name: "handler", type: Function },
       { name: "contentWindow", type: Object, optional: true, mayBeNull: true }
   ]);
	if (e) throw e;

	if (!element._events) {
		element._events = {};
	}
	var eventCache = element._events[eventName];
	if (!eventCache) {
		element._events[eventName] = eventCache = [];
	}
	var browserHandler;
	if (element.addEventListener) {
		browserHandler = function(e) {
			return handler.call(element, new Sys.UI.DomEvent(e));
		}
		element.addEventListener(eventName, browserHandler, false);
	}
	else if (element.attachEvent) {
		browserHandler = function() {
			var w = (contentWindow == null) ? window : contentWindow;
			return handler.call(element, new Sys.UI.DomEvent(w.event));
		}
		element.attachEvent('on' + eventName, browserHandler);
	}
	eventCache[eventCache.length] = { handler: handler, browserHandler: browserHandler };
}

function SysProcessKey(e) {
	/// <summary>Determines if a pressed key should be handled (it filters out control keys 'accidentally' passed on).</summary>
	/// <returns type="boolean">True if a pressed key should be handled.
	/// <remarks>FF sends control keys (a.o. arrow keys) through to the keypress unlike other browsers.</remarks>
	/// False if a pressed key should not be handled </returns>

	if (Sys.Browser.agent === Sys.Browser.Firefox) {
		var ev = e;
		if (e.rawEvent) {
			ev = e.rawEvent;
		}
		if (ev.type === "keypress" &&
            (ev.keyCode > 0 ||
             ev.ctrlKey ||
             ev.altKey)
           ) {
			return false;
		}
	}
	return true;
}

// Legacy key handling routines
function SysKeyDown(e) {
	new SysHandleKey(e).HandleEnter();
}

function SysGetKey(e) {
	/// <summary>obsolete: use <see cref="SysHandleKey.GetKey"/></summary>
	return new SysHandleKey(e).GetKey();
}
function SysSetKey(e, key) {
	/// <summary>obsolete: setting keys is considered a security risc. For non-IE user agents it is
	/// mimicked by raising a keydown event. It is however not the preferred way.
	/// <summary>
	if (e.srcElement) {
		e.keyCode = key;
	}
	else {
		e.stopPropagation();

		var evt = document.createEvent("KeyboardEvent");
		evt.initKeyEvent("keydown", true, true, null, false, false, false, false, key, 0);
		var el = SysSrcElement(e);
		el.dispatchEvent(evt);
	}
}

// System functions to support text selection.

// order of checking for interface:
// // FF, Safari, Chrome, Opera
// if (window.getSelection) {
// }
// // IE, Opera. This should come last; Opera supports both
// else if (document.selection) {
// }

// An element's nodeType can be any of
//        Node.ELEMENT_NODE == 1
//        Node.ATTRIBUTE_NODE == 2
//        Node.TEXT_NODE == 3
//        Node.CDATA_SECTION_NODE == 4
//        Node.ENTITY_REFERENCE_NODE == 5
//        Node.ENTITY_NODE == 6
//        Node.PROCESSING_INSTRUCTION_NODE == 7
//        Node.COMMENT_NODE == 8
//        Node.DOCUMENT_NODE == 9
//        Node.DOCUMENT_TYPE_NODE == 10
//        Node.DOCUMENT_FRAGMENT_NODE == 11
//        Node.NOTATION_NODE == 12

// Mimic public enumerators

SysSelection.Mode = {
	undefined: -1,
	control: 0,
	text: 1,
	mixed: 2
};

SysSelection._Type = {
	text: "Text",
	control: "Control",
	none: "None"
};

// Interface
SysSelection.prototype = {
	el: null,
	hasSelection: false,
	sysselection: "1.0.0",
	mode: SysSelection.Mode.undefined,

	GetCaretPosition: function() {
		/// <summary>Get the location of the caret, i.e. the cursor position within the text.</summary>
		/// <returns type="Integer"></returns>
	},
	SetCaretPosition: function(pos) {
		/// <summary>Set the location of the caret, i.e. the cursor</summary>
		/// <param name="pos" optional="false" integer="true">The position in the elements text where the caret should be set to.</param>
		/// <remarks>If any text was selected, this selection is lost.</remarks>
	},
	GetSelection: function() {
		/// <summary>Get the selected text</summary>
		/// <returns type="String">The selected text or an empty string if no text was selected.</returns>
	},
	SetSelection: function(start, nr) {
		/// <summary>Select a part of the inner text in an element.</summary>
		/// <param name="start" optional="true" integer="true">If supplied indicates the starting character for the new
		/// selection.</param>
		/// <param name="nr" optional="true" integer="true">If supplied, indicates the number of characters to include 
		/// in the selection.</param>
	},
	ClearSelection: function() {
		/// <summary>Unselects selected text / controls.</summary>
	},
	DeleteSelection: function() {
		/// <summary>Deletes the selection, returns the deleted selection text.</summary>
	},
	ReplaceSelection: function(ins) {
		/// <summary>Replace the selected text with the supplied text. If no text was selected the supplied text
		/// is inserted at the current caret position.</summary>
	}
}

// Constructor
function SysSelection(el) {
	/// <summary>Represents a (text) selection object.</summary>
	/// <param name="el" type="Any">Can be anything ranging from an element's id, a jQuery object, ... <see cref="SysElement />
	/// </param>
	/// <field name="el" type="jQuery">The element the selection operates on. Note: this is not necessarily the same as the element
	/// that was initially supplied.</field>
	/// <field name="hasSelection" type="boolean">Indicates if the selection can be manipulated. A false can occur
	/// if no text / element had been selected, or, if no manipulable element was supplied.</field>
	/// <field name="sysselection" type="String">contains a version number and identifies any instance as being an instance of
	/// SysSelection.</field>

	if (SysSelection._initialized === undefined) {

		// Public interface
		SysSelection.prototype.GetCaretPosition = function() {
			if (this._selectionStart == -1) {
				if (this.hasSelection) {
					if (window.getSelection) {
						if (SysElement.IsNotNothing(this._el.selectionStart)) {							
							this._selectionStart = this._el.selectionStart;
						}
						else {
							this._selectionStart = this._sel.anchorOffset;
							// this._selectionStart = this._rng.startOffset;
						}
					} else if (document.selection) {
						var i;
						var objCaret;
						if (this._sel && this._rng) {
							objCaret = SysSelection._CreateRange(this._sel);
						}
						else {
							objCaret = SysSelection._CreateRange(document.selection);
						}

						// We need to use val for e.g. an input element, text for e.g. button, td, ...
						var txt = this.el.text() || this.el.val();
						i = txt.replace(/\n/g, '').length + 1;

						var moved = 1;
						while (objCaret && objCaret.parentElement() == this._el && moved == 1) {
							moved = objCaret.move("character", 1);
							if (moved === 1) {
								--i;
							}
						}
						this._selectionStart = --i;
					}
					else {
						this._selectionStart = 0;
					}
				}
			}
			return this._selectionStart;
		};

		SysSelection.prototype.SetCaretPosition = function(pos) {
			if (this.hasSelection) {
				this._selectionStart = pos;
				if (window.getSelection) {
					this._el.selectionStart = pos;
					this._el.selectionEnd = pos;
				}
				else {
					var selRange = this._el.createTextRange();
					selRange.move("character", pos)
					selRange.select();
				}
			}
		};

		SysSelection.prototype.GetSelection = function() {
			var txt = "";
			if (this.hasSelection) {
				if (window.getSelection) {
					if (SysElement.IsNotNothing(this._el.selectionStart)) {
						var pos = this.GetCaretPosition();
						if (pos != this._el.selectionEnd) {
							txt = this.el.val().substring(pos, this._el.selectionEnd);
						}
					}
					else {
						txt = this._sel.toString();
					}
				}
				else if (document.selection) {
					if (this._sel.type === SysSelection._Type.text) {
						txt = this._rng.text;
					}
					else if (this._sel.type === SysSelection._Type.control) {
						txt = this._el.innerText;
					}
				}
			}
			return txt;
		};

		SysSelection.prototype.SetSelection = function(start, nr) {
			var selStart = -1;
			var selEnd = -1;
			var txtLen = (this.el.val() || this.el.text()).length;
			if (typeof start === "number" && start >= 0) {
				selStart = selEnd = start;
			}
			if (typeof nr === "number" && nr >= 0) {
				selEnd = selStart + nr;
			}

			if (window.getSelection) {
				if (selStart > -1) {
					this._selectionStart = this._el.selectionStart = selStart;
				}
				else {
					this._selectionStart = this._el.selectionStart = 0;
				}

				if (selEnd > -1) {
					this._el.selectionEnd = selEnd;
				}
				else {
					this._el.selectionEnd = txtLen;
				}
			}
			else if (document.selection) {
				var rng = document.selection.createRange();
				if (selStart > 0) {
					rng.moveStart("character", selStart);
				} else {
					rng.moveStart("textedit");
				}
				if (selEnd == -1) {
					rng.expand("textedit");
				} else {
					rng.expand("character", txtLen - selStart);
				}
				rng.select();
			}
		};

		SysSelection.prototype.ClearSelection = function() {
			if (this.hasSelection) {
				if (window.getSelection) {
					this._el.selectionEnd = this._el.selectionStart;
				}
				else if (document.selection) {
					this._sel.empty();
					this._rng = null;
					//                    if (this._sel.type === SysSelection._Type.text) {
					//                        this._sel.empty();
					//                        this._rng = this._sel.createRange();
					//                    }
					//                    else if (this._sel.type === SysSelection._Type.control) {
					//                        var el2 = this._rng.commonParentElement();
					//                        this._sel.empty();
					//                        if (el2.nodeType === 9) {
					//                            this._rng = el2.body.createControlRange();
					//                        }
					//                        else {
					//                            this._rng = el2.document.body.createControlRange();
					//                        }
					//                        
				}
			}
		};

		SysSelection.prototype.DeleteSelection = function() {
			var txt = "";
			if (this.hasSelection) {
				if (window.getSelection) {
					txt = this._sel.toString();
					if (txt.length > 0) {
						this._sel.deleteFromDocument();
					}
					//                    var pos = this.GetCaretPosition();
					//                    if (pos == this._el.selectionEnd) {
					//                        return null;
					//                    }
					//                    var val = this.el.val();
					//                    txt = val.substring(pos, this._el.selectionEnd);
					//                    this.el.val(
					//                        val.substring(0, pos) +
					//                        val.substring(this._el.selectionEnd));
				}
				else if (document.selection) {
					if (this._sel.type === SysSelection._Type.text) {
						txt = this._rng.text;
						this._sel.clear();
					}
					else if (this._sel.type === SysSelection._Type.control) {
						var i = 0;
						var el = this._el.parentElement;
						while (i < this._rng.length) {
							txt += this._rng(i).innerText;
							i++;
						}
						this._sel.clear();
						this._Init(el);
					}
				}
			}
			return txt;
		};

		SysSelection.prototype.ReplaceSelection = function(ins) {
			if (this.hasSelection) {
				if (window.getSelection) {
					var pos = this.GetCaretPosition();
					//this.DeleteSelection();

					if (SysElement.IsNotNothing(this._el.value)) {
						this._el.value = this._InsertValue(this._el.value, pos, ins);

						this.SetCaretPosition(pos + ins.length);
					}
					else if (SysElement.IsNotNothing(this._el.textContent)) {
						this._el.textContent = this._InsertValue(this._el.textContent, pos, ins);
					}
				}
				else if (document.selection) {
					if (this._sel.type === SysSelection._Type.none) {
						// determine if we're inside an element that can receive text
						// Note alternatively:
						//    this._rng = this._el.document.selection.createRange().duplicate();
						//    this._rng.text = ins;
						if (SysElement.IsNotNothing(this._rng)) {
							this._rng.text = this._rng.text.charAt(this._rng.text.length - 1) == '' ? ins + ' ' : ins;
						}
						else {
							this._el.focus();
							if (SysElement.IsNotNothing(this._el.value)) {
								this._el.value = ins;
							}
						}
					}
					else if (this._sel.type === SysSelection._Type.text) {
						this._rng.text = ins;
					}
					else {
						//this.DeleteSelection();
						if (this._el.createTextRange) {
							this._rng = this._el.createTextRange();
							this._rng.text = ins;
						}
					}
				}

			}
		};

		// Local interface
		SysSelection.prototype._Init = function(el) {
			/// <summary>This interface is NOT intended to be part of the public interface.</summary>
			var locEl = el;
			if (el) {
				var el2 = new SysElement(el).element;
				if (el2.length > 0) {
					locEl = el2[0];
				}
			}

			var ret = SysSelection._GetElement(locEl);
			this.el = ret[0];

			// Intended for private use only
			this._sel = ret[1];
			this._rng = ret[2];
			this.mode = ret[3];
			this._el = this.el[0];
			this._selectionStart = -1;
			this.hasSelection = true;  // (this._el.nodeType == 1);
		}

		SysSelection.prototype._InsertValue = function(val, pos, ins) {
			/// <summary>This interface is NOT intended to be part of the public interface.</summary>
			var txt;
			if (pos != -1) {
				txt = val.substring(0, pos);
				txt += ins;
				txt += val.substring(pos);				
			}
			else {
				txt = ins + val;
			}
			return txt;
		}

		SysSelection._initialized = true;

	}

	this._Init(el);

}

// private 'static':

SysSelection._GetElement = function(el) {
	var node, sel, rng, mode = SysSelection.Mode.undefined;
	if (el) {
		if (window.getSelection) {

			// In virtually all cases (I've seen sofar) all selections are wrapped in a TextNode element
			mode = SysSelection.Mode.text;

			// Make sure not to use the wrong parent window (e.g. a frame / window object was passed on)
			if (el.window) {
				sel = el.window.getSelection();
			}
			else {
				sel = window.getSelection();
			}

			// Selections inside an element (e.g. <input>) are not stored in range objects, ergo the rangeCount can be 0
			if (sel.rangeCount > 0) {
				rng = sel.getRangeAt(0);
				if (SysElement.IsNotNothing(el.selectionStart)) {
					node = el;
				}
				else {
					node = rng.startContainer;

					if (node.nodeType == 3) {
						node = node.parentNode;
					}
					else {
						mode = SysSelection.Mode.control;
					}
				}
			}
			else {
				node = el;
			}
		}
		else if (document.selection) {
			// nodeType === DOCUMENT_NODE
			if (el.nodeType === 9) {
				sel = el.selection;
			}
			else {
				sel = el.document.selection;
			}
			rng = SysSelection._CreateRange(sel);
			var type = sel.type;

			if (type === SysSelection._Type.text) {
				mode = SysSelection.Mode.text;
			}
			else if (type === SysSelection._Type.control) {
				mode = SysSelection.Mode.control;
			}
			else {
			}
			// not every DOM element has a nodeType: frames
			if (type === SysSelection._Type.text || SysElement.IsNothing(el.nodeType)) {
				if (rng.parentElement) {
					node = rng.parentElement();
				}
				else if (rng.commonParentElement) {
					node = rng.commonParentElement();
				}
			}
			else if (type === SysSelection._Type.control) {
				node = rng(0);
			}
			else if (type === SysSelection._Type.none) {
				node = el;
			}
		}
	}
	var ret = [];
	ret[0] = $(node);
	ret[1] = sel;
	ret[2] = rng;
	ret[3] = mode;
	return ret;
}

SysSelection._CreateRange = function(sel) {
	/// <summary>This interface is NOT intended to be part of the public interface.</summary>
	/// <remarks>When the selection.type is "Control", the interface of the selection object no longer supports 
	/// duplicate(). <br/>
	/// Use with the document.selection interface (i.e. IE)</remarks>

	var rng = sel.createRange();
	if (typeof (rng.duplicate) === "object") {
		rng = rng.duplicate();
	}
	return rng;
}




// START: UNCONVERTED FUNCTIONS

// Browser
//----------
function BrowseTableMouseOver(e) {
	/// <summary>Browser table MouseOver event handler</summary>
	/// <param name="e" type="DOMEvent"></param>
	
	var el = SysSrcElement(e); 
	if (el.tagName == "TD")
		el.parentNode.className = "Selected";
}

function BrowseTableMouseOut(e) {
	/// <summary>Browser table MouseOut event handler</summary>
	/// <param name="e" type="DOMEvent"></param>

	var el = SysSrcElement(e);
	if (el.tagName == "TD") {
		var p = el.parentNode;
		p.className = ((p.rowIndex % 2) != 0) ? "DataLight" : "DataDark";
	}
}

function BrowseTableClick(e) {
	/// <summary>Browser table Click event handler</summary>
	/// <param name="e" type="DOMEvent"></param>	

	var el = SysSrcElement(e);
	BrowseTableClicked(el.href == 'javascript:{}' ? el.parentNode : el, e);
}

function BrowseSetFocus(ctlID) {
	/// <summary>Sets focus on the specified browser control</summary>
	/// <param name="ctlID" type="String">The id of the control to set focus</param>

	var ctl = SysGetElement(ctlID);
	if (ctl != null) ctl.focus();
}

function BrowseTableKeyPress(e) {
	//	var el = e.srcElement;
	//	if (el.tagName == "TD" && el.tabIndex == 0 && e.keyCode == 13) {
	//		BrowseTableClicked(el);
	//		e.returnValue = false;
	//	}
}

// Inputfield Selector
var sysInput;
var sysInputAlt;
var sysInputMenu;
var sysInputText;
var sysInputRow;
var sysInputXmlHttp;
var sysInputTimer;
var sysInputTextType;
var sysInputRefUrl;
var sysInputKeyInRef;
var sysInputType; // stores enum BrowseInputType values
var sysInputExtraQuery = '';
var sysInputParm = '';
var sysInputDivisionCode = '';

function SysInputFindElement(el) {
	while (el != null && el.className != "contextmenuitems") {
		el = el.parentNode;
	}
	return el;
}
function SysInputHighlight(e) {
	var el = SysInputFindElement(SysSrcElement(e));
	if (el != null && el.className == "contextmenuitems") {
		sysInputRow = el.rowIndex;
		el.style.backgroundColor = SysColors.ActiveCaption;
		el.style.color = SysColors.CaptionText;
	}
}

function SysInputLowlight(e) {
	if (sysInputRow < 0) return;
	var r = sysInputMenu.rows[sysInputRow];
	if (r != null) {
		r.style.backgroundColor = "";
		r.style.color = "";
	}
	var el = SysInputFindElement(SysSrcElement(e));
	if (el != null && el.className == "contextmenuitems") {
		el.style.backgroundColor = "";
		el.style.color = "";
	}
}

function SysInputRowHide(row) {
	var r = sysInputMenu.rows[row];
	if (r != null) {
		r.style.backgroundColor = "";
		r.style.color = "";
	}
}

function SysInputSelectRow(e, key) {
	/// <summary>Select a row from a popup menu.</summary>
	/// <param name="e" type="event"></param>
	/// <param name="key" type="number">key code</param>
	/// <returns type="Boolean">true if a row was selected, false otherwise.</returns>

	if (sysInputMenu == null ||
	    sysInput == null ||
	    (sysCxMenu !== null && sysCxMenu.is(":hidden")) ||
	    (key != SysHandleKey.Key.up && key != SysHandleKey.Key.down)
	   ) {
		return false;
	}
	SysInputLowlight(e);
	if (key == SysHandleKey.Key.up) {
		if (sysInputRow > 0) {
			sysInputRow -= 1;
		}
		else {
			sysInputRow = sysInputMenu.rows.length - 1;
		}
	}
	else {
		if (sysInputRow < (sysInputMenu.rows.length - 1)) {
			sysInputRow += 1;
		}
		else {
			sysInputRow = 0;
		}
	}
	var r = sysInputMenu.rows[sysInputRow];
	if (r != null) {
		r.style.backgroundColor = SysColors.ActiveCaption;
		r.style.color = SysColors.CaptionText;
		var c = r.cells[0];
		SysInputSetValue(c);  //(window, c);
	}
	return true;
}

function SysInputMouseSelect(e) {
	/// <summary>Input mouse click event handler</summary>
	/// <param name="e" type="DOMEvent"></param>

	var el = SysSrcElement(e); 
	if (el != null) {
		SysInputSetValue(el);
		el.focus(); 	//Necessary for IE8 only
		SysMenuHide();
		if (sysInputChanged) {
			var c = SysGetElement(sysInputAlt + '_alt');
			if (c == null)
				c = SysGetElement(sysInputAlt);
			if (c != null) {
				SysChangeOnBlur(c);
				c.focus(); 
			}
		}
	}
}

function SysInputSetValue(el) {
	/// <param name="el" type="DOMElement"></param>
	var el2 = $(el.parentNode.firstChild);

	var iv = SysTrim(el2.attr('iv'));
	sysInputChanged = true;
	if (sysInputType == BrowseInputType.Browser) {
		var sin = $("#" + sysInputAlt);
		var f = 1;
		var refUrl = sysInputRefUrl;
		var bKeyInRef = sysInputKeyInRef;
		var ic = el2.attr('ic');
		if (ic == null) {
			ic = iv;
		}
		if (sin.length > 0) {
			sin.val(iv);
			sysInputChanged = true;
		}
		var sinAlt = $("#" + sysInputAlt + "_alt");
		if (sinAlt.length > 0) {
			sinAlt.val(SysTrim(ic));
			f++;
		}
		var sinRef = $("#" + sysInputAlt + "_ref");
		if (sinRef.length > 0) {
			if (refUrl.length > 0) {
				sinRef.attr("href", refUrl + SysURLEncode(iv));
			}
			if (bKeyInRef) {
				SysSetInnerText(sinRef, el2.text());
			}
			else {
				SysSetInnerText(sinRef, ic + " - " + el2.text());
			}
		}
	}
	else if (sysInputType == BrowseInputType.InputField) {
		var sin = $("#" + sysInput);
		sin.val(el2.text());
	}
	else if (sysInputType == BrowseInputType.SearchField) {
		var iv = el2.attr('iv');
		var ic = el2.attr('ic');
		if (ic == null) {
			ic = iv;
		}
		var sin = $("#" + sysInput);
		sin.val(SysTrim(ic));
	}
	else if (sysInputType == BrowseInputType.Tag) {
		//FC27.574.081 Tagging		
		var iv = el2.attr('iv');
		var ic = el2.attr('ic');
		if (ic == null)
			ic = iv;
		var sin = sysInput;
		var si = SysGetElement(sin);
		var sv = si.value;
		var sp = "";
		var cp = SysGetCaretPosition(si);
		var li = sv.lastIndexOf(",", cp - 1);
		if (li >= 0)
			sp = sv.substring(0, li + 1);
		si.value = sp + SysTrim(el2.text());
	}
	else {
		Sys.Debug.fail("where does this occur");
		var sin = sysInput;
		var si = SysGetElement(sin);
		var sit = si.value;
		var cp = SysGetCaretPosition($(si));
		var li = sit.lastIndexOf(";", cp - 1);
		if (li < 0)
			li = -1;
		var i = sit.indexOf(";", cp);
		if (i < 0)
			i = sit.length;
		var st = sit.substring(0, li);
		if (st != '' && st != null)
			st = st + ";";
		var en = sit.substring(i, sit.length);
		if (en != '' && en != null)
			en = ";" + en;
		si.value = st + el2.text() + en;
		selRange = si.createTextRange();
		selRange.move("character", cp)
		var i = si.value.indexOf(";", cp);
		if (i < 0)
			i = si.value.length;
		selRange.moveEnd("character", i - cp)
		selRange.select();
	}
}

function SysSetSysDialog(el) {
	var cvcount = el.getAttribute('cvcount');
	if ((!cvcount) || (!parseInt(cvcount)) || (parseInt(cvcount) <= 0))
		return;
	count = parseInt(cvcount);
	if (count == 1) {
		SysDialog.returnValue = (el.getAttribute('cv0')) ? SysTrim(el.getAttribute('cv0')) : '';
		return;
	}
	SysDialog.returnValue = new Array();
	for (var k = 0; k < count; k++) {
		SysDialog.returnValue[k] = (el.getAttribute('cv' + k)) ? SysTrim(el.getAttribute('cv' + k)) : '';
	}
}
// CMDM - Add entityEGBrowser
function SysInputBrowseChg(ctl, refurl, bKeyInRef, where, parms, bQuickSearch, extraResults, bEnterpriseSearch, backOfficeDivisionCode, entityEGBrowser, backOfficeSetting) {
	//BR 23.660.584
	onChangeTriggered = true;

	var sin = SysGetElement(ctl + '_alt');
	if (sin == null)
		sin = SysGetElement(ctl);
	var sit = SysTrim(sin.value); // BR 24.535.313
	var t;
	if (sit != null && sit != '')
	    t = SysCallback("../docs/SysInputSearch.aspx?MultiBrowser=1&XML=1&InputType=B&Text=" + SysURLEncode(sit) + "&" + where + "&BRS_BackOfficeDivisionCode=" + backOfficeDivisionCode + "&BRS_EntityEGBrowser=" + entityEGBrowser + "&BRS_BackOfficeSetting=" + backOfficeSetting, "", null, false); // CMDM - Add entityEGBrowser
	var ok = false;
	if (t != null) {
		var es = t.getElementsByTagName("Entity");
		for (i = 0; !ok && i < es.length; i++) {
			var e = es.item(i);
			var code = e.getAttribute("code");
			var id = e.getAttribute("id");
			if (es.length == 1 || SysTrim(sit).toLowerCase() == SysTrim(code).toLowerCase() || SysTrim(sit).toLowerCase() == SysTrim(id).toLowerCase()) {
				var desc = e.getAttribute("description");
				SysSetSysDialog(e);
				SysSetBrowserChg(ctl, id, code, refurl, desc, bKeyInRef, extraResults, SysDialog.returnValue);
				ok = true;
			}
		}
		if ((!ok) && (es.length > 1)) {
			if (bEnterpriseSearch == true) { //FC 26.556.647, Enterprise Search
				new SysElement(sin).FireEvent("dblclick");
				//.fireEvent('ondblclick');
				SysCancelBubble(event);
				return;
			} else {
				var code = es[0].getAttribute("code");
				var id = es[0].getAttribute("id");
				var desc = es[0].getAttribute("description");
				SysSetSysDialog(es[0]);
				SysSetBrowserChg(ctl, id, code, refurl, desc, bKeyInRef, extraResults, SysDialog.returnValue);
				ok = true;
			}
		}
	}

	var el = SysGetElement(ctl + '_ref');
	if (el != null) {
		var elGrid = SysGetElement(ctl + '_ref_ref'); // BR 26.863.222 
		if (sit == null || sit == '') {
			SysSetInnerText(el, '');
			if (elGrid != null) SysSetInnerText(elGrid, '');
			SysClearExtraResults(extraResults);
		}
		else if (ok) {
			el.style.color = '';
			if (elGrid != null) elGrid.style.color = '';
			//el.runtimeStyle.color = '';
			//if (elGrid != null) elGrid.runtimeStyle.color = '';
		}
		else {
			SysSetInnerText(el, sysNoDataTerm);
			el.style.color = "red";
			//el.runtimeStyle.color = "red";
			if (el.tagName == 'A')
				el.removeAttribute('href');

			if (elGrid != null) {
				SysSetInnerText(elGrid, sysNoDataTerm);
				elGrid.style.color = "red";
				//elGrid.runtimeStyle.color = "red";
				if (elGrid.tagName == 'A') elGrid.removeAttribute('href');
			}

			if (bQuickSearch) {
				SysSetValue(ctl, '');
				SysSetValue(ctl + '_alt', '');
			}
			SysClearExtraResults(extraResults);
		}
	} // BR 32.276.947
	else {
		if (!ok) {
			if (bQuickSearch) {
				SysSetValue(ctl, '');
				SysSetValue(ctl + '_alt', '');
			}
		}
	}
}

// CT 23.889.446
function SysClearExtraResults(extraResults) {
	if (extraResults != null) {
		var er = extraResults.split(',');
		for (j = 0; j < er.length; j++) {
			c = SysGetElement(er[j]); if (c != null) { SysSet(er[j], ''); }
		}
	}
}

//function SysInputBrowse(id, refurl, bKeyInRef, where, parms, altParam, backOfficeDivisionCode)
// CMDM - Add entityEGBrowser
function SysInputBrowse(e, id, refurl, bKeyInRef, where, parms, altParam, extraResults, bEnterpriseSearch, backOfficeDivisionCode, entityEGBrowser, backOfficeSetting) {
	var c;
	if (altParam != null) {
		c = SysGetElement(id + '_alt');
		if (c != null && c.value != null) {
			var val = SysTrim(c.value);
			var i; var ok = false; var str = '0123456789 .';
			for (i = 0; i < val.length; i++) {
				if (str.indexOf(val.charAt(i)) < 0)
					ok = true;
			}
			if (ok)
				where = where + '&BRS_' + altParam + '=' + SysURLEncode(val);
		}
	}
	//window.status = where
	sysInputType = BrowseInputType.Browser;
	sysInputRefUrl = refurl;
	sysInputKeyInRef = bKeyInRef;
	sysInputExtraQuery = where;
	sysInputParm = parms;
	if (backOfficeDivisionCode != null) {
		sysInputDivisionCode = '&BRS_BackOfficeDivisionCode=' + backOfficeDivisionCode
	}

	if (entityEGBrowser != null)  // CMDM - Add entityEGBrowser
	{
		sysInputDivisionCode = sysInputDivisionCode + '&BRS_EntityEGBrowser=' + entityEGBrowser
	}

    if (backOfficeSetting != null)  // CMDM - Add entityEGBrowser
    {
        sysInputDivisionCode = sysInputDivisionCode + '&BRS_BackOfficeSetting=' + backOfficeSetting
    }	
	
	var sin = SysGetElement(id + '_alt');
	var sit;
	if (sin != null) {
		sit = sin.value;
		return SysInputSelectDo(e, sin, '', id, sit);
	}
	else {
		sin = SysGetElement(id);
		sit = sin.value;
		return SysInputSelectDo(e, sin, '', id, sit);
	}
}
function SysInputSelect(e, el, textType) {
	sysInputType = BrowseInputType.InputField;
	var sit = el.value;
	return SysInputSelectDo(e, el, textType, null, sit);
}
function SysInputSide(e, el, textType) {
	sysInputType = BrowseInputType.SearchField;
	var sit = el.value;
	return SysInputSelectDo(e, el, textType, null, sit);
}
function SysInputList(e, el, textType) {
	sysInputType = BrowseInputType.InputList;
	var sit = el.value;
	var cp = SysGetCaretPosition(el);
	var li = sit.lastIndexOf(";", cp - 1);
	if (li < 0)
		li = -1;
	var i = sit.indexOf(";", cp);
	if (i < 0)
		i = sit.length;
	sit = sit.substring(li + 1, i);
	return SysInputSelectDo(e, el, textType, null, sit);
}
//FC27.574.081 Tagging
function SysInputTag(e, el, textType) {
	sysInputType = BrowseInputType.Tag;
	var sit = el.value;
	var cp = SysGetCaretPosition(el);
	var li = sit.lastIndexOf(",", cp - 1);
	if (li < 0)
		li = -1;
	i = sit.length;
	sit = sit.substring(li + 1, i);
	return SysInputSelectDo(e, el, textType, null, sit);
}

function _DoMnuMouseOver(e) {
	var el = SysSrcElement(e);
	if (SysElement.IsNotNothing(sysInputMenu) && el.nodeName.toLowerCase() === "td") {
		SysInputSetValue(el);
	}
}

function _DoValidateMouseOut(e) {
	ValidateMouseOut(e, sysCxMenu, 0);
}

function ValidateMouseOut(e, ctlMenu, topMargin) {
	/// <summary>Determine if the mouse pointer falls outside the boundaries of a popped up menu. If so, the popup is 
	/// hidden.</summary>
	/// <param name="e" type="DOMEvent"></param>
	/// <param name="ctlMenu" type="jQuery"></param>
	/// <param name="topMargin" type="Number"></param>
	/// <returns type="undefined">undefined</returns>

	// has it really exceeded the bounds and not just a propagation effect? (assuming the hide still deletes the 
	// object).
	if (SysElement.IsNothing(ctlMenu)) {
		return;
	}

	var xScrollLeft = $(document.body).scrollLeft() + $(document.documentElement).scrollLeft();
	var yScrollTop = $(document.body).scrollTop() + $(document.documentElement).scrollTop();
	var xMouse = e.clientX + xScrollLeft;
	var yMouse = e.clientY + yScrollTop;
	var x = ctlMenu.offset().left;
	var y = ctlMenu.offset().top;
	var w = ctlMenu.width();
	var h = ctlMenu.height();

	if (xMouse <= x) SysMenuHide(e);
	if (xMouse >= (x + w)) SysMenuHide(e);

	if (yMouse <= (y - topMargin)) SysMenuHide(e);
	if (yMouse >= (y + h)) SysMenuHide(e);
}

function _CreateMenuContainer() {
	if (sysCxMenu == null) {
		var menu = document.createElement("div");
		sysCxMenu = $(menu);

		var body = $(document.body);
		var docElement = $(document.documentElement);
		var scrollLeft = body.scrollLeft() + docElement.scrollLeft();
		var scrollTop = body.scrollTop() + docElement.scrollTop();

		sysCxMenu.css({
			'position': 'absolute',
			'display': 'block',
			'padding': '0px',
			'zIndex': 100,
			'left': scrollLeft,
			'top': scrollTop
		});
		document.body.appendChild(menu);
				
		// BR 39.287.088 - Removed "&& Sys.Browser.version < 7" from the 
		// "if (Sys.Browser.agent === Sys.Browser.InternetExplorer)" statement so the selection list 
		// will be displayed correctly when using 'Follow-up via request' from SOI

		// create iframe to hide undesirable dropdowns in IE 6. The frame is a IE specific fix.
			if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {

			var frame = document.createElement("iframe");
			sysCxMenuFrame = $(frame);
			sysCxMenuFrame.css({
				'position': 'absolute',
				'opacity': 0,
				'display': 'none',
				'zIndex': 50,
				'left': scrollLeft,
				'top': scrollTop
			});
			sysCxMenuFrame.attr("src", "empty.html");
			document.body.appendChild(frame);
		}

		menu = new SysElement(menu);
		menu.AttachEvent("onkeydown", SysMenuOnKeyDown);
		menu.AttachEvent("onmouseout", _DoValidateMouseOut);
		menu.AttachEvent("onmouseover", _DoMnuMouseOver);
	}
}

function SysInputSelectDo(e, me, textType, altid, sit) {
	/// <summary>Do a selection from a browser/selection popup: if it does not exist it is created.</summary>
	/// <param name="e" type="event"></param>
	/// <param name="me" type="DOMElement">The input element for which to browse.</param>
	/// <param name="textType" type="String">Standard browser (one of 'Exact.Web.Standard.StandardBrowser').</param>
	/// <param name="altid" type="String"></param>
	/// <param name="sit" type="String">The search input text to look for.</param>
	/// <returns type="undefined|true">only returns true if we need to wait for a callback that will fill the 
	/// browser popup.</returns>

	if (SysElement.IsNothing(e)) {
		// Nothing we can do
		sysInputText = "";
		return;
	}

	var hdl = new SysHandleKey(e);
	var key = hdl.GetKey();
	if (SysInputSelectRow(e, key)) {
		SysStopPropagation(e);
		sysInputText = "";
		return;
	}

	if (key == SysHandleKey.Key.esc || key == SysHandleKey.Key.enter || key == SysHandleKey.Key.left ||
        key == SysHandleKey.Key.right || key == SysHandleKey.Key.up || key == SysHandleKey.Key.down) {
		SysCancelInputSearch();
		sysInputText = "";
		return;
	}

	if (hdl.IsCtrlKey() || me.value == null || me.value == "" || key == SysHandleKey.Key.tab) {
		sysInputText = "";
		return;
	}

	// We're also catching the controls keys themselves (no need + unwanted side effects to let them through).
	if (key === SysHandleKey.Key.ctrl || key === SysHandleKey.Key.shift || key === SysHandleKey.Key.alt) {
		return;
	}

	_CreateMenuContainer();

	if (sysInputText != sit || me.id != sysInput) {
		sysInputRow = -1;
		sysInputText = sit;
		sysInput = me.id;
		sysInputAlt = altid;
		sysInputTextType = textType;

		sysXmlHttpAborted = false;
		if (sysInputTimer != null)
			window.clearTimeout(sysInputTimer);
		sysInputTimer = window.setTimeout(SysInputTimerHandler, 300);
		return true;
	}
	else {
		SysInputHandle();
	}
	SysStopPropagation(e);
	SysPreventDefault(e);
}

function SysInputTimerHandler() {
	if (!sysXmlHttpAborted) {
		if (sysInputType == BrowseInputType.Browser) {
			SysCallback("../docs/SysInputSearch.aspx?MultiBrowser=1&InputType=B&Text=" + SysURLEncode(sysInputText) + "&" + sysInputExtraQuery + sysInputDivisionCode, "", SysInputCallback);
		}
		//FC27.574.081 Tagging
		else if (sysInputType == BrowseInputType.Tag) {
			SysCallback("DocInputSearchTag.aspx?MultiBrowser=1&TextType=" + sysInputTextType + "&InputType=" + sysInputType
				+ "&Text=" + SysURLEncode(sysInputText) + "&eq=" + sysInputExtraQuery + sysInputParm,
				"", SysInputCallback);
		}
		else {
			SysCallback("../docs/SysInputSearch.aspx?MultiBrowser=1&TextType=" + sysInputTextType + "&InputType=" + sysInputType
				+ "&Text=" + SysURLEncode(sysInputText) + "&eq=" + sysInputExtraQuery + sysInputParm,
				"", SysInputCallback);
		}
	}
}

function SysInputCallback() {
	//
	//This line of code was introduced in 793 and causes some very strange timing issues
	//So it's removed for the time being. Have to figure out what is was needed for and if
	//it has to be solved differently
	// call is being handled, reset the input search string
	//sysInputText = "";
	//

	if (!sysXmlHttpAborted && sysXmlHttp.readyState == 4) {
		var sysCmxBody = sysXmlHttp.responseText;
		sysCmxBody = sysCmxBody.replace(/\r\n/g, '');

		// Because server-side a redirect might take place, which could be an entire form we make sure
		// that a) not an entire document will be inserted and
		// b) that no script is executed (especially the re-loading/executing of MSAjax library)
		var $sysCmxBody = $(sysCmxBody);
		if ($sysCmxBody.length > 1) {
			var form = $sysCmxBody.filter("form");
			if (form.length > 0) {
				$("script", form).remove();
				sysCmxBody = form.html();
			}
		}

		if (sysCmxBody == null || sysCmxBody == "") {
//			if (InMenuLeft()) {
//				parent.prtSetFrameCols();
//			}
			sysCxMenu.hide();
			if (sysCxMenuFrame !== null) {
				sysCxMenuFrame.hide();
			}
			return;
		}
	
		if (SysElement.IsNotNothing(sysCmxBody) && sysCmxBody.length > 0) {			
			sysCxMenu.html(sysCmxBody);
			SysInputHandle();
		}
	}
}

function SysInputHandle() {
	/// <summary>Handles the 'Type Ahead' functionality for the control specified in [sysInput]</summary>

	var x = 0;
	var y = 0;
	
	var si = SysGetElement(sysInput);
	if (si != null) {
		//get position of the input control first
		x = $(si).offset().left;
		y = $(si).offset().top + $(si).height() + 5;

		//set initial size of popup (adjust to input control)
		var h = 200;
		var w;
		//BR 34.804.402 - Changed width to 500 (similar to code in SysIE.js)
		if (si.offsetWidth < 500) {
			w = 500;
		}
		else {
			w = si.offsetWidth;
		}

		//search for contents
		var d = SysGetElement('_Menu', sysCxMenu[0]);
		if (d != null)
			sysInputMenu = d;
		else {
			sysInputMenu = null;
			d = SysGetElement('_MenuError', sysCxMenu[0]);
		}
		if (d != null) {
			//resize to contents
			h = d.offsetHeight;
			if (h < 20) {
				h = 20;
			}
			if (w < d.offsetWidth) {
				w = d.offsetWidth;
			}
			//reset y if needed
			if ((y + h + si.offsetHeight) > window.screen.availHeight) {
				y = y - h - si.offsetHeight;
			}			

			$(d).css("width", "100%");
		}

		sysCxMenu.css({
			'left': x,
			'top': y,
			'width': w,
			'height': h
		});

		if (sysCxMenuFrame !== null) {
			sysCxMenuFrame.css({
				'left': x,
				'top': y,
				'width': w,
				'height': h
			});
		}

		//		if (InMenuLeft()) {
		//			parent.prtBroadenFrameCols(w);
		//		}

		sysCxMenu.show();
		if (sysCxMenuFrame !== null) {
			sysCxMenuFrame.show();
		}
	}
	return true;
}

function InMenuLeft() {
	/// <summary>Returns true if the current window frame is [MenuLeft]</summary>
	/// <returns type="Boolean"></returns>
	
	return window.frameElement && (window.frameElement.id.toUpperCase() == 'MENULEFT');
}

// ExchangeRate Field
// ------------------
function SysExchangeRate(ctlSource, ctlRate, target, ctlDate, enabled) {
	var cs = SysGetElement(ctlSource);
	var cr = SysGetElement(ctlRate);
	var cd = SysGetElement(ctlDate);
	var ip = SysGetElement(ctlRate + '_hidden');
	if (cr != null && cs != null) {
		var url = 'SysCallback.aspx?Action=1&Target=' + target + '&Source=' + cs.value;
		if (cd != null) url += '&Date=' + cd.value;
		cr.value = SysCallback(url);
		ip.value = cs.value;
		SysSetReadOnly(cr, !enabled || cs.value == target);
	}
}

// Editor
function SysEditor_InsertImage() {
	editor.document.execCommand('insertimage', '1', null);
}

// Callback values
function SysCbLoadList(url, setValues) {
	var a = SysCallback(url);
	var cx = window.createPopup();
	cx.document.write(a);
	cx.document.close();
	var t = cx.document.getElementById('callbackvalues');
	if (t == null)
		return null;
	if (setValues != null)
		SysCbSetValues(cx);
	return cx
}
function SysCbSetValues(cx) {
	var t = cx.document.getElementById('callbackvalues');
	for (var ri = 0; ri < t.rows.length; ri++) {
		var r = t.rows[ri];
		SysCbSetValueRow(r);
	}
}
function SysCbSetValue(cx, id) {
	var r = SysGetElement(id, cx);
	if (r != null)
		SysCbSetValueRow(r)
}
function SysCbSetValueRow(row) {
	var n = row.getAttribute('id');
	var ty = row.getAttribute('t');
	if (ty == null || ty == '') {
		var v = SysGetInnerText(row.cells[0]);
		SysSet(n, v);
	}
	else if (ty == 'B') {
		var iv = SysGetInnerText(row.cells[0]);
		var ic = SysGetInnerText(row.cells[1]);
		var refurl = SysGetInnerText(row.cells[2]);
		var d = SysGetInnerText(row.cells[3]);
		if (iv == null || iv == '')
			iv = ic;
		SysSetBrowser(n, iv, ic, refurl, d, null, null);
	}
}
function SysCbGetValue(cx, id) {
	var r = SysGetElement(id, cx);
	if (r != null) {
		return SysGetInnerText(r.cells[0]);
	}
}

function SysSetBrowser(id, idValue, code, refurl, description, bKeyInRef, extraResults, vData) {
	var f = 1;
	var r = '';
	if (code == null)
		code = idValue;
	var c = SysGetElement(id);
	if (c != null) {
		c.value = SysTrim(idValue);
	}
	c = SysGetElement(id + '_alt');
	if (c != null) {
		var tCode = SysTrim(code);
		if (c.value.toUpperCase() != tCode.toUpperCase())
			c.value = SysTrim(code);
	}
	c = SysGetElement(id + '_ref');
	if (c != null) {
		if (refurl.length > 0) { c.href = refurl + SysURLEncode(idValue); }
		if (extraResults != null) {
			SysSetInnerText(c, code);
			var er = extraResults.split(',');
			erc = er.length;
			var ier = vData.length - erc;

			if (er != null) {
				for (k = 0; k < er.length; k++) {
					SysSet(er[k], vData[ier + k]);
				}
			}
		}
		else if (bKeyInRef || code.length == 0)
			SysSetInnerText(c, description);
		else
			SysSetInnerText(c, code + " - " + description);
	}
}

// BR 23.558.592
function SysSetBrowserChg(id, idValue, code, refurl, description, bKeyInRef, extraResults, vData) {
	SysDialog.ctl = id;
	SysDialog.bKeyInRef = bKeyInRef;
	SysDialog.refurl = refurl;
	SysDialog.extraResults = extraResults;
	SysDialog.onchangeScript = ''	//BR 27.828.386
	SysBrowseDataHandler();
}

//Use innerHTML to load an ActiveX control
function SysCreateControl(DivID, obj) {
	var d = SysGetElement(DivID);
	d.innerHTML = obj;
}

// END: UNCONVERTED FUNCTIONS 

var sysXmlHttp;
var sysXmlHttpAborted = false;

function SysCallback(url, callbackID, callbackFunction, asText, returnBody) {
	try {		
		// url:    URL to invoke
		// params: string object to pass to the remote URL
		if (asText == null) asText = true;
		if (returnBody == null) returnBody = false;

		// Add some parameters to the query string
		if (callbackID == null) callbackID = "true";
		var pageUrl = url
		if (url.indexOf('?') < 0)
			pageUrl += '?'
		else
			pageUrl += '&';

		pageUrl += "callback=" + callbackID;
		// Initialize the XmlHttp object
		if (sysXmlHttp == null) {
			if (false) //(typeof (ActiveXObject) != "undefined")
				sysXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			else 
				sysXmlHttp = new XMLHttpRequest;
		}
		else
			sysXmlHttp.abort();

		// Prepare for a GET statement and synchronous.
		if (callbackFunction == null)
			sysXmlHttp.open("GET", pageUrl, false);
		else
			sysXmlHttp.open("GET", pageUrl, true);
		sysXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		if (callbackFunction != null)
			sysXmlHttp.onreadystatechange = callbackFunction;
		sysXmlHttp.send(null);

		if (callbackFunction != null)
			return null;
		else if (asText) {
			if (returnBody) {
				return sysXmlHttp.responseBody;
			}
			else {
				return sysXmlHttp.responseText;
			}
		}
		else {
			return sysXmlHttp.responseXML;
		}
	}
	catch (ex) {
		//alert(ex.message);
		return null;
	}
}

// browser
function SysCancelInputSearch() {
	/// <summary>Cancels a request for input search, and hides the context menu</summary>
	
	SysCallbackAbort();
	if (sysCxMenu != null)
		sysCxMenu.hide();

	if (sysCxMenuFrame !== null) 
		sysCxMenuFrame.hide();	
}

function SysCallbackAbort() {
	/// <summary>Cancels the current request made from [sysXmlHttp]</summary>

	if (sysXmlHttp != null)
		sysXmlHttp.abort();
	sysXmlHttpAborted = true;
}

// End: From SysIE.js


// JC: Obsolete functions 

//// retrieve XML data
//function SysGetXMLData(topic, key) {
//	/// <summary>obsolete</summary>

//	var url = "SysXMLData.aspx";
//	url = url + "?Topic=" + SysURLEncode(topic);
//	url = url + "&Key=" + SysURLEncode(key);

//	var xmlHttp;
//	if (window.XMLHttpRequest) {
//		xmlHttp = new XMLHttpRequest();
//	}
//	else if (window.ActiveXObject) {
//		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
//	}

//	if (xmlHttp) {
//		// retrieve XML data
//		xmlHttp.open("GET", url, false);
//		xmlHttp.setRequestHeader("Content-Type", "text/xml");
//		xmlHttp.send(null);
//		// readyState
//		//	 0 = uninitialized
//		//	 1 = loading
//		//	 2 = loaded
//		//	 3 = interactive
//		//	 4 = complete
//		// status
//		//	 200 = OK
//		if (xmlHttp.readyState == 4 && xmlHttp.Status == 200) {
//			return xmlHttp.responseXML;
//		}
//	}

//	return null;
//}

//var menuCurrent;
//var menuColor;
//var menuBackColor;
//function MnuMouseOver(e) {
//	var me = SysSrcElement(e);
//	MnuColorOff(menuCurrent)
//	menuCurrent = me;
//	MnuColorOn(me)
//}

//function MnuColorOn(me) {
//	if (me == null) return;
//	if (me.tagName == "A")
//		me = me.parentNode;
//	var a = me.firstChild;
//	if (a == null) return;
//	if (a.tagName != "A")
//		return;

//	var t = me.parentNode.parentNode.parentNode;
//	var tr = t.rows[0].cells[0];
//	if (menuColor == null) {
//		menuColor = me.currentStyle.color;
//		menuBackColor = me.currentStyle.backgroundColor;
//	}
//	me.runtimeStyle.backgroundColor = tr.currentStyle.backgroundColor;
//	me.runtimeStyle.color = tr.currentStyle.color;

//}

//function MnuColorOff(me) {
//	if (me == null) return;
//	if (me.tagName == "A")
//		me = me.parentNode;
//	var a = me.firstChild;
//	if (a == null) return;
//	if (a.tagName != "A")
//		return;
//	me.runtimeStyle.backgroundColor = menuBackColor;
//	me.runtimeStyle.color = menuColor;
//}
