var
	httpRequestFormLoad = false;
	isDCQ = false;;
	bean = '';
	formCaption = '';
	currentForm = '';
	currentPage = '';

/**
 * Sets focus to the first enabled field in the enter order.
 */
function focusFirstField(name) {
	if (name == undefined || !(name instanceof String)) {
		var xmldoc = httpRequestFormLoad.responseXML;
		if (xmldoc.getElementsByTagName('firstField').item(0).hasChildNodes()) {
			name = xmldoc.getElementsByTagName('firstField').item(0).firstChild.data;
		} else {
			return;
		}
	}
	if (name != '') {
		var field = document.getElementById(name);
		if (field.className == 'endless_contents') 
			focusEndlessField(field);
		else if (field.className != 'disabled' && !field.disabled
				 && field.style.visibility != 'hidden') {
			field.focus();
			field.blur();
			field.focus();
		} else {
			focusNextField(field);
		}
	}
}

/**
 * Clears the event for the specified element.
 */
function clearEvent(element) {
	var events = ['onchange', 'onfocus', 'onblur', 'onkeypress', 'onkeydown',
				  'onclick', 'onmouseover', 'onmouseout'];
	for (var i = 0; i < events.length; i++) {
		if (element[events[i]]) {
			element[events[i]] = null;
		}
	}
}

/**
 * Finds all controls and clears the event.
 */
function traverseDomTree(childList) {
	for (var i = 0; i < childList.length; i++) {
		if (childList[i].id) {
			var element = document.getElementById(childList[i].id);
			if (element != null) {
				clearEvent(element);
			}
		}
		if (childList[i].childNodes) {
			traverseDomTree(childList[i].childNodes);
		}
	}
}

/**
 * Shows a form by calling the formload Ajax request.
 */
function showForm(form, page, elementId, callbackMethod) {
	if (elementId == undefined) elementId = 'form_holder';
	if (callbackMethod == undefined) callbackMethod = callbackFormLoad;
	
	var caption = document.getElementById('caption');
	if (caption != null)
		caption.innerHTML = '';
	var pageNavigation = document.getElementById('page_navigation');
	if (pageNavigation != null)
		pageNavigation.innerHTML = '';
	
	var element = document.getElementById(elementId);
	traverseDomTree(element.childNodes);
	var loadingForm = (loadingFormText ? loadingFormText : 'Loading form ');
	document.getElementById(elementId).innerHTML = '<img src="dcforms/ajax-loader.gif"> <span class="form-loader">' + loadingForm + ' ' + form + '...</span>';
	httpRequestFormLoad = false;
	httpRequestFormLoad = createXMLHttpRequest();
	if (!httpRequestFormLoad) {
		if (showMessage) showMessage('error.xmlhttp.formload');
		return false;
	}

	httpRequestFormLoad.onreadystatechange = callbackMethod;
	var reqStr = 'formload?form=' + form.toUpperCase() + '&page=' + page + '&bean=' + bean;
	if (elementId == 'modal_holder') reqStr += '&modal=1';
	httpRequestFormLoad.open('GET', reqStr, true);
	httpRequestFormLoad.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	httpRequestFormLoad.send(null);
	currentForm = form;
	if (page > 0)		
		currentPage = page;
	else
		currentPage = -2;
}

/**
 * The callback for the formload Ajax request for ordinary pages.
 */
function callbackFormLoad() {
	genericCallbackFormLoad('form_holder', true);
}

/**
 * The callback for the formload Ajax request for modal pages.
 */
function callbackModalLoad() {
	if (httpRequestFormLoad.readyState == 4) {
		if (httpRequestFormLoad.status == 200) {
			var buttonId = false;
			if (httpRequestButton) {
				var buttonXML = httpRequestButton.responseXML;
				if (buttonXML) {
					var gotopage = buttonXML.getElementsByTagName('gotopage');
					if (gotopage) {
						buttonId = gotopage.item(0).getAttribute('button');
					}
				}
			}
			genericCallbackFormLoad('modal_holder', false);
			modalDialogEvent.showModal.fire(buttonId, formCaption);
		} else {
			if (showMessage) showMessage('error.request.modal', httpRequestFormLoad.status);
		}
	}
}

/**
 * The callback for the formload Ajax request.
 */
function genericCallbackFormLoad(elementId, canSetFocus) {
	if (httpRequestFormLoad.readyState == 4) {
		if (httpRequestFormLoad.status == 200) {
			var xmldoc = httpRequestFormLoad.responseXML;
			var data = xmldoc.getElementsByTagName('data').item(0);
			var holder = document.getElementById(elementId);
			if (data.textContent == undefined)
				holder.innerHTML = data.firstChild.data;
			else
				holder.innerHTML = data.textContent;
				
			// Fix for getting scroll bars in IE6:
			var iel = holder.getElementsByTagName('div')[0];
			holder.style.width = iel.style.width;
			holder.style.height = iel.style.height;

			var caption = document.getElementById('caption');
			if (caption != null && xmldoc.getElementsByTagName('caption').item(0).hasChildNodes()) {
				caption.innerHTML = xmldoc.getElementsByTagName('caption').item(0).firstChild.data;
			}
			
 			var formDescEl = xmldoc.getElementsByTagName('formDesc').item(0);
 			if (formDescEl && formDescEl.firstChild) {
				formNameEvent.newFormName.fire(formDescEl.firstChild.data);
	 		}
			
 			var pageNavigation = document.getElementById('page_navigation');
 			if (pageNavigation != null) {
	 			var pageNavigationStr = '';
	 			getNavigationStr();
 			}
 			
 			var formCaptionEl = xmldoc.getElementsByTagName('caption').item(0).firstChild;
 			if (formCaptionEl) {
	 			formCaption = formCaptionEl.data;
	 		} else {
	 			formCaption = '';
	 		}
 			bean = xmldoc.getElementsByTagName('bean').item(0).firstChild.data;
 			isDCQ = xmldoc.getElementsByTagName('dcq').item(0).firstChild.data == 'True';
 			
 			if (isDCQ) {
 				fshBean = xmldoc.getElementsByTagName('fshbean').item(0).firstChild.data;
 				
 				var isFirstQPage = xmldoc.getElementsByTagName('isfirstqpage').item(0).firstChild.data == 'true';
 				var isLastQPage = xmldoc.getElementsByTagName('islastqpage').item(0).firstChild.data == 'true';
 				
 				var status = new NavigationButtonStatusInfo(isFirstQPage, isLastQPage);
	 			navigationButtonStatusEvent.updateStatus.fire(status);
	 			
	 			var obj = eval('(' + xmldoc.getElementsByTagName('pagecaptionlist').item(0).firstChild.data + ')');
	 			pageListChangedEvent.pageListChanged.fire(obj.pageList);
 			}
 			
 			// Empty FSH:
 			setFSHHintText('');
 			
 			// See if we need to get FSH hints:
 			if (fshHintCache[fshBean] == undefined) {
	 			createFSHHintCallback();
	 		}
 			
 			var enterOrderData = xmldoc.getElementsByTagName('enterOrder').item(0);
 			if (enterOrderData.textContent == undefined) {
 				eval(enterOrderData.firstChild.data);
 			} else {
 				eval(enterOrderData.textContent);
 			}
			// Fix for IE (canSetFocus): IE cannot set focus to fields that are not displayed
 			if (canSetFocus) {
 				if (xmldoc.getElementsByTagName('firstField').item(0).hasChildNodes()) {
	 				var firstField = xmldoc.getElementsByTagName('firstField').item(0).firstChild.data;
	 				focusFirstField(firstField);
	 			} else { // Must set focus to something in order for keydown listeners to work.
					document.getElementById('dummy_link').focus();
	 			}
 			}
 			window.status = 'Form: ' + currentForm;
		} else {
			if (showMessage) showMessage('error.request.formload', httpRequestFormLoad.status);
		}
	}
}

