/*
 * @author	Nicholas Almeida, www.fbiz.com.br
 * @version	1.3
 * @original http://www.javascript-coder.com
*/
var valColorError = "#FEFEDE";
var __buttonSubmit__;
var __newWidth__;
var __buttonSubmitSrc__;
function frmValidator(frmname)
{
this.formobj=document.forms[frmname];
if(!this.formobj)
{
	alert('BUG: Não foi possívem acessar o formulário: '+frmname);
	return;
};
if(this.formobj.onsubmit){this.formobj.old_onsubmit = this.formobj.onsubmit;this.formobj.onsubmit=null;}
else{this.formobj.old_onsubmit = null;};
this.formobj.onsubmit=form_submit_handler;
this.av = add_validation;
this.cSubmit = change_submit;this.amv = addMultiVal;this.customValidation=set_addnl_vfunction;
this.clearAllValidations = clear_all_validations;this.formobj.onreset = rABgColor;
};
function set_addnl_vfunction(functionname)
{
	this.formobj.addnlvalidation = functionname;
};

function clear_all_validations()
{
	for(var itr=0;itr < this.formobj.elements.length;itr++)
	{
		this.formobj.elements[itr].validationset = null;
	};
};

	function form_submit_handler()
	{
	for(var itr=0;itr < this.elements.length;itr++)
	{
	if(this.elements[itr].validationset && !this.elements[itr].validationset.validate())
	{
		return false;
	};
	};
	if(this.addnlvalidation)
	{str =' var ret = '+this.addnlvalidation+'()';
	eval(str);
	if(!ret) return ret;
	};
	if(__buttonSubmit__)
	{__buttonSubmit__.title = 'Enviando...';
	if(__buttonSubmitSrc__){__buttonSubmit__.src = __buttonSubmitSrc__;
	}
	else
	{
	__buttonSubmit__.value = 'Enviando...';
	}
	__buttonSubmit__.disabled = 'disabled';
	__buttonSubmit__.style.cursor = 'wait';
	if(__newWidth__) {__buttonSubmit__.style.width = __newWidth__};}return true;};function add_validation(itemname,descriptor,errstr){if(!this.formobj){
	alert('BUG: Formulário não definido corretamente!');
	return;};var itemobj = this.formobj[itemname];
	if (!itemobj) alert('BUG: Não foi possível encontrar nehum campo com o name=' + itemname);if(itemobj.length && isNaN(itemobj.selectedIndex) ){itemobj = itemobj[0];};if(!itemobj)
	{alert('BUG: Não foi possível encontrar o campo com o nome: '+itemname);return;};
	if(!itemobj.validationset)
	{itemobj.validationset = new ValidationSet(itemobj);
	};
	itemobj.validationset.add(descriptor,errstr);
	};function change_submit(bt,newWidth, buttonSubmitSrc)
	{if(!this.formobj)
	{alert('BUG: Formulário não definido corretamente!');
	return;};
	__buttonSubmit__ = gElm(bt);
	__newWidth__ = newWidth;
	__buttonSubmitSrc__ = buttonSubmitSrc;};
	function ValidationDesc(inputitem,desc,error){this.desc=desc;this.error=error;this.itemobj = inputitem;
	this.validate=vdesc_validate;};function vdesc_validate() {if(!validateInput(this.desc,this.itemobj,this.error))
	{this.itemobj.focus();return false;};return true;};
	function ValidationSet(inputitem){this.vSet=new Array();this.add= add_validationdesc;
	this.validate= vset_validate;this.itemobj = inputitem;};function add_validationdesc(desc,error){this.vSet[this.vSet.length]= new ValidationDesc(this.itemobj,desc,error);
	};
	function vset_validate()
	{
	for(var itr=0;itr<this.vSet.length;itr++)
	{
		if(!this.vSet[itr].validate())
			{
				return false;
			};
		};
		return true;
	};
	function validateEmail(email)
	{if (email.length <= 0) {return true;};
	var splitted = email.match('^(.+)@(.+)$');
	if (splitted == null)return false;
	if (splitted[1] != null ) {var regexp_user = /^\"?[\w-_\.]*\"?$/;
	if (splitted[1].match(regexp_user) == null)return false;};
	if (splitted[2] != null) {var regexp_domain = /^[\w-\.]*\.[A-Za-z]{2,4}$/;
	if (splitted[2].match(regexp_domain) == null) {var regexp_ip = /^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	if (splitted[2].match(regexp_ip) == null)return false;
	};
	return true;
	};
	return false;
	};
	function TestComparison(objValue,strCompareElement,strvalidator,strError)
	{
	var bRet=true;
	var objCompare=null;
	if(!objValue.form){alert('BUG: Formulário não definido!');
	return false};
	objCompare = objValue.form.elements[strCompareElement];
	if(!objCompare)
	{alert('BUG: Campo com o nome '+strCompareElement+' não encontrado!');
	return false;
	};
	var cmpstr='';switch(strvalidator){case 'equal': case 'eq': {if(objValue.value != objCompare.value)
	{cmpstr = ' deve ser igual ao campo \"';
	bRet = false;};break;};
	case 'notequal':case 'noteq': {if(objValue.value.length > 0 && objCompare.value.length > 0 && objValue.value == objCompare.value){
	cmpstr = ' deve ser diferente do campo \"';
	bRet = false;
	};
	break;
	};
	};
	if(bRet==false)
	{
	if(!strError || strError.length==0)
	{strError = 'O campo \"' + objValue.title + '\"' + cmpstr + objCompare.title + '\".';
	 cBgColor(objValue);};alert(strError);};
	 if(bRet) rBgColor(objValue);
	 return bRet;
	 };
	 function TestSelMin(objValue,strMinSel,strError){
	 var bret = true;
	 var objcheck = objValue.form.elements[objValue.name];
	 var chkcount =0;
	 if(objcheck.length){
	 for(var c=0;c < objcheck.length;c++){
	 if(objcheck[c].checked == '1'){chkcount++;
	 };
	 };}else {chkcount = (objcheck.checked == '1')?1:0;};
	 var minsel = eval(strMinSel);
	 if(chkcount < minsel) {
	 if(!strError || strError.length ==0) 
	 {
	  strError = 'Selecione ao menos ' + minsel + ' opção(ões) para o campo \"' + objValue.title + '\".';
	  };
	 alert(strError); bret = false;
	 };
	 if(bret)
	  rBgColor(objValue);
	 return bret;};
	 function TestSelMax(objValue,strMaxSel,strError)
	 {
	 var gret = true;
	 var objcheck = objValue.form.elements[objValue.name];
	 var chkcount =0;
	 if(objcheck.length)
	 {
	 for(var c=0;c < objcheck.length;c++)
	 {
	 if(objcheck[c].checked == '1')
	 {
	 chkcount++;
	 };
	 };
	 }else {
	 chkcount = (objcheck.checked == '1')?1:0;
	 };
	 var maxsel = eval(strMaxSel);
	 if(chkcount > maxsel) {if(!strError || strError.length ==0)
	  { strError = 'Selecione no máximo ' + maxsel + ' opção(ões) para o campo \"' + objValue.title + '\".';
	  };
	  alert(strError); 
	  gret = false;};
	  if(gret) rBgColor(objValue);
	  return gret;
	  };
	  function TestDontSelect(objValue,index,strError)
	 {var ret = true;if(objValue.selectedIndex == null) 
	 {
	  alert('BUG: Este comando só pode ser usado para elementos de seleção.');
	ret = false;
	   }
	   else if(objValue.selectedIndex == eval(index))
	    { if(!strError || strError.length ==0)
	     {
	strError = 'Selecione uma das opções para o campo \"' + objValue.title + '\".';
	      };
             alert(strError);
	  ret =  false;
	  cBgColor(objValue);
	                              };
	  if(ret) rBgColor(objValue);
	  return ret;};
	  function TestRequiredInput(objValue,strError)
	  {
	  var ret = true;
	  if(eval(objValue.value.length) == 0) {
	if(!strError || strError.length ==0) {
	strError = 'O campo \"' + objValue.title + '\" é obrigatório.';
	};
	cBgColor(objValue);
	  alert(strError);
	   ret=false;
	};
	   if(ret) rBgColor(objValue);
	   return ret;
	   };
	  function TestMaxLen(objValue,strMaxLen,strError)
	  {
	  var ret = true;
	  if(eval(objValue.value.length) > eval(strMaxLen))
	{ 
	  if(!strError || strError.length ==0)
	   { 
	   strError = 'O campo \"' + objValue.title + '\" pode conter no máximo '+ strMaxLen +' caracter(es).';
	   };
	   alert(strError + '\nAtualmente ele tem: ' + objValue.value.length + ' caracter(es).');
	    ret = false; };if(ret) rBgColor(objValue);
	   return ret;};
	  function TestMinLen(objValue,strMinLen,strError){
	  var ret = true;
	  if(eval(objValue.value.length) < eval(strMinLen)) { if(!strError || strError.length ==0) {
strError = 'O campo \"' + objValue.title + '\" deve conter no mínimo ' + strMinLen + ' caracter(es).'; };
	  alert(strError + '\nAtualmente ele tem: ' + objValue.value.length + ' caracter(es).');
	   ret = false;
	      };
	   if(ret) rBgColor(objValue);
	   return ret;
	  };function TestInputType(objValue,strRegExp,strError,strDefaultError){var ret = true;
	  var charpos = objValue.value.search(strRegExp);
	   if(objValue.value.length > 0 &&  charpos >= 0) 
	   { 
	   if(!strError || strError.length ==0)
	    {
	    strError = strDefaultError;};
	    alert(strError + '\nErro no caracter na posição: ' + eval(charpos+1)+'.');
	    ret = false; };
	    if(ret) rBgColor(objValue);
	    return ret;
	    };
	    function TestEmail(objValue,strError)
	    {var ret = true;if(objValue.value.length > 0 && !validateEmail(objValue.value) ) 
	   { if(!strError || strError.length ==0) {
	    strError = '\"' + objValue.value+'\" não é um e-mail válido para o campo \"' + objValue.title + '\".'; };
	   alert(strError);
	    ret = false;
	    };
	   if(ret) rBgColor(objValue);
	   return ret;};function TestRegExp(objValue,strRegExp,strError)
	   {var ret = true;
	   if( objValue.value.length > 0 && !objValue.value.match(strRegExp) ) {
	    if(!strError || strError.length ==0) {
	    strError = 'Caracter não permitido encontrado no campo \"' + objValue.title + '\".';};
	   alert(strError); ret = false;cBgColor(objValue);};
	   if(ret) rBgColor(objValue);return ret;};
	   function TestSelectOneRadio(objValue,strError)
	   {var objradio = objValue.form.elements[objValue.name];
	   if (!objradio) 
	   alert('BUG: Não foi possível encotrar nenhum radioButton no formulário.\nCertifique-se de que eles existem e que tem o atributo \"name\".');var one_selected=false;
	   for(var r=0;r < objradio.length;r++)
	   {if(objradio[r].checked == '1')
	   {one_selected=true;
	   break;
	   };
	   };
	   if(false == one_selected)
	   {
	   if(!strError || strError.length ==0) 
	   {
	   strError = 'Selecione uma das opções para o campo \"'+objValue.title+'\".';
	    };
	   alert(strError);};return one_selected;};
	   function TestCpf(v) {if(!v) return true;var s=null;var r=null;
	   if(v.length!=11||v.match(/1{11};|2{11};|3{11};|4{11};|5{11};|6{11};|7{11};|8{11};|9{11};|0{11};/)) 
	   return false;
	   s=0;
	   for(var i=0;i<9;i++)
	    s+=parseInt(v.charAt(i))*(10-i);r=11-(s%11);
	    if(r==10||r==11) r=0;
	    if(r!=parseInt(v.charAt(9))) 
	    return false;
	    s=0;
	    for(var i=0;i<10;i++) 
	    s+=parseInt(v.charAt(i))*(11-i);
	    r=11-(s%11);
	    if(r==10||r==11)
	     r=0;
	     if(r!=parseInt(v.charAt(10))) 
	     return false;
	    return true;
	    };
	    function TestCnpj(v) {if(!v) return true;
	    var m = new Array('543298765432','6543298765432');
	    var d = new Array(0,0);
	    for (var t=0; t<2; t++) 
	    {
	    for(x=0; x<13; x++)
	    {if ((t==0 && x!=12) || t==1) d[t] += ( parseInt(v.slice(x,x+1)) * parseInt(m[t].slice(x,x+1)) );
	    };
	    d[t] = (d[t] * 10) % 11;if (d[t] == 10) d[t] = 0;};
	    return (d[0] == parseInt(v.slice(12,13)) && d[1] == parseInt(v.slice(13,14)));
	    };
	    
	    function TestFile(v ,ext) {if(!v) return true;var e = ext.split(",");for(var i=0; i<e.length; i++) {
	    if (v.substr(v.lastIndexOf('.')+1)==e[i]) return true;};return false;};
	    function replaceAll(str, replacements ) 
	    {for ( i = 0; i < replacements.length; i++ ) {var idx = str.indexOf( replacements[i][0] );
	    while ( idx > -1 ) 
	    {str = str.replace( replacements[i][0], replacements[i][1] );
	    idx = str.indexOf( replacements[i][0] );};};return str;};
	    function addMultiVal(){var arrPar = [];for(var i=0; i<arguments.length; i++){arrPar.push(arguments[i]);};
	    var fld = arrPar[0];arrPar = arrPar.slice(1,arrPar.length);
	    for (var a=0;a<arrPar.length;a++)
	    {
	    this.av(fld,arrPar[a]);
	    };
	    delete arrPar, fld;
	    };
	    
	    function validateInput(strValidateStr,objValue,strError) 
	    {var ret = true;var epos = strValidateStr.search('='); var command  = '';
	     var cmdvalue = '';
	     if(epos >= 0)
{ command  = strValidateStr.substring(0,epos); cmdvalue = strValidateStr.substr(epos+1);
	      }
	      else
{ command = strValidateStr; };
	       switch(command) { case 'req': case 'required': { ret = TestRequiredInput(objValue,strError);
	       break;
	                    };
	    case 'maxlength': case 'maxlen': { ret = TestMaxLen(objValue,cmdvalue,strError);
	    break; };
	    case 'minlength': case 'minlen': { ret = TestMinLen(objValue,cmdvalue,strError);
	    break; };
	    case 'alnum': case 'alphanumeric': {
	     ret = TestInputType(objValue,'[^A-Za-z0-9áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ\\s]',strError, 'Apenas caracteres alfanuméricos(letras e números) são permitidos para o campo \"' + objValue.title + '\".');
	     break;};case 'num': case 'number': case 'numeric': {
	     ret = TestInputType(objValue,'[^0-9]',strError, 'Apenas caracteres numéricos(números) são permitidos para o campo \"' + objValue.title + '\".');break;};
	    case 'letters': case 'let': { ret = TestInputType(objValue,'[^A-Za-záàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ\\s]',strError, 'Apenas letras são permitidas para o campo \"' + objValue.title + '\".');
	    break; };
	    case 'restrict':case 'rest': { ret = TestInputType(objValue,'[^A-Za-z0-9-_]',strError, 'Apenas letras são permitidas para o campo \"' + objValue.title + '\".');
	    break;
	     };
	     case 'email': { ret = TestEmail(objValue,strError);
	     break; };
	    case "lt":case "lessthan":{
	        if (isNaN(objValue.value)) { 
	           alert('Apenas caracteres numéricos(números) são permitidos para o campo \"' + objValue.title + '\".');        return false;    };    if (eval(objValue.value) > eval(cmdvalue)) {
	                   if (!strError || strError.length == 0) {            strError = 'O campo \"' + objValue.title + '\" deve ser menor ou igual a: ' + cmdvalue + '.';
	                           };
	                   alert(strError);
	            return false;    };
	        break;};
	        case "gt":case "greaterthan":{
	            if (isNaN(objValue.value)) {
	                alert('Apenas caracteres numéricos(números) são permitidos para o campo \"' + objValue.title + '\".');        return false;    };
	            if (eval(objValue.value) < eval(cmdvalue)) {
	                    if (!strError || strError.length == 0) {
	                                strError = 'O campo \"' + objValue.title + '\" deve ser maior ou igual a: ' + cmdvalue + '.';        };
	                            alert(strError);
	                                    return false;
	                                        };    break;
	                                        };
	                            case 'regex': { ret = TestRegExp(objValue,cmdvalue,strError);
	                            break; };
	                    case 'dontselect': { ret = TestDontSelect(objValue,cmdvalue,strError);
	                    break; };
	            case 'selmin':{ret = TestSelMin(objValue,cmdvalue,strError);break;};
	            case 'selmax':{ret = TestSelMax(objValue,cmdvalue,strError);break;};
	            case 'selone':{ret = TestSelectOneRadio(objValue,strError);break;};
	             case 'equal': case 'eq': case 'notequal':case 'noteq':{return TestComparison(objValue,cmdvalue,command,strError);
	            break;
	            };
	            case 'cpf':
	             {
	             var tmpValue = replaceAll(objValue.value, [['.', ''],[ '/', '' ],['-', ''],[' ', '']]);
	            ret = TestCpf(tmpValue);
	            if(!ret) {
	            alert('\"' + objValue.value + '\" não é um número de CPF válido para o campo \"' + objValue.title + '\".');cBgColor(objValue);}
	            else rBgColor(objValue);
	            delete tmpValue;break;             };
	            case 'cnpj': { var tmpValue = replaceAll(objValue.value, [['.', ''],[ '/', '' ],['-', ''],[' ', '']]);
	            ret = TestCnpj(tmpValue);
	            if(!ret)
	             {
	             alert('\"' + objValue.value + '\" não é um número de CNPJ válido para o campo \"' + objValue.title + '\".');cBgColor(objValue);}else rBgColor(objValue);
	            delete tmpValue;
	            break;
	                         };
	            case 'file': {
	             ret = TestFile(objValue.value.toLowerCase(), cmdvalue);
	            if(!ret) 
	            {
	            alert('O campo \"' + objValue.title + '\" permite somente arquivos com a extensão \".' + cmdvalue +' \".');cBgColor(objValue);}else rBgColor(objValue);
	            delete tmpValue;break;             };
	            };
	            if(ret) 
	            rBgColor(objValue);
	            return ret;
	             };function cBgColor(o)
	             {o.style.backgroundColor = valColorError;
	             };
	             function rBgColor(o)
	             {o.style.backgroundColor = "";
	             };

	            function rABgColor()
	            {for (var itr = 0; itr < this.elements.length; itr++) 
	            {rBgColor(this.elements[itr]);
	            };};
	            function only(t,o,e)
{if(window.event)key=window.event.keyCode;
else if(e)key=e.which;
else return true;S=(o)?o:'';
if(t=='num'||t=='number'||t=='numeric')S+='0123456789';
	            if(t=='alnum'||t=='alphanumeric')
	            S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ 0123456789';
	            if(t=='let'||t=='letters')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ ';
	            if(t=='rest'||t=='restrict')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	            if(t=='email')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@-_.';if(key==null||key==0||key==8||key==9||key==13||key==27)
	            return true;
	            else if(S.indexOf(String.fromCharCode(key))!=-1)return true;
	            else return false;};function not(S,e) {
	            if(window.event)key=window.event.keyCode;else if(e)key=e.which;else return true;
	            if(!S)return false;else if(key==null||key==0||key==8||key==9||key==13||key==27)
	            return true;else if(S.indexOf(String.fromCharCode(key))!=-1)return false;
	            else return true;
	            };
	            
	            function jump(o,e)
{
if(window.event)key=window.event.keyCode;
else if(e)key=e.which;
else return true;if (key==9||key==2||key==16) return false;
if(o.value.length==o.maxLength){
  for(var i=0;i<o.form.length;
i++){    if(o.form[i]==o&&o.form[i+1])
{o.form[i+1].focus();
    break;
        };
}
};
};
function checkReset(f)
{if(confirm('Todos os dados preenchidos serão apagados.\nPara apagar todos os dados clique em \"OK\".\nPara continuar preenchendo clique em \"Cancelar\".')) gElm(f).reset();
};