// to consolidate all error messages
var totalAlert="";

// form submit counter
var submitCounter=0;

// regular expressions used by checking functions
var reNonBlank=/[\S]/;
var reHexColor=/^#[0-9a-fA-F]{6}$/;
var reInt=/^\d+$/;
var reSignedInt=/^(\+|-)?\d+$/;
var reFloat=/^\d+(\,\d+)?$/;
var reSignedFloat=/^(\+|-)?\d+(\.\d+)?$/;
var reChar=/^[\w\-]+$/;
var reEMail=/^\w[\w\-\.]+\@\w[\w\-]+(\.[\w\-]+)+$/;
var reIP=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
var rePostalCA=/^(\w\d){3}$/;

function rpChar(f) {
  var df=f;

  df=df.replace(/\\/g, '\\\\');
  df=df.replace(/\//g, '\\\/');
  df=df.replace(/\[/g, '\\\[');
  df=df.replace(/\]/g, '\\\]');
  df=df.replace(/\(/g, '\\\(');
  df=df.replace(/\)/g, '\\\)');
  df=df.replace(/\{/g, '\\\{');
  df=df.replace(/\}/g, '\\\}');
  df=df.replace(/\</g, '\\\<');
  df=df.replace(/\>/g, '\\\>');
  df=df.replace(/\|/g, '\\\|');
  df=df.replace(/\*/g, '\\\*');
  df=df.replace(/\?/g, '\\\?');
  df=df.replace(/\+/g, '\\\+');
  df=df.replace(/\^/g, '\\\^');
  df=df.replace(/\$/g, '\\\$');

  return df;
}

function rePhone(f) {
  var df=rpChar(f);

  df=df.replace(/d/gi, '\\d');
  df=df.replace(/w/gi, '(\\w|\\d)');

  return new RegExp('^'+df+'$');
}

function reDate(f) {
  var df=rpChar(f);

  df=df.replace(/dd/gi, '\\d\\d');
  df=df.replace(/mm/gi, '\\d\\d');
  df=df.replace(/yyyy/gi, '\\d\\d\\d\\d');

  return new RegExp('^'+df+'$');
}

function reCharNM(n,m) {
  return new RegExp("\^[\\w\\-]{"+n+","+m+"}\$");
}

function reNumberN(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}\$");
}

function reNumberN2(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\$");
}

function reNumberNM(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}(\\.\\d{1,"+m+"})?\$");
}

function reNumberNM2(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\\.\\d{"+m+"}\$");
}

// wrapper functions
function _alertIt(msg, mode) {
  if (mode) {
    totalAlert+=msg+"\n";
  }
  else {
    totalAlert="";
    alert(msg);
  }
}

function _checkIt(re, field, msg, mode) {
  if (!re.test(field.value)) {
    _alertIt(msg, mode);

    if (field.select) {
      field.select();
    }
    if (field.focus) {
      field.focus();
    }

    return (mode && mode==1)?true:false;
  }

  return true;
}
function _checkIt_2(re, field) {
  if (!re.test(field.value)) {
   return false;
  }
  return true;
}

function noErrors() {
  if (totalAlert=="") {
    return true;
  }
  else {
    alert(totalAlert);
    totalAlert="";
    return false;
  }
}

// the checking functions

function isSelectSELECT(field,msg,mode) {
	if (field[0].selected) { 
		_alertIt(msg, mode); 
		if(mode == 0) {
		    if (field.focus) {
		      field.focus();
		    }
		}
		return false;
	} else {
		return true;
	}
}

function isSelectSELECT_2(field) {
	if (field[0].selected && field[0].value == '-') { 
		return false;
	} else {
		return true;
	}
}

function goodPhone(pf, field, msg, mode) {
  return _checkIt(rePhone(pf), field, msg, mode);
}

function goodPostalCA(field, msg, mode) {
  return _checkIt(rePostalCA, field, msg, mode);
}

function goodDate(df, field, msg, mode) {
  if (_checkIt(reDate(df), field, msg, mode?2:0)) {
    var di=field.value;
    var y4=df.search(/yyyy/i), y=di.substring(y4, y4+4)-0;
    var m2=df.search(/mm/i), m=di.substring(m2, m2+2)-1;
    var d2=df.search(/dd/i), d=di.substring(d2, d2+2)-0;

    var dd=new Date(y, m, d);
    if (y==dd.getFullYear() && m==dd.getMonth() && d==dd.getDate()) {
      return true;
    }
    else {
      _alertIt(msg, mode);

		if(mode == 0) {
		    if (field.focus) {
		      field.focus();
		    }
		}

    }
  }
}
function goodDateMA(df, field, msg, mode) {
  if (_checkIt(reDate(df), field, msg, mode?2:0)) {
    var di=field.value;
    var y4=df.search(/yyyy/i), y=di.substring(y4, y4+4)-0;
    var m2=df.search(/mm/i), m=di.substring(m2, m2+2)-1;

    var dd=new Date(y, m, 01);
    if (y==dd.getFullYear() && m==dd.getMonth()) {
      return true;
    }
    else {
      _alertIt(msg, mode);

		if(mode == 0) {
		    if (field.focus) {
		      field.focus();
		    }
		}

    }
  }
  return (mode && mode==1)?true:false;
}

function goodUF(Field,msg,mode,obrigatorio) {

	//if (isBlank(Field) && obrigatorio == 0) return true;

	var Estados = ".RS.SC.PR.SP.RJ.ES.MG.BA.AC.AL.AP.AM.CE.GO.MA.MT.MS.PA.PB.PE.PI.RN.RO.RR.SE.TO.";
	var teste = ((isBlank(Field) && obrigatorio == 1))? "--" : Field.value.toUpperCase();
	if (Estados.indexOf(teste) == -1){ 
		_alertIt(msg, mode); 
		if(mode == 0) {
		    if (Field.focus) {
		      Field.focus();
		    }
		}
		return false;
	} else {
		return true;
	}
}

function goodIP(field, msg, mode) {
  return _checkIt(reIP, field, msg, mode);
}

function isCampoMinimo(tamanho,field, msg, mode) {
	if(field.value.length < tamanho) {
		_alertIt(msg, mode);
		field.focus();
		return false; 
	} else {
		return true; 
   }
}

function goodChar(field, msg, mode) {
  return _checkIt(reChar, field, msg, mode);
}

function goodEMail(field, msg, mode) {
  return _checkIt(reEMail, field, msg, mode);
}

function goodInt(field, msg, mode) {
  return _checkIt(reInt, field, msg, mode);
}

function goodSignedInt(field, msg, mode) {
  return _checkIt(reSignedInt, field, msg, mode);
}

function goodFloat(field, msg, mode) {
  return _checkIt(reFloat, field, msg, mode);
}

function goodSignedFloat(field, msg, mode) {
  return _checkIt(reSignedFloat, field, msg, mode);
}

function goodIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,0), field, msg, mode);
}

function goodSignedIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,1), field, msg, mode);
}

function goodIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,0), field, msg, mode);
}

function goodSignedIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,1), field, msg, mode);
}

function goodCharLen(n, m, field, msg, mode) {
  return _checkIt(reCharNM(n,m), field, msg, mode);
}

function goodFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,0), field, msg, mode);
}

function goodSignedFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,1), field, msg, mode);
}

function goodFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,0), field, msg, mode);
}

function goodSignedFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,1), field, msg, mode);
}

function _rangeIt(field, r1, r2, msg, mode) {
  if (field.value>=r1 && field.value<=r2) {
    return true;
  }
  else {
    _alertIt(msg, mode);

    field.select();
    field.focus();

    return (mode && mode==1)?true:false;
  }
}

function rangeInt(field, r1, r2, msg, mode) {
  if (goodInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedInt(field, r1, r2, msg, mode) {
  if (goodSignedInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloat(field, r1, r2, msg, mode) {
  if (goodFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloat(field, r1, r2, msg, mode) {
  if (goodSignedFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeIntLen(n, field, r1, r2, msg, mode) {
  if (goodIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedIntLen(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeIntLen2(n, field, r1, r2, msg, mode) {
  if (goodIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedIntLen2(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function _dd(n) {
  return (n<10)?"0"+n:""+n;
}

function _getOffset(n) {
  var d=new Date();
  if (n!=0) {
    d.setTime(d.getTime()+n*86400000);
  }
  return d.getFullYear()+""+_dd(d.getMonth()+1)+""+_dd(d.getDate())+"";
}

function _stringIt(df, d) {
  var y4=df.search(/yyyy/i), m2=df.search(/mm/i), d2=df.search(/dd/i);
  return d.substring(y4, y4+4)+d.substring(m2, m2+2)+d.substring(d2, d2+2);
}

function rangeDate(df, field, r1, r2, msg, mode) {
  if (goodDate(df, field, msg, mode?2:0)) {
    var d=_stringIt(df, field.value);

    var r1x="", r2x="";
    if (r1.search(/^\d+$/)!=-1) {
      r1x=_getOffset(r1-0);
    }
    else {
      r1x=_stringIt(df, r1);
    }
    if (r2.search(/^\d+$/)!=-1) {
      r2x=_getOffset(r2-0);
    }
    else {
      r2x=_stringIt(df, r2);
    }

    if (d<r1x || d>r2x) {
      _alertIt(msg, mode);

      field.select();
      field.focus();
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodDateRange(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodDateRange2(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>=_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodHexColor(field, msg, mode) {
  return _checkIt(reHexColor, field, msg, mode);
}

function nonBlank(field, msg, mode) {
  return _checkIt(reNonBlank, field, msg, mode);
}

function nonBlank(field, msg, mode) {
  return _checkIt(reNonBlank, field, msg, mode);
}
function isBlank(field) {
  return !_checkIt_2(reNonBlank, field);
}

function goodRadioedFields(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re, form[form[fn][i].value], msgs[i], mode);
    }
  }

  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}

function goodRadioedFields2(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re[i], form[form[fn][i].value], msgs[i], mode);
    }
  }

  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}

function noBadWords(field, strict, words, msg, mode) {
  var lw=[], nwb=strict?'':'\\b';
  for (var i=0; i<words.length; i++) {
    lw[i]=nwb+words[i].toLowerCase()+nwb;
  }

  var re=new RegExp(lw.join("|"), "i");
  if (re.test(field.value)) {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
  else {
    return true;
  }
}

// -- Codigo Jorge -------------------------------

function filtra_num(evento){ // Permite somente números (IE)
	var tecla = evento.keyCode;
	if (tecla > 47 && tecla < 58){ // numeros de 0 a 9
		return true;
	}else{
		if (tecla != 8){ // backspace
			evento.keyCode = 0;
		}else{
			return true;
		}
	}
}

function isCampoExato(tamanho,field, msg, mode) {
	if(field.value.length == tamanho) {
		return true; 
	} else {
		_alertIt(msg, mode);
		field.focus();
		return false; 
    }
}

function isIdentic(field1,field2, msg, mode) {
	if(field1.value == field2.value) {
		return true; 
	} else {
		_alertIt(msg, mode);
		field1.focus();
		return false; 
    }
}

function isCheckedRadio(nom_rad, msg, mode){
	ck = -1;
	for (i=0; i < nom_rad.length; i++){
		if (nom_rad[i].checked){
			ck = i;
		}
	}
	if(ck != -1){
		return true; 
	}else{
		_alertIt(msg, mode);
		return false; 
	}
}

function isCheckedRadioIndex(nom_rad, index){
	if (nom_rad[index].checked){
		return true; 
	}else{
		return false; 
	}
}


// Checar se um campo combo está na seleção padrão

function isModifSELECT(combofield) {
	return (!combofield[0].selected);
}

// formata data no campo de formulario (IE)

function formataData(evento) { 
	var tecla = evento.keyCode;
	vr = event.srcElement.value;
	vr = vr.replace( ".", "" );
	vr = vr.replace( "/", "" );
	vr = vr.replace( "/", "" );
	tam = vr.length + 1;
	if ( tecla != 9 && tecla != 8 ){
		if ( tam > 2 && tam < 5 ){
			event.srcElement.value = vr.substr( 0, tam - 2  ) + '/' + vr.substr( tam - 2, tam );
		}
		if ( tam >= 5 && tam <= 10 ){
			event.srcElement.value = vr.substr( 0, 2 ) + '/' + vr.substr( 2, 2 ) + '/' + vr.substr( 4, 4 );
		 }
	}
}
//=============================================================================================

// Validação de CNPJ (**** Jorge ****)
function validaCNPJ(field, msg, mode){
    CNPJ = field.value;
    //substituir os caracteres que não são números
    if(document.layers && parseInt(navigator.appVersion) == 4){
        x = CNPJ.substring(0,2);
        x += CNPJ. substring (3,6);
        x += CNPJ. substring (7,10);
        x += CNPJ. substring (11,15);
        x += CNPJ. substring (16,18);
        CNPJ = x;
    }else{
        CNPJ = CNPJ. replace (".","");
        CNPJ = CNPJ. replace (".","");
        CNPJ = CNPJ. replace ("-","");
        CNPJ = CNPJ. replace ("/","");
    }
    var a = [];
    var b = new Number;
    var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
    for (i=0; i<12; i++){
        a[i] = CNPJ.charAt(i);
        b += a[i] * c[i+1];
    }
    if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
    b = 0;
    for (y=0; y<13; y++) {
        b += (a[y] * c[y]);
    }
    if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
    if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
    	_alertIt(msg, mode);
		field.focus();
        return false;
    }
    return true;
}

// Validação de CPF (**** Jorge ****)
function validaCPF(field, msg, mode) {
    CPF = field.value;
    if (CPF == "00000000000" || CPF == "11111111111" || CPF == "22222222222" || CPF == "33333333333" || CPF == "44444444444" || CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" || CPF == "88888888888" || CPF == "99999999999"){
    	_alertIt(msg, mode);
		field.focus();
        return false;
    }
    var a = [];
    var b = new Number;
    var c = 11;
    for (i=0; i<11; i++){
            a[i] = CPF.charAt(i);
            if (i < 9) b += (a[i] * --c);
    }
    if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
    b = 0;
    c = 11;
    for (y=0; y<10; y++) b += (a[y] * c--);
    if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
    if ((CPF.charAt(9) != a[9]) || (CPF.charAt(10) != a[10])){
    	_alertIt(msg, mode);
		field.focus();
        return false;
    }
    return true;
}
// Função para colocar barras e filtrar números em campo data
function data_formata_barras(campo_data, tecla_evento){
	separador='/';
	tecla=tecla_evento.keyCode;
	valor_data=campo_data.value.split('');
	data_formatada='';
	i=0;
	while(i < valor_data.length){
		caractere=valor_data[i];
		numeros=/^\d+$/;
		if(numeros.test(caractere) || caractere==separador){
			data_formatada+=String(caractere);
		}
		if((data_formatada.length==2 || data_formatada.length==5) && tecla!=8){
			data_formatada+=separador; i++;
		}
		i++;
	}
	campo_data.value=data_formatada;
}
