debug = true;
advanced_debug = false;		
/* ===================================================================
 Autor: Patrick J. Levy 
 Data: 18/10/2010
 Versão: 2.4

 funcões para validação automatica de formulário - Jquery
 Dependencias: jquery-1.4.2

 Ativar: <form validaForm="true">
 Exigir dados: <input type="text" valida="Especifique o valor para o xxxx">
 Aplicar mascara/formato: <input type="text" mascara="cep|data|hora|hora2|cpf|cnpj|email">
 Valor maximo no memo: <textarea maxlenght="100">
 Contagem de caracteres no memo : <textarea name="xxx"></textarea><span id="xxx_len"></span>
 Valida radio/check (só na primeira): <input type="radio" valida="Especifique uma opção">
 A funçao de validação também pode ser chamada pelo js: validaForm(form);
/ =================================================================== */

$(function(){
	//preparação :
	$('textarea').each(function(){	   
		nome = $(this).attr('name');
		maxlen = $(this).attr('maxlength');
		curlen = $(this).val().length;
		if (!!maxlen){
			$('#'+nome+'_len').html(curlen+'&nbsp;caracteres. (máx: '+maxlen+')');
		} else {
			$('#'+nome+'_len').html(curlen+'&nbsp;caracteres.');
		}		
	});
	
	//validações OnBlur:
	$('input[formato=data]').mask('99/99/9999');
	$('input[formato=data2]').mask('99/9999');	
	$('input[formato=hora]').mask('99:99:99');
	$('input[formato=hora2]').mask('99:99');
	$('input[formato=cep]').mask('99999-999');	
	$('input[formato=telefone]').mask('(99) 9999-9999');		
	$('input[formato=cpf]').mask('999.999.999-99');
	$('input[formato=cnpj]').mask('99.999.999/9999-99');
	$('textarea').blur(function () {checkMemo(this);});
	
	//dummy function:
	$('input[dummy], textarea[dummy]').blur(function(){
		dummyBlur(this);
	});
	$('input[dummy], textarea[dummy]').focus(function(){
		dummyFocus(this);
	});	
	
	$('textarea').bind('keypress', function(e){	
		nome = $(this).attr('name');
		maxlen = $(this).attr('maxlength');
		lenfld = $('#'+nome+'_len');

		var valor = $(this).val();
		var key	= (e.keyCode ? e.keyCode : e.charCode);
		var ch	= String.fromCharCode(key);
		var str	= valor + ch;
		var pos	= str.length;
		
		if (!!maxlen){
			if (pos <= maxlen){
				$('#'+nome+'_len').html(pos+'&nbsp;caracteres. (máx: '+maxlen+')');						 
			} else {
				alert('Texto muito longo. Máximo permitido: '+maxlen);
				return false;	
			}
		} else {
			$('#'+nome+'_len').html(pos+'&nbsp;caracteres.');
		}
	});
	   
	//busca por formulários com atributo de validar form
	$('[validaForm=true]').submit(function(){
		//verifica se existe validação geral do form:
		validaForm($(this));
	});
	
	$('a.submit').click(function(){
		form = $(this).closest('form');
		if(validaForm($(form))){
			$(form).trigger('submit');
			return false;		
		}
	})
	
	$('a.ajx_submit').click(function(){
		ajx_submit($(this));
		return false;	
	})	
	
	$('a.ajx_consume').click(function(){
		ajx_consume($(this));	
		return false;		
	})	
	
	if ($('div#lista')){
		$('a.ajx_consume').trigger('click');	
	}	
});

function lista(){
	$('a.ajx_consume').trigger('click');	
}

function ajx_submit(subButton){

	form = $(subButton).closest('form');
	if(validaForm($(form))){
		var btClass = subButton.attr('class');
		subButton.attr('class', 'botao xs_gry');
		$('label.loader').html('<img src="../img/anm_loader_sml.gif" />');	
		if (!advanced_debug) {
			dType = "json";
		} else {
			dType = "text";
		}

		var actionPostPage = $(form).attr('action');
		ajxPostPage = actionPostPage.replace(/.php/, '.ajx.php');

		var $editors = $("textarea.ckeditor"); 
		if ($editors.length) { 
			for (instance in CKEDITOR.instances) 
    	        CKEDITOR.instances[instance].updateElement(); 
		}

		$.ajax({
			type: "POST",
			url: ajxPostPage,
			data: $(form).serialize(),
			dataType:dType,
			success: function(rtrMsg){
				if (rtrMsg){
					if (debug && advanced_debug) {
						alert(rtrMsg);
						return false;
					}
				
					rtr = rtrMsg.res;
					msg = rtrMsg.msg;	
					cmd = rtrMsg.cmd;
					adc = rtrMsg.adc;
					msg = unescape(msg.replace(/\+/g," "));

					if (rtr == 'err'){
						if (cmd == 'alerta'){
							alert(msg);	
						} else {
							alert(msg);	
						}
					} else if (rtr == 'ok'){
						
						if (cmd != ''){
							cmd = cmd.split(',');
							for (i=0;i<cmd.length;i++){
								comando = cmd[i];
								if (comando == 'atualiza'){
									atualiza('frame_principal', 'frmRlt');
								} else if (comando == 'relista'){
									relista('frame_principal');									
								} else if (comando == 'alerta'){ 
									alerta(msg, 1);	
								} else if (comando == 'alert'){ 
									alert(msg);		
								} else if (comando == 'limpa'){ 
									$(form).clearForm();									
								} else if (comando == 'principal'){ 
									voltar('principal');
								} else if (comando == 'repost'){
									document.location.reload();
								} else if (comando == 'post'){
									//adc = alert(adc)					
									adc = "{"+adc+"}"
									var jSonStr = eval('(' + adc + ')');
									jsPost(actionPostPage, '', jSonStr);
								} else if (comando == 'redirect'){
									document.location.href = adc;
								} else if (comando == 'reload'){
									var vLoc = document.location.href;
									document.location.href = vLoc.replace(/#/, '');
								} else if (comando == 'function'){
									eval(adc);									
								}
							}
						} else {
							alert(msg);
						}
					}
				}
				subButton.attr('class', btClass);
				$('label.loader').html('');
				return false;
			},
			error: function (xhr, ajaxOptions, thrownError){
				//$('span#loader').html('');
				if (debug){
					//alert(xhr.statusText); 
					alert(thrownError);
				} else {
					alert('Problemas no processamento.');					
				}
				subButton.attr('class', btClass);
				$('label.loader').html('');
			}
		});	
	}	
}

function ajx_consume(subButton){

	form = $(subButton).closest('form');
	if(validaForm($(form))){

		var actionPostPage = $(form).attr('action');
		var actionResultContainer = $(form).attr('result');
		actionPostPage = actionPostPage.replace(/.php/, '.ajx.php');
		
		$('#'+actionResultContainer).html('<div class="big_loader"></div>');
		$.ajax({
			type: "POST",
			url: actionPostPage,
			data: $(form).serialize(),
			dataType:'text',
			success: function(rtrMsg){

				if (debug && advanced_debug) {
					alert(rtrMsg);
					return false;
				}

				$('#'+actionResultContainer).html(rtrMsg);
				if ($("table.lista")){
					processaLista();	
				}

				return false;
			},
			error: function (xhr, ajaxOptions, thrownError){
				if (debug){
					//alert(xhr.statusText); 
					alert(thrownError);
				} else {
					alert('Problemas no processamento.');					
				}
				$('#'+actionResultContainer).html('');
		
			}
		});	
	}	
}

function validaForm(oForm){
	validaStr = oForm.attr('valida');
	if (!!validaStr){
		question = confirm(validaStr);
		if (question == 0){
			return false;	
		}
	}

	subForm = true;


	$('[valida]', oForm).each(function() {	
		var campo	= this;										   
		var type 	= this.type;
		var tag 	= this.tagName.toLowerCase();
		var strValida= $(this).attr('valida');
		var dummy	= $(this).attr('dummy');
		var valor 	= $(this).val();		
		//TEXT
		if (type == 'text' || type == 'password' || tag == 'textarea' || tag == 'hidden'){
			if (valor == dummy) valor = '';
			if (valor == ''){
				alert(strValida);
				campo.focus();					
				subForm = false;
				return (false);
			}
		//RADIOBUTTON				
		} else if (type == 'radio'){
			theName = $(this).attr('name');
			if( $("input[name="+theName+"]:checked").length == 0 ){
				alert(strValida);
				this.focus();
				subForm = false;
				return (false);					
			}
		//CHECKBOX 	
		} else if (type == 'checkbox'){
			theName = $(this).attr('name');
			if( $("input[name="+theName+"]:checked").length == 0 ){
				alert(strValida);
				this.focus();
				subForm = false;
				return (false);					
			}
		//SELECT 
		} else if (tag == 'select'){
			
			if (valor == ''){
				alert(strValida);
				this.focus();
				subForm = false;
				return (false);				
			};
		}
	});
		
	//Validação customizada:
	if (subForm){
		if(typeof validaFormCustom == 'function') { 
			subForm = validaFormCustom(oForm); 
		} 		
	}
	
	if (subForm){
		$('input[formato]', oForm).each(function() {	
			var campo	= this;										   
			var type 	= this.type;
			var formato	= $(this).attr('formato');
			var valor = $(this).val();
			
			if (valor != ''){			
				//CPF
				if (formato == 'cpf'){
						vldAdc = validaCPF(valor);
						if (vldAdc != ''){
							alert(vldAdc);
							$(campo).val('').css('border-color','#f00').focus();	
							subForm = false;
							return (false);								
						}
				}
				//CNPJ
				else if (formato == 'cnpj'){
					vldAdc = validaCNPJ(valor);
					if (vldAdc != ''){
						alert(vldAdc);
						$(campo).val('').css('border-color','#f00').focus();	
						subForm = false;
						return (false);								
					}								
				}
				//DATA
				else if (formato == 'data'){
					vldAdc = checkDate(valor);
					if (vldAdc != ''){
						alert(vldAdc);
						$(campo).val('').css('border-color','#f00').focus();
						subForm = false;
						return (false);								
					}								
				}	
				//EMAIL
				else if (formato == 'email'){
					vldAdc = validaEmail(valor);
					if (vldAdc != ''){
						alert(vldAdc);
						$(campo).val('').css('border-color','#f00').focus();
						subForm = false;
						return (false);								
					}								
				}					
			}
		});	
	}
	
	//não validou, não envia.
	if (!subForm){
		return false;	
	} else {
		return true;	
	}
}

///////////////////////////////////////////
// validar CPF
///////////////////////////////////////////

function validaCPF(CPF){
	erro = new String;
	if (CPF.length != 14) erro = "É necessario preencher corretamente o número do CPF! (xxx.xxx.xxx-xx)"; 
	if ((CPF.charAt(3) != ".") || (CPF.charAt(7) != ".") || (CPF.charAt(11) != "-")){
		if (erro.length == 0) erro = "É necessário preencher corretamente o número do CPF! (xxx.xxx.xxx-xx)";
	}
	if(document.layers && parseInt(navigator.appVersion) == 4){
		x = CPF.substring(0,2);
		x += CPF.substring (4,6);
		x += CPF.substring (8,10);
		x += CPF.substring (12,13);
		CPF = x; 
	} else {
		CPF = CPF.replace ('.','');
		CPF = CPF.replace ('.','');
		CPF = CPF.replace ('-','');
	}	
	if (CPF.length > 0){
		if (CPF.length != 11 || CPF == "00000000000" || CPF == "11111111111" ||
			CPF == "22222222222" ||	CPF == "33333333333" || CPF == "44444444444" ||
			CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" ||
			CPF == "88888888888" || CPF == "99999999999"){
			erro = "CPF Inválido!";
		}
	
		soma = 0;
		for (cpx=0; cpx < 9; cpx ++)
			soma += parseInt(CPF.charAt(cpx)) * (10 - cpx);
		resto = 11 - (soma % 11);
		if (resto == 10 || resto == 11)
			resto = 0;
		if (resto != parseInt(CPF.charAt(9))){
			erro = "CPF Inválido!";
		}
	
		soma = 0;
		for (cpx = 0; cpx < 10; cpx ++)
			soma += parseInt(CPF.charAt(cpx)) * (11 - cpx);
		resto = 11 - (soma % 11);
	
		if (resto == 10 || resto == 11)
			resto = 0;
	
		if (resto != parseInt(CPF.charAt(10))){
			erro = "CPF Inválido!";
		}
		if (erro != ''){
			return (erro);
		}
		return '';		
	}	
}

///////////////////////////////////////////
// validar CNPJ
///////////////////////////////////////////

function validaCNPJ(CNPJ) {
	erro = new String;
	if (CNPJ.length < 18) erro = "É necessario preencher corretamente o número do CNPJ! (xx.xxx.xxx/xxxx-xx)"; 
	if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
		if (erro.length == 0) erro = "É necessário preencher corretamente o número do CNPJ! (xx.xxx.xxx/xxxx-xx)";
	}
	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 nonNumbers = /\D/;
	if (nonNumbers.test(CNPJ)) erro = "A verificação de CNPJ suporta apenas números!"; 
	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
	for (cpj=0; cpj<12; cpj++){
		a[cpj] = CNPJ.charAt(cpj);
		b += a[cpj] * c[cpj+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])){
		erro ="CNPJ Inválido!";
	}
	if (erro.length > 0){
		return (erro)
	}
	return '';
}

function checkDate(dtaValue){
	if (dtaValue == "" ){
		return '';
	}
	var err=0;
	if (dtaValue.length != 8 && dtaValue.length != 10 ) err=1
	mm = dtaValue.substring(3, 5);
	dd = dtaValue.substring(0, 2);
	yy = dtaValue.substring(6, 10);
	if (mm<1 || mm>12) err = 1
	if (dd<1 || dd>31) err = 1
	if (yy.length == 4){
		if (yy<1900) err = 1
	} else {
		//se ano for inferior a 30 se entende 20??
		//se for maior que 29 se entende 19??
		yy=parseInt(yy,10)
		yy += yy<30?2000:1900
	}
	if (mm==4 || mm==6 || mm==9 || mm==11){
		if (dd==31) err=1
	}
	if (mm==2){
		var dtaYear=parseInt(yy/4);
		if (isNaN(dtaYear)) {
			err=1;
		}
		if (dd>29) err=1
		if (dd==29 && ((yy/4)!=parseInt(yy/4))) err=1
	}
	if (err==1) {
		return (dtaValue + ' é uma data inválida !');
	} else {
		return '';
	}
}

function validaEmail(email) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	if(reg.test(email) == false) {
		return ('Email inválido');
	} else {
		return ('');	   
	}
}

function checkTime(cpoTime){
	strTime = cpoTime.value
	err = 0;
	if (strTime == ''){
		return false;
	}
	if (strTime.indexOf(':') < 0) err = 1;
	if (err==0){
		strTimeArr = strTime.split(':');
		if(strTimeArr.length < 2 && strTimeArr.length > 3) err = 1;
	}
	if (err==0){
		hora = parseInt(strTimeArr[0]);
		minuto = parseInt(strTimeArr[1]);
		segundo = 0;
		if (strTimeArr.length == 3) segundo = parseInt(strTimeArr[2]);
		if (hora < 0 || hora > 23) err = 1; 
	}	
	if (err==0){
		if (minuto < 0 || minuto > 59) err = 1; 
	}		
	if (err==0){
		if (segundo < 0 || segundo > 59) err = 1; 
	}
	if (err == 1){
		alert(strTime + ' é uma hora inválida !');
		cpoTime.value = '';
		cpoTime.focus();
		return false;		
	}
}

function checkBlur(cpo,formato){
	valor = $(cpo).val();
	if (valor != ''){
		if (formato == 'email'){
			if (valor.indexOf('@') < 0){
				$(cpo).css('border-color', '#ff0000');
				$(cpo).val('');
				return (false);												
			} else {
				$(cpo).css('border-color', '');				
			}
		}
		/*
		if (!reg.test(cpo.value)){

			//alert('Formato inválido no campo '+formato);
			//cpo.value = '';
			cpo.focus();
			return (false);								
		}
		*/
	}
}


function checkMemo(memTime){
	maxlen = $(memTime).attr('maxlength');
	curlen = $(memTime).val().length;
	if (!!maxlen){
		if (curlen > maxlen){
			alert('Texto muito longo. Máximo permitido: '+maxlen)
			memTime.value = memTime.value.substr(0,maxlen);
			curlen = $(memTime).val().length;			
			$('#'+$(memTime).attr('name')+'_len').html(curlen+'&nbsp;caracteres. (máx: '+maxlen+')');
		};	
	};
}


function dummyFocus(cpo){
	valor = $(cpo).val();
	dummy = $(cpo).attr('dummy');
	if (valor == dummy) $(cpo).val('');
}
function dummyBlur(cpo){
	dummy = $(cpo).attr('dummy');
	valor = $(cpo).val();
	if (valor == '') $(cpo).val(dummy);
}

$.fn.clearForm = function() {
	return this.each(function() {
		var type = this.type, tag = this.tagName.toLowerCase();
		if (tag == 'form'){
			return $(':input',this).clearForm();
		}
		if (type == 'text' || type == 'password' || tag == 'textarea'){
//			alert($(this).attr('dummy'));
			dummy = $(this).attr('dummy');
			if (dummy == undefined){
				this.value = '';			
			} else {
				this.value = $(this).attr('dummy');			
			}
		} else if (type == 'checkbox' || type == 'radio'){
			this.checked = false;
		} else if (tag == 'select'){
			this.selectedIndex = -1;
		}
	});
};

/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y<h;y++){if(g[y]){m[y]=d.placeholder;var z=v(y);if(z<h&&g[y].test(m[z])){m[y]=m[z]}else{break}}}s();r.caret(Math.max(i,x))}function u(y){for(var A=y,z=d.placeholder;A<h;A++){if(g[A]){var B=v(A);var x=m[A];m[A]=z;if(B<h&&g[B].test(x)){z=x}else{break}}}}function l(y){var x=a(this).caret();var z=y.keyCode;n=(z<16||(z>16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(x<h){var A=String.fromCharCode(C);if(g[x].test(A)){u(x);m[x]=A;s();var y=v(x);a(this).caret(y);if(d.completed&&y==h){d.completed.call(r)}}}}}return false}function w(x,y){for(var z=x;z<y&&z<h;z++){if(g[z]){m[z]=d.placeholder}}}function s(){return r.val(m.join("")).val()}function p(y){var z=r.val();var C=-1;for(var B=0,x=0;B<h;B++){if(g[B]){m[B]=d.placeholder;while(x++<z.length){var A=z.charAt(x-1);if(g[B].test(A)){m[B]=A;C=B;break}}if(x>z.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}
if(!y&&C+1<e){r.val("");w(0,h)}else{if(y||C+1>=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}  })}})})(jQuery);
