var
	enterOrder = null;

/**
 * Creates a XMLHttpRequest object.
 */
function createXMLHttpRequest() {
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		if (req.overrideMimeType) {
			req.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return req;
}

//TODO: IE don't handle getElementsByName when adding elements dynamically
//This function is not used right now but may be used in future to get a list
//of elements and then set focus on the correct item
function getElementsByName_iefix(tag, name) {	
	 var elem = document.getElementsByTagName(tag);
	 var arr = new Array();
	 for(i = 0,iarr = 0; i < elem.length; i++) {
		  att = elem[i].getAttribute("name");
		  if(att == name) {
			   arr[iarr] = elem[i];
			   iarr++;
		  }
	 }
	 return arr;
}

/**
 * Sets focus to the next enabled field in the enter order.
 */
function focusNextField(field) {
	var stop = false;
	var fieldInfo = enterOrder[field.id];	
	while (!stop) {
		var newField = document.getElementById(fieldInfo.next);
		if (newField.id == field.id) {
			field.blur();
			field.focus();
			return;
		}
		if (newField.className == 'endless_contents') {
			stop = true;
			focusEndlessField(newField);
		} else if (newField.className != 'disabled' && !newField.disabled && newField.style.visibility != 'hidden') {
			stop = true;
			newField.focus();
			newField.blur();
			newField.focus();
		} else {
			fieldInfo = enterOrder[newField.id];
		}
	}
}

/**
 * Sets focus to the previous enabled field in the enter order.
 */
function focusPrevField(field) {
	var stop = false;
	var fieldInfo = enterOrder[field.id];	
	while (!stop) {
		var newField = document.getElementById(fieldInfo.prev);
		if (newField.id == field.id)
			return;			
		if (newField.className == 'endless_contents') {
			stop = true;
			focusEndlessField(newField);
		} else if (newField.className != 'disabled' && !newField.disabled && newField.style.visibility != 'hidden') {
			stop = true;
			newField.focus();
		} else {
			fieldInfo = enterOrder[newField.id];
		}
	}
}

/**
 * Sets focus to an endless fiels.
 */
function focusEndlessField(endless) {
	var cells = endless.tBodies[0].rows[0].cells;
	for (var i = 0; i < cells.length; i++) {
		if (!cells[i].childNodes[0].readOnly) {
			cells[i].childNodes[0].focus();
			cells[i].childNodes[0].blur();
			cells[i].childNodes[0].focus();
			break;
		}
	}
}

/**
 * Read attributes from the XML callback updates the controls.
 */ 
function updateAttributes(xmldoc) {
	var rowcounts = xmldoc.getElementsByTagName('rowcount');
	for (var i = 0; i < rowcounts.length; i++) {
		var rowcount = rowcounts.item(i);
		if (rowcount.firstChild != null) {
			var nofrows = rowcount.firstChild.data;
			var endlessTable = document.getElementById('tbl_' + rowcount.getAttribute('name'));
			while (endlessTable.rows.length > nofrows) {
				endlessTable.deleteRow(endlessTable.rows.length - 1);
			}
		}
	}
	
	var values = xmldoc.getElementsByTagName('value');
	var row;
	for (var i = 0; i < values.length; i++) {
		var value = values.item(i);
		row = parseInt(value.getAttribute('row'),10);// == -1 ? 0 : parseInt(value.getAttribute('row'),10);
		var field = null;
		if (row == -1) {
			var nodeList = document.getElementsByName(value.getAttribute('name'));
			field = new Array();
			for (var n=0; n<nodeList.length; n++) field[n] = nodeList.item(n);
		} else {
			field = document.getElementsByName(value.getAttribute('name')).item(row);
		}
		
		if (field == null && row > 0) {
			var existingRow = row;
			while (field == null) {
				existingRow--;
				field = document.getElementsByName(value.getAttribute('name')).item(existingRow);
			}
			var table = getCurrentTable(field);
			while (existingRow < row) {
				var clonedRow = table.rows[0].cloneNode(true);
				table.tBodies[0].appendChild(clonedRow);
				existingRow++;
				var cells = table.tBodies[0].rows[existingRow].cells;
				clearTableCells(cells);
			}
			field = document.getElementsByName(value.getAttribute('name')).item(row);
		}

		if (field != null) {
			// Make sure it's in an array
			if (field.constructor != Array) {
				var tmp = new Array();
				tmp[0] = field;
				field = tmp;
			}
			for (var ai = 0; ai < field.length; ai++) {
				//Find out if field is a toggle field
				var type = field[ai].getAttribute('type');
				if ((type == 'radio') || (type == 'checkbox')) {
					field[ai].checked = value.firstChild.data == '1';
				} else {
					field[ai].value = value.firstChild != null ? value.firstChild.data : '';
				}
			}
		}
	}
			
	var visibles = xmldoc.getElementsByTagName('visible');
	for (var i = 0; i < visibles.length; i++) {
		var visible = visibles.item(i);
		row = parseInt(value.getAttribute('row'),10) == -1 ? 0 : parseInt(value.getAttribute('row'),10);
		var field = document.getElementsByName(visible.getAttribute('name')).item(row);
		
		if (field != null) {
			field.style.visibility = visible.firstChild.data == 'true' ? 'visible' : 'hidden';
		}
		//Also hide label
		field = document.getElementsByName('div_' + visible.getAttribute('name')).item(row);
		if (field != null) {
			field.style.visibility = visible.firstChild.data == 'true' ? 'visible' : 'hidden';
		}

		//Also hide label
		field = document.getElementsByName('button_' + visible.getAttribute('name')).item(row);
		if (field != null) {
			field.style.visibility = visible.firstChild.data == 'true' ? 'visible' : 'hidden';
		}

	}
			
	var enables = xmldoc.getElementsByTagName('enabled');
	for (var i = 0; i < enables.length; i++) {
		var enabled = enables.item(i);
		row = parseInt(enabled.getAttribute('row'),10) == -1 ? 0 : parseInt(enabled.getAttribute('row'),10);
		var field = document.getElementsByName(enabled.getAttribute('name')).item(row);
		if (field != null) {
			if (field.type == 'textarea') {
				field.disabled = enabled.firstChild.data == 'false';
				field.className = field.disabled ? 'disabled' : 'enabled';
			} else if (field.type == 'checkbox' || field.type == 'radio') {
				field.disabled = enabled.firstChild.data == 'false';
			} else {
				field.readOnly = enabled.firstChild.data == 'false';
				field.className = field.readOnly ? 'disabled' : 'enabled';
			}
		}
		//TODO disable button in lisbox too?
	}
}

/**
 * Checks if the Ajax XML callback has set sesion timeout tag
 * and if that is true it will redirect to a another page.
 */
function checkForTimeout(xmldoc) {
	var sessionTimeout = xmldoc.getElementsByTagName('sessiontimeout');
	if (sessionTimeout.length == 1) {
		sessionTimeoutEvent.timeout.fire();
		return true;
	} else {
		return false;
	}
}

