var validation = new Validation();
var validationPopin = new Validation();

function Field(id, label, message) {
	this.id = id;
	this.label = label;
	this.message = new Array();
	this.validationFunction = new Array();
	this.formObject = null;
	this.functionCount = 0;

	var init = 3;
	if (message instanceof Function) {
		init = 2;
	} 
	
	for (i = init; i < arguments.length; i ++) {
		this.validationFunction.push(arguments[i]);
		if (message instanceof Array) {
			this.message[(i - init)] = message[(i - init)];
		} else if (!message instanceof Function){
			this.message[(i - init)] = message;
		}
	}
	this.functionCount = 0;
}

Field.prototype.addMessage = function (message) {
	if (this.message[this.functionCount] == null || this.message[this.functionCount] == "") {
		this.message[this.functionCount] = message;
		this.functionCount ++;
	}
};

function Validation() {
	this.form = null;
	this.fields = new Array();
}

Validation.prototype.removeField = function (idField) {
	var fields = new Array();
	for(i = 0; i < this.fields.length; i++){
		if (this.fields[i].id != idField){
			fields.push(this.fields[i]);
		}
	}
	this.fields = fields
};

Validation.prototype.addField = function (field) {
	this.fields.push(field);
};

Validation.prototype.validate = function (form) {
	if (this.fields.length > 0) {
		this.form = form;
		var error = "<br>";
		var totalError = 0;
		for (i in this.fields) {
			var field = this.fields[i];
			field.formObject = form.elements[field.id];
			for(func in field.validationFunction) {
				field.functionCount = func;
				if (!field.validationFunction[func](field)) {
					totalError ++;
					error += "<li class=\"error\">" + field.message[func] + "</li>";
				}
			}
		}
		
		if (totalError > 0) {
			//showTopMessage(error);
			showErrorMessagePopin(error)
		}
		
		return totalError == 0;
	}
	return true;
};

Validation.prototype.isEmpty = function (field) {
	field.addMessage("O campo \"" + field.label + "\" &eacute; obrigat&oacute;rio");
	if (field.formObject == null || field.formObject.value.trim().length == 0 || isFormObjectEmpty(field.formObject)) {
		return false;
	}	
		
	return true;
};

Validation.prototype.isLegalAge = function(field) {
	field.addMessage("O Prestador precisa ser maior de 18 anos");
	
	var now = new Date();
	var eighteenYearsAgo = new Date(parseInt((now.getYear() - 18), 10), now.getMonth(), now.getDate());
	var dataNasc = getDateFromString(field.formObject.value);
	
	return (eighteenYearsAgo > dataNasc);
	
};

Validation.prototype.isBetweenDate = function(field, date1, date2) {
	field.addMessage("A data deve estar entre " + getStringFromDate(date1) + " e " + getStringFromDate(date2));

	var data = getDateFromString(field.formObject.value);
	
	return (date1 < data && data < date2);
};

Validation.prototype.isBiggerDate = function(field, date1) {
	field.addMessage("A \"" + field.label + "\" tem que ser menor que " + getStringFromDate(date1));
	var data = getDateFromString(field.formObject.value);
	if (data == null || date1 == null) {
		return true;
	}
	return data < date1;
};

Validation.prototype.isLessEqualDate = function(field, date1) {
	field.addMessage("A \"" + field.label + "\" tem que ser menor que " + getStringFromDate(date1));
	var data = getDateFromString(field.formObject.value);
	if (data == null || date1 == null) {
		return true;
	}
	return data <= date1;
};


Validation.prototype.isValidDate = function(field) {
	field.addMessage(field.label + " Inv&aacute;lida");
	if (field.formObject && field.formObject.value != "") {
		return getDateFromString(field.formObject.value) != null;
	}
	return true;
};
Validation.prototype.isValidEmail = function(field) {
	field.addMessage("Email Inv&aacute;lido");
	if (field.formObject.value != "") {
		var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		return emailPattern.test(field.formObject.value);
	}
	return true;
};

function isFormObjectEmpty(obj) {
	
	var isChecked = false;
	if(obj.length > 0 && (obj[0].type == "radio" || obj[0].type == "checkbox")) {
		
		for (c = 0; c < obj.length; c ++) {
			if (obj[c].checked) {
				isChecked = true;
				break;
			}
		}
	} else {
		
		if (obj.type == "radio" || obj.type == "checkbox") {
			isChecked = obj.checked;
		} else if (obj.value != "") {
			isChecked = true;
		}
	}
	
	return !isChecked;
}
