var oValidateFieldXmlHttp = null;
var iTimeoutId = null;
var ierrorTimeoutId = null;
var arrFields = new Array();
var fieldCurrent = null;

function validateFieldInit(oEvent) {
	oEvent = oEvent || window.event;
	var txtField = oEvent.target || oEvent.srcElement;
	validateField(txtField);
};

function addDefoo(message) {
	//$defoo = document.getElementById("defoo");
	//$defoo.innerHTML = message + "<br />" + $defoo.innerHTML;
};

function validateField(txtField) {
	if(!arrFields[txtField.id] | arrFields[txtField.id] == null) {
		addDefoo(txtField.id + " has been added to the queue for validation");
	};
	arrFields[txtField.id] = txtField;
	
	var btnSubmit = document.getElementById("frmSubmit");
	btnSubmit.disabled = true;
	
	if(oValidateFieldXmlHttp == null) {
		oValidateFieldXmlHttp = zXmlHttp.createRequest();
	}
	
	if(fieldCurrent == null) {
		var arrCount = 0;
		for(var i in arrFields) {
			if(arrCount == 0 && arrFields[i] != null) {
				fieldCurrent = arrFields[i];
				arrCount++
				addDefoo("fieldCurrent was null, fieldCurrent is now: " + fieldCurrent.id);
			};
		};
		
		var divError = document.getElementById("form_" + fieldCurrent.id + "_Error");
		setErrorSpan(divError, "Validating..", "", "60px", "#FF6600");
		fieldCurrent.valid = false;
	};
	
	oValidateFieldXmlHttp.onreadystatechange = function() {
		if(oValidateFieldXmlHttp.readyState == 4) {
			httpstatus = 300;
			try {
				httpstatus = oValidateFieldXmlHttp.status;
			} catch(exception) {
				httpstatus = 300
			};
			if(httpstatus == 200) {
				addDefoo("Ajax request has returned with a 200 status");
				var arrInfo = oValidateFieldXmlHttp.responseText.split("||");
				var divError = document.getElementById("form_" + fieldCurrent.id + "_Error");
				
				if(!eval(arrInfo[0])) {
					setErrorSpan(divError, arrInfo[1], "", "350px", "#FF0000");
					fieldCurrent.valid = false;
				} else {
					setErrorSpan(divError, arrInfo[1], "", "30px", "#00CC00");
					fieldCurrent.valid = true;
				};
				addDefoo("fieldCurrent is now null<br />Removing " + fieldCurrent.id + " from arrFields");
				arrFields[fieldCurrent.id] = null;
				fieldCurrent = null;
				
				if(fieldCurrent == null) {
					var arrCount = 0;
					for(var i in arrFields) {
						if(arrCount == 0 && arrFields[i] != null) {
							fieldCurrent = arrFields[i];
							addDefoo("fieldCurrent was null, fieldCurrent is now: " + fieldCurrent.id);
							arrCount++
						};
					};
					if(fieldCurrent != null) {
						var divError = document.getElementById("form_" + fieldCurrent.id + "_Error");
						setErrorSpan(divError, "Validating..", "", "60px", "#FF6600");
						fieldCurrent.valid = false;
						addDefoo("Setting up ajax for new request");
						oValidateFieldXmlHttp.abort();
						validateField(fieldCurrent);
					} else {
						addDefoo("Setting up ajax for new request");
						oValidateFieldXmlHttp.abort();
					};
				};
			} else {
				addDefoo("There was an error, sending request again.");
				if(fieldCurrent != null) {
					clearTimeout(ierrorTimeoutId);
					ierrorTimeoutId = null;
					ierrorTimeoutId = setTimeout(function() {								  	
						validateField(fieldCurrent);
					}, 500);
				}
			};
			//Disable/Enable submit button
			var btnSubmit = document.getElementById("frmSubmit");
			btnSubmit.disabled = !isFormValid();
		};
	};
	
	if(fieldCurrent.id == txtField.id && fieldCurrent != null) {
		clearTimeout(iTimeoutId);
		iTimeoutId = null;
		iTimeoutId = setTimeout(function() {
			oValidateFieldXmlHttp.open("get", "validate.php?" + fieldCurrent.name + "=" + encodeURIComponent(fieldCurrent.value), true);
			if(oValidateFieldXmlHttp.readyState == 1) {
				addDefoo("Sending ajax request for " + fieldCurrent.id);
				oValidateFieldXmlHttp.send(null);
			};
		}, 450);
	};
};

function setErrorSpan(target, message, display, width, color) {
		divError = target;
		divError.innerHTML = message;
		divError.style.display = display;
		divError.style.width = width;
		divError.style.background = color;
};

function validateReEntry(oEvent) {
	oEvent = oEvent || window.event;
	var txtField = oEvent.target || oEvent.srcElement;
	var txtOrig = document.getElementById(txtField.id.substr(2));
	var divError = document.getElementById("form_" + txtField.id + "_Error");
	
	if(txtField.value != txtOrig.value) {
		divError.innerHTML = "Field does not match. Please try again.";
		divError.style.display = "";
		divError.style.width = "350px";
		divError.style.background = "#FF0000";
		txtField.valid = false;
	} else {
		divError.innerHTML = "Okay!";
		divError.style.display = "";
		divError.style.width = "30px";
		divError.style.background = "#00CC00";
		txtField.valid = true;
	};
	//Disable/Enable submit button
	var btnSubmit = document.getElementById("frmSubmit");
	btnSubmit.disabled = !isFormValid();
};

function isFormValid() {
	var frmMain = document.forms[0];
	var blnValid = true;
	
	for(var i=0; i < frmMain.elements.length; i++) {
		if(typeof frmMain.elements[i].valid == "boolean") {
			blnValid = blnValid && frmMain.elements[i].valid;
		};
	};
	return blnValid;
};