/**
 * sfCNPJValidator valida se o CNPJ informado e verdadeiro.
 * 
 * Optional parameters:
 *  # cnpj_error - [Invalid input] - mensagem usada quando o cnpj não é valido #
 * cnpj_nan_error - [Invalid input] - mensagem usada quando o é inserido
 */
/* Construtor */
var sfCNPJValidator = function() {
	this.cnpj_error = "CNPJ inválido";
	this.cnpj_nan_error = "Deve ser inserido apenas números";
}

sfCNPJValidator.prototype.execute = function(value) {

	value = value.replace(/[^0-9]/g, '');
	var cnpjCalc = value.substr(0, 12);
	var cnpjSoma = 0;
	var cnpjDigit = 0;
	var digit = "";
	
	if(parseInt(value) == 00000000000000) {
		return this.cnpj_error;
	}

	for (i = 0; i < 4; i++) {
		cnpjSoma = cnpjSoma + parseInt(cnpjCalc.charAt(i)) * (5 - i);
	}

	for (i = 0; i < 8; i++) {
		cnpjSoma = cnpjSoma + parseInt(cnpjCalc.charAt(i + 4)) * (9 - i);
	}

	cnpjDigit = 11 - cnpjSoma % 11;

	if ((cnpjDigit == 10) || (cnpjDigit == 11)) {
		cnpjCalc = cnpjCalc + "0";
	} else {
		digit = digit + cnpjDigit;
		cnpjCalc = cnpjCalc + (digit.charAt(0));
	}

	cnpjSoma = 0;

	for (i = 0; i < 5; i++) {
		cnpjSoma = cnpjSoma + parseInt(cnpjCalc.charAt(i)) * (6 - i);
	}

	for (i = 0; i < 8; i++) {
		cnpjSoma = cnpjSoma + parseInt(cnpjCalc.charAt(i + 5)) * (9 - i);
	}

	cnpjDigit = 11 - cnpjSoma % 11;

	if ((cnpjDigit == 10) || (cnpjDigit == 11)) {
		cnpjCalc = cnpjCalc + "0";
	} else {
		digit = "";
		digit = digit + cnpjDigit;
		cnpjCalc = cnpjCalc + (digit.charAt(0));
	}
	if (value != cnpjCalc) {
		return this.cnpj_error;
	}
	return false;
}

/**
 * sfCPFValidator valida se o CPF informado e verdadeiro.
 * 
 * Optional parameters:
 *  # cpf_error - [Invalid input] - mensagem usada quando o cpf não é valido #
 * cpf_nan_error - [Invalid input] - mensagem usada quando o é inserido
 */

/* Construtor */
var sfCPFValidator = function() {
	this.cpf_error = "CPF inválido";
	this.cpf_nan_error = "Deve ser inserido apenas números";
}

sfCPFValidator.prototype.execute = function(value) {
	value = value.replace(/[^0-9]/g, '');
	var cpfCalc = value.substr(0, 9);
	var cpfSoma = 0;
	var cpfDigit = 0;
	var digit = "";

	if ( (cpfCalc == 000000000) || (cpfCalc == 111111111) ||
	     (cpfCalc == 222222222) || (cpfCalc == 333333333) ||
	     (cpfCalc == 444444444) || (cpfCalc == 555555555) ||
	     (cpfCalc == 666666666) || (cpfCalc == 777777777) ||
	     (cpfCalc == 888888888) || (cpfCalc == 999999999) ||
	     (cpfCalc == 123456789)
	     ) {
		return this.cpf_error;
	}

	for (i = 0; i < 9; i++) {
		cpfSoma = cpfSoma + parseInt(cpfCalc.charAt(i)) * (10 - i)
	}

	cpfDigit = 11 - cpfSoma % 11;

	if (cpfDigit > 9) {
		cpfCalc = cpfCalc + "0";
	} else {
		digit = digit + cpfDigit;
		cpfCalc = cpfCalc + digit.charAt(0);
	}

	cpfSoma = 0;

	for (i = 0; i < 10; i++) {
		cpfSoma = cpfSoma + parseInt(cpfCalc.charAt(i)) * (11 - i)
	}

	cpfDigit = 11 - cpfSoma % 11;

	if (cpfDigit > 9) {
		cpfCalc = cpfCalc + "0";
	} else {
		digit = "";
		digit = digit + cpfDigit;
		cpfCalc = cpfCalc + digit.charAt(0);
	}

	if (value != cpfCalc) {
		return this.cpf_error;
	}
	return false;
}

/**
 * sfEmailValidator verifies a parameter contains a value that qualifies as an
 * email address.
 * 
 * Optional parameters:
 *
 * # email_error - [Invalid input] - An error message to use when the
 *                                          input is not an email address
 */

/* Constructor */
var sfFoneValidator=function() {
  this.msg = "Número de telefone com formato inválido.";
}

sfFoneValidator.prototype.execute=function(value) {
  regExp  = /^([0-9]{4}[\-][0-9]{4})$|^$/;
  if ( regExp.test(value) ) {
    return false;
  } else {
    return this.msg;
  }
}

/**
 * sfDateValidator verifies a parameter contains a value that qualifies as an
 * date.
 * 
 * Optional parameters:
 *
 * # msg - [Invalid input] - An error message to use when the input is not an valid date
 * # compare - Campo pelo qual se deseja fazer a comparação
 * # compare_erro - Mensagem de erro que será exibida caso os valores das datas comparadas sejam incompatíveis
 * # operator - operador de comparação para o parametro compare
 * # dtAtual - Operador de comparação da data atual
 * # dtAtual_erro - Mensagem de erro que será exibida caso a data comparada não esteja compatível com a atual
 */

/* Constructor */
var sfDateValidator=function() {
  this.date_error = "Data inválida.";
  this.compare    = "";
  this.operator   = "";
  this.compare_error = "Datas incompatíveis";
  this.dtAtual = "";
  this.dtAtual_error = "";
}

sfDateValidator.prototype.execute=function(value) {
  regExp  = /^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
  /* Verifica se a data é válida */
  if ( !regExp.test(value) ) {
    return this.date_error;
  }
  value1   = value.substr(6, 4)+""+value.substr(3, 2)+""+value.substr(0, 2);
  /* Verifica se a data é válida */
  if(this.compare != "" && this.operator != ""){
	  value2 = sfGetElementByName(this.compare);
	  value2 = value2.value.substr(6, 4)+""+value2.value.substr(3, 2)+""+value2.value.substr(0, 2);
	  
	  switch(this.operator){
	  	case '>':
	  		if(value1>value2){
	  			return this.compare_error;
	  		}
	  		break;
	  	case '>=':
	  		if(value1>=value2){
	  			return this.compare_error;
	  		}
	  		break;
	  	case '==':
	  		if(value1==value2){
	  			return this.compare_error;
	  		}
	  		break;
	  	case '<=':
	  		if(value1<=value2){
	  			return this.compare_error;
	  		}
	  		break;
	  	case '<':
	  		if(value1<value2){
	  			return this.compare_error;
	  		}
	  		break;
	  	default:
	  		return "Operador de comparação de data inválido.";
	  }
  }

  if(this.dtAtual != "" && this.dtAtual_error != ""){
	  var now = new Date();
	  dia = now.getDate();
	  mes = now.getMonth()+1;
	  if(dia.toString().length==1){ dia = "0"+dia; }
	  if(mes.toString().length==1){ mes = "0"+mes; }
	  value2 = now.getFullYear()+""+mes+""+dia;
	  switch(this.dtAtual){
	  	case '>':
	  		if(value1>value2){
	  			return this.dtAtual_error;
	  		}
	  		break;
	  	case '>=':
	  		if(value1>=value2){
	  			return this.dtAtual_error;
	  		}
	  		break;
	  	case '==':
	  		if(value1==value2){
	  			return this.dtAtual_error;
	  		}
	  		break;
	  	case '<=':
	  		if(value1<=value2){
	  			return this.dtAtual_error;
	  		}
	  		break;
	  	case '<':
	  		if(value1<value2){
	  			return this.dtAtual_error;
	  		}
	  		break;
	  	default:
	  		return "Operador de comparação de data inválido.";
	  }
  }
  
  return false;
}

var sfGetElementByName=function(name){
	return $(name.replace('[', '_').replace(']', ''));
}