var Validator = function(form, errout) {
	var object  = this;
	this.form   = form;
	this.errout = (errout == undefined) ? null : errout;
	this.error  = '';
	this.values = new Array();
	this.rules  = new Array();
	this.setRules();
    $('#'+form).submit(function() {return object.validate();}); 
}

Validator.prototype.setRules = function() {
	if (Rules != undefined) {
		this.rules = Rules;
		return true;
	}
	return false;
}

Validator.prototype.rule = function(name, rule, error) {
	this.values.push({name: name, type: 'rule', rule: rule, error: error});
	return true;
}

Validator.prototype.min = function(name, min, error) {
	this.values.push({name: name, type: 'min', min: min, error: error});
	return true;
}

Validator.prototype.max = function(name, max, error) {
	this.values.push({name: name, type: 'max', max: max, error: error});
	return true;
}

Validator.prototype.minmax = function(name, min, max, error) {
	this.values.push({name: name, type: 'minmax', min: min, max: max, error: error});
	return true;
}

Validator.prototype.minlen = function(name, min, error) {
	this.values.push({name: name, type: 'minlen', min: min, error: error});
	return true;
}

Validator.prototype.maxlen = function(name, max, error) {
	this.values.push({name: name, type: 'maxlen', max: max, error: error});
	return true;
}

Validator.prototype.minmaxlen = function(name, min, max, error) {
	this.values.push({name: name, type: 'minmaxlen', min: min, max: max, error: error});
	return true;
}

Validator.prototype.checked = function(name, error) {
	this.values.push({name: name, type: 'checked', error: error});
	return true;
}

Validator.prototype.compare = function(name, comp_name, error) {
	this.values.push({name: name, type: 'compare', comp_name: comp_name, error: error});
	return true;
}

Validator.prototype.validate = function() {
	for (var i = 0; i < this.values.length; i++) {
		var elem  = $('#'+this.form+' *[@name='+this.values[i].name+']');
		var value = $.trim(elem.val());
		switch (this.values[i].type) {
			case 'rule':
				if (! this.rules[this.values[i].rule].test(value)) this.setError(this.values[i].error);
				break;
			case 'min':
				value = (parseFloat(value)) ? parseFloat(value): 0;
				if (value < this.values[i].min) this.setError(this.values[i].error);
				break;
			case 'max':
				value = (parseFloat(value)) ? parseFloat(value): 0;
				if (value > this.values[i].max) this.setError(this.values[i].error);
				break;
			case 'minmax':
				value = (parseFloat(value)) ? parseFloat(value): 0;
				if (value < this.values[i].min || value > this.values[i].max) this.setError(this.values[i].error);
				break;		
			case 'checked':
				value = (elem.attr('checked') == undefined) ? false : elem.attr('checked');
				if (value != true) this.setError(this.values[i].error); 
				break;	
			case 'minlen':
				if (value.length < this.values[i].min) this.setError(this.values[i].error);
				break; 
			case 'maxlen':
				if (value.length > this.values[i].max) this.setError(this.values[i].error);
				break;   
			case 'minmaxlen':
				if (value.length < this.values[i].min || value.length > this.values[i].max) this.setError(this.values[i].error);
				break; 
			case 'compare': 
				var comp_elem = $('#'+this.form+' *[@name='+this.values[i].comp_name+']');
				var comp_val  = $.trim(comp_elem.val());
				if (value != comp_val) this.setError(this.values[i].error);
				break;
		}
	}
	return this.showError();
}

Validator.prototype.setError = function(error) {
	if (this.errout == null) this.error = this.error + error + "\n";
	else this.error = this.error + error + "<br />";
	return true;
}

Validator.prototype.showError = function() {
	if (this.error == '') return true;
	if (this.errout == null)
		alert(this.error);
	else 
		$('#'+this.errout).html(this.error);
	this.error = '';
	return false;
}

