//<SCRIPT>
function Invoker(){
	this.parseReturnNode		= parseReturnNode_Invoker;	
	 
	this.errorNo				= null;
	this.errorDesc				= null;
	this.responseDOM			= null;
	this.responseNode			= null;
	this.serverTime				= -1;
	this.responseLength			= -1;
	this.getDOM					= getDOM_Invoker;
	this.addParameter			= addParameter_Invoker;
	this.addXMLServerParameters	= addXMLServerParameters_Invoker;
	this.addSearchParameters	= addSearchParameters_Invoker;
	this.addParameterNode		= addParameterNode_Invoker;
	this.addParameterNodes		= addParameterNodes_Invoker;
	this.destroy				= destroy_Invoker;
	this.setInvoke				= setInvoke_Invoker;
	this.getSelectFieldsNode	= getSelectFieldsNode_Invoker;
	this.addSelectParameters	= addSelectParameters_Invoker;
	this.getServerTime			= getServerTime_Invoker;
	this.getResponseLength		= getResponseLength_Invoker;
	
	this.onreturn				= null;
	
	this.XMLDOM					= createDOM();
	this.XMLDOM.documentElement	= this.XMLDOM.createElement('service');

	var node = this.XMLDOM.createElement('invoke');
	this.invokeNode	= this.XMLDOM.createTextNode('');
	node.appendChild(this.invokeNode);

	this.XMLDOM.documentElement.appendChild(node);
	this.parametersNode		= this.XMLDOM.createElement('parameters');
	
	this.XMLDOM.documentElement.appendChild(this.parametersNode);
	this.addParameter('uniqueClientId', app.uniqueClientId);
}

function getDOM_Invoker(){
	return this.XMLDOM;
}

function getServerTime_Invoker(){
	return this.serverTime;
}

function getResponseLength_Invoker(){
	return this.responseLength;
}

function setInvoke_Invoker(invoke){
	this.invokeNode.nodeTypedValue = invoke;	
}

function destroy_Invoker(){
	this.XMLDOM = null;
}
 
function addParameter_Invoker(name, value){
	var param = this.XMLDOM.createElement(name);
	if (value != null)
		param.appendChild(this.XMLDOM.createTextNode(value));
	
	this.parametersNode.appendChild(param);
}

function addXMLServerParameters_Invoker(xmlServer){
	this.addParameterNodes(xmlServer.getXMLNode().childNodes);
}

function addSelectParameters_Invoker(selectFields){
	this.parametersNode.appendChild(this.getSelectFieldsNode(selectFields));
}

function addParameterNodes_Invoker(nodes){
	for (var i = 0; i < nodes.length; i++)
		this.addParameterNode(nodes[i]);
}

function addParameterNode_Invoker(node, rootTagName){
	if (rootTagName){
		var rootNode = node.ownerDocument.createElement(rootTagName);
		rootNode.appendChild(node);
		node = rootNode;
	}
	this.parametersNode.appendChild(node.cloneNode(true));
}

function addSearchParameters_Invoker(search){
	this.addParameterNode(search.getXMLNode(this.XMLDOM));
}

function parseReturnNode_Invoker(xmlNode){
	this.responseDOM  = createDOM();
	this.responseDOM.documentElement = xmlNode.cloneNode(true);
	
	this.errorNo	= parseInt(xmlNode.selectSingleNode('errorNo').nodeTypedValue);
	this.errorDesc	= xmlNode.selectSingleNode('errorDesc').nodeTypedValue;
	this.invoke		= xmlNode.selectSingleNode('invoke').nodeTypedValue;
	this.responseNode	= xmlNode.selectSingleNode('response');
	this.serverTime	= xmlNode.selectSingleNode('serverTime').nodeTypedValue;
	this.responseLength	= xmlNode.selectSingleNode('responseLength').nodeTypedValue;
	
	//check for logon error
	if (this.errorNo == -10000){
//		app.showMsg(window, null, "Du er ikke længere logget på systemet. Klik 'OK' for at gå til login-siden.", 'OK', function(){
//			app.location.reload(true)
//		});
		app.checkConnection();
	}
	
	if (this.onreturn)
		this.onreturn(this);
}

function getSelectFieldsNode_Invoker(selectFields){
	var selectNode = this.XMLDOM.createElement('selectFields');
		
	for (var i = 0; i < selectFields.length; i++){
		var node = this.XMLDOM.createElement('selectField');
		selectNode.appendChild(node);
			
		for (el in selectFields[i]){
			var elNode = this.XMLDOM.createElement(el);
			elNode.appendChild(this.XMLDOM.createTextNode(selectFields[i][el]));
			node.appendChild(elNode);
		}
	}
		
	return selectNode;
}


//////////////////////////////////////////////////////////////////////
//Class InvokeManager
//////////////////////////////////////////////////////////////////////
function InvokeManager(){
	this.addInvoker = addInvoker_InvokeManager;
	this.addInvokerAlwaysLast = addInvokerAlwaysLast_InvokeManager;
	
	this.getDOM	= getDOM_InvokeManager;
	this.parseReturnDOM = parseReturnDOM_InvokeManager;
	this.invokers = new Array();
	this.invokersLast = new Array();
}

function addInvoker_InvokeManager(invoker){
	if (invoker)
		this.invokers[this.invokers.length] = invoker;
}

function addInvokerAlwaysLast_InvokeManager(invoker){
	this.invokersLast[this.invokersLast.length] = invoker;
}

function getDOM_InvokeManager(){
	var XMLDOM = createDOM();
	XMLDOM.documentElement = XMLDOM.createElement('data');
	
	for (var i = 0; i < this.invokers.length; i++)
		XMLDOM.documentElement.appendChild(this.invokers[i].getDOM().documentElement.cloneNode(true));
	
	for (var i = 0; i < this.invokersLast.length; i++)
		XMLDOM.documentElement.appendChild(this.invokersLast[i].getDOM().documentElement.cloneNode(true));

	return XMLDOM;
}

function parseReturnDOM_InvokeManager(XMLDOM){
	//find the invokers
	var invokers = XMLDOM.documentElement.selectNodes('service');
	var i = 0;
	
	for (; i < this.invokers.length; i++)
		this.invokers[i].parseReturnNode(invokers[i]);

	for (var j = 0; j < this.invokersLast.length; j++)
		this.invokersLast[j].parseReturnNode(invokers[j + i]);
}


function getNodeValue(node, defValue){
	if (node)
		return node.nodeTypedValue;
	else 
		if (defValue != undefined)
			return defValue;
		else
			return '';
}

//splits request if to big
function sendSafe(HTTPReq, XMLDOM){
	var xml = XMLDOM.xml;
	var maxLength = 30000;
	var pos = 0;
	
	if (maxLength < xml.length){
		var arr = new Array();
		
		while (pos < xml.length){
			arr[arr.length] = xml.substr(pos, maxLength);
			
			pos += maxLength;
		}
		
		for (var i = 0; i < arr.length; i++){
			var tmpHTTPReq = app.getHTTPReq(false);
			
			var invokerMan = app.createInvokeManager();
			var invoker = app.createInvoker();
			invoker.setInvoke('sendPartMessage');
			invoker.addParameter('partMessage', arr[i]);
			invokerMan.addInvoker(invoker);
			
			tmpHTTPReq.send(invokerMan.getDOM());
		}
		
		invokerMan = app.createInvokeManager();
		invoker = app.createInvoker();
		invoker.setInvoke('executeMessage');
		invokerMan.addInvoker(invoker);
		
		HTTPReq.send(invokerMan.getDOM());
	}
	else
		HTTPReq.send(XMLDOM);
}

/////////////////////////////////

function createDOM(xml){
	var XMLDOM = null;
	
	if (!app.xmlType){
/*		if (!XMLDOM){
			try{
				app.xmlType = 'MSXML2.DOMDocument.6.0';
				XMLDOM = new ActiveXObject(app.xmlType);
			}
			catch(e){}
		}*/
		if (!XMLDOM){
			try{
				app.xmlType = 'MSXML2.DOMDocument.3.0';
				XMLDOM = new ActiveXObject(app.xmlType);
			}
			catch(e){}
		}
		if (!XMLDOM){
			try{
				app.xmlType = 'Microsoft.XMLDOM';
				XMLDOM = new ActiveXObject(app.xmlType);
			}
			catch(e){}
		}
	}
	else{
		XMLDOM = new ActiveXObject(app.xmlType);
	}
	
//	XMLDOM.setProperty('SelectionLanguage', 'XPath');

	XMLDOM.async=false;
	XMLDOM.validateOnParse=true;

	if (xml){
		if (!XMLDOM.loadXML('<?xml version="1.0" encoding="iso-8859-1"?>' + xml))
			alert(XMLDOM.parseError);
		
	}
	
	return XMLDOM;
}    

function createDOMEval(xml, win){
	var XMLDOM = null;
	var eval = '';
	
	eval = 'new ActiveXObject("' + app.xmlType + '")';
	
	XMLDOM = win.eval(eval);
	
	XMLDOM.async=false;
	XMLDOM.validateOnParse=true;

	if (xml){
		if (!XMLDOM.loadXML('<?xml version="1.0" encoding="iso-8859-1"?>' + xml))
			alert(XMLDOM.parseError);
		
	}
	
	return XMLDOM;
}    

function getHTTPReq(async, disableCompression){
	var HTTPReq = null;

	if (!app.xmlHTTPType){
/*		if (!HTTPReq){
			try{
				app.xmlHTTPType = 'MSXML2.XMLHTTP.6.0';
				HTTPReq = new ActiveXObject(app.xmlHTTPType);
			}
			catch(e){}
		}*/
		if (!HTTPReq){
			try{
				app.xmlHTTPType = 'MSXML2.XMLHTTP.3.0';
				HTTPReq = new ActiveXObject(app.xmlHTTPType);
			}
			catch(e){}
		}
		if (!HTTPReq){
			try{
				app.xmlHTTPType = 'Microsoft.XMLHTTP';
				HTTPReq = new ActiveXObject(app.xmlHTTPType);
			}
			catch(e){}
		}
	}
	else{
		HTTPReq = new ActiveXObject(app.xmlHTTPType);
	}
	
	async = async || false;

	HTTPReq.open('POST', 'http:' + app.serverPath + app.XMLServerPath + (disableCompression ? (app.XMLServerPath.indexOf('?') > -1 ? '&' : '?') + 'disableCompression=true': ''), async);
//alert('http:' + app.serverPath + app.XMLServerPath);
	return HTTPReq;
}

function getPlural(count, str, post){
	if (count > 1)
		return str + post;
	else 
		return str;
}

/////////////////////
//MsgBox
////////////////////
function showMsg(window, title, text){
	var buttonCount = 0;
	
	var divMsgBox = window.document.all.divMsgBox;
	divMsgBox.style.display = '';
	divMsgBox.all.divMsgText.innerHTML = text;
	
	if (title){
		divMsgBox.all.divMsgHeader.innerText = title;
		divMsgBox.all.divMsgHeader.style.display = '';
	}
	else
		divMsgBox.all.divMsgHeader.style.display = 'none';
	
	divMsgBox.all.divMsgButtons.innerHTML = '';

	for (var i = 3; i < showMsg.arguments.length - 1; i = i + 2){
		var buttonId = 'msgBut' + i;
		
		if (showMsg.arguments[i] && showMsg.arguments[i + 1]){
			divMsgBox.all.divMsgButtons.insertAdjacentHTML('BeforeEnd', (buttonCount > 0 ? '<SPAN style="width: 10px"></SPAN>': '') + '<BUTTON class="divMsgButton" id="' + buttonId + '">' + showMsg.arguments[i] + '</BUTTON>');
		}
		
		var button = divMsgBox.all.divMsgButtons.all[buttonId];
		
		if (showMsg.arguments[i + 1] == 'close')
			button.onclick = function(){divMsgBox.style.display = 'none'}
		else if (typeof(showMsg.arguments[i + 1]) == 'string'){
			button.onclickEval = showMsg.arguments[i + 1];
			button.onclick = buttonEval;
		}
		else
			button.onclick = showMsg.arguments[i + 1];
	}
}

function buttonEval(){
	eval(this.onclickEval);
}

function hideMsg(window){
	var divMsgBox = window.document.all.divMsgBox;
	
	if (divMsgBox)
		divMsgBox.style.display = 'none';
}
//</SCRIPT>

//<SCRIPT>
//////////////////////////////
//functions
/////////////////////////////
var msPerDay = 24 * 60 * 60 * 1000;
var msPerHour = 60 * 60 * 1000;
var msPerMinute = 1000 * 60;
var msPerWeek = 24 * 60 * 60 * 1000 * 7;

var dropdownCSS = 
	'<STYLE>TABLE{font-family: Arial;font-size: 13px;color: Black;}BODY{padding: 0px;margin: 0px;}TR{width: 100%;height: 17px;}.dropdownBox{BORDER-RIGHT: dimgray 1px solid;BORDER-TOP: dimgray 1px solid;MARGIN-TOP: -1px;FONT-SIZE: 13px;BORDER-LEFT: dimgray 1px solid;BORDER-BOTTOM: dimgray 1px solid;FONT-FAMILY: Arial;BACKGROUND-COLOR: ghostwhite;CURSOR: hand;overflow: hidden;}' +
	'.dropdownItemFocus{WIDTH: 100%;COLOR: black;HEIGHT: 17px;BACKGROUND-COLOR: #FAF4C6;padding-left: 2px;}' +
	'.dropdownItemBlur{WIDTH: 100%;COLOR: black;HEIGHT: 17px;padding-left: 2px;background-color: ghostwhite;}</STYLE>';

var contextCSS = 
	'<STYLE>TABLE{font-family: Arial;font-size: 13px;color: Black;}BODY{padding: 0px;margin: 0px;}TR{width: 100%;height: 17px;}.dropdownBox{BORDER-RIGHT: dimgray 1px solid;BORDER-TOP: dimgray 1px solid;MARGIN-TOP: -1px;FONT-SIZE: 13px;BORDER-LEFT: dimgray 1px solid;BORDER-BOTTOM: dimgray 1px solid;FONT-FAMILY: Arial;BACKGROUND-COLOR: ghostwhite;CURSOR: hand;overflow: hidden;}' +
	'.contextMenuParent2{width: 1px; height: 1px; border-collapse: collapse;	border: 1px solid black; background-color: #FCFCF9;	cursor: default; z-index: 100000; }' +
	'.contextMenuParentHead2{border-collapse: collapse;	cursor: default; font-weight: 700; text-align: center;}' +
	'.contextMenuItemBlur2{height: 20px; font-family: Arial; background-color: #FCFCF9; border: 1px solid #FCFCF9;	padding: 1px;}' +
	'.contextMenuItemFocus2{height: 20px; font-family: Arial; background-color: #C1D2EE; border: 1px solid #316AC5; padding: 1px;}</STYLE>';

var arrDayNames = new Array();
arrDayNames[0] = 'Søndag';
arrDayNames[1] = 'Mandag';
arrDayNames[2] = 'Tirsdag';
arrDayNames[3] = 'Onsdag';
arrDayNames[4] = 'Torsdag';
arrDayNames[5] = 'Fredag';
arrDayNames[6] = 'Lørdag';

function getDayName(date){
	return arrDayNames[date.getDay()];
}

function cancelEvent_misc(ev){
	ev.cancelBubble = true;
	ev.keyCode = 0;
	return false;
}

function tableNoContext(table){
	table.getTableMain().attachEvent('oncontextmenu', cancelEvent_misc);
}
	
function trim(str){
	return str.replace(/[\s]+$/g,"");
}

function beginCapital(str){
	var arr = str.split(' ');
	var newStr = '';
	
	for (var i = 0; i < arr.length; i++)
		newStr += arr[i].toUpperCase().substring(0, 1) + arr[i].toLowerCase().substring(1) + ' ';
	
	for (var i = 0; i < newStr.length; i++)
		if (newStr.substr(i, 1) == '-' && (i + 1) < newStr.length)
			newStr = newStr.substr(0, i + 1) + newStr.substr(i + 1, 1).toUpperCase() + newStr.substr(i + 2);
	
	return app.trim(newStr);
}

function getBrowserVersion(){
	var navStr = window.navigator.appVersion;
	var index = navStr.lastIndexOf('MSIE');
	
	if (index > -1){
		navStr = navStr.substr(index + 4);
		index = navStr.indexOf(';');

		return parseFloat(navStr.substr(1, index));
	}
	else
		return 0;
}

//returns value of URL parameter, otherwise null
function getURLParam(paramName){
	var params = parseURLParam();
	
	if (params[paramName] != undefined)
		return params[paramName];
	else
		return null;
}

//parses the URL parameters and returns an array
function parseURLParam(){
	var newArr = new Array();
	var query = (app.location.href.indexOf('?') > -1 ? app.location.href.substr(app.location.href.indexOf('?') + 1) : '')
	
	if (query){
		var arr = query.split('&');
		
		for (var i = 0; i < arr.length; i++){
			var tmpArr = arr[i].split('=');	
			newArr[tmpArr[0]] = (tmpArr[1] ? tmpArr[1] : '');
		}
	}
	
	return newArr;
}

//Checks all fields in a given element, if they are empty and valid
function checkEmptyFields(element, msgWin, showFunc, suppressFocus, elementType){
	var found = true;
	var msgWin = msgWin || getMsgWin();
	
	var elements = null;
	
	if (elementType)
		elements = element.all.tags(elementType);
	else
		elements = element.all;
		
	for (var i = 0; i < elements.length; i++){
		var childElement = elements[i];
		
		if (childElement.value == '' && childElement.checkEmpty && childElement.noCheck!='true') {
			found = false;
			if (showFunc)
				showFunc();
			
			if (!suppressFocus){
				var callback = function(){
					try{
						elements.focus();
					}
					catch(e){}
				}
				msgWin.show('auto', 'auto', 'Udfyld felt', 'Du mangler af udfylde feltet: <br>' + elements[i].checkEmpty, true, callback);
			}
			break;
		}
		else if (childElement.checkRule && childElement.noCheck!='true'){
			var result = elements[i].checkRule();
			
			if (result != ''){
				found = false;
				if (showFunc)
					showFunc();
 
				if (!suppressFocus){
					var callback = function(){
					try{
						elements[i].focus();
					}
					catch(e){}
					}
				
					msgWin.show('auto', 'auto', 'Field validation', result, true, callback);
				}
				break;
			}
		}	
	}				
	
	return found;
}

function getDateStr(date, sep){
	if (!sep)
		sep = '-';

	if (!date)
		return date
	else
		return date.getDate() + sep + (date.getMonth() + 1) + sep + date.getFullYear();
}

function getDateStr2(date, sep){
	if (!sep)
		sep = '-';
	
	if (!date)
		return date
	else
		return insertLeadingChars(date.getMonth() + 1, 2, '0') + sep + insertLeadingChars(date.getDate(), 2, '0') + sep + date.getFullYear();
}

function getDateStr3(date, sep){
	if (sep == undefined)
		sep = '-';
	
	if (!date)
		return date
	else
		return insertLeadingChars(date.getDate(), 2, '0') + sep + insertLeadingChars(date.getMonth() + 1, 2, '0') + sep + date.getFullYear();
}

function getDateTimeStr4(date){
	dateStr = getDateTimeStr3(date);

	if (!dateStr)
		return dateStr;
	else
		return app.getDayName(date) + ' ' + dateStr;
}

function getDateTimeStr(date){
	if (!date)
		return date
	else
		return insertLeadingChars(date.getDate()) + '-' + insertLeadingChars(date.getMonth() + 1) + '-' + date.getFullYear() + ' ' + insertLeadingChars(date.getHours(), 2, '0') + ':' + insertLeadingChars(date.getMinutes(), 2, '0');
}

function getDateTimeStr2(date){
	if (!date)
		return date
	else
		return insertLeadingChars(date.getMonth() + 1) + '/' + insertLeadingChars(date.getDate()) + '/' + date.getFullYear() + ' ' + insertLeadingChars(date.getHours(), 2, '0') + ':' + insertLeadingChars(date.getMinutes(), 2, '0');
}

function getDateTimeStr3(date){
	if (!date)
		return date;
	else
		return insertLeadingChars(date.getDate()) + '-' + insertLeadingChars(date.getMonth() + 1) + '-' + date.getFullYear() + (date.getHours() > 0 || date.getMinutes() > 0 ? ' ' + insertLeadingChars(date.getHours(), 2, '0') + ':' + insertLeadingChars(date.getMinutes(), 2, '0') : '');
}

function getDateTimeStr4(date){
	dateStr = getDateTimeStr3(date);

	if (!dateStr)
		return dateStr;
	else
		return app.getDayName(date) + ' ' + dateStr;
}

function getTimeStr(date){
	if (!date)
		return '';
	else
		return app.insertLeadingChars(date.getHours(), 2, '0') + ':' + app.insertLeadingChars(date.getMinutes(), 2, '0');
}

function getTimeStr2(date){
	var strTime = getTimeStr(date);
	
	if (!date || (date.getMinutes() == 0 && date.getHours() == 0))
		return '';
	else
		return strTime;
}

function addMinutes(date, min){
	date.setMinutes(date.getMinutes() + min);
	return date;
}

function getTime(date){
	return insertLeadingChars(date.getHours(), 2, '0') + ':' + insertLeadingChars(date.getMinutes(), 2, '0');
}

function getHour(date){
	return date.getHours();
}

function getTimeStamp(){
	return (((new Date()) -1) +  '').substring(6);
}

function getFullYear(year){
	if (isNaN(year))
		return 0;
	else{
		if ((year + '').length == 4)
			return year;
		else{
			var newYear = parseInt(year, 10);
			if (newYear < 20)
				return newYear + 2000;
			else
				return newYear + 1900;
		}
	}
}

function splitDateTime(strDateTime){
	var obj = new Object();
	var index = strDateTime.indexOf(' ');
	
	if (index > 0){
		obj.date = strDateTime.substr(0, index);
		obj.time = strDateTime.substr(index + 1);
	}
	else{
		if (strDateTime.indexOf(':') > -1){
			obj.date = '';
			obj.time = strDateTime;
		}
		else{
			obj.time = '';
			obj.date = strDateTime;
		}
	}

	return obj;		
}

//parses from dd-MM-yyyy
function parseDate(strDate){
	var index = strDate.indexOf(' ');
	if (index > -1)
		strDate = strDate.substr(0, index);
		
	if (strDate){
		var lastPos = strDate.lastIndexOf('-');
		var year = -1;
		var month = -1;
		var day = -1;

		if (strDate.length == 4){
			var tmpDate = new Date();
			year = tmpDate.getFullYear();
			month = parseInt(strDate.substring(2, 4), 10);
			day = parseInt(strDate.substring(0, 2), 10);
		}
		else if (strDate.length == 6){
			year = parseInt(getFullYear(strDate.substr(4, 6)), 10);
			month = parseInt(strDate.substring(2, 4), 10);
			day = parseInt(strDate.substring(0, 2), 10);
		}
		else if (strDate.length == 8 && lastPos == -1){
			year = parseInt(getFullYear(strDate.substr(4, 8)), 10);
			month = parseInt(strDate.substring(2, 4), 10);
			day = parseInt(strDate.substring(0, 2), 10);
		}
		else{
			year = parseInt(getFullYear(strDate.substr(lastPos + 1)), 10);
			firstPos = strDate.indexOf('-');
			month = parseInt(strDate.substring(firstPos + 1, lastPos), 10);
			day = parseInt(strDate.substring(0, firstPos), 10);
		}
				
		if (month == 0 || day == 0 || (year > 99 && year < 1000))
			return null;
		
		var a = new Date(0, 0);
		a.setFullYear(year);
		a.setMonth(month - 1);
		a.setDate(day)
		a.setMinutes(0);
		a.setHours(0);
		a.setSeconds(0);
		a.setMilliseconds(0);
		
		return a;
	}
	else 
		return null;
}

//parses from MM-dd-yyyy
function parseDate2(strDate){
	var index = strDate.indexOf(' ');
	if (index > -1)
		strDate = strDate.substr(0, index);
		
	if (strDate){
		var lastPos = strDate.lastIndexOf('/');
		var year = parseInt(getFullYear(strDate.substr(lastPos + 1)));
		var firstPos = strDate.indexOf('/');
		var day = parseInt(strDate.substring(firstPos + 1, lastPos), 10);
		var month = parseInt(strDate.substring(0, firstPos), 10);
		
		var a = new Date(0, 0);
		a.setFullYear(year);
		a.setMonth(month - 1);
		a.setDate(day)
		a.setMinutes(0);
		a.setHours(0);
		a.setSeconds(0);
		a.setMilliseconds(0);
		
		return a;
	}
	else 
		return null;
}

function parseDateTime(strDate){
	var index = strDate.lastIndexOf(' ');
	var newDate = parseDate(strDate);

	if (newDate){
		if (index > -1){
			var min = parseMinutes(strDate.substr(index));
			var hour = Math.round(min / 60);
			newDate.setHours(hour);
			newDate.setMinutes(min - (hour * 60));
		}
	}

	return newDate;
}

function parseDateTime2(strDate){
	var index = strDate.lastIndexOf(' ');
	var newDate = parseDate2(strDate);

	if (newDate){
		if (index > -1){
			var min = parseMinutes(strDate.substr(index));
			var hour = Math.round(min / 60);
			newDate.setHours(hour);
			newDate.setMinutes(min - (hour * 60));
		}
	}

	return newDate;
}

function getDateDiffDays(dateFrom, dateTo){
	var offset = 0;
	
	if (!dateTo || !dateFrom)
	    return 0; 
	
	//check for forskelle i tidszoner
	if (dateTo.getTimezoneOffset() != dateFrom.getTimezoneOffset())
		offset = (dateFrom.getTimezoneOffset() - dateTo.getTimezoneOffset()) * 60 * 1000;
		
	return ((dateTo.valueOf() - dateFrom.valueOf()) + offset) / msPerDay;
}

function getDateDiffMinutes(dateFrom, dateTo){
	var offset = 0;
	
	if (!dateTo || !dateFrom)
	    return 0; 

	//check for forskelle i tidszoner
	if (dateTo.getTimezoneOffset() != dateFrom.getTimezoneOffset())
		offset = (dateFrom.getTimezoneOffset() - dateTo.getTimezoneOffset()) * 60 * 1000;
		
	return ((dateTo.valueOf() - dateFrom.valueOf()) + offset) / msPerMinute;
}

function addDays(date, days){
	if (isNaN(days))
		return date;
		
	var day = date.getDate();
	
	date.setDate(day + parseInt(days));
	
	return date;
}

function addMonth(date, months){
	var month = date.getMonth();
	
	date.setMonth(month + parseInt(months))
	
	return date;
}

function addMinutes(date, minutes){
	date.setMilliseconds(msPerMinute * minutes);
	
	return date;
}

function copyDate(date){
	var newDate = new Date(date.valueOf());
	
	return newDate;
}

function getDay(date){
	return parseInt(date / msPerDay);
}

function getWeek(date){
	var startDate = new Date(0, 0);

	startDate.setFullYear(date.getFullYear());
	
	var dayCount = 0;
	var diff = 0;
	var week = 1;	

	//find monday
	while (startDate.getDay() != 1){
		dayCount++;
		startDate = addDays(startDate, 1);
	}
	
	//if 4 or more days, monday was one week earlier
	if (dayCount >= 4)
		startDate = addDays(startDate, -7);
	
	diff = getDateDiffDays(startDate, date);
	if (diff < 0){
		addDays(startDate, -7);
		return getWeek(startDate);
	}
	
	week += parseInt(diff / 7);
	
	return week;
}

function getWeekDay(date){
	var x = new Array("Søndag", "Mandag", "Tirsdag", "Onsdag","Torsdag", "Fredag", "Lørdag");
	
	return x[date.getDay()];
}

function formatDate(strDateIn){
	var strDate = strDateIn;
	var index = strDate.indexOf(' ');
	
	if (index > -1)
		strDate = strDate.substr(0, index);

	if (strDate){
		var lastPos = strDate.lastIndexOf('/');
		var year = parseInt(getFullYear(strDate.substr(lastPos + 1)));
		var firstPos = strDate.indexOf('/');
		var day = parseFloat(strDate.substring(firstPos + 1, lastPos));
		var month = parseFloat(strDate.substring(0, firstPos));
		
		return day + '-' + month + '-' + year + ' ' + (index > -1 ? strDate.substr(index + 1) : '');
	}
	else 
		return '';
}

function formatDateTime(strDateIn){
	var strDate = strDateIn;
	var index = strDate.indexOf(' ');
	
	if (strDate){
		strDate = formatDate(strDate) + strDate.substring(index);
		
		return strDate;
	}
	else 
		return '';
}

function parseMinutes(strMin){
	if (strMin){
		var firstPos = strMin.indexOf(':');
		var hour = parseInt(strMin.substr(0, firstPos), 10);
		var minute = parseInt(strMin.substring(firstPos + 1), 10);
				
		return (parseInt(hour) * 60) + parseInt(minute);
	}
	else
		return 0;
}

function getMSTimeZoneDiff(dateFrom, dateTo){
	return (dateFrom.getTimezoneOffset() - dateTo.getTimezoneOffset()) * msPerMinute;
}

function formatPrice(price){
	return formatNumber(price, 2);
}

function formatNumber(number, decimals){
	var newNumber = number;
	newNumber = newNumber + '';
	newNumber.replace(/[,]/g, '.');
	
	if (!isNaN(newNumber)){
		newNumber = newNumber.replace(/[.]/g, ',');
		var index = newNumber.indexOf(',');

		if (index > -1){
			var str = newNumber.substr(index + 1);

			if (str.length < decimals)
				return newNumber.substr(0, index + 1) + insertTrailingChars(str, decimals, '0');
			else
				return newNumber;
		}
		else if (isNaN(decimals) || decimals > 0)
			return newNumber + ',' + insertTrailingChars('0', decimals, '0');
	}

	return number;
}

function formatCurrency(num) {
	if (num == null || num == undefined)	
		return '';
	
	num = num.toString().replace(/[,]/g,'');

	if(isNaN(num))
		num = "0";
		
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();

	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+'.' + num.substring(num.length-(4*i+3));
		
	return (((sign)?'':'-') + num + ',' + cents);
}

function insertLeadingChars(str, length, ch){
	str += '';
	var zeroesToInsert = length - str.length;
	
	for (var i = 0; i < zeroesToInsert; i++)
		str = ch + str;
		
	return str;
}

function insertTrailingChars(str, length, ch){
	str += '';
	var charsToInsert = length - str.length;
	
	for (var i = 0; i < charsToInsert; i++)
		str = str + ch;
		
	return str;
}

function insertBRTag(HTML){
	return HTML.replace(/[\n]/g, '<BR/>');
}

function insertEllipsisTag(HTML){
	return '<SPAN style="width: 100%; overflow: hidden; text-overflow: ellipsis"><NOBR>' + HTML + '</NOBR></SPAN>';
}

//adds two floating-point values without bug
function addValues(val1, val2, decimals){
	var decimals = decimals || 2;
	
	return getFloatValue(parseFloat(val1) + parseFloat(val2), decimals);
}

//subtracts two floating-point values without bug
function subValues(val1, val2, decimals){
	var decimals = decimals || 2;

	return getFloatValue(parseFloat(val1) - parseFloat(val2), decimals);
}

//sumarizes a number of nodes as int types
function sumIntNodes(nodes){
	var total = 0;
	
	if (nodes)
		for (var i = 0; i < nodes.length; i++)
			total += parseInt(nodes[i].nodeTypedValue);
			
	return total;
}

//sumarizes a number of nodes as float types
function sumFloatNodes(nodes, convert){
	var sum = 0;
	var value = 0;	
		
	if (nodes)
		for (var i = 0; i < nodes.length; i++){
			value = nodes[i].nodeTypedValue;
			
			if (convert)
				value = getFloatValue(value);
				
			if (nodes[i] && !isNaN(value))
				sum = addValues(sum, value);
		}

	return sum;
}

function getFloatValue(value, radix){
	value = value + '';
	
	var index = value.lastIndexOf(',');
	
	if (index > -1){
		//hvis sidste er et komma, så fjern alle punktum
		value = value.replace(/[.]/g, '');
		//sæt komma til punktum
		value = value.replace(/[,]/g, '.');
	}
	else{
		var index = value.lastIndexOf('.');
		
		if (index > -1){
			//hvis sidste er et ., så fjern alle ,
			value = value.replace(/[,]/g, '');
		}
	}
	
	value = (Math.round(parseFloat(value) * 1000) / 1000);
	
	if (radix == 2 || !radix)
		value = (Math.round(parseFloat(value) * 100) / 100);

	return value;
} 

function appendNodes(node, nodes){
	if (node && nodes && nodes.length > 0)
		for (var i = 0; i < nodes.length; i++)	
			node.appendChild(nodes[i].cloneNode(true));
}

//replace all nodes from newnodes occurring in oldnodes, otherwise, append
function replaceNodes(oldNodes, newNodes){
	var nodesToAppend = new Array();
	
	for (var i = 0; i < newNodes.length; i++){
		var newNode = newNodes[i];
		var node = oldNodes.selectSingleNode(newNode.nodeName);
		
		if (node)
			node.replaceChild((newNode.firstChild ? newNode.firstChild.cloneNode(true) : null), node.firstChild);
		else
			nodesToAppend[nodesToAppend.length] = newNode.cloneNode(true);
	}
	
	if (nodesToAppend.length > 0)
		for (var i = 0; i < nodesToAppend.length; i++)
			oldNodes.appendChild(nodesToAppend[i]);
		
	return oldNodes;
}

function disableFields(doc){
	for (var i = 0; i < doc.all.length; i++){
		var element = doc.all[i];

		if (!element.neverDisable){
			if (element.setDisable)
				element.setDisable(true);
				if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA'){
					if (element.type == 'checkbox' || element.type == 'radio')
						element.disabled = true;
					else if (element.type == 'radio'){
						element.className = 'appRadioDisabled';
						element.disabled = true;
					}
					else{
						element.className = 'appTextboxDisabled';
						element.readOnly = true;
					}
				}
				else if (element.tagName == 'BUTTON'){
					if (element.filters[0])
						element.filters[0].enabled=true;
					element.disabled = true;
				}
			}
	}
}

function disableField(element){
	if (!element.neverDisable){
		if (element.setDisable)
			element.setDisable(true);
		
		if (element.tagName == 'BUTTON'){
			if (element.filters[0])
				element.filters[0].enabled=true;
			element.disabled = true;
		}
		else{		
			if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA'){
				if (element.type == 'checkbox' || element.type == 'radio')
					element.disabled = true;
				else if (element.type == 'radio'){
					element.className = 'appRadioDisabled';
					element.disabled = true;
				}
				else{
					element.className = 'appTextboxDisabled';
					element.readOnly = true;
				}
			}
		}
	}
}

function enableFields(doc){
	for (var i = 0; i < doc.all.length; i++){
		var element = doc.all[i];
		
		if (!element.neverDisable){
			if (element.setDisable)
				element.setDisable(false);

			if (element.tagName == 'BUTTON'){
				element.disabled = false;
				if (element.filters[0])
					element.filters[0].enabled=false;
			}
			else{		
				if ((element.tagName == 'INPUT' && element.className != 'appLabel') || element.tagName == 'TEXTAREA'){
					if (element.type == 'checkbox')
						element.disabled = false;
					else if (element.type == 'radio'){
						element.className = 'appRadio';
						element.disabled = false;
					}
					else{
						element.className = 'appTextbox';
						element.readOnly = false;
					}
				}
			}
		}
	}
}

function enableField(element){
	if (!element.neverDisable){
		if (element.setDisable)
			element.setDisable(false);
			
		if ((element.tagName == 'INPUT' && element.className != 'appLabel') || element.tagName == 'TEXTAREA'){
			if (element.type == 'checkbox')
				element.disabled = false;
			else if (element.type == 'radio'){
				element.className = 'appRadio';
				element.disabled = false;
			}
			else{
				element.className = 'appTextbox';
				element.readOnly = false;
			}
		}
		else if (element.tagName == 'BUTTON'){
			if (element.filters[0])
				element.filters[0].enabled=false;
				
			element.disabled = false;
		}
	}
}

function saveFieldsValue(parentElement){
	for (var i = 0; i < parentElement.all.length; i++){
		var element = parentElement.all[i];
		if (element.tagName == 'INPUT'){
			if (element.type == 'text')
				element.saveValue = element.value;
			else if (element.type == 'checkbox' || element.type == 'radio')
				element.saveValue = element.checked;
		}
	}
}

function loadFieldsValue(parentElement){
	for (var i = 0; i < parentElement.all.length; i++){
		var element = parentElement.all[i];
		if (element.tagName == 'INPUT'){
			if (element.type == 'text')
				element.value = element.saveValue;
			else if (element.type == 'checkbox' || element.type == 'radio')
				element.checked = element.saveValue;
		}
	}
}

function removeRootXML(xml){
	var pos1 = xml.indexOf('>');
	var pos2 = xml.lastIndexOf('<');
			
	return xml.substring(pos1 + 1, pos2);
}

function filterUniqeNodeValues(nodes){
	var tmpArr = new Array();
	var newArr = new Array();
	
	for (var i = 0; i < nodes.length; i++)
		tmpArr[app.getNodeValue(nodes[i])] = true;
	
	for (a in tmpArr)
		newArr[newArr.length] = a;
	
	return newArr;
}

function scaleElement(element, maxWidth, maxHeight, orgHeight, orgWidth){
	if (maxWidth || maxHeight && (element.offsetWidth > 0 && element.offsetHeight > 0)){
		var scale = 1;
		var newHeight = 0;
		var newWidth = 0;
		
		newHeight = element.offsetHeight;
		newWidth = element.offsetWidth;
		
		if (element.offsetWidth > maxWidth)
			scale = maxWidth / element.offsetWidth;
			
		//get new height
		newHeight = element.offsetHeight * scale;

		//is the height allright?
		if (newHeight <= maxHeight)
			newWidth = element.offsetWidth * scale;
		else{
			scale = maxHeight / element.offsetHeight;
			
			newHeight = element.offsetHeight * scale;
			newWidth = element.offsetWidth * scale;
		}
		
		element.style.width = newWidth;
		element.style.height = newHeight;
	}
}

function SortInfo(XPath, XPathCol, parseAsType, desc){
	this.XPath = XPath;
	this.XPathCol = XPathCol; 
	this.parseAsType = parseAsType;
	this.desc = desc;
	
	this.subSort = null;
}

function sortDOM(rootNode, sortInfo){
	var sortArray = new Array();
	
	var rowNodes = (sortInfo.XPath ? rootNode.selectNodes(sortInfo.XPath) : rootNode);
	
	for (var i = 0; i < rowNodes.length; i++)
		sortArray[sortArray.length] = rowNodes[i];
	
	sortArray.sort(function(el1, el2){
		var curSortInfo = sortInfo;
			
		while (curSortInfo){
			if (curSortInfo.parseAsType == 'number'){
				var val1 = parseFloat((el1.selectSingleNode(curSortInfo.XPathCol)) ? el1.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue : -1);
				var val2 = parseFloat((el2.selectSingleNode(curSortInfo.XPathCol)) ? el2.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue : -1);
			}
			else if (curSortInfo.parseAsType == 'string'){
				var val1 = (el1.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue).toUpperCase();
				var val2 = (el2.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue).toUpperCase();
			}
			else if (curSortInfo.parseAsType == 'date'){
				var val1 = parseDateTime2(el1.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue);
				var val2 = parseDateTime2(el2.selectSingleNode(curSortInfo.XPathCol).nodeTypedValue);
			}
			if (curSortInfo.desc){
				if (val1 < val2)
					return 1;
				else if (val1 > val2)
					return -1;
				else 
					return 0;
			}
			else{
				if (val1 > val2)
					return 1;
				else if (val1 < val2)
					return -1;
				else
					return 0;
			}
		}
			
		return 0;
	});
	
	if (rowNodes.length > 0)
		for (var i = 0; i < sortArray.length; i++){
			//get parentNode
			var parentNode = sortArray[i].parentNode;
			
			//remove nodes from parent
			var tmp = parentNode.removeChild(sortArray[i]);
			
			//check if node should be sorted internally
			if (sortInfo.subSort)
				sortDOM(tmp, sortInfo.subSort);
			
			//and append the same node, to apply the correct order 
			parentNode.appendChild(sortArray[i]);
		}
}

function sortTable(rows, colNo, type, desc, sortFunction){
	var sortArray = new Array();
	
	for (var i = 0; i < rows.length; i++)
		sortArray[sortArray.length] = rows[i];
	
	sortArray.sort(function(el1, el2){
		var el1Value = (sortFunction ? sortFunction(colNo, el1) : el1.children[colNo].innerText);
		var el2Value = (sortFunction ? sortFunction(colNo, el2) : el2.children[colNo].innerText);
		
		if (type == 'number'){
			el1Value = returnFloat(el1Value);

			if (isNaN(el1Value)) {
				if (isNaN(el1Value))
					el1Value = -1
			}
				
				
			el2Value = returnFloat(el2Value);
			if (isNaN(el2Value)) {
				if (isNaN(el2Value))
					el2Value = -1
			}
		}
		else if (type == 'string'){
			el1Value = (el1Value).toUpperCase();
			el2Value = (el2Value).toUpperCase();
		}
		else if (type == 'date'){
			el1Value = parseDate(el1Value);
			el2Value = parseDate(el2Value);
		}
		else if (type == 'dateTime'){
			el1Value = parseDateTime(el1Value);
			el2Value = parseDateTime(el2Value);
		}
		if (desc){
			if (el1Value < el2Value)
				return 1;
			else if (el1Value > el2Value)
				return -1;
		}
		else{
			if (el1Value > el2Value)
				return 1;
			else if (el1Value < el2Value)
				return -1;
		}
			
		return 0;
	});
	
	if (rows.length > 0)
		for (var i = 0; i < sortArray.length; i++){
			//get parentNode
			var parentNode = sortArray[i].parentNode;
			//remove nodes from parent
			parentNode.removeChild(sortArray[i]);
			//and append the same node, to apply the correct order 
			parentNode.appendChild(sortArray[i]);
		}
}

function returnFloat(number){
	if (!isNaN(number))
		return parseFloat(number);
	else
		return parseFloat(((number + '').replace(/\./g, '')).replace(/\,/g, '.'));
}

function returnInteger(number){
	return (number + '').replace(/\./g, '');
}

function sortSpannedTable(arrTBodies, colNo, type, desc, sortFunction){
	var sortArray = new Array();
	var tableLength = new Array();
	
	for (var j = 0; j < arrTBodies.length; j++){
		var rows = arrTBodies[j].rows;
		tableLength[j] = rows.length;
	
		for (var i = 0; i < rows.length; i++)
			sortArray[sortArray.length] = rows[i];
	}
	
	sortArray.sort(function(el1, el2){
		var el1Value = (sortFunction ? sortFunction(colNo, el1) : el1.children[colNo].innerText);
		var el2Value = (sortFunction ? sortFunction(colNo, el2) : el2.children[colNo].innerText);
		
		if (type == 'number'){
			var val1 = (!isNaN(el1Value) ? parseFloat(el1Value) : -1);
			var val2 = (!isNaN(el2Value) ? parseFloat(el2Value) : -1);
		}
		else if (type == 'string'){
			var val1 = (el1Value).toUpperCase();
			var val2 = (el2Value).toUpperCase();
		}
		else if (type == 'date'){
			var val1 = parseDateTime(el1Value);
			var val2 = parseDateTime(el2Value);
		}
		if (desc){
			if (val1 < val2)
				return 1;
			else if (val1 > val2)
				return -1;
		}
		else{
			if (val1 > val2)
				return 1;
			else if (val1 < val2)
				return -1;
		}
			
		return 0;
	});
	
	if (rows.length > 0){
		for (var i = 0; i < sortArray.length; i++){
			//get parentNode
			var parentNode = sortArray[i].parentNode;
			//remove nodes from parent
			parentNode.removeChild(sortArray[i]);
		}
		
		var i = 0;
		
		for (var j = 0; j < tableLength.length; j++){
			for (var k = 0; k < tableLength[j]; k++){
				//and append same nodes to one tables, to apply the correct order 
				arrTBodies[j].appendChild(sortArray[i++]);
			}
		}
	}
}

function isValidEmail(email, required) {
    if (required==undefined) {   // if not specified, assume it's required
        required=true;
    }
    if (email==null) {
        if (required) {
            return false;
        }
        return true;
    }
    if (email.length==0) {  
        if (required) {
            return false;
        }
        return true;
    }
    if (! allValidChars(email)) {  // check to make sure all characters are valid
        return false;
    }
    if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
        return false;
    } else if (email.lastIndexOf(".") <= email.indexOf("@")) {  // last dot must be after the @
        return false;
    } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
        return false;
    } else if (email.indexOf("..") >=0) { // two periods in a row is not valid
	return false;
    } else if (email.indexOf(".") == email.length) {  // . must not be the last character
	return false;
    }
    return true;
}

function allValidChars(email) {
  var parsed = true;
  var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
  for (var i=0; i < email.length; i++) {
    var letter = email.charAt(i).toLowerCase();
    if (validchars.indexOf(letter) != -1)
      continue;
    parsed = false;
    break;
  }
  return parsed;
}

//////////////////////////////
//functions
/////////////////////////////
//////////////////////////////////////
//Class WrapManager
/////////////////////////////////////	
function WrapManager(){
	this.wrap				= wrap_WrapManager;
	this.destroy			= destroy_WrapManager;
	this.addWrappedElement	= addWrappedElement_WrapManager;
	this.wrappedElements	= new Array();
}

function wrap_WrapManager(element, suppressChildWrap, tagType){
	var children = null;
	var startIndex = this.wrappedElements.length;
	
	if (suppressChildWrap)
		children = new Array(element);
	else{
		if (!tagType)
			children = element.all;
		else
			children = element.all.tags(tagType);
	}

	for (var i = 0; i < children.length; i++){
		if (children[i].wrappers){
			this.wrappedElements[this.wrappedElements.length] = children[i];
		}
	}
	
//	var start = new Date();	
	for (var i = startIndex; i < this.wrappedElements.length; i++){
		var wrapElement = this.wrappedElements[i];
		var wrapper = this.wrappedElements[i].document.parentWindow.eval('app.eval("new app.' + wrapElement.wrappers + '()")');
		wrapper.wrap(wrapElement);
		if (wrapper.wrapInit)
			wrapper.wrapInit(wrapElement);
	}
//	alert(new Date() - start);
}

function addWrappedElement_WrapManager(element){
	this.wrappedElements[this.wrappedElements.length] = element;
}

function destroy_WrapManager(){
	for (var i = this.wrappedElements.length -1; i >= 0; i--){
		this.wrappedElements[i].unWrap();
		this.wrappedElements[i] = null;
	}
	
	for (it in this)
		this[it] = null;
}
//////////////////////////////////////
//Class WrapManager
/////////////////////////////////////		


////////////////////////////////////////////
//Class SettingsXML
////////////////////////////////////////////
//Class used for saving / loading user settings
function SettingsXML(XMLDOM){
	//public
	this.getSetting		= getSetting_SettingsXML;
	this.setSetting		= setSetting_SettingsXML;
	this.autoSet		= autoSet_SettingsXML;
	this.autoGet		= autoGet_SettingsXML;
	this.setSettingNode	= setSettingNode_SettingsXML;
	this.getSettingNode	= getSettingNode_SettingsXML;
	this.getXMLDOM		= getXMLDOM_SettingsXML;
		
	//private
	this.getNode		= getNode_SettingsXML;
	this.XMLDOM			= XMLDOM;
	this.nodeSettings	= XMLDOM.documentElement;
	this.onNodeChange	= null;
}

function getXMLDOM_SettingsXML(){	
	return this.XMLDOM;
}

function getSetting_SettingsXML(setting, defValue){
	var node = this.nodeSettings.selectSingleNode(setting);
	if (defValue == undefined)
		defValue = '';
			
	if (node == null)
		return defValue;
	else
		return node.nodeTypedValue;
}


function setSetting_SettingsXML(setting, value, root){
	var node = this.getNode(setting);
		
	if (node.firstChild == null){
		node.appendChild(this.XMLDOM.createTextNode(value));
	}
	else
		node.text = value;
}

function getSettingNode_SettingsXML(setting){
	return node = this.nodeSettings.selectSingleNode(setting);
}


function setSettingNode_SettingsXML(nodeName){	
	var node = this.getNode(nodeName);
	
	//clear node
	for (var i = node.childNodes.length - 1; i >= 0 ; i--)
		node.removeChild(node.childNodes[i]);
		
	return node;
}


function autoSet_SettingsXML(HTMLElement){
	for (var i = 0; i < HTMLElement.all.length; i++){
		var element = HTMLElement.all[i];
		if (element.setting)
			this.setSetting(element.setting, element.value);
	}
}


function autoGet_SettingsXML(HTMLElement){
	for (var i = 0; i < HTMLElement.all.length; i++){
		var element = HTMLElement.all[i];
		if (element.setting){
			value = this.getSetting(element.setting);
			if (value == null) value = '';
			element.value = value;
		}
	}
}


function getNode_SettingsXML(setting){
	//get node, create one if it does not already exist

	var node = this.nodeSettings;
	var nodeArr = setting.split('/');
	var i = 0;
	var curNodeName = nodeArr[i++];
	
	while (curNodeName){
		//create  / find node(s)
		
		var newNode = node.selectSingleNode(curNodeName);
		if (!newNode){
			if (curNodeName.indexOf('[') > -1)
				newNode = this.XMLDOM.createElement(curNodeName.substr(0, curNodeName.indexOf('[')));
			else
				newNode = this.XMLDOM.createElement(curNodeName);
			node.appendChild(newNode);
		}
		
		curNodeName = nodeArr[i++];	
		node = newNode;
	}
	return node;
}

function getNumNodeValue(node){
	if (node && parseInt(node.nodeTypedValue) > -1)
		return node.nodeTypedValue;
	else
		return '';
}

function destroyObject(obj){
	for (it in obj)
		delete(obj[it]);
}

function prepareDirty(doc){
	var elements = doc.all;
	
	for (var i = 0; i < elements.length; i++){
		if (elements[i].prepareDirty)
			elements[i].prepareDirty();
	}
}

function prepareDirty(doc, onlyXMLTags){
	var value = null;
	
	for (var i = 0; i < doc.all.length; i++){
		var element = doc.all[i];

		if (!element.neverDirty && (!onlyXMLTags || element.XMLTag)){
			if (element.XMLRuleOut)
				value = element.XMLRuleOut();
			else{
				if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA'){
					value = element.value;
				}
			}
			element.dirtyValue = value;
		}
	}
}

function getDirtyField(doc){
	var value = null;
	var found = null;
	
	for (var i = 0; i < doc.all.length; i++){
		var element = doc.all[i];

		if (element.dirtyValue != undefined){
			if (element.XMLRuleOut)
				value = element.XMLRuleOut();
			else{
				if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA'){
					value = element.value;
				}
			}
			if (element.dirtyValue != value){
				found = element;
				break;
			}
		}
	}
	
	return found;
}

////////////////////////////////////////////
//Class Usersettings
////////////////////////////////////////////
//Class used for saving / loading user settings
function Usersettings(XMLDOM){
	//public
	this.getSetting		= getSetting_Usersettings;
	this.setSetting		= setSetting_Usersettings;
	this.autoSet		= autoSet_Usersettings;
	this.autoGet		= autoGet_Usersettings;
	this.setSettingNode	= setSettingNode_Usersettings;
	this.getSettingNode	= getSettingNode_Usersettings;
	this.getXMLDOM		= getXMLDOM_Usersettings;
		
	//private
	this.getNode		= getNode_Usersettings;
	this.XMLDOM			= XMLDOM;
	this.nodeSettings	= XMLDOM.documentElement;
	this.onNodeChange	= null;
}

function getXMLDOM_Usersettings(){	
	return this.XMLDOM;
}

function getSetting_Usersettings(setting, defValue){
	var node = this.nodeSettings.selectSingleNode(setting);
	if (defValue == undefined)
		defValue = '';
			
	if (node == null)
		return defValue;
	else
		return node.nodeTypedValue;
}


function setSetting_Usersettings(setting, value, root){
	var node = this.getNode(setting);
		
	if (node.firstChild == null){
		node.appendChild(this.XMLDOM.createTextNode(value));
	}
	else
		node.text = value;
}

function getSettingNode_Usersettings(setting){
	return node = this.nodeSettings.selectSingleNode(setting);
}


function setSettingNode_Usersettings(nodeName){	
	var node = this.getNode(nodeName);
	
	//clear node
	for (var i = node.childNodes.length - 1; i >= 0 ; i--)
		node.removeChild(node.childNodes[i]);
		
	return node;
}


function autoSet_Usersettings(HTMLElement){
	for (var i = 0; i < HTMLElement.all.length; i++){
		var element = HTMLElement.all[i];
		if (element.setting)
			this.setSetting(element.setting, element.value);
	}
}


function autoGet_Usersettings(HTMLElement){
	for (var i = 0; i < HTMLElement.all.length; i++){
		var element = HTMLElement.all[i];
		if (element.setting){
			value = this.getSetting(element.setting);
			if (value == null) value = '';
			element.value = value;
		}
	}
}


function getNode_Usersettings(setting){
	//get node, create one if it does not already exist

	var node = this.nodeSettings;
	var nodeArr = setting.split('/');
	var i = 0;
	var curNodeName = nodeArr[i++];
	
	while (curNodeName){
		//create  / find node(s)
		
		var newNode = node.selectSingleNode(curNodeName);
		if (!newNode){
			newNode = this.XMLDOM.createElement(curNodeName);
			node.appendChild(newNode);
		}
		
		curNodeName = nodeArr[i++];	
		node = newNode;
	}
	return node;
}

function renameNode(node, name){
	var XMLDOM = node.ownerDocument;
	var newNode = XMLDOM.createElement(name).cloneNode(true);
	
	for (var i = 0; i < node.childNodes.length; i++)
		newNode.appendChild(node.childNodes[i].cloneNode(true));
		
	return newNode;
}

function renameNodes(nodes, name){
	var arr = new Array();
	
	for (var i = 0; i < nodes.length; i++)
		arr[arr.length] = renameNode(nodes[i], name);
		
	return arr;
}

function createPopUpWin(win){
	var popUp = (win ? win.createPopup() : window.createPopup());

	popUp.document.open();
	popUp.document.write('<HTML><HEAD>' + dropdownCSS + '</LINK></HEAD><BODY onunload="try{document.body.dropdownElement.collapse(true)}catch(e){}" class="dropdownBox" noFocus="true"></BODY></HTML>');
	popUp.document.close();
	
	return popUp;
}



function createPopUpContext(win){
	var popUp = (win ? win.createPopup() : window.createPopup());

    popUp.document.open();
	popUp.document.write('<HTML><HEAD>' + contextCSS + '<META HTTP-EQUIV="MSThemeCompatible" CONTENT="Yes"></HEAD><BODY oncontextmenu="return false" scroll="no" style="border: 0px solid black" rightMargin=0 leftMargin=0 topMargin=0 bottomMargin=0 class="contextMenuParent2"></BODY></HTML>');
	popUp.document.close();
	
	return popUp;
}

function createPopUpCalendar(win){
	var popUp = (win ? win.createPopup() : window.createPopup());

	popUp.document.open();
	popUp.document.write('<HTML><HEAD><LINK rel="stylesheet" type="text/css" href="../general/calendar.css"></LINK><META HTTP-EQUIV="MSThemeCompatible" CONTENT="Yes"><SCRIPT language="javascript" src="../library/components/calendar/simplecalendar.js">var g_Calendar = null</SCRIPT><SCRIPT language="javascript"></SCRIPT></HEAD><BODY oncontextmenu="return false" scroll="no" style="border: 0px solid black" rightMargin=0 leftMargin=0 topMargin=0 bottomMargin=0 onload="window_onload(\'' + app.language + '\')"></BODY></HTML>');
	popUp.document.close();
	
	return popUp;
}

function createTooltip(win){
	var popUp = (win ? win.createPopup() : window.createPopup());

	popUp.document.open();
	popUp.document.write('<HTML><HEAD><META HTTP-EQUIV="MSThemeCompatible" CONTENT="Yes"><STYLE>BODY{cursor: default; background-color: #FFFFE1; font-size: 12px; font-family: arial;} .tooltip{border: 1px solid black; padding: 2px} .head{text-align: center; font-weight: 700}</STYLE><SCRIPT language="javascript">function setTooltip(HTML){ divTooltip.innerHTML = HTML; } </SCRIPT></HEAD><BODY scroll="no" style="border: 0px solid black; height: 500px" rightMargin=0 leftMargin=0 topMargin=0 bottomMargin=0"><DIV class="tooltip" id="divTooltip"></DIV></BODY></HTML>');
	popUp.document.close();
	
	return popUp;
}

////////////////////////////////////////////
//Class Usersettings
////////////////////////////////////////////

//-Class context menu
function ContextMenu(win, offsetElement){
	this.popUp = win.createPopup();
	this.body = this.popUp.document.body;
	this.body.contextMenu = this;
	this.win = win;
	
	this.show = show_ContextMenu;
	this.showPopUp = showPopUp_ContextMenu;	
	this.items = new Array();
	this.body.innerHTML = '<DIV id="divPopUp" class="popUp"></DIV>';
	this.body.attachEvent('onmouseup', onmouseup_ContextMenu);
	this.divPopUp = this.body.all.divPopUp;
	this.addItem = addItem_ContextMenu;
	this.popUp.document.createStyleSheet('../general/application.css');
	this.setHTML = setHTML_ContextMenu;
	this.offsetElement = offsetElement || this.win.document.body;
	this.lastHeight = 0;
	
	this.items = new Array();
	this.noItems = true;
}

function onmouseup_ContextMenu(ev){
	ev.srcElement.document.body.contextMenu.popUp.hide();
}

function showPopUp_ContextMenu(x, y, width){
	this.popUp.show(x, y, width, this.lastHeight, this.offsetElement);
	if (this.divPopUp.offsetHeight != this.lastHeight){
		this.popUp.show(x, y, width, this.divPopUp.offsetHeight, this.offsetElement);
		this.lastHeight = this.divPopUp.offsetHeight;
	}
}

function show_ContextMenu(x, y, width){
	this.showPopUp(x, y, width);
}

function addItem_ContextMenu(id, HTML, func){
	if (!this.noItems){
		div = this.popUp.document.createElement('DIV');
		div.className = 'popUpItemSep';
		this.divPopUp.appendChild(div);
	}

	this.noItems = false;
	var div = this.popUp.document.createElement('DIV');
	this.divPopUp.appendChild(div);
	div.className = 'popUpItemBlur';
	
	if (func){
		div.onmousedown = func;
		div.onmouseleave = contextItemBlur;
		div.onmouseenter = contextItemFocus;
		div.style.cursor = 'hand';
	}
	else
		div.style.cursor = 'default';
	
	this.items[id] = div;
}

function setHTML_ContextMenu(id, HTML){
	this.items[id].innerHTML = HTML;
}

function contextItemBlur(){
	this.className = 'popUpItemBlur';
}

function contextItemFocus(){
	this.className = 'popUpItemFocus';
}

//Context
function Context(){
	
}

function getDate(value){
	var year = '';
	var month = '';
	var day = '';

	if (value){
		//is value divided by '-'
		if (value.indexOf('-') > -1){
			var lastPos = value.lastIndexOf('-');
			year = parseInt(value.substr(lastPos + 1), 10);
			var firstPos = value.indexOf('-');
			month = parseInt(value.substring(firstPos + 1, lastPos), 10);
			day = parseInt(value.substring(0, firstPos), 10);
		}
		//is format ddmmyy
		else if (value.length == 6){
			day = parseInt(value.substring(0, 2), 10);
			month = parseInt(value.substring(2, 4), 10);
			year = parseInt(value.substring(4, 6), 10);
		}
		//is format ddmmyyyy
		else if (value.length == 8){
			day = parseInt(value.substring(0, 2), 10);
			month = parseInt(value.substring(2, 4), 10);
			year = parseInt(value.substring(4, 8), 10);
		}
		
		month = month + '';
		day = day + '';
		
		if (month.length < 2)
			month = '0' + month;
		
		if (day.length < 2)
			day = '0' + day;

		if (year < 1900)
			year += 2000;

		return month + '/' + day + '/' + year;
	}
	return '';
};

function getAbsoluteWebPath(page){
	var index = page.lastIndexOf('../');

	return app.rootWebPath + '/' + (index > -1 ? page.substr(3) : page);
}

function getAbsoluteRootPath(){
	var path = location.href;

	index = path.indexOf('?');
	path = (index > -1 ? path.substr(0, index) : path);

	index = path.lastIndexOf('/');
	path = (index > -1 ? path.substr(0, index) : path);
	
	index = path.lastIndexOf('/');
	path = (index > -1 ? path.substr(0, index) : path);

	return path;
}

function getFileName(path){
	var startIndex = path.lastIndexOf('/');
	if (startIndex == -1)
		startIndex = 0;
	
	return (path.substr(startIndex + 1));
}

////////////////////////////////////////////////////////////////////
//Class ParamManager
////////////////////////////////////////////////////////////////////
function ParamManager(destFrame){
	this.destFrame = destFrame;
	
	this.setFunction = setFunction_ParamManager;
	this.attach = attach_ParamManager;
	this.setOnLoad	= setOnLoad_ParamManager;

	this.parameters = new Array();
	this.func = null;
	this.onLoadFunc = null;
	this.callback = null;
}

function setOnLoad_ParamManager(func){
	this.onLoadFunc = func;
}

function setFunction_ParamManager(func){
	this.func = func;
	
	for (var i = 1; i < setFunction_ParamManager.arguments.length; i++)
		this.parameters[i - 1] = setFunction_ParamManager.arguments[i];
}

function attach_ParamManager(){
	var parameters = this.parameters;
	this.destFrame.parameters = parameters;
	var destFrame = this.destFrame;
	
	var evalStr = '';
	if (this.onLoadFunc){
		destFrame.onLoadFunc = this.onLoadFunc;
		evalStr += 'this.onLoadFunc();this.onLoadFunc=null;';
	}
		
	evalStr += 'this.' + this.func + '(';
	
	for (var i = 0; i < this.parameters.length; i++){
		if (i > 0)
			evalStr += ', ';
		evalStr += 'this.parameters[' + i + ']';
	}
	
	evalStr += ');this.run=null;this.parameters=null;';

	destFrame.run = function(){
		eval(evalStr);
	}
	
	if (app.document.all[this.destFrame.name])
		if (app.parent.document.all[this.destFrame.name].readyState == 'complete')
			destFrame.run();
		else
			app.parent.document.all[this.destFrame.name].onreadystatechange = function(){
				if (app.document.all[destFrame.name].readyState == 'complete') {
					app.document.all[destFrame.name].onreadystatechange = null;
					destFrame.setTimeout(
						function() {
							destFrame.parameters = parameters;
							if (!destFrame.isWindowLoaded){
								if (destFrame.window_onload){
									destFrame.isWindowLoaded = true;
									if (ParamManager.onBeforeWindowLoaded)
										ParamManager.onBeforeWindowLoaded(destFrame);

									destFrame.window_onload();
								
									if (ParamManager.onWindowLoaded)
										ParamManager.onWindowLoaded(destFrame);

									destFrame.eval(evalStr)
									app.document.all[destFrame.name].style.visibility = '';
								}
								else{
									//error from server, probable too many users are connected
									alert('server error');
								}
							}
						}, 500);
				}
			}
	
}

var contextZIndex = 1;

//////////////////////////////////
//ContextMenu2
//////////////////////////////////
function ContextMenuItem2(){
	this.draw = draw_ContextMenuItem2;
	this.setHTML = setHTML_ContextMenuItem2;
	this.getElement = getElement_ContextMenuItem2;
	this.setBlur = setBlur_ContextMenuItem2;
	this.setFocus = setFocus_ContextMenuItem2;
	this.destroy = destroy_ContextMenuItem2;
	this.hide = hide_ContextMenuItem2;
	this.show = show_ContextMenuItem2;
	this.getX = getX_ContextMenuItem2;
	this.getY = getY_ContextMenuItem2;
	this.getWidth = getWidth_ContextMenuItem2;
	this.setSubItem = setSubItem_ContextMenuItem2;
	this.showSubItem	 = showSubItem_ContextMenuItem2;
	this.hideSubItem = hideSubItem_ContextMenuItem2;
	this.hideRoot = hideRoot_ContextMenuItem2;
	this.enable = enable_ContextMenuItem2;
	this.disable = disable_ContextMenuItem2;
	this.skipFocus = false;
	
	this.onclick = null;
	this.element = null;
	this.parent = null;
	this.HTML = '&nbsp;';
	this.subItem = null;
}

function setSubItem_ContextMenuItem2(item){
	this.subItem = item;
}

function hideRoot_ContextMenuItem2(){
	if (this.parent)
		this.parent.hideRoot();
	else
		this.hide();
}

function getX_ContextMenuItem2(){
	return this.parent.element.offsetLeft;		
}

function getY_ContextMenuItem2(){
	element = this.element;
	
	while (element.tagName != 'TD')
		element = element.parentElement;
	
	return this.parent.element.offsetTop + element.offsetTop;
}

function getWidth_ContextMenuItem2(){
	return this.element.offsetWidth;
}

function showSubItem_ContextMenuItem2(x, y){
	if (this.subItem)
		this.subItem.show(x, y);
}

function hideSubItem_ContextMenuItem2(x, y){
	if (this.subItem)
		this.subItem.hide();
}

function setHTML_ContextMenuItem2(HTML){
	this.HTML = HTML;
}

function getElement_ContextMenuItem2(HTML){
	this.HTML = HTML;
}

function setBlur_ContextMenuItem2(){
	this.element.className = 'contextMenuItemBlur2';
}

function setFocus_ContextMenuItem2(){
	if (!this.skipFocus)
		this.element.className = 'contextMenuItemFocus2';
}

function draw_ContextMenuItem2(parentDiv){
	this.parentDiv = parentDiv;
	this.element = parentDiv.document.createElement('DIV');
	this.element.innerHTML = this.HTML;
	this.parentDiv.appendChild(this.element);
	this.element.owner = this;
	this.element.menuItem = true;
	this.setBlur();
	
	this.element.attachEvent('onmousedown', onMenuItemClicked);
//	this.element.attachEvent('onmousedown', function(){alert();});
//	this.element.attachEvent('onclick', function(){alert();});
}

function onMenuItemClicked(ev){
	var element = ev.srcElement;
	
	while (!element.menuItem && element.parentElement)
		element = element.parentElement;
	
	if (!ev.srcElement.skipEvent && element.owner.onclick)
		element.owner.onclick(element.owner, ev.srcElement.id);
	
	if (!ev.srcElement.skipClose && element.owner && element.owner.hideRoot)
		element.owner.hideRoot();
	
	ev.cancelBubble = true;
}

function enable_ContextMenuItem2(){
	this.element.disabled = false;
}

function disable_ContextMenuItem2(){
	this.element.disabled = true;
}

function destroy_ContextMenuItem2(){	
	if (this.subItem)
		this.subItem.destroy();

	this.element.removeNode(true).outerHTML = '';
	
	for (a in this)
		this[a] = null;		
}

function hide_ContextMenuItem2(){	
	this.element.style.visibility = 'hidden';
	this.setBlur();
}

function show_ContextMenuItem2(){	
	this.element.style.visibility = '';
}

function ContextMenuItem2Sep(){
	this.parent = ContextMenuItem2;
	this.parent();
	
	this.enable = function() {};
	this.disable = function() {};
	this.setBlur = function() {};
	this.setFocus = function() {};
	
	this.draw = draw_ContextMenuItem2Sep;
}

function draw_ContextMenuItem2Sep(parentDiv){
	this.parentDiv = parentDiv;
	this.element = parentDiv.document.createElement('DIV');
	this.element.style.height = '1px';
	this.element.style.fontSize = '1px';
	this.element.style.textAlign = 'center';
	this.element.innerHTML = '<SPAN style="border-bottom: 1px solid darkgray; margin-bottom: 1px; width: 80%">&nbsp;</SPAN>';
	this.parentDiv.appendChild(this.element);
	this.element.owner = null;
	this.element.menuItem = false;
}

ContextMenuItem2Sep.prototype = ContextMenuItem2;


function ContextMenuParent2(parentDiv, width, usePopUp){
	this.parent = ContextMenuItem2;
	this.parent();
	
	this.parentDiv = parentDiv;
	this.draw = draw_ContextMenuParent2;
	this.show = show_ContextMenuParent2;
	this.addMenuItem = addMenuItem_ContextMenuParent2;
	this.destroy = destroy_ContextMenuParent2;
	this.hide = hide_ContextMenuParent2;
	this.setHTML = setHTML_ContextMenuParent2;
	this.enable = enable_ContextMenuParent2;
	this.disable = disable_ContextMenuParent2;

	this.HTML = '';
	this.usePopUp = usePopUp || false;
	this.width = width || '150px';
	this.neverDestroy = false;
	this.locLength = 0;
	this.menuItems = new Array();
	this.element = null;
	this.activeElement = null;
	this.isInitialized = false;
	this.head = null;
	this.onmouseover = null;
}

ContextMenuParent2.prototype = ContextMenuItem2;

function setHTML_ContextMenuParent2(HTML){
	this.HTML = HTML;
	
	if (this.isInitialized){
		this.head.innerHTML = HTML;
		this.head.style.display = '';
	}
}

function addMenuItem_ContextMenuParent2(item){
	this.menuItems[this.menuItems.length] = item;
	item.parent = this;
}

function enable_ContextMenuParent2(text){
	for (var i = 0; i < this.menuItems.length; i++)
		if (this.menuItems[i].element.innerText == text){
			this.menuItems[i].enable();
			break;
		}
}

function disable_ContextMenuParent2(text){
	for (var i = 0; i < this.menuItems.length; i++)
		if (this.menuItems[i].element.innerText == text){
			this.menuItems[i].disable();
			break;
		}
}

function destroy_ContextMenuParent2(){	
    if (!this.isInitialized)
        return; 
	if (this.neverDestroy){
		this.hide();
	}
	else{
		for (var i = 0; i < this.menuItems.length; i++)
			this.menuItems[i].destroy();

		this.element.removeNode(true).outerHTML = '';
		
		//IE BUG
		//for (a in this){
		    //this[a] = null;	
        
        //IE BUG Workaround
        this.parent = null;
        this.parentDiv = null;
        this.draw = null;
        this.show = null;
        this.addMenuItem = null;
        this.destroy = null;
        this.hide = null;
        this.setHTML = null;
        this.enable = null;
        this.disable = null;
	}
}

function hide_ContextMenuParent2(){	
	for (var i = 0; i < this.menuItems.length; i++)
		this.menuItems[i].hide();
	
	this.element.style.display = 'none';
	
	if (this.popUp)
		this.popUp.hide();
}
 
function show_ContextMenuParent2(x, y, offsetX, offsetY, offsetElement){
	this.element.style.display = '';

	for (var i = 0; i < this.menuItems.length; i++)
		this.menuItems[i].show();

	if (this.popUp){
		this.popUp.show(x, y, this.element.offsetWidth, this.element.offsetHeight, (offsetElement ? offsetElement : this.parentDiv));
		this.popUp.show(x, y, this.element.offsetWidth, this.element.offsetHeight, (offsetElement ? offsetElement : this.parentDiv));
	}
	else{
		this.element.style.left = (x || 0);
		this.element.style.top = (y || 0);

		this.element.style.zIndex = contextZIndex++;
		this.activeElement = null;
	}		
}

function draw_ContextMenuParent2(){
	if (!this.isInitialized){
		var doc = null;
		
		if (this.usePopUp){
			this.popUp = createPopUpContext(this.parentDiv.document.parentWindow)
			doc = this.popUp.document;
		}
		else
			doc = this.parentDiv.document;

		this.element = doc.createElement('TABLE');
		this.element.style.position = 'absolute';
		this.element.cellspacing = 0;
		this.element.cellpadding = 0;
		this.element.className = 'contextMenuParent2';
		this.element.style.display = 'none';
		this.element.appendChild(doc.createElement('TBODY'));
		this.element.owner = this;
		this.element.style.width = this.width || '';
		
		var tr = doc.createElement('TR');
		var td = doc.createElement('TD');
		tr.appendChild(td);
		td.innerHTML = this.HTML;
		td.className = 'contextMenuParentHead2';
		this.element.tBodies[0].appendChild(tr);

		if (!this.HTML)
			td.style.display = 'none';
		
		this.head = td;
		
		for (var i = 0; i < this.menuItems.length; i++)	{
			var tr = doc.createElement('TR');
			var td = doc.createElement('TD');
			tr.appendChild(td);
			this.menuItems[i].draw(td);
			this.element.tBodies[0].appendChild(tr);
		}
		
		if (this.usePopUp)
			doc.body.appendChild(this.element);
		else
			this.parentDiv.appendChild(this.element);
		
		this.element.tBodies[0].attachEvent('onmouseover', setBlurFocus);
		
		this.isInitialized = true;
	}
}

function setBlurFocus(ev){
	var element = ev.srcElement;
	
	while (!element.menuItem && element.parentElement)
		element = element.parentElement;
		
	if (element.menuItem){
		if (element.owner.parent.activeElement){
			element.owner.parent.activeElement.setBlur();
			element.owner.parent.activeElement.hideSubItem();
		}
		
		if (element.owner.parent.onmouseover)
			element.owner.parent.onmouseover(element.owner);
		
		element.owner.parent.activeElement = element.owner;
		element.owner.setFocus();
		element.owner.showSubItem(element.owner.getX() + element.owner.getWidth(), element.owner.getY());
	}
}

function createXSLElement(doc, nodeName){
	return doc.createNode(1, nodeName, 'http://www.w3.org/1999/XSL/Transform');
}

/////////////////////
//Calendar
////////////////////
function Calendar(win, element, width, offsetX, offsetY){
	this.win = win || window;
	this.element = element;
	this.offsetX = offsetX || 0;
	this.offsetY = offsetY || 0;
	this.width = width || 200;
	this.show = show_Calendar;

	this.winCalendar = app.createPopUpCalendar(this.win);
}

function show_Calendar(target, defaultDate, dateFormat, dateFrom, dateTo, callback, element, width, offsetX, offsetY){
	this.winCalendar.show(offsetX || this.offsetX, offsetY || this.offsetY, 250, 210, element || this.element);
	
	if (this.winCalendar.document.Script.window.g_Calendar)
		this.winCalendar.document.Script.window.g_Calendar.show(target, defaultDate, dateFormat, dateFrom, dateTo, callback);
	else
		this.winCalendar.document.Script.window.lateShow = function() {
			this.g_Calendar.show(target, defaultDate, dateFormat, dateFrom, dateTo, callback);
		};
		
	this.winCalendar.document.Script.window.hide = this.winCalendar.hide;
}

/////////////////////
//TableInput
////////////////////
function TableInput(win, element, width, offsetX, offsetY){
	this.win = win || window;
	this.element = element;
	this.offsetX = offsetX || 0;
	this.offsetY = offsetY || 0;
	this.width = width || 200;
	this.show = show_TableInput;

	this.winCalendar = app.createPopUpTableInput(this.win);
}

function show_TableInput(element, width, offsetX, offsetY, callback){
	this.winCalendar.show(offsetX || this.offsetX, offsetY || this.offsetY, width || this.width, 135, element || this.element);
/*	
	if (this.winCalendar.document.Script.window.g_Calendar)
		this.winCalendar.document.Script.window.g_Calendar.show(target, bHasDropDown, dateFormat, dateFrom, dateTo, callback);
	else
		this.winCalendar.document.Script.window.lateShow = function() {
			this.g_Calendar.show(target, bHasDropDown, dateFormat, dateFrom, dateTo, callback);
		};
		
	this.winCalendar.document.Script.window.hide = this.winCalendar.hide;*/
}

/////////////////////
//Tooltip
////////////////////
function Tooltip(win, element){
	this.win = win || window;
	this.element = element;
	this.show = show_Tooltip;
	this.hide = hide_Tooltip;

	this.winTooltip = app.createTooltip(this.win);
}

function show_Tooltip(HTML, offsetX, offsetY, width, height, element, resize){
	if (this.winTooltip.document.Script.window.setTooltip){
		this.winTooltip.document.Script.window.setTooltip(HTML);
	}
	
	this.winTooltip.show(offsetX || 0, offsetY || 0, width || 200, height || this.winTooltip.document.all.divTooltip.offsetHeight, element || null);
}

function hide_Tooltip(HTML, offsetX, offsetY, width, height, element){
	this.winTooltip.hide();
}
//</SCRIPT>

function Timer(window, millisec, disable){
	this.timers = new Array();
	this.millisec = millisec || 60000;
	this.ticks = 0;
	this.enabled = !disable;
	this.win = window;
	this.timerId = null;
	
	this.addTimer = addTimer_Timer;
	this.removeTimer = removeTimer_Timer;
	this.enable = enable_Timer;
	this.disable = disable_Timer;
	
	app.timer = this;
	
	if (this.enabled){
		this.enable();
		timerEvent();
	}
}

function disable_Timer(){
	this.enabled = false;
	this.win.clearInterval(this.timerId);
}

function enable_Timer(){
	this.enabled = true;
	this.timerId = this.win.setInterval(timerEvent, this.millisec);
}

function timerEvent(){
	app.timer.ticks++;
	var timers = app.timer.timers;
	
	for (t in timers)
		if ((app.timer.ticks % timers[t].interval) == 0){
			timers[t].func();
			if (timers[t].repeatOnce)
				delete(timers[t]);
		}
}

function addTimer_Timer(id, interval, func, repeatOnce){
	var timer = new Object();
	timer['id'] = id;
	timer['interval'] = interval;
	timer['func'] = func;
	timer['repeatOnce'] = repeatOnce || false;
	
	this.timers[id] = timer;
}

function removeTimer_Timer(id){
	delete(this.timers[id]);
}

function calcFraction(value, fraction){
	try{
		if (fraction.indexOf('/') > -1){
			var arr = fraction.split('/');
			
			return (value / arr[1]) * arr[0];
		}
		else if (fraction.indexOf('%') > -1){
			fraction = fraction.substring(0, fraction.length - 1);
			
			return (value / 100) * parseFloat(fraction);
		}
		else
			return null;
	}
	catch(e){
		return null;
	}
}


/////////////////////
//WindowPool
////////////////////
function WindowPool(poolsize, funcCreateWin, title){
	this.title = title  || '';

	this.poolsize = poolsize;
	this.funcCreateWin = funcCreateWin;

	this.getWindow = getWindow_WindowPool;
	this.returnWindow = returnWindow_WindowPool;
	
	this.pool = new Array();
}

function getWindow_WindowPool(title){
	var win = null;

	for (var i = 0; i < this.pool.length; i++){
		if (!this.pool[i].inUse){
			win = this.pool[i];
			
			try{
				win.win.resetWindow();
				break;
			}
			catch(e){
				this.pool = app.removeFromArray(this.pool, i);
				
				try{
					win.win.close();
				}
				catch(e){alert(e)}
				win = null;
			}
		}
	}
	
	if (!win){
		if (app.htmlApp){
			win = this.funcCreateWin(this.title);
			
			if ((this.pool.length) < this.poolsize){
				this.pool[this.pool.length] = win;
				win.appWindow = true;
			}
		}
		else{
			win = this.funcCreateWin(title);
		}
	}
		
	return win;
}

function returnWindow_WindowPool(win){
	for (var i = 0; i < pool.length; i++){
		if (pool[i] == win){
			win.inUse = false;
			this.pool = app.removeFromArray(this.pool, i);
		}
	}
}


//////////////////////////////////////
//
/////////////////////////////////////
function createTextIFrame(div, onframeopen, onframeclose){
	div.innerHTML = '<DIV style="background-color: white; border: 1px solid black" onclick="window.event.cancelBubble=true; return false;" ondblclick="window.event.cancelBubble=true; return false;" onmouseup="window.event.cancelBubble=true; return false"><IFRAME name="textFrame" id="textFrame" scrolling="no" frameborder="0" marginheight="0" marginwidth="0" border="0" src="../library/textIFrame.htm" style="width: 100%; height: 100%; border: 0px solid black;"></IFRAME></DIV>';
	div.firstChild.firstChild.contentWindow.onframeopen = onframeopen;
	div.firstChild.firstChild.contentWindow.onframeclose = onframeclose;
	div.firstChild.firstChild.contentWindow.owner = div;
	
	return div.firstChild.firstChild.contentWindow;
}

function replaceTagName(node, newTagName){
	var newNode = node.ownerDocument.createElement(newTagName);
	
	for (var i = 0; i < node.childNodes.length; i++)	
		newNode.appendChild(node.childNodes[i].cloneNode(true));
		
	//node.parentNode.replaceChild(newNode, node);
	
	return newNode;
}

function getTimeStrFromMinutes(minutes){
	if (minutes == -1 || minutes == '-1')
		return '--:--';
	else
		return app.insertLeadingChars(parseInt(parseInt(minutes) / 60), 2, '0') + ':' + app.insertLeadingChars(parseInt(minutes) % 60, 2, '0');
}//<SCRIPT language="javascript">
var filter = null;

function Filter(element){
	this.wrap			= wrap_Filter;
	
	if (element)
		this.wrap(element);
}
		 

Filter.WrapFilterPattern = new Object();
Filter.WrapFilterPattern.phone		= /[\d\+()-]/;
Filter.WrapFilterPattern.numericext	= /[\d\,.]/; 
Filter.WrapFilterPattern.currency	= /[\-\d\,.]/; 
Filter.WrapFilterPattern.currencycalc	= /[\+\-\d\\/\%,.]/;
Filter.WrapFilterPattern.numericextneg	= /[\+\-\d\,.]/;
Filter.WrapFilterPattern.numeric	= /[\d]/;
Filter.WrapFilterPattern.numericneg	= /[\+\-\d]/;
Filter.WrapFilterPattern.alfa		= /[a-z\sæøå]/i;
Filter.WrapFilterPattern.alfanum	= /[a-z\d\sæøå]/i;
Filter.WrapFilterPattern.oerer		= /[\d]/;
Filter.WrapFilterPattern.year		= /[\d]/;
Filter.WrapFilterPattern.date		= /[\+\-\d\.,/]/;
Filter.WrapFilterPattern.dateExt	= /[\+\-\d\.,/udm]/;
Filter.WrapFilterPattern.dateTime	= /[\+\-\d\.,:/]/;
Filter.WrapFilterPattern.time		= /[\+\-\d\:]/;
Filter.WrapFilterPattern.okcode		= /[jn]/i;
Filter.WrapFilterPattern.daysInMonth= new Array( 
	/* Jan */ 31,     /* Feb */ 29, /* Mar */ 31,     /* Apr */ 30, 
	/* May */ 31,     /* Jun */ 30, /* Jul */ 31,     /* Aug */ 31, 
	/* Sep */ 30,     /* Oct */ 31, /* Nov */ 30,     /* Dec */ 31 );

Filter.XMLRulesOut = new Object();

Filter.XMLRulesOut.numericext = function(value){
	var retVal = null;
	
	if (value != undefined)
		retVal = value + '';
	else 
		retVal = this.value + '';
	
	if (retVal == '')
		if (this.returnZeroOnEpmty == "true")
			return '0';
		else
			return '-1';
	else
		return app.returnFloat(retVal) + '';
};

Filter.XMLRulesOut.currency = function(value){
	var retVal = null;
	
	if (value != undefined)
		retVal = value + '';
	else 
		retVal = this.value + '';
	
	if (retVal == '')
		if (this.returnZeroOnEpmty == "true")
			return '0';
		else
			return '-1';
	else
		return app.getFloatValue(retVal) + '';
};

Filter.XMLRulesOut.numeric = function(value){
	var retVal = null;
	
	if (value != undefined)
		retVal = value
	else 
		retVal = this.value;
	
	if (retVal == '')
		if (this.returnZeroOnEpmty == "true")
			return '0';
		else
			return '-1';
	else
		return app.returnInteger(retVal) + '';
};

Filter.XMLRulesOut.radio = function(){
	var all = this.document.all[this.id];
				
	for (var i = 0; i < all.length; i++){
		if (all[i].checked)
			return all[i].value;
	}
};

Filter.XMLRulesOut.checkbox = function(){
	var all = this.document.all[this.id];
				
	if (this.checked)
		return 'true';
	else
		return 'false';

};

Filter.XMLRulesOut.checkbox3state = function(){
	return this.value;
};

Filter.XMLRulesOut.date = function(value){
	if (value == undefined)
		value = this.value;

	return app.getDate(value);
};

Filter.XMLRulesOut.dateTime = function(value){
	if (value == undefined)
		value = this.value;

	if (value){
		var lastPos = value.lastIndexOf('-');
		var year = parseInt(value.substr(lastPos + 1), 10);
		var firstPos = value.indexOf('-');
		var month = parseFloat(value.substring(firstPos + 1, lastPos));
		var day = parseFloat(value.substring(0, firstPos));
				
		return parseInt(month, 10) + '/' + parseInt(day, 10) + '/' + year;
	}
	else
		return '';
};

Filter.XMLRulesOut.hrs24 = function(value){
	if (value == undefined)
		value = this.value;

	var firstPos = value.indexOf(':');

	if (value && firstPos > -1){
		var firstPos = value.indexOf(':');

		var hour = parseInt(value.substr(firstPos - 2, firstPos), 10);
		var minute = parseInt(value.substring(firstPos + 1));

		if (isNaN(hour) && !isNaN(minute)){
			hour = minute;
			minute = 0;
		}
				
		return insertLeadingChars(hour, 2, '0') + ':' + insertLeadingChars(minute, 2, '0');
	}
	else
		return '';
};

Filter.XMLRulesOut.time = function(){
	if (this.value == '--:--' || this.value == '')
		return '-1';
	else
		return this.getMinutes() + '';
}

Filter.XMLRulesIn = new Object();

Filter.XMLRulesIn.numericext = function(value){
	if (value){
		if (parseFloat(value) != 0)
			value = (Math.round(value * 1000) / 1000) + '';
				
		if (parseFloat(value) < 0 && (this.allowNeg != 'true'))
			value = '';
	}
									
	return value;
};

Filter.XMLRulesIn.currency = function(value){
	if (value){
		if (parseFloat(value) != 0)
			value = (Math.round(value * 1000) / 1000) + '';
				
		if (parseFloat(value) < 0 && (this.allowNeg != 'true'))
			value = '';
	}
	
	if (value)
		value = app.formatCurrency(value);
										
	return value;
};

Filter.XMLRulesIn.numeric = function(value){
	if (parseInt(value, 10) < 0)
		value = '';
					
	return value;
};

Filter.XMLRulesIn.radio = function(value){
	var all = this.document.all[this.id];

	for (var i = 0; i < all.length; i++){
		if (all[i].value == value)
			all[i].checked = true;
		else
			all[i].checked = false;
	} 
				
	return this.value;

};

Filter.XMLRulesIn.checkbox = function(value){
	var all = this.document.all[this.id];

	if (value == 'true')
		this.checked = true;
	else
		this.checked = false;
				
	return this.value;

};

Filter.XMLRulesIn.checkbox3state = function(value){
	var all = this.document.all[this.id];

	if (value == 'true'){
		this.checked = true;
		this.value = 'true';
		this.style.border = '';
	}
	else if (value == 'false'){
		this.checked = false;
		this.value = 'false';
		this.style.border = '';
	}
	else{
		this.checked = false;
		this.value = '';
		this.style.border = '1px solid white';
	}
					
	return this.value;
};

Filter.XMLRulesIn.date = function(value){ 
	if (value){
		if (value == 'now'){
			var date = new Date();
			return insertLeadingChars(date.getDate(), 2, '0') + '-' + (insertLeadingChars(date.getMonth() + 1, 2, '0')) + '-' + date.getFullYear();
		}		 
		else{
			var index1 = value.indexOf('/');
			var index2 = null;
			
			var day = null;
			var month = null;
			var year = null;
			var hour = '';
			
			if (index1 > 0){
				month = value.substring(0, index1);
				index2 = index1;
				index1 = value.indexOf('/', index1 + 1);
			}
			else return '';

			if (index1 > 0){
				day = value.substring(index2 + 1, index1);

				index2 = value.indexOf(' ', index1 + 1);
				if (index2 == -1)
					year = value.substr(index1 + 1);
				else
					year = value.substring(index1 + 1, index2);
				
			}
			else return '';

			return parseInt(day, 10) + '-' + parseInt(month, 10) + '-' + year;
		}
	}
	else
		return '';
};

Filter.XMLRulesIn.dateTime = function(value){ 
	if (value){
		if (value == 'now'){
			var date = new Date();
			return date.getDate() + '-' + (date.getMonth() + 1) + '-' + date.getFullYear() + date.getHours() + ':' + date.getMinutes();
		}		
		else{
			var index1 = value.indexOf('/');
			var index2 = null;
			
			var day = null;
			var month = null;
			var year = null;
			var hour = '';
			
			if (index1 > 0){
				month = value.substring(0, index1);
				index2 = index1;
				index1 = value.indexOf('/', index1 + 1);
			}
			else return '';

			if (index1 > 0){
				day = value.substring(index2 + 1, index1);
				index2 = value.indexOf(' ', index1 + 1);
				
				if (index2 > 0){
					year = value.substring(index1 + 1, index2);
					hour = value.substr(index2 + 1);
				}
				else
					year = value.substr(index1 + 1);
				
			}
			else return '';

			return parseFloat(day) + '-' + parseFloat(month) + '-' + year + (hour != '' ? ' ' + hour : '');
		}
	}
	else
		return '';
}

Filter.XMLRulesIn.hrs24 = function(value){ 
	if (value){
		if (value == 'now'){
			var date = new Date();
			return date.getHours() + ':' + (date.getMinutes());
		}		
		else
			return value;
	}
	else
		return '';
};

Filter.XMLRulesIn.time = function(value){
	if (!isNaN(value) && parseInt(value, 10) > 0){
		var hours = parseInt((parseInt(value) / 60));
		var minutes = parseInt(value) - (60 * hours);
		
		return insertLeadingChars(hours, 2, '0') + ':' + insertLeadingChars(minutes, 2, '0');
	}
	if (parseInt(value, 10) == -1)
		return '--:--';
	else
		return '00:00';
}

Filter.XMLRulesIn.print = function(value){
	this.innerText = value;
	return value;
}

Filter.checkRules = new Object();
			
Filter.checkRules.numericext = function(node){
	var value = this.value + '';
	var fieldName = this.checkEmpty || this.checkFieldName;
				
	value = app.returnFloat(value) + '';
				
	if (value.indexOf('.') < value.lastIndexOf('.'))
		return 'Decimal error in field: ' + fieldName;
	else
		return '';
};

Filter.checkRules.currency = Filter.checkRules.numericext;

Filter.checkRules.hrs24 = function(node){
	var error = false;
	var fieldName = this.checkEmpty || this.checkFieldName;

	if (this.value == '')
		return '';
	
	var firstPos = this.value.indexOf(':');
	
	var hour = parseInt(this.value.substr(0, firstPos), 10);
	var minute = parseInt(this.value.substring(firstPos + 1), 10);
	
	if (isNaN(hour) && !isNaN(minute)){
		hour = minute;
		minute = 0;
	}

	if (isNaN(hour) || isNaN(minute))
		error = true;
	else{
		if (hour > 23 || minute > 60)
			error = true;
	}
	
	if (error)
		return 'Format error in field: ' + fieldName + '. Valid format is hh:mm';
	else
		return '';
}

Filter.checkRules.time = function(node){
	var error = false;
	var fieldName = this.checkEmpty || this.checkFieldName;

	if (this.value == '')
		return '';
	
	var firstPos = this.value.indexOf(':');
	
	if (firstPos == -1)
		error = true;
	else{
		var hour = parseInt(this.value.substr(0, firstPos), 10);
		var minute = parseInt(this.value.substring(firstPos + 1), 10);
		
		if (isNaN(hour) || isNaN(minute))
			error = true;
	}
	
	if (error)
		return 'Format error in field: ' + fieldName + '. Valid format is hhh:mm';
	else
		return '';
}

Filter.checkRules.date = function(node){
	var error = false;
	var fieldName = this.checkEmpty || this.checkFieldName;
				
	if (this.value == '')
		return '';
				
	this.value = this.value.replace(/\,/g, '-');
	this.value = this.value.replace(/\./g, '-');
	this.value = this.value.replace(/[/]/g, '-');
	var count = 0;
	for (var i = 0; i < this.value.length; i++)
		if (this.value.substr(i, 1) == '-')
			count++;
	
	if (count == 0 && this.value.length == 6){
		this.value = this.value.substr(0,2) + '-' + this.value.substr(2,2) + '-' + this.value.substr(4,2);
		count = 2;
	}
	else if (count == 0 && this.value.length == 8){
		this.value = this.value.substr(0,2) + '-' + this.value.substr(2,2) + '-' + this.value.substr(4,4);
		count = 2;
	}
	
	if (count != 2)
		error = true;
	else{
		//check year
		var lastPos = this.value.lastIndexOf('-');
		var year = parseInt(this.value.substr(lastPos + 1), 10);

		if (!isNaN(year)){
			if (year < 100 && year >= 50){
				year = 1900 + year;
				this.value = this.value.substr(0, lastPos + 1) + year;
			}
			else if (year < 50 && year > 0){
				year = 2000 + year;
				this.value = this.value.substr(0, lastPos + 1) + year;
			}
			else if (year < 1900)
				error = true;
		}
		else
			error = true;

		//check month
		var firstPos = this.value.indexOf('-');
		var month = parseFloat(this.value.substring(firstPos + 1, lastPos));
					
		if (!error){
			if (isNaN(month) || month > 12 || month < 1)
				error = true;
		}
					
		//check day
		var day = parseFloat(this.value.substring(0, firstPos));
					
		if (!error){
			if (!isNaN(day)){
				if (day < 1 || day > Filter.WrapFilterPattern.daysInMonth[month - 1])
					error = true;
				}
			else
				error = true
		}
	}
				
				
	if (error)
		return 'Format error in field: ' + fieldName + '. Valid format is dd-mm-yyyy';
	else
		return '';
};

function wrap_Filter(element){
	createFilter_Filter(element);
	
	element.filterWrapper = this;
	element.unWrap = unWrap_Filter;

	element.createFilter	= createFilter_Filter;
	element.setFilter		= setFilter_Filter;
	element.setXMLRuleOut	= setXMLRuleOut_Filter;
	element.setXMLRuleIn	= setXMLRuleIn_Filter;
	element.setCheckRule	= setCheckRule_Filter;
}

function unWrap_Filter(){
	this.detachEvent('onkeypress', onKeyPress_Filter);
	this.detachEvent('onkeydown', checkTextAreaLength_Filter);
		
	this.detachEvent('onchange');
	this.createFilter	= null;
	this.setFilter		= null;
	this.setXMLRuleOut	= null;
	this.setXMLRuleIn	= null;
	this.setCheckRule	= null;
		
	for (it in this.filterWrapper)
		this.filterWrapper[it] = null;
		
	this.filterWrapper = null;
}
	
function createFilter_Filter(element){
	var ruleOut = element.style.XMLRuleOut || null;
	var ruleIn = element.style.XMLRuleIn || null;
	var filterExp = element.style.filterRegExp || null;
	var filter = element.style.filter || null;
	var maxLength = element.maxLength || null;
	var checkRule = element.style.checkRule || null;
	var combRule = element.style.combRule || null;
	var param = element.style.param || null;
			
/*	element.attachEvent('onchange', function() {
		if (element.oldValue != element.value)
			element.isDirty = true;
		else
			element.isDirty = false;
	});*/

/*	element.prepareDirty = function(){
		this.isDirty = false;
		this.oldValue = this.value;
	}*/
			
	if (element.maxLength && element.tagName == 'TEXTAREA')
		element.attachEvent('onkeypress', checkTextAreaLength_Filter);
			
	if (filter){
		setFilter_Filter(eval('Filter.WrapFilterPattern.' + filter), element);
	}
			
	if (ruleOut){
		setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + ruleOut), element);
	}

	if (ruleIn){
		setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + ruleIn), element);
	}

	if (checkRule){
		setCheckRule_Filter(eval('Filter.checkRules.' + checkRule), element);
	}
	
	if (combRule){
		if (combRule == 'numericext'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule + (element.allowNeg == 'true' ? 'neg' : '')), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setCheckRule_Filter(eval('Filter.checkRules.' + combRule), element);
		}
		else if (combRule == 'currency'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule + (element.allowNeg == 'true' ? 'neg' : '')), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setCheckRule_Filter(eval('Filter.checkRules.' + combRule), element);
		}
		else if (combRule == 'currencycalc'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.currency'), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.currency'), element);
			setCheckRule_Filter(eval('Filter.checkRules.currency'), element);
		}
		else if (combRule == 'numeric'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
		}
		else if (combRule == 'date'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setCheckRule_Filter(eval('Filter.checkRules.' + combRule), element);
			element.getDate = getDate_date;
		}
		else if (combRule == 'dateExt'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.date'), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.date'), element);
			setCheckRule_Filter(eval('Filter.checkRules.date'), element);
			element.getDate = getDate_date;
		}
		else if (combRule == 'time'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setCheckRule_Filter(eval('Filter.checkRules.' + combRule), element);
			element.getMinutes = getMinutes_time;
		}
		else if (combRule == 'dateTime'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
		}
		else if (combRule == 'hrs24'){
			setFilter_Filter(eval('Filter.WrapFilterPattern.' + combRule), element);
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
			setCheckRule_Filter(eval('Filter.checkRules.' + combRule), element);
			element.getMinutes = getMinutes_time;
		}
		else if (combRule == 'radio'){
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
		}
		else if (combRule == 'checkbox'){
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
		}
		else if (combRule == 'checkbox3state'){
			setXMLRuleOut_Filter(eval('Filter.XMLRulesOut.' + combRule), element);
			setXMLRuleIn_Filter(eval('Filter.XMLRulesIn.' + combRule), element);
		}
	}
}
		
function setFilter_Filter(filter, element){
	element.detachEvent('onkeypress', onKeyPress_Filter);
	element.filterObj = filter;

	if (filter)
		element.attachEvent('onkeypress', onKeyPress_Filter);
}

function setXMLRuleOut_Filter(rule, element){
	if (rule){
		element.XMLRuleOut = rule;
	}
	else
		element.XMLRuleOut = null;
}

function setXMLRuleIn_Filter(rule, element){
	if (rule){
		element.XMLRuleIn = rule;
	}
	else{
		element.XMLRuleIn = null;
	}
}
		
function setCheckRule_Filter(rule, element){
	if (rule){
		element.checkRule = rule;
	}
	else
		element.checkRule = null;
}

function onKeyPress_Filter(ev){
	var element = ev.srcElement;

	var key = String.fromCharCode(ev.keyCode);
	if (ev.keyCode != 13 && ev.keyCode != 27 && element.filterObj && !element.filterObj.test(key)) 
		ev.keyCode = 0;
}
		
function checkTextAreaLength_Filter(ev){
	var element = ev.srcElement;
	
	if (ev.keyCode != 27 && element.value.length >= parseInt(element.maxLength, 10))
		ev.keyCode = 0;
}

function getDate_date(){
	if (this.value){
		var lastPos = this.value.lastIndexOf('-');
		var year = parseInt(getFullYear(this.value.substr(lastPos + 1)), 10);
		var firstPos = this.value.indexOf('-');
		var month = parseInt(this.value.substring(firstPos + 1, lastPos), 10);
		var day = parseInt(this.value.substring(0, firstPos), 10);
		
		var a = new Date(0, 0);
		a.setFullYear(year);
		a.setMonth(month - 1);
		a.setDate(day)
		a.setHours(0);
		a.setMinutes(0);
		a.setSeconds(0);
		a.setMilliseconds(0);
		
		return a;
	}
	else 
		return null;
}

function getMinutes_time(){
	var value = this.value;
	
	if (value){
		var firstPos = this.value.indexOf(':');
		
		var hour = parseInt(this.value.substr(0, firstPos), 10);
		var minute = parseInt(this.value.substring(firstPos + 1), 10);
		
		if (isNaN(hour) && !isNaN(minute)){
			hour = minute;
			minute = 0;
		}
				
		hour = (isNaN(hour) ? 0 : hour);
		minute = (isNaN(minute) ? 0 : minute);

		return (parseInt(hour) * 60) + parseInt(minute);
	}
	else
		return 0;
}

function initDateGroup(txtDay, txtMonth, txtYear, txtTime){
	txtDay.attachEvent('onfocus', Filter_focusSelect);
	txtDay.nextElement = txtMonth;
	txtDay.attachEvent('onkeyup', Filter_nextElement);
	txtDay.attachEvent('onkeydown', Filter_crement);
	txtDay.checkDate = Filter_checkDateGroup;
	txtDay.getDate = Filter_getDateGroup;
	txtDay.setDate = Filter_setDateGroup;
	txtDay.setDate2 = Filter_setDate2Group;
	txtDay.getDateStr = Filter_getDateStrGroup;
	txtDay.getDateTimeStr = Filter_getDateTimeStrGroup;
	txtDay.increment = Filter_incrementField;
	txtDay.maxValue = 32;
	txtDay.day = txtDay;
	txtDay.month = txtMonth;
	txtDay.year = txtYear;
	txtDay.time = txtTime || null;
	txtDay.interval = app.msPerDay;

	txtMonth.attachEvent('onfocus', Filter_focusSelect);
	txtMonth.attachEvent('onkeyup', Filter_nextElement);
	txtMonth.attachEvent('onkeydown', Filter_crement);
	txtMonth.nextElement = txtYear;
	txtMonth.increment = Filter_incrementFieldMonth;
	txtMonth.maxValue = 12;
	txtMonth.day = txtDay;
	txtMonth.month = txtMonth;
	txtMonth.year = txtYear;
	txtMonth.time = txtTime || null;
	
	txtYear.attachEvent('onfocus', Filter_focusSelect);
	txtYear.attachEvent('onkeyup', Filter_nextElement);
	txtYear.attachEvent('onkeyup', Filter_parseYear);
	txtYear.attachEvent('onkeydown', Filter_crement);
	txtYear.increment = Filter_incrementFieldYear;
	txtYear.day = txtDay;
	txtYear.month = txtMonth;
	txtYear.year = txtYear;
	txtYear.time = txtTime || null;
	
	if (txtTime){
		txtYear.nextElement = txtTime;
		txtTime.attachEvent('onfocus', Filter_focusSelect);
		txtTime.attachEvent('onkeyup', Filter_parseTime);
		txtTime.attachEvent('onkeydown', Filter_crement);
		txtTime.increment = Filter_incrementField;
		txtTime.day = txtDay;
		txtTime.month = txtMonth;
		txtTime.year = txtYear;
		txtTime.time = txtTime;
	}
}

function Filter_focusSelect(ev){
	var range = ev.srcElement.createTextRange();
	range.select();
	
	if (range.text != ev.srcElement.value)
		alert();
}

function Filter_crement(ev){
	if (ev.keyCode == 38 && !isNaN(ev.srcElement.value)){
		ev.srcElement.increment(1);
		ev.keyCode = 0;
	}
	else if (ev.keyCode == 40 && !isNaN(ev.srcElement.value)){
		ev.srcElement.increment(-1);
		ev.keyCode = 0;
	}
	ev.srcElement.keyDownYet = true;
}

function Filter_parseTime(ev){
}

function Filter_incrementFieldTime(interval){
	var value = this.getMinutes();
	
	value += parseInt(interval, 10) || 60;
	
	if (value > 0)
		this.value = insertLeadingChars(parseInt(value / 60, 10), 2, '0') + ':' + insertLeadingChars(value % 60, 2, 0);
	else
		this.value = '00:00';
}

function Filter_incrementField(interval){
	var element = this;
	var day = (element.day ? element.day : this);
	
	var date = day.getDate();
	
	if (!date){
		var now = new Date();
		date = new Date(0,0);
		date.setYear(now.getFullYear());
		date.setMonth(now.getMonth());
		date.setDate(now.getDate());
		date.setHours(now.getHours());
	}
	
	date = app.addDays(date, interval);
	day.setDate(date);
	
	element.blur();
	element.focus();
}

function Filter_incrementFieldMonth(interval){
	var element = this;
	this.value = this.value || 1;
	var day = (element.day ? element.day : this);
	
	var date = day.getDate();
	
	if (date){
		date.setMonth((parseInt(this.value, 10) - 1) + interval);
		day.setDate(date);
	}
		
	element.blur();
	element.focus();
}

function Filter_incrementFieldYear(interval){
	var element = this;
	this.value = this.value || (new Date()).getFullYear();
	var day = (element.day ? element.day : this);
	
	var date = day.getDate();
	
	if (date){
		date.setYear(parseInt(this.value, 10) + interval);
		day.setDate(date);
	}
		
	element.blur();
	element.focus();
}

function Filter_nextElement(ev){
	if (ev.srcElement.keyDownYet && ev.srcElement.nextElement && ev.keyCode != 9 && ev.keyCode != 16 && ev.keyCode != 38 && ev.keyCode != 40 && (ev.srcElement.maxLength == ev.srcElement.value.length)){
		ev.srcElement.nextElement.focus();
		ev.srcElement.keyDownYet = false;
		ev.keyCode = 0;
	}
}

function Filter_parseYear(ev){
	if (ev.srcElement.value.length == 2 && ev.srcElement.value.substr(0,1) == '0'){
		ev.srcElement.value = '20' + ev.srcElement.value;
		ev.srcElement.blur();
		ev.srcElement.focus();
	}
}

function Filter_getDateStrGroup(){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	
	return day.value + '-' + month.value + '-' + year.value;
}

function Filter_getDateTimeStrGroup(){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	var time = (year.nextElement);
	
	return day.value + '-' + month.value + '-' + year.value + ' ' + (time ? time.value : '00:00');
}

function Filter_setDateGroup(date){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	var time = year.nextElement;

	if (!date){
		day.value = '';
		month.value = '';
		year.value = '';
		
		return;
	}
	
	day.value = app.insertLeadingChars(date.getDate(), 2, '0');
	month.value = app.insertLeadingChars(date.getMonth() + 1, 2, '0');
	year.value = date.getFullYear();
	
	if (time)
		time.value = app.insertLeadingChars(date.getHours(), 2, '0') + ':' + app.insertLeadingChars(date.getMinutes(), 2, '0');
}

function Filter_checkDateGroup(){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	
	
	if (day.value == '' && month.value == '' && year.value == '')
		return '';
	
	if (!day.value || !month.value || !year.value)
		return 'Fejl ved udfyldning af dato. Gyldigt format er: dd-mm-åååå';
	
	if (parseInt(year.value, 10) < 2000){
		year.focus();
		return 'Fejl i felt år.';
	}

	if (parseInt(month.value, 10) > 12 || parseInt(month.value, 10) == 0){
		month.focus();
		return 'Fejl i felt måned.';
	}
	
	var date = new Date(0, 0);
	date.setFullYear(parseInt(year.value, 10));
	
	date.setMonth(parseInt(month.value, 10) - 1);
	date.setDate(parseInt(day.value, 10));
	
	if (date.getMonth() + 1 != parseInt(month.value, 10)){
		day.focus();	
		return 'Fejl i felt dato.';
	}
	
	return '';
}

function Filter_getDateGroup(){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	var time = year.nextElement;

	if (day.value == '' && month.value == '' && year.value == '')
		return null;
	
	var date = new Date(0, 0);
	date.setYear(year.value);
	date.setMonth(parseInt(month.value, 10) - 1);
	date.setDate(day.value);
	
	if (time)
		date.setMinutes(time.getMinutes());
	
	return (isNaN(date) ? null : date);
}

function Filter_setDate2Group(d, m, y){
	var day = this;
	var month = day.nextElement;
	var year = month.nextElement;
	
	day.value = app.insertLeadingChars(d, 2, '0');
	month.value = app.insertLeadingChars(m, 2, '0');
	year.value = y;
}

function initDateField(txtDay, txtTime){
	txtDay.attachEvent('onkeydown', Filter_crement);
	txtDay.checkDate = Filter_checkDateGroup;
	txtDay.getDate = Filter_getDateField;
	txtDay.setDate = Filter_setDateField;
	txtDay.setDate2 = Filter_setDate2Field;
	txtDay.getDateStr = Filter_getDateStrField;
	txtDay.increment = Filter_incrementField;
	
	if (txtTime){
		txtDay.nextElement = txtTime;
		txtDay.time = txtTime;
		txtDay.setDate = Filter_setDateField;
	}
}

function Filter_setDateField(date){
	this.value = app.getDateStr(date);
	
	if (this.time)
		this.time.value = app.getTimeStr(date);
}

function Filter_getDateField(){
	return app.parseDateTime(this.value + ' ' + (this.time && this.time.checkRule() == '' ? this.time.value : '00:00'));
}

function Filter_getDateStrField(){
	return app.getDateStr(app.parseDate(this.value));
}

function Filter_setDate2Field(d, m, y){
	this.value = app.insertLeadingChars(d, 2, '0') + '-' + app.insertLeadingChars(m, 2, '0') + '-' + y;
}

//</SCRIPT>

//<SCRIPT>

function XMLServer(){
	//public
	this.getXMLNode			= getXMLNode_XMLServer;
	this.addHTMLElement		= addHTMLElement_XMLServer;
	this.addSearchElement	= addSearchElement_XMLServer;
	this.addRule			= addRule_XMLServer;
	
	//private
	this.serveValues			= serveValues_XMLServer;
	this.serveValue				= serveValue_XMLServer;
	this.retrieveValues			= retrieveValues_XMLServer;
	this.retrieveSearchValues	= retrieveSearchValues_XMLServer;
	this.retrieveValue			= retrieveValue_XMLServer;
	this.retrieveSearchValue	= retrieveSearchValue_XMLServer;
	this.addParameter			= addParameter_XMLServer;
	this.addParameterNode		= addParameterNode_XMLServer; 
	this.addParameterNodes		= addParameterNodes_XMLServer; 
	this.destroy				= destroy_XMLServer;
		
	this.rules = new Array();
	this.parameters = new Array();
	this.XMLNodes = new Array();
	this.XMLNodesNull = new Array();
	this.HTMLElements = new Array();
	this.searchElements = new Array();
}

function addParameter_XMLServer(parameter, value){
	this.parameters[parameter] = value;
}

function destroy_XMLServer(){
	for (it in this)	
		delete(this[it]);
}

function addParameterNodes_XMLServer(nodes){
	if (nodes)
		for (var i = 0; i < nodes.length; i++)
			this.addParameterNode(nodes[i]);
}

function addParameterNode_XMLServer(node, rootTagName){
	if (rootTagName){
		if (node == null){
			this.XMLNodesNull[this.XMLNodesNull.length] = rootTagName;
		}
		else{
			var rootNode = node.ownerDocument.createElement(rootTagName);
			rootNode.appendChild(node);
			this.XMLNodes[this.XMLNodes.length] = rootNode;
		}
	}
	else	
		this.XMLNodes[this.XMLNodes.length] = node.cloneNode(true); 
}

function addHTMLElement_XMLServer(element, tag){
	var obj = new Object();
	obj['HTMLElement'] = element;
	obj['tag'] = tag;
	
	this.HTMLElements[this.HTMLElements.length] = obj;
}

function addSearchElement_XMLServer(element, tag){
	var obj = new Object();
	obj['HTMLElement'] = element;
	obj['tag'] = tag;
	
	this.searchElements[this.searchElements.length] = obj;
}

function getXMLNode_XMLServer(tag){
	if (!tag)
		tag = 'fieldValues';
		
	var XMLDOM = app.createDOM();
	XMLDOM.appendChild(XMLDOM.createElement(tag));
	
	if (this.HTMLElements){
		for (var i = 0; i < this.HTMLElements.length; i++){
			var node = null;
			
			if (this.HTMLElements[i].tag){
				node = XMLDOM.createElement(this.HTMLElements[i].tag);
				XMLDOM.documentElement.appendChild(node);
			}
			else
				node = XMLDOM.documentElement;
			this.retrieveValues(this.HTMLElements[i].HTMLElement, node);
		}
	}
	
	if (this.searchElements){
		for (var i = 0; i < this.searchElements.length; i++){
			var node = null;
			
			node = XMLDOM.documentElement;
			this.retrieveSearchValues(this.searchElements[i].HTMLElement, node);
		}
	}

	if (this.rules){
		for (var i = 0; i < this.rules.length; i++){
			var node = this.rules[i](XMLDOM);
			if (node)
				XMLDOM.documentElement.appendChild(node);
		}
	}
	
	for (param in this.parameters){
		var node = XMLDOM.createElement(param);
		node.appendChild(XMLDOM.createTextNode(this.parameters[param]));
		XMLDOM.documentElement.appendChild(node);
	}
	
	for (var i = 0; i < this.XMLNodes.length; i++){
		XMLDOM.documentElement.appendChild(this.XMLNodes[i].cloneNode(true));
	}

	for (var i = 0; i < this.XMLNodesNull.length; i++){
		XMLDOM.documentElement.appendChild(XMLDOM.createElement(this.XMLNodesNull[i]));
	}

	this.HTMLElements =null;
	this.rules = null;
	this.parameters = null;
	this.XMLNodes = null;
	this.XMLNodesNull = null;
	
	return XMLDOM.documentElement;
}

function addRule_XMLServer(rule){
	this.rules[this.rules.length] = rule;
}

function serveValues_XMLServer(doc, xmlNode, elementType){
	var elements = null;
	
	if (elementType)
		elements = doc.all.tags(elementType);
	else
		elements = doc.all;
	
	if (xmlNode){
		for (var i = 0; i < elements.length; i++){
			if (elements[i].XMLTag){
				var element = elements[i];
				var nodeId = element.XMLTag;
				var node = xmlNode.selectSingleNode(nodeId);

				if (node != null){
					if (!element.XMLRuleIn)
						element.value = node.nodeTypedValue;
					else
						element.value = element.XMLRuleIn(node.nodeTypedValue);
				}
			}
		}
	
		if (doc.all.length == 0 && doc.XMLTag){
			var nodeId = doc.XMLTag;
			var node = xmlNode.selectSingleNode(doc.XMLTag);

			if (node != null){
				if (!doc.XMLRuleIn)
					doc.value = node.nodeTypedValue;
				else
					doc.value = element.XMLRuleIn(node.nodeTypedValue);
			}
		}
	}
}

function serveValue_XMLServer(doc, XMLId, value){
	var elements = doc.all;
		
	for (var i = 0; i < elements.length; i++){
		if (elements[i].XMLTag && elements[i].XMLTag == XMLId){
			var element = elements[i];

			if (!element.XMLRuleIn)
				element.value = value;
			else
				element.value = element.XMLRuleIn(value);
		}
	}
}

function retrieveValues_XMLServer(doc, rootNode){
	var elements = doc.all;
	var length = elements.length;
	
	for (var i = 0; i < length; i++){
		if (elements[i].XMLTag && !elements[i].noEmpty){
			var element = elements[i];
			var node = rootNode.ownerDocument.createElement(element.XMLTag);
			
			rootNode.appendChild(this.retrieveValue(element, node));
		}
	}
	
	//this was a element, and not a container
	if (length == 0 && !element.noEmpty){
		var element = doc;
		var node = rootNode.ownerDocument.createElement(element.XMLTag);
			
		rootNode.appendChild(this.retrieveValue(element, node));
	}
}

function retrieveValue_XMLServer(element, node){
	var value = '';
	
	if (!element.XMLRuleOut)
		value = element.value;
	else
		value = element.XMLRuleOut();
			
	//is the return an xml string, or an xml node? + remove "invalid" xml
	if (!value || !value.xml){
		node.appendChild(node.ownerDocument.createTextNode(value ? value.replace(/[“”]/, '"').replace(/[’]/, "'").replace(/[…]/, ""): value));
	}
	else
		node = value;
	
	return node;
}

function retrieveSearchValues_XMLServer(doc, rootNode){
	var elements = doc.all;
	var length = elements.length;
	
	for (var i = 0; i < length; i++){
		if (elements[i].searchTag && !elements[i].noEmpty){
			var element = elements[i];
			
			this.retrieveSearchValue(element, rootNode);
		}
	}
	
	//this was a element, and not a container
	if (length == 0 && !element.noEmpty){
		var element = doc;
			
		this.retrieveSearchValue(element, rootNode);
	}
}

function retrieveSearchValue_XMLServer(element, node){
	var value = '';
	
	if (!element.XMLRuleOut)
		value = element.value;
	else
		value = element.XMLRuleOut();
	
	if (value != '' && ((element.type.toLowerCase() != 'checkbox') || element.checked)){
		var searchNode = XMLServer.buildSearchNode(node.ownerDocument, element.searchTag, element.searchOp, element.searchType, value);
		
		node.appendChild(searchNode);
	}
		
	return node;
}

XMLServer.buildSearchNode = function(XMLDOM, id, op, type, value){
	var searchNode = XMLDOM.createElement('searchItem');

	if (id){
		var idNode = XMLDOM.createElement('id');
		idNode.appendChild(XMLDOM.createTextNode(id));
		searchNode.appendChild(idNode);
	}
	
	if (op){
		var opNode = XMLDOM.createElement('op');
		opNode.appendChild(XMLDOM.createTextNode(op));
		searchNode.appendChild(opNode);
	}
	
	if (type){
		var typeNode = XMLDOM.createElement('type');
		typeNode.appendChild(XMLDOM.createTextNode(type));
		searchNode.appendChild(typeNode);
	}

	if (value != undefined)	{
		var valueNode = XMLDOM.createElement('value');
		//is the return an xml string, or an xml node?
		if (!value || !value.xml)
			valueNode.appendChild(XMLDOM.createTextNode(value));
		else
			valueNode = value;
			
		searchNode.appendChild(valueNode);
	}
		
	return searchNode;
}

XMLServer.addSubSearchNodes = function(searchNode, op, nodes){
	var opNode = searchNode.ownerDocument.createElement('subQueryOp');
	opNode.appendChild(searchNode.ownerDocument.createTextNode(op));
	searchNode.appendChild(opNode);
	
	for (var i = 0; i < nodes.length; i++)
		searchNode.appendChild(nodes[i]);
}

function trimXML(strXML){
	if (strXML.substr(strXML.length-1, 1) == '\n') strXML = strXML.substr(0, strXML.length -2);
	return strXML;
}

//</SCRIPT>
//<SCRIPT>
////////////////////////////////////////
//Language - start
////////////////////////////////////////
function LanguageManager(defaultLanguage, editLanguageMode){
	this.addLanguage = addLanguage_LanguageManager;
	this.translate = translate_LanguageManager;
	this.translateX = translateX_LanguageManager;
	this.translate2 = translate2_LanguageManager;
	this.translateDoc = translateDoc_LanguageManager;
	this.translateWord = translateWord_LanguageManager;
	this.translateXML = translateXML_LanguageManager;
	
	this.languages = new Array();
	this.defaultLanguage = defaultLanguage || app.defaultLanguage;
	this.editLanguageMode = editLanguageMode || false;
}

LanguageManager.getLanguage = function(){
	return window.navigator.userLanguage;
}

function addLanguage_LanguageManager(xmlNode, languageId){
	this.languages[languageId] = new Language(xmlNode, languageId);
}

function translate_LanguageManager(text, languageId){
	languageId = (languageId ? languageId : this.defaultLanguage);
	
	if (!this.languages[languageId])
		return null;
	else
		return this.languages[languageId].translate(text);
}

function translateXML_LanguageManager(text, languageId){
	languageId = (languageId ? languageId : this.defaultLanguage);
	
	if (!this.languages[languageId])
		return null;
	else
		return this.languages[languageId].translateXML(text);
}

function translateX_LanguageManager(text, languageId){
	languageId = (languageId ? languageId : this.defaultLanguage);
	
	if (!this.languages[languageId])
		return null;
	else
		return this.languages[languageId].translateX(text);
}

function translate2_LanguageManager(text, languageId){
	var trans = null;
	
	try{
		if (text){
			trans =  this.translate(text.replace(/[ \/]/g, '_'), languageId);
			if (trans)
				return trans;
			else 
				return text;
		}
		else
			return text;
	}
	catch(e){
		return text;
	}
}

function translateDoc_LanguageManager(doc, languageId){
	var length = 0;
	var nodes = null;

	if (doc.length != undefined){
		length = doc.length;
		nodes = doc;
	}
	else{
		length = doc.all.length;
		nodes = doc.all;
	}
	
	if (window.editLanguageMode){
		for (var i = 0; i < length; i++){
			nodes[i].oncontextmenu = enableFieldTrans;
		}	
	}
	
	var transXMLNodes = new Array();
	
	for (var i = 0; i < length; i++){
		if (nodes[i].trans){
			var text = this.translate(nodes[i].trans, languageId);
			if (text != null)
				nodes[i].innerText = text;
				
			else if (nodes[i].trans == 'root'){
				if (!nodes[i].orgText)
					nodes[i].orgText = nodes[i].innerText;
				
				var text = this.translate(nodes[i].orgText, languageId);
				if (text != null)
					nodes[i].innerText = text
			}
			else if (nodes[i].trans == 'root2'){
				var text = '';
				
				if (!nodes[i].orgText)
					nodes[i].orgText = nodes[i].innerText;

				var arr = nodes[i].orgText.split(' ');
				
				for (var j = 0; j < arr.length; j++){
					text += this.translateX(arr[j], languageId) + ' ';
				}

				nodes[i].innerText = text
			}
		}
		else if (nodes[i].transXML)
			transXMLNodes[transXMLNodes.length] = nodes[i];
	}
	
	for (var i = 0; i < transXMLNodes.length; i++){
		var text = this.translateXML(transXMLNodes[i].transXML, languageId);

		if (text != null)
			transXMLNodes[i].innerHTML = text;
	}
		
}

function translateWord_LanguageManager(text, word, languageId){
	var transWord = this.translate(word, languageId);
	
	if (transWord)
		text = text.replace(word, transWord);
		
	return text;
}

function enableFieldTrans(ev){
	var win = app.getWinAddTranslation();
	win.setFunction('create', this.trans, this.innerText);
			
	win.show('auto', 'auto');
	
	win = null;
	
	return false;
}

////////////////////////////////////////

function Language(xmlNode, languageId){
	this.xmlNode = xmlNode;
	this.languageId = languageId;
	this.translate = translate_Language;
	this.translateX = translateX_Language;
	this.translateXML = translateXML_Language;
}

function translate_Language(text){
	if (!this.xmlNode)
		return null;
	else{
		var node = this.xmlNode.selectSingleNode(text + '/translation[@language="' + this.languageId + '"]');
		
		if (node)
			return app.getNodeValue(node);
		else
			return null;
	}
}

function translateXML_Language(text){
	if (!this.xmlNode)
		return null;
	else{
		var node = this.xmlNode.selectSingleNode(text + '/translation[@language="' + this.languageId + '"]');
		
		if (node){
			var text = '';
			
			for (var i = 0; i < node.childNodes.length; i++)
				text += node.childNodes[i].xml;
				
			return text;
		}
		else
			return null;
	}
}

function translateX_Language(text){
	if (!this.xmlNode)
		return text;
	else{
		try{
			var node = this.xmlNode.selectSingleNode(text + '/translation[@language="' + this.languageId + '"]');
			
			if (node)
				return app.getNodeValue(node);
			else
				return text;
		}
		catch(e){
			return text;
		}
	}
}

////////////////////////////////////////
//Language - end
////////////////////////////////////////

////////////////////////////////////////
//DLR methods
////////////////////////////////////////
function parseDLRDateStr(dateStr){
	var year = dateStr.substr(0, 4);
	var month = dateStr.substr(5, 2);
	var date = dateStr.substr(8, 2);
	
	return parseDate(date + '-' + month + '-' + year);
}

//get the DLR time
function getDLRTime(route){
	var tmp = getNodeValue(XMLDOM_ticketInfo.selectSingleNode('//Journey[' + route + ']/DepartureTime')).replace(/[-]/g, '/').split(' ')[1];
	
	return tmp.substring(0, tmp.lastIndexOf('.'));
}
//</SCRIPT>