if (!self.g_IS)g_IS= new Is()
	function getStyle(obj){
		if (g_IS.w3c) return obj.style;
		else return obj;
}
function Is() {
    var agent = navigator.userAgent.toLowerCase();
	this.major = parseInt(navigator.appVersion);
    this.minor = parseFloat(navigator.appVersion);
    this.ns  = ((agent.indexOf('mozilla')!=-1) && ((agent.indexOf('spoofer')==-1) && (agent.indexOf('compatible') == -1)));
    this.ns2 = (this.ns && (this.major == 2));
    this.ns3 = (this.ns && (this.major == 3));
    this.ns4b = (this.ns && (this.minor < 4.04));
    this.ns4 = ((this.ns && (this.major >= 4))&&!(agent.indexOf('netscape6')!=-1));
	this.gek = (agent.indexOf('gecko')!=-1);
	this.ns6 = (agent.indexOf('netscape6')!=-1);
    this.ie   = (agent.indexOf("msie") != -1);
    this.ie3  = (this.ie && (this.major == 2));
    this.ie4  = (this.ie && (this.major == 4));
    this.ie5  = (this.ie && (this.major >= 4));
    this.op  =  (agent.indexOf("opera") != -1);
	this.w3c = ((agent.indexOf('netscape6')!=-1)||(this.ie && (this.major >= 4)));
}
if (g_IS.ns4){
   g_sSTYLE_REF 			= "";
   g_sDOC_REF 				= "document.layers";
   g_sDOC					= "document.";		// Netscape aceita visibility igual ao Explorer:
   g_sVISIBLE_REF 			= "show";			// setar style visibility como 'visible' ou 'hidden' 
   g_sHIDE_REF				= "hide";			// buscar eh que tem diferenca 'show' e 'hide'g_sSTYLE_REF 			= ".style";
}
else{
   g_sSTYLE_REF				= ".style";
   g_sDOC_REF 				= "document.all";
   g_sDOC					= "";
   g_sVISIBLE_REF 			= "visible";
   g_sHIDE_REF 				= "hidden";		   
}


// Example: obj = findObj("image1");
function findObj(theObj, theDoc)
{
  var p, i, foundObj;
  
  if(!theDoc) theDoc = document;
  if( (p = theObj.indexOf("?")) > 0 && parent.frames.length)
  {
    theDoc = parent.frames[theObj.substring(p+1)].document;
    theObj = theObj.substring(0,p);
  }
  if(!(foundObj = theDoc[theObj]) && theDoc.all) foundObj = theDoc.all[theObj];
  for (i=0; !foundObj && i < theDoc.forms.length; i++) 
    foundObj = theDoc.forms[i][theObj];
  for(i=0; !foundObj && theDoc.layers && i < theDoc.layers.length; i++) 
    foundObj = findObj(t1eObj,theDoc.layers[i].document);
  if(!foundObj && document.getElementById) foundObj = document.getElementById(theObj);
  
  return foundObj;
}

function isObject(obj){var stobj= typeof obj;return (stobj.indexOf("object")>=0);}
function isString(obj){var stobj= typeof obj;return (stobj.indexOf("string")>=0);}
function isDate(obj) {return (obj&&obj.year)?true:false;}
function isArray(obj){return (obj&&obj.sort)?true:false}


function Numerico(Bflag){
  var Tecla = window.event.keyCode;
  event.cancelBubble = true;

  if (Bflag){ // Somente numeros, espaço, barra ou ífem
  	if((Tecla > 47 && Tecla < 58) || Tecla == 32 || Tecla == 45 || Tecla == 47)
    	event.returnValue = true;
    else
    	event.returnValue = false;
  }
  else { // Somente letras
	  if((Tecla > 57) || (Tecla == 32))
		event.returnValue = true;
	  else
		event.returnValue = false;   
   }
}

function SomenteNumerico(){
  var Tecla = window.event.keyCode;
  event.cancelBubble = true;

  if (Tecla > 47 && Tecla < 58)
  	event.returnValue = true;
  else
  	event.returnValue = false;
}

function CapturaEventoNetscape(){
	if (navigator.appName == "Netscape"){
		document.captureEvents(Event.KEYPRESS);
		document.onkeypress = Resto;
		return true;
	}
}

function DesligaCapturaNetscape(){
	if (navigator.appName == "Netscape")
		document.releaseEvents(Event.KEYPRESS);
	return true;
}

function Resto(event){
    var Tecla = event.which;
    if (Tecla == null) Tecla = event.keyCode;

	if (Tecla == 13){
		Valida();
		return false;	
	}
  	event.cancelBubble = true;

  	if ((Tecla > 47 && Tecla < 58)){ // Somente numeros
		return true
  	}	
 	return false;
}

function comparaCampos(campo1,campo2,bmsg,msg){
	if ((campo1.value) == campo2.value){
		return true;
	}
	else {
		if(bmsg) alert(msg);
		campo2.focus();
		return false;
	}	
}

function Radio(objeto){
	var radio = objeto;
	cont = objeto.length;
	vx = 0;
	
	if(!isNaN(cont)){
		for (i=0; i<cont; i++){                        
			if (radio[i].checked){
				vx = vx + 1;
				break;  	
			}
		}
		if (vx == 0){
			return true;
		}
		else{
			return false;
		}
	}
	else{
		if(radio.checked){
			return false;
		}
		else{
			return true;
		}
	}
}

// 0 - qualquer
// 1 - numerico
// 2 - email
// 3 - CheckBox
// 4 - data Tipo dd/mm/aaaa
// 5 - radio
// 6 - CPF
// 7 - CNPJ
// 8 - CPF/CNPJ
// 9 - inscrição estadual
function RecordForm(Vcampo,Vobrigatorio,Vtipo,VnomeCampo,vNomeCampoHidden,vTamanhoCampo){
	this.campo = Vcampo;
	this.obrigatorio = Vobrigatorio;
	this.tipo = Vtipo;
	this.nomeCampo = VnomeCampo;
	this.nomeCampoHidden = vNomeCampoHidden;
	this.tamanhoCampo = vTamanhoCampo;
}

function formataHidden(campo1,campo2){
	var campoNormal = findObj(campo1);
	var campoHidden = findObj(campo2);
	var vString = '';

	for(i=0;i<campoNormal.length;i++){
		if (campoNormal[i].checked){
			vString += campoNormal[i].value + ',';
		}
	}
	campoHidden.value = vString.substr(0,(vString.length - 1));
}

function resetaCheck(obj){
	var vResetaCheck = findObj(obj);

	for(var i=0;i<vResetaCheck.length;i++){
		vResetaCheck[i].checked = false;
	}
}

function Verifica_Email(emailStr){
	var checkTLD=0;
	var knownDomsPat=/ ^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);

	if (matchArray==null){
		return false; 
	} 
	var user=matchArray[1]; 
	var domain=matchArray[2]; 
	for(i=0; i<user.length; i++){
		if (user.charCodeAt(i)>127){
			return false; 
		} 
	} 
	for(i=0; i<domain.length; i++){
		if (domain.charCodeAt(i)>127){
			return false; 
		}
	} 
	if (user.match(userPat)==null){
		return false; 
	} 
	var IPArray=domain.match(ipDomainPat); 
	if (IPArray!=null){
		for(var i=1;i<=4;i++){
			if (IPArray>255){
				return false; 
			} 
		} 
		return true; 
	}
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for(i=0;i<len;i++){
		if (domArr[i].search(atomPat)==-1){
			return false;
		} 
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1)
		return false; 

	if (len<2){
		return false; 
	}

	return true;
}

function validaForm(arrayForm,theForm,campo1,campo2,bmsg,msg){
	if (isObject(campo1) || isObject(campo2)){
		if (campo1.value != '' && campo2.value != ''){
			return comparaCampos(campo1,campo2,bmsg,msg);
		}
	}

	var obj;
	var errMsg = 'Os seguintes erros foram detectados:\n\n';
	var err = 0;
	var tip = -1;
	var objErr = '';

	for(var i=0;i<arrayForm.length;i++){
	  if (arrayForm[i].campo != ''){
		if (isObject(theForm))
			obj = document[theForm.name][arrayForm[i].campo];
		else
			obj = findObj(arrayForm[i].campo);

		if (arrayForm[i].obrigatorio == 1){
			if ((arrayForm[i].tipo != 3 && arrayForm[i].tipo != 5) && (obj.value == '')){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' é um campo obrigatório.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if ((arrayForm[i].tipo != 3 && arrayForm[i].tipo != 5) && (((obj.value.indexOf('<div') != -1) || (obj.value.indexOf('<DIV') != -1)) || ((obj.value.indexOf('<LAYER') != -1) || (obj.value.indexOf('<layer') != -1)))){
				errMsg = errMsg + '- Conteúdo do campo ' + arrayForm[i].nomeCampo + ' é impróprio.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if ((arrayForm[i].tipo != 3 && arrayForm[i].tipo != 5) && obj.value.length < arrayForm[i].tamanhoCampo){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa ter ' + arrayForm[i].tamanhoCampo + ' caracteres ou mais.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 1 && isNaN(obj.value)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor numérico válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 2 && !Verifica_Email(obj.value)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 3 && Radio(obj)){
				errMsg = errMsg + '- precisa escolher um(a) ' + arrayForm[i].nomeCampo + '.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			// impValData(field,bmsg,itipo) itipo 0=qualquer, 1=dmaa,2=dmaaaa,3=ddmm
			else if (arrayForm[i].tipo == 4 && !impValData(obj, 2)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter uma data válida.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 5 && Radio(obj)){
				errMsg = errMsg + '- precisa escolher um(a) ' + arrayForm[i].nomeCampo + '.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

// 			Funções de validação - CPF  impValCPFCGC(obj,true,2) - RageInputs.js
//          Tipo = ["CPF/CNPJ","CPF","CNPJ"] é um array com indice inicial 0
// 			true = ok
// 			false = com erro
// 			0 = vazio
			else if (arrayForm[i].tipo == 6 && !impValCPFCGC(obj,false,1)){ // CPF				
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 7 && !impValCPFCGC(obj,false,2)){ // CNPJ
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 8 && !impValCPFCGC(obj,false,0)){ // CPF/CNPJ
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == '') tip = arrayForm[i].tipo
				if (objErr == '') objErr = obj;
			}

// 			Função valida digito da inscrição estadual impValIERS(obj,true) - RageInputs.js
// 			0 = CAMPO vazio
// 			true = ok
// 			false = erro
			else if (arrayForm[i].tipo == 9 && !impValIERS(obj,false)){ // Inscrição Estadual
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}
		}
	  	else if (obj.value != ''){
			if (((obj.value.indexOf('<div') != -1) || (obj.value.indexOf('<DIV') != -1)) || ((obj.value.indexOf('<LAYER') != -1) || (obj.value.indexOf('<layer') != -1))){
				errMsg = errMsg + '- Conteúdo do campo ' + arrayForm[i].nomeCampo + ' é impróprio.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}
		
			if (arrayForm[i].tipo == 1 && isNaN(obj.value)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor numérico válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if ((arrayForm[i].tipo != 3 && arrayForm[i].tipo != 5) && obj.value.length < arrayForm[i].tamanhoCampo){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa ter ' + arrayForm[i].tamanhoCampo + ' caracteres ou mais.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 2 && !Verifica_Email(obj.value)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 3 && Radio(obj)){
				errMsg = errMsg + '- precisa escolher um(a) ' + arrayForm[i].nomeCampo + '.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			// impValData(field,bmsg,itipo) itipo 0=qualquer, 1=dmaa,2=dmaaaa,3=ddmm
			else if (arrayForm[i].tipo == 4 && !impValData(obj, 2)){
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter uma data válida.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}
			
			else if (arrayForm[i].tipo == 5 && Radio(obj)){
				errMsg = errMsg + '- precisa escolher um(a) ' + arrayForm[i].nomeCampo + '.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

// 			Funções de validação - CPF  impValCPFCGC(obj,true,2) - RageInputs.js
//          Tipo = ["CPF/CNPJ","CPF","CNPJ"] é um array com indice inicial 0
// 			true = ok
// 			false = com erro
// 			0 = vazio
			else if (arrayForm[i].tipo == 6 && !impValCPFCGC(obj,false,1)){ // CPF				
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 7 && !impValCPFCGC(obj,false,2)){ // CNPJ
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

			else if (arrayForm[i].tipo == 8 && !impValCPFCGC(obj,false,0)){ // CPF/CNPJ
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}

// 			Função valida digito da inscrição estadual impValIERS(obj,true) - RageInputs.js
// 			0 = CAMPO vazio
// 			true = ok
// 			false = erro
			else if (arrayForm[i].tipo == 9 && !impValIERS(obj,false)){ // Inscrição Estadual
				errMsg = errMsg + '- ' + arrayForm[i].nomeCampo + ' precisa conter um valor válido.\n';
				err = 1;
				if (tip == -1) tip = arrayForm[i].tipo;
				if (objErr == '') objErr = obj;
			}		
	  	}		
	  }	
	  // arrayForm[i].campo sem campo definido
	  else {
		alert('Erro desconhecido!\n');
		return false;
	  }
	}
	
	if (err == 1){
		alert(errMsg);
 		if((tip != -1) && (tip != 3) && (tip != 5)) objErr.focus();
		return false;
	}
	else {
		// Passa os campos de checkBox para hiddenFields
		for(var i=0; i<arrayForm.length; i++){
			if (arrayForm[i].tipo == 3 && (arrayForm[i].nomeCampoHidden != '' && arrayForm[i].nomeCampoHidden != null)){
				formataHidden(arrayForm[i].campo,arrayForm[i].nomeCampoHidden);
				resetaCheck(arrayForm[i].campo);
			}
		}
		return true;
	}
}
