
/* Validator */

function Validator() {
	this.items = [];
}

//add an item
Validator.prototype.addItem = function(fName, fType, fRequired) {
	
	var Elm = document.getElementById(fName);
	var index = this.items.length;
	var val = this;

	this.items[index]={itemName:fName,itemType:fType,itemRequired:fRequired,itemElm:Elm};

	if (fType) {
		if (typeof(Validator.types[fType].event) == "function") {
			Validator.types[fType].event(Elm);
		} else {
			Elm.attachEvent(Validator.types[fType].event, function() {
				if (typeof(Validator.types[fType].format) == "function") {
					Validator.types[fType].format(window.event.srcElement);
				}
				if (typeof(Validator.types[fType].check) == "function") {
					val.check(index, window.event.srcElement);
				}

			});
		}
	} 
	
	//pre check the values
	this.check(index, Elm);
	

}

// check the field
Validator.prototype.check = function(fIndex, elm) {

	//check fro type
	if (this.items[fIndex].itemType) {
	
		//only validate on a value
		if (elm.value) {
			var error = !Validator.types[this.items[fIndex].itemType].check(elm);
		}
	
		if (this.items[fIndex].itemError != error) {
			this.items[fIndex].itemErrorchanged = true;
		} else {
			this.items[fIndex].itemErrorchanged = false;
		}
	
		this.items[fIndex].itemError = error;
		
		if (error == true) {
			Validator.display.error(this.items[fIndex]);
		} else {
			Validator.display.noerror(this.items[fIndex]);
		}
	}
	
	//check for required
	if (this.items[fIndex].itemRequired) {

		if (elm.value) {
			error = false;
		} else {
			error = true;
		}

		this.items[fIndex].itemRequiredError = error;
		Validator.display.required(this.items[fIndex]);
	}
}

//validate
Validator.prototype.validate = function(fSubmit) {
	var error = false;
	
	for (var i=0; i < this.items.length; i++) {
	
	    //format the values 
	    if (typeof(Validator.types[this.items[i].itemType].format) == "function") {
    	    Validator.types[this.items[i].itemType].format(this.items[i].itemElm);
    	}
	
		//check the fields again
		this.check(i,this.items[i].itemElm);
	
		//check for errors in check(expr)
		if (this.items[i].itemError == true) {
			error = true;
		}
		
		//check for errors in required
		if (this.items[i].itemRequiredError == true) {
			error = true;
		}
	}

	Validator.display.form(fSubmit, error);

	return !error;
}

Validator.types = [];
Validator.display = [];


