// Generic Form Validation
// Jacob Hage (jacob@hage.dk)
var checkObjects	= new Array();
var errors		= "";
var returnVal		= false;
var language		= new Array();
//
//language["header"]	= "The following error(s) occured:"
//language["start"]	= "->";
//language["field"]	= " Field ";
//language["require"]	= " is required";
//language["min"]	= " and must consist of at least ";
//language["max"]	= " and must not contain more than ";
//language["minmax"]	= " and no more than ";
//language["chars"]	= " characters";
//language["num"]	= " and must contain a number";
//language["email"]	= " must contain a valid e-mail address";
//

language["header"]	= "Ocorreram os seguintes erros:"
language["start"]	= "->";
language["field"]	= " Campo ";
language["field2"]	= " Field ";
language["require"]	= " é obrigatório";
language["require2"]	= " required";
language["min"]		= " e deve possuir pelo menos  ";
language["max"]		= " e não deve possuir mais do que ";
language["minmax"]	= " e não mais que ";
language["chars"]	= " caracteres";
language["num"]		= " e deve possuir números";
language["email"]	= " deve possuir um endereço de e-mail válido";
language["email2"]	= " must have a valid e-mail address";

// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n, type, HTMLname, min, max, d) {
var p;
var i;
var x;
if (!d) d = document;
if ((p=n.indexOf("?"))>0&&parent.frames.length) {
  d = parent.frames[n.substring(p+1)].document;
  n = n.substring(0,p);
}
if (!(x = d[n]) && d.all) x = d.all[n];
  for (i = 0; !x && i < d.forms.length; i++) {
    x = d.forms[i][n];
  }
  for (i = 0; !x && d.layers && i < d.layers.length; i++) {
    x = define(n, type, HTMLname, min, max, d.layers[i].document);
    return x;
  }
eval("V_"+n+" = new formResult(x, type, HTMLname, min, max);");
checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function formResult(form, type, HTMLname, min, max) {
this.form = form;
this.type = type;
this.HTMLname = HTMLname;
this.min  = min;
this.max  = max;
}

function validate() {
if (checkObjects.length > 0) {
  errorObject = "";
  for (i = 0; i < checkObjects.length; i++) {
    validateObject = new Object();
    validateObject.form = checkObjects[i].form;
    validateObject.HTMLname = checkObjects[i].HTMLname;
    validateObject.val = checkObjects[i].form.value;
    var valor = Trim(checkObjects[i].form.value)
    //validateObject.len = checkObjects[i].form.value.length;
    validateObject.len = valor.length;
    validateObject.min = checkObjects[i].min;
    validateObject.max = checkObjects[i].max;
    validateObject.type = checkObjects[i].type;
    if (validateObject.type == "num" || validateObject.type == "string") {
      if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
		// -------------------------------------------------------------------------------
		// As linhas abaixo foram incluídas para que apareça somente uma mensagem por vez.
		alert(errors);
		errors = "";
		returnVal = false;
		return;
		// -------------------------------------------------------------------------------
      }
      else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
    }
    else if(validateObject.type == "email") {
      // Checking existense of "@" and ".".
      // Length of must >= 5 and the "." must
      // not directly precede or follow the "@"
      if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") || (validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")) { 
	    errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n";
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
    }
 }
}
// As linhas abaixo servem para mostrar todos os erros de uma vez.
// Para isso é necessário retirar as linhas que foram acrescentadas
// na observação acima
if (errors) {
  alert(language["header"].concat("\n" + errors));
  errors = "";
  returnVal = false;
}
else {
  returnVal = true;
}
}


//////NOVA VERSÃO/////////
function define2(n, type, HTMLname, HTMLname2, ingles, min, max, d) {
var p;
var i;
var x;
if (!d) d = document;
if ((p=n.indexOf("?"))>0&&parent.frames.length) {
  d = parent.frames[n.substring(p+1)].document;
  n = n.substring(0,p);
}
if (!(x = d[n]) && d.all) x = d.all[n];
  for (i = 0; !x && i < d.forms.length; i++) {
    x = d.forms[i][n];
  }
  for (i = 0; !x && d.layers && i < d.layers.length; i++) {
    x = define2(n, type, HTMLname, HTMLname2, ingles, min, max, d.layers[i].document);
    return x;
  }
eval("V_"+n+" = new formResult2(x, type, HTMLname, HTMLname2, ingles, min, max);");
checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function formResult2(form, type, HTMLname, HTMLname2, ingles, min, max) {
this.form = form;
this.type = type;
this.HTMLname = HTMLname;
this.HTMLname2 = HTMLname2;
this.ingles = ingles;
this.min  = min;
this.max  = max;
}

function validate2() {
if (checkObjects.length > 0) {
  errorObject = "";
  for (i = 0; i < checkObjects.length; i++) {
    validateObject = new Object();
    validateObject.form = checkObjects[i].form;
    validateObject.HTMLname = checkObjects[i].HTMLname;
    validateObject.HTMLname2 = checkObjects[i].HTMLname2;
    validateObject.ingles = checkObjects[i].ingles;
    validateObject.val = checkObjects[i].form.value;
    var valor = Trim(checkObjects[i].form.value)
    //validateObject.len = checkObjects[i].form.value.length;
    validateObject.len = valor.length;
    validateObject.min = checkObjects[i].min;
    validateObject.max = checkObjects[i].max;
    validateObject.type = checkObjects[i].type;
    if (validateObject.type == "num" || validateObject.type == "string") {
      if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
        if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['require2'] + language['num'] + "\n"; }
		// -------------------------------------------------------------------------------
		// As linhas abaixo foram incluídas para que apareça somente uma mensagem por vez.
		alert(errors);
		errors = "";
		returnVal = false;
		return;
		// -------------------------------------------------------------------------------
      }
      else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
        if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['require2'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n"; }
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
        if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['require2'] + language['min'] + validateObject.min + language['chars'] + "\n"; }
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
        if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['require2'] + language['max'] + validateObject.max + language['chars'] + "\n"; }
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
      else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) {
        errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
        if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['require2'] + "\n"; }
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
    }
    else if(validateObject.type == "email") {
      // Checking existense of "@" and ".".
      // Length of must >= 5 and the "." must
      // not directly precede or follow the "@"
      if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") || (validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")) { 
	    errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n";
            if (validateObject.ingles == 1) { errors += language['start'] + language['field2'] + validateObject.HTMLname2 + language['email2'] + "\n"; }
		alert(errors);
		errors = "";
		returnVal = false;
		return;
      }
    }
 }
}
// As linhas abaixo servem para mostrar todos os erros de uma vez.
// Para isso é necessário retirar as linhas que foram acrescentadas
// na observação acima
if (errors) {
  alert(language["header"].concat("\n" + errors));
  errors = "";
  returnVal = false;
}
else {
  returnVal = true;
}
}
//////////////////////////



////////////////////////// CPF ////////////////////////////////////
function checkCPF(strNumber)
{
   CPF = strNumber
   CPF = CPF.split(".").join("");
   CPF = CPF.split("-").join("");

	if (CPF.length != 11 || CPF == "00000000000" || CPF == "11111111111" ||
		CPF == "22222222222" ||	CPF == "33333333333" || CPF == "44444444444" ||
		CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" ||
		CPF == "88888888888" || CPF == "99999999999")
		return false;
	soma = 0;
	for (i=0; i < 9; i ++)
		soma += parseInt(CPF.charAt(i)) * (10 - i);
	resto = 11 - (soma % 11);
	if (resto == 10 || resto == 11)
		resto = 0;
	if (resto != parseInt(CPF.charAt(9)))
		return false;
	soma = 0;
	for (i = 0; i < 10; i ++)
		soma += parseInt(CPF.charAt(i)) * (11 - i);
	resto = 11 - (soma % 11);
	if (resto == 10 || resto == 11)
		resto = 0;
	if (resto != parseInt(CPF.charAt(10)))
		return false;
//        alert('Correto');
	return true;
}
////////////////////////// CPF ////////////////////////////////////

////////////////////////// CNPJ ////////////////////////////////////
function getNumber(strNumber)
{
   var number;
   var strRetNumber="";
 
   for (var i=0 ; i < strNumber.length ; i++)
   {
      number = parseInt(strNumber.charAt(i));
      if ( number )
      {
         strRetNumber += strNumber.charAt(i)
      }
      else
      {
         if ( number == 0 )
         {
            strRetNumber += strNumber.charAt(i)
         }
      }
   }
   return strRetNumber;
}

function check1( value )
{
   var count = 1;
   var len = value.length;
   var first;
   if ( len > 1 )
   {
      first = value.charAt( 0 );
   }
   else
   {
      return false;
   }
   for ( var i = 1; i < value.length ; i++ )
   {
      if ( value.charAt( i ) == first )
      {
         count++;
      }
   }

   if ( count == len )
   {
      return false;
   }
      
   return true;
}

function checkCNPJ(cnpj)
{ 
   var cnpjCalc; 
   var cnpjAdd; 
   var i; 
   var cnpjDigit; 
   
   cnpj = getNumber( cnpj , 14 );
      
   check1( cnpj );
 
   // Get only numeric digits
   cnpjCalc = cnpj.substring( 0 , 12 );
      
   // First part of digit verification
   cnpjAdd = 0; 
   for( i = 0 ; i < 4 ; i++ ) 
   { 
      cnpjAdd += parseInt( cnpjCalc.substring( i , i + 1 ) ) * (5 - i); 
   } 
 
   for( i = 0 ; i < 8 ; i++ ) 
   { 
      cnpjAdd += parseInt( cnpjCalc.substring( i + 4 , i + 4 + 1 ) ) * (9 - i); 
   } 
      
   // Fisrt digit
   cnpjDigit = 11 - (cnpjAdd % 11); 
       
   if ( cnpjDigit == 10 || cnpjDigit == 11 ) 
   { 
      cnpjCalc += '0'; 
   } 
   else 
   { 
      cnpjCalc += cnpjDigit; 
   } 
      
   // Second part of digit verification
   cnpjAdd = 0; 
   for ( i = 0 ; i < 5 ; i++ ) 
   { 
      cnpjAdd += parseInt( cnpjCalc.substring( i , i + 1 ) ) * (6 - i); 
   } 
   for ( i = 0 ; i < 8 ; i++ ) 
   { 
      cnpjAdd += parseInt( cnpjCalc.substring( i + 5, i + 5 + 1 ) ) * (9 - i); 
   } 
      
   // Second digit
   cnpjDigit = 11 - (cnpjAdd % 11); 
   if ( cnpjDigit == 10 || cnpjDigit == 11 ) 
   { 
      cnpjCalc += '0'; 
   } 
   else 
   { 
      cnpjCalc += cnpjDigit; 
   } 
   
   return ( cnpj == cnpjCalc ); 
}
////////////////////////// CNPJ ////////////////////////////////////
function Trim(TRIM_VALUE){
   if(TRIM_VALUE.length < 1){
      return"";
   }
   TRIM_VALUE = RTrim(TRIM_VALUE);
   TRIM_VALUE = LTrim(TRIM_VALUE);
   if(TRIM_VALUE==""){
      return "";
   }
   else{
      return TRIM_VALUE;
   }
} //End Function

function RTrim(VALUE){
    var w_space = String.fromCharCode(32);
    var v_length = VALUE.length;
    var strTemp = "";
    if(v_length < 0){
        return"";
    }
    var iTemp = v_length -1;

    while(iTemp > -1){
        if(VALUE.charAt(iTemp) == w_space){
        }
        else{
            strTemp = VALUE.substring(0,iTemp +1);
            break;
        }
        iTemp = iTemp-1;

    } //End While
    return strTemp;
} //End Function

function LTrim(VALUE){
    var w_space = String.fromCharCode(32);
    if(v_length < 1){
        return"";
    }
    var v_length = VALUE.length;
    var strTemp = "";

    var iTemp = 0;

    while(iTemp < v_length){
        if(VALUE.charAt(iTemp) == w_space){
        }
        else{
            strTemp = VALUE.substring(iTemp,v_length);
            break;
        }
        iTemp = iTemp + 1;
    } //End While
    return strTemp;
} //End Function
