var registeredFields = new Array();
var registeredForms = new Array();
var singleValidation = false;
var currentField = "";
var validating = false;

function applyResults(results) {
	var count = 0;
	for(var result in results.errors) {
		$("#" + result + "Error").html(results.errors[result]);
		$("#" + result + "Error").fadeIn("slow");		
		count++;
	}
	if (!singleValidation) {
		for(var field in registeredFields) {
			if (field.form != results.form) {
				continue;
			}
			if (results.errors[field] == undefined) {
				$("#" + field + "Error").html("");
				$("#" + field + "Error").fadeOut("slow");		
			}
		}
	} else {
		if (results.errors[currentField] == undefined) {
				$("#" + currentField + "Error").html("");
				$("#" + currentField + "Error").fadeOut("slow");		
		}			
	}
	
	if (!singleValidation && (count == 0)) {		
		$("#" + results.form)[0].submit();
		
	}
}
function performFieldValidation(formID, name) {
	registeredFields[name].value = $("#" + name).val();
	fields = [registeredFields[name]];
	performValidation(formID, fields);	
}

function performValidation(formID, fields) {
	if (validating)
		return;
	validating = true;	
	
	fields[fields.length] = {name: "form", value: formID};
	var formURL = registeredForms[formID].url;
	$.get(formURL, fields, function(data) {	
		applyResults(data);
		singleValidation = false;	
		currentField = "";
		validating = false;		
	}, "json");
}

function registerField(formID, fieldName) {
	registeredFields[fieldName] = {name : fieldName, value:  $("#" + fieldName).val(), form: formID};
}

function registerForm(formID, formURL) {
	registeredForms[formID] = {name : formID, url: formURL};
	$("#" + formID).submit(validateForm);	
}
function registerFieldValidation(formID, fieldName) {
	$("#" + fieldName+ "Error").hide();
	registeredFields[fieldName] = {name : fieldName, value:  $("#" + fieldName).val(), form: formID};
	$("#" + fieldName).blur( function() {
		if (!validating)
		{
			singleValidation = true;									  	
			currentField = fieldName;
			performFieldValidation(formID, fieldName);
		}
	});
}
function validateForm() {	
	/*if (validating)
	{
		alert("ok");
		return false;
	}*/
	var index = 0;
	fields = new Array();
	for (var name in registeredFields) {
		if (registeredFields[name].form != this.id) {
			continue;
		}
		if ($("#" + name).length >0)
		{
			if ($("#" + name)[0].type == "radio") {
				registeredFields[name].value = $("#" + name)[0].checked? $("#" + name).val() : "";
			} else {
				registeredFields[name].value = $("#" + name).val();
			}
		}		
		fields[index++] = registeredFields[name];
	}
	singleValidation = false;
	currentField = "";
	performValidation(this.id, fields);	
	
	return false;
}
