function checkNormalKeyDown(oSender, oEvent)
{
	notifyEditState(oSender, oEvent);
}

function notifyEditState(oSender, oEvent)
{
	var attrColl = oSender.attributes;
	var attr = attrColl['notifyEditState'];
	
	if (attr != null)
	{
		if (attrColl["contentEditable"] == "false")
		{
			return;
		}
		
		if (attr.value == "True")
		{
			setEditState('Edit');
		}
	}

}

function notifyEditStateForced()
{
	setEditState('Edit');
}


function checkUppercaseKeyDown(oSender, oEvent)
{
	var key = oEvent.keyCode;
	if (key >= 65 && key <=90)
	{
		var chr = String.fromCharCode(key);
		var txt = oSender.value;
		// check if text in the text is selected
		// if so, delete it
		var sel = document.selection.createRange().text;
		if (sel != "")
		{
			document.selection.clear();
			txt = txt.replace(sel,chr);
		}
		else
		{
			txt = txt + chr;
		}
		oSender.value = txt.toUpperCase();
		oEvent.returnValue = false;
	}
	
	// to notify the state change
////	notifyEditState(oSender, oEvent);
}
function checkIntegerKeyDown(oSender, oEvent)
{
	var k=oEvent.keyCode;
	var txt = oSender.value;
	var pos;
	
	if (oEvent.ctrlKey == true)
	{
		return;
	}
	
	if (!isNumericChar(k))
	{
		oEvent.returnValue = false;
		return;
	}
	
	if ((k==110) ||
		(k==190) ||
		(k==188))
	{
		oEvent.returnValue = false;
		return;
	}

	oEvent.returnValue = true;
	
	// to notify the state change
////	notifyEditState(oSender, oEvent);
}

function checkDecimalKeyDown(oSender, oEvent)
{
	var k=oEvent.keyCode;
	var txt = oSender.value;
	var pos;
	
		
	if (!isNumericChar(k))
	{
		oEvent.returnValue = false;
		return;
	}
	
	if ((k==110) ||	(k==190)) //Dot and numeric Dot
	{
		if (txt.indexOf(',') != -1)
		{
			oEvent.returnValue = false;
		}
		else
		{
			// replace dot by comma
			oSender.value += ',';
			oEvent.returnValue = false;
		}	
		return;
	}

	if (k==188) //comma
	{
		if (txt.indexOf(',') != -1)
		{
			oEvent.returnValue = false;
			return;

		}
			
	}

	oEvent.returnValue = true;
	
	// to notify the state change
////	notifyEditState(oSender, oEvent);
}

function checkDateKeyDown(oSender, oEvent)
{

	var k= oEvent.keyCode;
	
	var txt = oSender.value;
	
	// if first char not is a number then exit
	if ((txt=="") && (!isNumber(k)))
	{
		oEvent.returnValue = false;
		return;
	}	
	
	// replace space and slash by '-'
	if ((k==32) || (k==191)) //space or '/'
	{
		if (countCharInString(txt,"-") < 2)
		{
			oSender.value += '-';
		}
		oEvent.returnValue = false;
		return;
	}

	if ((countCharInString(txt,'-') == 2) && (k==189))
	{
		oEvent.returnValue = false;
		return;
	}
		
	if (!isNumericChar(k))
	{
		oEvent.returnValue = false;
		return;
	}
	
	if (countCharInString(txt,'-') == 2)
	{
		if ((txt.length - txt.lastIndexOf('-')) > 4 && isNumber(k)) 
		{
			oEvent.returnValue = false;
			return;
		}	
	}
	if ((txt.length == 2) && (isNumber(k)) && (txt.indexOf('-') == -1))
	{
		oSender.value += '-';
	}
	
	oEvent.returnValue = true;
		
	// to notify the state change
	////notifyEditState(oSender, oEvent);
	

}

function checkNumericKeyDown(oSender, oEvent)
{
	//if (!isNumericChar(oEvent.keyCode))
	var key = oEvent.keyCode;
	if (key >= 65 && key <=90) // niet alphanumeriek
	{
		oEvent.returnValue = false;
		return;
	}

	oEvent.returnValue = true;
	
	// to notify the state change
	////notifyEditState(oSender, oEvent);
}

function isNumericChar(keyCode)
{
	var k = keyCode;

	if ((k >= 48 && k <= 57) ||
			(k >= 96 && k <= 110) ||
			(k == 110) ||
			(k == 188) ||
			(k == 190) ||
			(k == 189) ||//-
			(k == 8) ||//back
			(k == 9) ||//tab
			(k == 46) ||//del
			(k == 27) ||//esc
			(k == 13) ||//enter
			(k == 38) || (k == 40) ||//up//down
			(k == 37) || (k == 39))//left//right
		return true;
	else
		return false;


}

function isNumber(keyCode)
{
	
	var k = keyCode;

	if ((k >= 48 && k <= 57) ||
			(k >= 96 && k <= 110))//left//right
		return true;
	else
		return false;

}

function countCharInString(str, chr)
{
	var arr = str.split(chr);
	return arr.length - 1;
}

function setEditState(state)
{
	var frame = top.frames["LeftFrame"];
	
	if (frame == null)
	{
		frame = top.frames["frameLeft"];
	}
	
	if (frame != null)
	{
		var frm = frame.document.forms[0];
		if (frm != null)
		{
			var hiddenField = frame.document.getElementById('hiddenEditState');
			hiddenField.value = state;
		}
	}	
}



function comboOnChange(oSender, oEvent)
{
	// first notify the Edit State
	if (oEvent != null)
	{	
		notifyEditState(oSender, oEvent);
	}
	
	showConnectedControlForCombo(oSender, oEvent)
}

function showConnectedControl(oSender, oEvent)
{	
	// If Checkbox has ConnectControl, show/hide it
	var attrColl = oSender.attributes;
	var attr = attrColl['connectedControlID'];
	var attr2 = attrColl['connectedControlBehaviour'];
	var attr3 = attrColl['connectedControlOtherParent'];
	var checkedValue;
	
	if (attr != null)
	{
		var connectedCtrl;
		
		// if connectedControl is on other parent, find it
		if (attr3.value == 'True')
		{
			connectedCtrl = doFindConnectedControl(getControlShortId(attr.value));
		}
		else
		{
			connectedCtrl = document.getElementById(attr.value);
		}
		
		
		if (connectedCtrl != null)
		{
			//because oSender is a SPAN (the label of the checkbox)
			// we have to call oSender.firstChild to get reference to the checkbox
			// Also because the checked value is set after the mouseup event,
			// we use the !checked value
			
			if (oEvent!= null)
			{
				// h.neervens: 9-12-2006 because we changed from mouseup to onclick event,
				// the previous comment about the !checkedvalue is not valid anymore.
				//checkedValue = !oSender.firstChild.checked;
				checkedValue = oSender.firstChild.checked;
			}
			else
			{
				checkedValue = oSender.firstChild.checked;
			}
			
			dealWithConnectedControl(connectedCtrl, attr2.value, checkedValue);
		}
	}
}


function dealWithConnectedControl (connectedCtrl, behaviour, checkedValue)
{
	if (behaviour == 'Clear')
	{
		if (!checkedValue)
		{
			doClearConnectedControl(connectedCtrl);
		}
		doEnableConnectedControl(connectedCtrl, checkedValue);
		
		return;
	}
	
	if (behaviour == 'Hide')
	{
		setControlVisible(connectedCtrl, checkedValue);
		return;
	}
	
	if (behaviour == 'HideAndClear')
	{
		setControlVisible(connectedCtrl, checkedValue);
		
		if (!checkedValue)
		{
			doClearConnectedControl(connectedCtrl);
		}
		return;
	}
	
	if (behaviour == 'ReverseClear')
	{
		if (checkedValue)
		{
			doClearConnectedControl(connectedCtrl);
		}
		doEnableConnectedControl(connectedCtrl, !checkedValue);
		
		return;
	}
	
	
	// ReverseHideAndClear means that the connectedControl has to 
	// be hidden instead of showed when the checkbox is checked
	if (behaviour == 'ReverseHideAndClear')
	{
		setControlVisible(connectedCtrl, !checkedValue);
		
		if (checkedValue)
		{
			doClearConnectedControl(connectedCtrl);
		}
		return;
    }

    if (behaviour == 'ReverseHide') 
    {
        setControlVisible(connectedCtrl, !checkedValue);

        return;
    }
}
	
	
	
function showConnectedControlForCombo(oSender, oEvent)
{	
	// If Combobox has ConnectControl, show/hide it
	var attrColl = oSender.attributes;
	var attr = attrColl['connectedControlID'];
	var attrVal = attrColl['connectedValue'];
	var attr2 = attrColl['connectedControlBehaviour'];
	var attr3 = attrColl['connectedControlOtherParent'];
	var attrMirrored = attrColl['connectedControlMirroredID'];
	var checkedValue;
	
	if (attr != null && attr.value != "")
	{
		var ctrl;
		var ctrlMirrored;
				
		// if connectedControl is on other parent, find it
		// this means both the connectedControl and the connectedControlMirrored
		if (attr3.value == 'True')
		{
			ctrl = doFindConnectedControl(getControlShortId(attr.value));
			if (attrMirrored != null && attrMirrored.value != "")
			{
				ctrlMirrored = doFindConnectedControl(getControlShortId(attrMirrored.value)); // hoeft niet aanwezig te zijn...
			}
		}
		else
		{
			ctrl = document.getElementById(attr.value);
			if (attrMirrored != null && attrMirrored.value != "")
			{
				ctrlMirrored = document.getElementById(attrMirrored.value); // hoeft niet aanwezig te zijn...
			}
		}

		if (ctrl != null)
		{
			// If the value is connectedValue, then show the connected control
			checkedValue = (oSender.value == attrVal.value);	
						
			dealWithConnectedControl(ctrl, attr2.value, checkedValue);
		}
		
		if (ctrlMirrored != null)
		{
			// If the value is connectedValue, then show the connected control
			checkedValue = (oSender.value == attrVal.value);	
						
			dealWithConnectedControl(ctrlMirrored, attr2.value, !checkedValue);
		}
	}
}

function setControlVisible(control, show)
{
	if (show == true)
		control.style.display = '';
	else
		control.style.display = 'none';

}

function doClearConnectedControl(control)
{
	if (control.tagName == 'INPUT')
	{
	    if (control.type == "checkbox")
	    {
	        control.value = "off";
	    }
	    else
	    {
	        control.innerText = '';
	    }
		
		return;
	}
	
	if (control.tagName == 'TEXTAREA')
	{
		control.innerText = '';
		return;
	}
	
	var arrElements = control.getElementsByTagName('INPUT');
		
	//iterate over elements:
	for (var i=0; i<arrElements.length; i++)
	{
		//get pointer to current element:
		elem = arrElements[i];
		
		// if we have a TextBox, clear the contents
		if (elem.type == "text")
		{
			elem.innerText = '';
		}
		
		// if we have a CheckBox, set value to unchecked
		if (elem.type == "checkbox")
		{
			elem.checked = false;
		}
	}
	
	// Clear all the TEXTAREA controls
	arrElements = control.getElementsByTagName('TEXTAREA');
	//iterate over elements:
	for (var i=0; i<arrElements.length; i++)
	{
		//get pointer to current element:
		elem = arrElements[i];
		elem.innerText = '';
	}
		
}


function doEnableConnectedControl(control, enabled)
{
	if (control.tagName == 'INPUT')
	{
		control.contentEditable = enabled;
		return;
	}
	
	var arrElements = control.getElementsByTagName('INPUT');
		
	//iterate over elements:
	for (var i=0; i<arrElements.length; i++)
	{
		//get pointer to current element:
		elem = arrElements[i];
		elem.contentEditable = enabled;
	}
}

function doFindConnectedControl(controlID)
{
	var arrElements = document.all;//document.forms[0].elements;
	
	//iterate over elements:
	for (var i=0; i<arrElements.length; i++)
	{
		//get pointer to current element:
		elem = arrElements[i];
		
		if (elem.id.indexOf(controlID) != -1)
		{
			return elem;
		}
		//elem.contentEditable = enabled;
	}
	
	return null;
	
}

function getControlShortId(controlID)
{
	var fullCtrlName = controlID; // control.id;
	var arr = fullCtrlName.split("_");
		
	return arr[arr.length-1];
}

function formatNumberBy3(num, decpoint, sep)
	{
		// check for missing parameters and use defaults if so
		if (arguments.length == 2) {
			sep = ",";
		}
		if (arguments.length == 1) {
			sep = ",";
			decpoint = ".";
		}
		// need a string for operations
		num = num.toString();
		// separate the whole number and the fraction if possible
		a = num.split(decpoint);
		x = a[0]; // decimal
		y = a[1]; // fraction
		z = "";
		ch = "";

		if (typeof(x) != "undefined") {
			// reverse the digits. regexp works from left to right.
			for (i=x.length-1;i>=0;i--)
			{
				ch = x.charAt(i);
				if (ch != sep)
				{
					z += ch;
				}
			}
			// add seperators. but undo the trailing one, if there
			z = z.replace(/(\d{3})/g, "$1" + sep);
			if (z.slice(-sep.length) == sep)
			z = z.slice(0, -sep.length);
			x = "";
			// reverse again to get back the number
			for (i=z.length-1;i>=0;i--)
			x += z.charAt(i);
			// add the fraction back in, if it was there
			if (typeof(y) != "undefined" && y.length > 0)
			x += decpoint + y;
		}
		return x;
	}
	
	function floatToString(waarde, decpoint, sep)
	{
		if (waarde == null) return '';
		
		// check for missing parameters and use defaults if so
		if (arguments.length == 2) 
		{
			sep = ".";
		}
		if (arguments.length == 1) 
		{
			sep = ".";
			decpoint = ",";
		}
		
		var val = waarde.toString();
		
		// remove JScript thousand seperators
		var val = val.replace(',','');
		
		//replace JScript decimal separator(.) by decimal separator
		val = val.replace('.', decpoint);
		
		return formatNumberBy3(val, decpoint, sep)
	}
	
	function stringToFloat(waarde, decpoint, sep)
	{
		if (waarde == null || waarde == '') return 0;
		
		// check for missing parameters and use defaults if so
		if (arguments.length == 2) 
		{
			sep = ".";
		}
		if (arguments.length == 1) 
		{
			sep = ".";
			decpoint = ",";
		}
		
		// remove thousand seperators
		var val = waarde.replace(sep, '');
		
		//replace decimal separator by JScript decimal separator (.)
		val = val.replace(decpoint, '.');
		
		return parseFloat(val);
	}
	
	function correctNumberFormat(oSender)
	{
		var ctrl = oSender;
		
		if (oSender == null)
		{
			ctrl = event.srcElement;
		}
		
		if (ctrl != null)
		{
			var getal = formatNumberBy3(ctrl.value,",",".");
			ctrl.value = getal;
		}
	}
	
	var popupDateResult  = new Object();
		
	function showDateBtnCal(oSender)
	{
		popupDateResult.success = false;
		
		var attrColl = oSender.attributes;
		var attr = attrColl['connectedControlID'];
		var isIgEdit = false;
		if (attr != null)
		{
			var connectedCtrl = document.getElementById(attr.value);
			
			// if the connectedCtrl is hidden, it means that we deal with an Infragistics DateEdit
			if (connectedCtrl.type == "hidden")
			{
				isIgEdit = true;
				connectedCtrl = document.getElementById("igtxt" + attr.value);
			}
			
			if (connectedCtrl != null)
			{
				// determin position of dialog
				var x = 0, y = 0, elem = connectedCtrl, body = window.document.body;
				while(elem != null)
				{
					if(elem.offsetLeft != null) x += elem.offsetLeft;
					if(elem.offsetTop != null) y += elem.offsetTop;
					if(elem.nodeName == "HTML" && elem.clientHeight > body.clientHeight)
						body = elem;
					elem = elem.offsetParent;
				}
				
				var dlgheight = 285;
				var left = x + connectedCtrl.offsetWidth + window.screenLeft - 2;
				var top = y + window.screenTop - 2 - dlgheight;
				
				if (dlgheight < 0)
					dlgheight = 0;
				
				var positionStr = "dialogWidth:260px;dialogHeight:" + dlgheight + "px;dialogLeft:" + left + "px;dialogTop:" + top + "px;";
				
				
				var url = "/eff_common/Forms/DateEdit/frmDatePopup.aspx";
				
				if (connectedCtrl.value != "")
				{
					url += "?Identity=" + connectedCtrl.value;
				}
				var features =  positionStr + "status:no;center:yes;scroll:no;resizable:no;unadorned:yes";
				var lValue = window.showModalDialog(url, popupDateResult, features );
				
				if (popupDateResult.success)
				{
					if (!isIgEdit)
					{
						connectedCtrl.value = popupDateResult.datumString;
					}
					else
					{
						var e = igedit_getById(attr.value);
						if(e)
						{
							e.setValue(popupDateResult.datumString);//e.setText("");
							//e.update();
							//e.fireEvent(11,null,null);
							doChangeDateEdit(connectedCtrl,true);
						}

					}
					
					setEditState('Edit');
				}
			}
		}
	}
	
	function initEffCombo(controlID)
	{
		var ctrl = document.getElementById(controlID);
		
		if (ctrl != null)
		{
			ctrl.attachEvent("onchange", doOnComboChange);
			comboOnChange(ctrl, null);
		}
	}
	
	function doOnComboChange()
	{
		var ctrl = event.srcElement;
		
		if (ctrl != null)
		{
			comboOnChange(ctrl,event);
		}
	}
	
	function initEffChk(controlID)
	{
		var ctrl = document.getElementById(controlID);
		
		if (ctrl != null)
		{
			// attach two events to the onclick handler.
			
			// The first is to handle the connectedcontrol behaviour
			ctrl.attachEvent("onclick", doOnCheckBoxClick);
			// fire the event
			checkBoxClick(ctrl.parentElement, null);
				
			// The second one is to link the server side onchange event
			// to the client side onclick event, because the client side
			// onchange does not exist for a input of type checkbox
			ctrl.attachEvent("onclick", doOnCheckboxChange);
			
					
		}
	}
	
	function doOnCheckboxChange()
	{
		// the onchange event is attached to the label (span) of the checkbox. Not
		// to the checkbox itself. The SPAN is the ParentElement of the actual checkbox (INPUT)
		var ctrl = event.srcElement.parentElement;
		
		if (ctrl != null)
		{
			var s = ctrl.onchange;
			
			if (s != null)
			{
				eval(s);
			}
		}
	}
	
	function doOnCheckBoxClick()
	{
		// the server side  events are attached to the label (span) of the checkbox. Not
		// to the checkbox itself. The SPAN is the ParentElement of the actual checkbox (INPUT)
		var ctrl = event.srcElement.parentElement;
		
		if (ctrl != null)
		{
			checkBoxClick(ctrl,event);
		}
	}
	
	function checkBoxClick(oSender, oEvent)
	{
		// first notify the Edit State
		if (oEvent != null)
		{	
			notifyEditState(oSender, oEvent);
		}
		
		showConnectedControl(oSender, oEvent)
	}
	
	function initEffTxt(controlID)
	{
		var ctrl = document.getElementById(controlID);
		
		if (ctrl != null)
		{
			ctrl.attachEvent("onkeydown", doOnTextboxKeydown);
			ctrl.attachEvent("onchange", doOnTextboxChange);
			doOnTextboxChange(ctrl);
			
			// code for MemoTekst
			var attrColl = ctrl.attributes;
			var attr = attrColl['memoTekstID'];
			
			if (attr != null)
			{
				//ctrl.attachEvent("onmouseup", showMemoTekstPopup);
				//ctrl.attachEvent("oncontextmenu", hideContextMenu);
				ctrl.oncontextmenu = showMemoTekstPopup;
			}
		}
	}
	
	function initEffDte(controlID, eventString)
	{
		// because we cannot attach the onchange event to a Infragistics Edit Control
		// We have to do major tricks to accomplish this
		var ctrl = document.getElementById("igtxt" + controlID);
		
		if (ctrl != null)
		{
			// save the eventString into the onchange property. Because it's never used,
			// we can misuse it to link to the onBlur event
			ctrl.onchange = eventString;
			ctrl.onblur = doChangeDateEdit;
		}
	}
	
	function doChangeDateEdit(control, forced)
	{
			
		var ctrl = control;
		
		if (ctrl == null) ctrl = event.srcElement;
			
		if (ctrl != null)
		{
			// if control.elem exists, it means that control is an infragistaics DateEdit object
			var elem = ctrl.elem;
			// check if we control is the DateEdit object or if it's the INPUT control of the DateEdit
			if (ctrl.elem == null)
			{
				var fullID = ctrl.id;
				var shortID = fullID.replace('igtxt','');
				elem = igedit_getById(shortID);
			}
			else
			{
				elem = control;
			}
			
			var val = elem.instant(true);
			if(val != null && elem.old != null)
				if(val.getTime != null && val.getTime() == elem.old.getTime())
					val = elem.old;
			var oldVal = elem.old;
			
			if (val != oldVal || forced == true)
			{
				s = ctrl.onchange;
				eval(s);
				elem.old = val;
			}
		}
	}
	
	function initEffColBtn(controlID)
	{
		var ctrl = document.getElementById(controlID);
		
		if (ctrl != null)
		{
			ctrl.attachEvent("onclick", doOnCollapseButtonClick);
			collapseButtonClick(ctrl, null);
			
			// try to set the DoublClickBehaviour of Parent Element
			var attr = ctrl.attributes["enableDblClick"];
			
			if (attr != null)
			{
				var enabled = (parseInt(attr.value) == 1);	
				
				if (enabled)
				{
					var parentCtrl = ctrl.parentElement;
			
					if (parentCtrl != null && parentCtrl.tagName == "TD")
					{
						// attach event to the TR so the parent of the TD element
						parentCtrl.parentElement.attachEvent("ondblclick", doOnCollapseButtonClick);
						parentCtrl.parentElement.style.cursor = "hand";
						parentCtrl.parentElement.buttonID = ctrl.id;
					}
				}
			}
			
		}
	}
	
	function doOnCollapseButtonClick()
	{
		var ctrl = event.srcElement;
		
		if (ctrl != null)
		{
			if (ctrl.tagName == "IMG") // button itself is clicked
			{
				collapseButtonClick(ctrl,event);
			}
			else if (ctrl.tagName == "TR") // the bar is doubleclicked
			{
				var buttonCtrl = document.getElementById(ctrl.buttonID);
				collapseButtonClick(buttonCtrl,event);
			}
			else if (ctrl.tagName == "TD") // a cell inside the bar is doubleclicked
			{
				var buttonCtrl = document.getElementById(ctrl.parentElement.buttonID);
				collapseButtonClick(buttonCtrl,event);
			}
		}
	}
	
	function collapseButtonClick(oSender, oEvent)
	{
		// If button has ConnectControl, show/hide it
		var attrColl = oSender.attributes;
		var attr = attrColl['connectedControlID'];
		var attr2 = attrColl['isExpanded'];
		var attr3 = attrColl['expandedImageUrl'];
		var attr4 = attrColl['collapsedImageUrl'];
		
		var isExpanded = (parseInt(attr2.value) == 1);			
		
		if (attr != null)
		{
			var connectedCtrl = document.getElementById(attr.value);
			
			// Swap the Image and Expanded value only if the button is clicked,
			// so if the event != null
			if (oEvent != null)
			{
				if (isExpanded)
				{
					// do collapse
					attr2.value = 0;
					oSender.src = attr4.value;
				}
				else
				{
					// do expand
					attr2.value = 1;
					oSender.src = attr3.value;
				}
				
				//setControlVisible(connectedCtrl, !isExpanded);
				swapOpacity(connectedCtrl.id, 1000, !isExpanded);
				
				// Put expanded value in hiddenfield
				var hidden = document.getElementById(oSender.id + "_hidden");
				hidden.value = attr2.value;
			}
			else
			{
				// save the initialheight when control is initialized
				connectedCtrl.initialHeight = connectedCtrl.style.posHeight;//connectedCtrl.clientHeight;
				
				if (!isExpanded)
				{
					setControlVisible(connectedCtrl, isExpanded);	
					connectedCtrl.style.overflowY = "hidden";
					connectedCtrl.style.height = 0;
				}
				//swapOpacity(connectedCtrl.id, 1, isExpanded);
				//setControlVisible(connectedCtrl, true);	
				
			}
		}
	}
		
	
	function doOnTextboxKeydown()
	{
		var ctrl = event.srcElement;
		
		if (ctrl != null)
		{
			var attrColl = ctrl.attributes;
			var attr = attrColl['dataType'];
			
			if (attr != null)
			{
				if (attr.value == 'Integer')
				{
					checkIntegerKeyDown(ctrl,event);
					return;
				}
				
				if (attr.value == 'Double')
				{
					checkDecimalKeyDown(ctrl,event);
					return;
				}
				
				if (attr.value == 'Date')
				{
					checkDateKeyDown(ctrl,event);
					return;
				}
				
				if (attr.value == 'Numeric')
				{
					checkNumericKeyDown(ctrl,event);
					return;
				}
				
				if (attr.value == 'TextUppercase')
				{
					checkUppercaseKeyDown(ctrl,event);
					return;
				}
				
				checkNormalKeyDown(ctrl,event);
				return;
			}
			//comboOnChange(ctrl,event);
		}
	}
	
	function doOnTextboxChange(oSender)
	{
		var ctrl;
		
		if (event == null)
		{
			ctrl = oSender;
		}
		else
		{
			ctrl = event.srcElement
		}
		
		if (ctrl != null)
		{
			//// notifyeditstate if textbox is changed
			if (event != null && event.type == "change")
			{
				notifyEditState(ctrl, event);
			}
			
			var attrColl = ctrl.attributes;
			var attr = attrColl['correctNumberFormat'];
			
			if (attr != null)
			{
				if (attr.value == "True")
				{
					correctNumberFormat(ctrl);
				}
			}
				
		}
	}
	
	function showMemoTekstPopup()
	{
		var ctrl = event.srcElement;
		
		if (ctrl != null)
		{
			var attrColl = ctrl.attributes;
			var attr = attrColl['memoTekstID'];
			
			if (attr != null)
			{
				var attr2 = attrColl['popupMenuName'];
				
				// right click
				if (event.button == 2)
				{
					doShowMemoTekstPopup(attr.value, attr2.value);
					event.returnValue = false;
				}
				
				// contextmenu
				if (event.type == "contextmenu")
				{
					doShowMemoTekstPopup(attr.value, attr2.value);
					event.returnValue = false;
				}
			}
		}
	}
	
	function hideContextMenu()
	{
		event.returnValue = false;
		return false;
	}
	
	function findInputControlByShortID(controlID)
	{
		return findControlByShortID(controlID, 'INPUT');
	}

	function findTextAreaControlByShortID(controlID)
	{
		return findControlByShortID(controlID, 'TEXTAREA');
	}

	function findDivControlByShortID(controlID)
	{
		return findControlByShortID(controlID, 'DIV');
	}
	
	function findDateEditByShortID(controlID)
	{
		// first find the input control; don't search for hidden controls
		var ctrl = findControlByShortID(controlID, 'INPUT', 'text');
		if (ctrl != null)
		{
			var dateControlID = ctrl.id.replace("igtxt", "");
			var dateEdit = igedit_getById(dateControlID);
			return dateEdit;
		}
		
		return null;
	}
	
	function findDateEditByID(controlID)
	{
		var dateEdit = igedit_getById(controlID);
		return dateEdit;
	}
	
	function setDateEditValue(controlID, value)
	{
		var dateEdit = findDateEditByID(controlID);
		dateEdit.setValue(value);
	}
	
	function setDateEditDateValue(clientID, value)
	{
		var dateEdit = findDateEditByID(clientID);
		dateEdit.setValue(value);
	}
	
	function getDateEditValue(controlID)
	{
		var dateEdit = findDateEditByID(controlID);
		return dateEdit.getValue();
	}
	
	function setDateEditValueByShortID(controlID, value)
	{
		var dateEdit = findDateEditByShortID(controlID);
		dateEdit.setValue(value);
	}
	
	function getDateEditValueByShortID(controlID)
	{
		var dateEdit = findDateEditByShortID(controlID);
		return dateEdit.getValue();
	}

	// zoek een control buiten de huidige usercontrol
	// om de zoektijd te beperken moet het type opgegeven worden b.v. INPUT of DIV
	// om naamconficten te beperken kan de .ID ook nog uitgebreid worden naar [usercontrolnaam]_[control.id]
	function findControlByShortID(controlID, tagName, type)
	{
		var elem;
		var elemId;
		var arrElements = document.body.getElementsByTagName(tagName);
		
		//iterate over elements:
		for (var i=0; i<arrElements.length; i++)
		{
			
			//get pointer to current element:
			elem = arrElements[i];
			elemId = elem.id;
			
			if (type == null)
			{
				if (elemId.search(controlID) != -1)
				{
					return elem;
				}
			}
			else
			{
				if (elem.type == type)
					if (elemId.search(controlID) != -1)
					{
						return elem;
					}
			}
		}
		
		return null;
	}
	
	function swapOpacity(id, millisec, show)
	{
		var start;
		var end;
		
		if (show)
		{
			start = 0;
			end = 100;
		}
		else
		{
			start = 100;
			end = 0;
		}
		
		opacity(id, start, end, millisec);
	}
	
	function visibility(id, opacStart, opacEnd, millisec) 
	{ 
		//speed for each frame 
		var speed = Math.round(millisec / 100); 
		var timer = 0; 

		//determine the direction for the blending, if start and end are the same nothing happens 
		if(opacStart > opacEnd) //(collapsing)
		{ 
			for(i = opacStart; i >= opacEnd; i--) 
			{ 
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				timer++; 
			} 
		} 
		else if(opacStart < opacEnd) //(expanding)
		{ 
			for(i = opacStart; i <= opacEnd; i++) 
			{ 
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				timer++; 
			} 
		} 
	} 
	function opacity(id, opacStart, opacEnd, millisec) 
	{ 
		//speed for each frame 
		var speed = Math.round(millisec / 100); 
		var timer = 0; 
		var ctrl = document.getElementById(id);
		var style = ctrl.style;
		
		if (ctrl.initialHeight == null)
		{
			ctrl.initialHeight = ctrl.clientHeight;
		}
		var height = ctrl.initialHeight;
		
		ctrl.style.overflowY = "hidden";

		//determine the direction for the blending, if start and end are the same nothing happens 
		if(opacStart > opacEnd) { 
			for(i = opacStart; i >= opacEnd; i--) 
			{ 
				//setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				setTimeout("changeOpacAndSlide(" + i + ",'" + id + "'," + height + ")",(timer * speed)); 
				timer++; 
			} 
		} 
		else if(opacStart < opacEnd) 
		{ 
			
			for(i = opacStart; i <= opacEnd; i++) 
			{ 
				//setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				setTimeout("changeOpacAndSlide(" + i + ",'" + id + "'," + height + ")",(timer * speed)); 
				timer++; 
			} 
		} 
	} 

	//change the opacity for different browsers 
	function changeOpac(opacity, id) 
	{ 
		var object = document.getElementById(id).style; 
		//object.opacity = (opacity / 100); 
		//object.MozOpacity = (opacity / 100); 
		//object.KhtmlOpacity = (opacity / 100); 
		object.filter = "alpha(opacity=" + opacity + ")"; 
	} 
	
	function changeOpacAndSlide(opacity, id, originalHeight) 
	{ 
		var object = document.getElementById(id);
		
		// make visible
		object.style.display = '';
		
		object.style.filter = "alpha(opacity=" + opacity + ")"; 
		var percent = (opacity / 100); 
		object.style.height = percent*originalHeight; 
		
		if (percent == 0)
		{
			object.style.display = 'none';
		}
	} 

	function startOpacity(id, expanded)
	{
		var object = document.getElementById(id);
	}
	
	function finishOpacity(id, expanded)
	{
		var object = document.getElementById(id);
	}
	
	

				
