/**
 * Classe que agrupa funcionalidades de validação e máscaras Javascript.
 * @author Lauro Becker - lauro.becker@gmail.com
 *
 * ____________________CLASSES OBSERVADAS____________________
 *
 * mask-hora: aplica máscara de hora;
 * data-mask: aplica máscara de data ao input;
 * data-validate: valida se a data informada é válida (onblur);
 * numbers-only: somente libera números;
 * cpf-mask: máscara de CPF;
 * telefone-ddd-mask: máscara de telefone com DDD;
 * form-auto-validated: adiciona método de validação aos formulários, onsubmit;
 * __________________________________________________________
 */
var valida_horario, maskhora, horavalidate, datamask, datavalidate, numbersonly, cpfmask, telefonedddmask, formautovalidated;
function Validator(){
	//lista de classes observadas ativas
	
	maskhora = new Mask_Hora();
	datamask = new DataMask(); //data-mask
	datavalidate = new DataValidate(); //data-validate
	numbersonly = new NumbersOnly(); //numbers-only
	cpfmask = new CpfMask();//cpf-mask
	telefonedddmask = new TelefoneDDDMask(); //telefone-ddd-mask
	formautovalidated = new FormAutoValidated(); //telefone-ddd-mask
	horavalidate = new ValidaHora();
	//valida_horario = new ValidaHorario();
	valida_data = new IndexaData();
	//caixa_pergunta = new Caixa_Pergunta();	
	
}



/*___________________________________________________________*/

function ValidaHora(){
	var inputs = document.getElementsByClassName("horavalidate");
	inputs.each(
		function valideteElement(element){
			element.onblur = function(e){
				if(element.value == "") {
					return true;
				}
			
				if(element.value.length != 5) {
					alert("Hora inválida!");
					element.value = "";
			        element.focus();
			        return false;
				}
			
				hrs = (element.value.substring(0,2));  
			 	min = (element.value.substring(3,5));  
		    	estado = "";  
		    	if ((hrs < 00 ) || (hrs > 23) || ( min < 00) ||( min > 59)){  
		     		estado = "errada";  
		    	}  
			   
			  	if (element.value == "") {  
		     		estado = "errada";  
		    	}  

			    if (estado == "errada") {  
			       alert("Hora inválida!");  
			       element.value = "";
			       element.focus();  
			    }
			    
			    return false;
			};
		}
	);  
    
}

/*___________________________________________________________*/


/*
		Indexa os campos que contém a data do setor.
	*/
	function IndexaData(){
	
	var inp = document.getElementsByName("prazoData[]");
		for(var i = 0; i < inp.length; i++){
			inp[i].onblur = function(){
				
//				alert("inicial: " + this.value);
//				alert("final: " + $("pitDataprazoapresentacao").value);
				
				if(Compara_Datas(this.value, $("pitDataprazoapresentacao").value)){
					this.value = $("pitDataprazoapresentacao").value;
				}
				ValidaHorario();
			}
		}
		
		inp = document.getElementsByName("prazoDataTarefa[]");
		for(var i = 0; i < inp.length; i++){
			inp[i].onblur = function(){
				
//				alert("inicial: " + this.value);
//				alert("final: " + $("pitDataprazoapresentacao").value);
				
				if(Compara_Datas(this.value, $("pitDataprazoapresentacao").value)){
					this.value = $("pitDataprazoapresentacao").value;
				}
				ValidaHorario();
			}
		}
	}



/*___________________________________________________________*/

	function ValidaHorario(){ 		
		var inputs = document.getElementsByTagName("input");
		for(var i = 0; i < inputs.length ; i++) {
			var classes = inputs[i].className.split(" ");
			for(var j = 0; j < classes.length; j++) {
			
				if(classes[j] == "maskhora"){
					inputs[i].onblur = function(){
						
							 	var hrs = this.value.substring(0,2);  
							    var min = this.value.substring(3,5); 
							    var hrs_pit = $("pitHorarioprazoapresentacao").value.substring(0,2);  
							    var min_pit = $("pitHorarioprazoapresentacao").value.substring(3,5);
							    
							    if (hrs > 23 || min > 59)
							    {
							    	alert("Horário invalido!");  
							       	this.value = '';
							       	this.focus();
							     				 			
							 	} 
							 	else if (hrs_pit > 23 || min_pit > 59)
							    {
							    	alert("Horário de apresentação invalido!");  
							       	$("pitHorarioprazoapresentacao").value = '';
							       	$("pitHorarioprazoapresentacao").focus();							     						 			
							 	} 
							    
							    else if (hrs_pit != ''){ 
							    
								    if ((hrs > hrs_pit) || (hrs >= hrs_pit &&  min > min_pit))
								    {							       	
								       	var horario = '';
								       	if(confirm("O horário desta tarefa é maior ou igual ao horário da apresentação geral!\nDeseja alterar o horário da apresentação geral para após esta tarefa?")) {
										    hrs++;
										    horario = hrs + ":" + min;								    
										    preencheHorario(horario, $("pitHorarioprazoapresentacao"));
										    
										}
										else {
												   alert("O horário desta tarefa foi alterado para antes da apresentação geral.");
												   //muda a data da tarefa pela do PIT
												    hrs_pit--;
												    horario = hrs_pit + ":" + min_pit;								    
										    		preencheHorario(horario, this);
										    									   
										}
								     						 			
								 	} 
							 	 }      
					}
				}		 	
			}
		}
		var preencheHorario = function(hora, campo) {
			campo.value = hora;
		}				
	}
	



/* __________________________________________________________*/

function Mask_Hora(){
	var inputs = document.getElementsByClassName("maskhora");
	inputs.each(
		function valideteElement(element){
			element.setAttribute("maxLength", 5);
			element.onkeypress = function(e){
				if(!e)
					e = window.event;
					
					if(this.nodeName == "INPUT")
						return Ajusta_Hora(this, e);
				};			
			
			}
		);
}


/*______________________________________________________*/

function DataMask(){
	var inputs = document.getElementsByClassName("data-mask");

	inputs.each(
		function validateElement(element){
			element.setAttribute("maxLength", 10);

			element.onkeypress = function(e){
				if(!e)
					e = window.event;

				return Ajusta_Data(this, e);
			};
		}
 	);
}

/*______________________________________________________*/

function DataValidate(){
	var inputs = document.getElementsByClassName("data-validate");

	inputs.each(
		function validateElement(element){
			element.onblur = function(){
				Verifica_Data(this, true);
				this.blur();
			};
		}
	);
}

/*______________________________________________________*/

function NumbersOnly(){
	var inputs = document.getElementsByClassName("numbers-only");

	inputs.each(
		function validateElement(element){
			element.onkeypress = function(e){
				if(!e)
					e = window.event;

				return Bloqueia_Caracteres(e);
			};
		}
	);
}

/*______________________________________________________*/

function CpfMask(){
	var inputs = document.getElementsByClassName("cpf-mask");

	inputs.each(
		function validateElement(element){
			element.setAttribute("maxLength", 14);

			element.onkeypress = function(e){
				if(!e)
					e = window.event;

				return Ajusta_Cpf(this, e);
			};
		}
	);
}

/*______________________________________________________*/

function TelefoneDDDMask(){
	var inputs = document.getElementsByClassName("telefone-ddd-mask");

	inputs.each(
		function validateElement(element){
			element.setAttribute("maxLength", 14);

			element.onkeypress = function(e){
				if(!e)
					e = window.event;

				return this.onkeyup(e);
			}



			element.onkeyup = function(e){
				if(!e)
					e = window.event;

				return Ajusta_Telefone_DDD(this, e);
			};
		}
	);
}

/*______________________________________________________*/

function FormAutoValidated(){
	var borderNormal = "";
	var borderError = "#ff0000";

	var formularios = document.getElementsByClassName("form-auto-validated");

	formularios.each(
		function validateElement(element){
			element.onsubmit = function(e){
				var inputs = this.getElementsByTagName("input");
				var textareas = this.getElementsByTagName("textarea");
				var selects = this.getElementsByTagName("select");

				var inputAux = new Array (inputs.length + textareas.length + selects.length);
				
				var j = 0;
				for(j; j < inputs.length; j++){
					inputAux[j] = inputs[j];
				}
				
				var l = j;
				for(var i = 0; i < textareas.length; i++){
					l++;
					inputAux[l] = textareas[i];
				}
								
				for(var i = 0; i < selects.length; i++){
					inputAux[l + i + 1] = selects[i];
				}
				
				inputs = inputAux;
				
/*				for(var i = 0; i < inputAux.length; i++){
					alert(inputAux[i].name);
				}
				*/
				
				
				if(inputAux.length == 0)
					return;

				var submitForm = true;
				//-----------------------

				var invalidInputs = new Array();

				var contInv = 0;
				for(var i = 0; i < inputAux.length; i++){
					var el = inputAux[i];

					if(!el)
						continue;

					if(!formautovalidated.validInput(el)){
						el.style.borderColor = borderError;
						submitForm = false;

						invalidInputs[contInv++] = inputAux[i];
					}
					else{
						el.style.borderColor = borderNormal;
					}
				}

				if(!submitForm)
					invalidInputs[0].focus();

				//--
				return submitForm;
			}
		}
	);

	//--
	this.validInput = function(element){
		if(element){
			if(element.className == null){
				return;
			}
		}
		else{
			return;
		}
		
		var classNames = element.className.split(' ');
		var stat = true;

		for(var i = 0; i < classNames.length; i++){
			if(classNames[i] == "onsubmit:notnull")
				stat = stat && formautovalidated.onsubmitNotNull(element);
			//else if(classNames[i].substring(0, "onsubmit:notnullone{".length) == "onsubmit:notnullone{") //ao menos um que tem a mesma classe que este, não poderá estar null
			else if(classNames[i]== "onsubmit:notnullone") //ao menos um que tem a mesma classe que este, não poderá estar null
				stat = stat && formautovalidated.onsubmitNotNullOne(element, classNames[i]);
			else if(classNames[i] == "onsubmit:numbers-only")
				stat = stat && formautovalidated.onsubmitNumbersOnly(element);
			else if(classNames[i].substring(0, "onsubmit:length{".length) == "onsubmit:length{")
				stat = stat && formautovalidated.onsubmitLength(element, classNames[i].substring("onsubmit:length{".length, classNames[i].length - 1));
			else if(classNames[i] == "onsubmit:cpf")
				stat = stat && formautovalidated.onsubmitCPF(element);
			else if(classNames[i] == "onsubmit:telefone-ddd")
				stat = stat && formautovalidated.onsubmitTelefone(element);
		}

		return stat;
	}

	//________________________
	this.onsubmitNotNull = function(element){
		if(element.nodeName == "SELECT")
			return (element.options[element.selectedIndex].value != "null");
		else
			return (element.value.length > 0);
	}
	
	//________________________
	this.onsubmitNotNullOne = function(element, classN){
		var stats = false;
		
		//pego o formulário pai
		var parentForm = element.parentNode;
		
		var cont = 0;
		while(parentForm.nodeName != "FORM" && cont < 1000){
			parentForm = parentForm.parentNode;
			cont++;
		}
		
		var els = parentForm.getElementsByClassName(classN);
		for(var i = 0; i < els.length; i++){
			stats |= els[i].value.length > 0;
		}
		
		if(stats){
			for(var i = 0; i < els.length; i++){
				els[i].style.borderColor = borderNormal;
			}
		}
			
		
		return stats;
	}

	//________________________
	this.onsubmitNumbersOnly = function(element){
		return !isNaN(parseInt(element.value));
	}

	//________________________
	this.onsubmitLength = function(element, len){
		return (element.value.length == len);
	}

	//________________________

	this.onsubmitCPF = function(element){
		var cpf = element.value;

		//cpf.replace(/[^0-9]/,"");
		//cpf = cpf.replace(/(^[0-9])*.+([^0-9])*.+([^0-9])*.+([^0-9])*/,"");
		//cpf = cpf.replace(/(\d*\D)*/,"");
		
		//enquanto eu nao resolvo isso que nem gente, vai uma gamba mesmo...
		for(i = 0; i < cpf.length; i++)
			cpf = cpf.replace(/\D/,"");

		return validaCPF(cpf);

	}
	
	//________________________

	this.onsubmitTelefone = function(element){
		var telefone = element.value;
		return validaTelefone(telefone);

	}
}
/*______________________________________________________*/
/*
 Padawan's JavaScript-Mega-Validator 3000+
 Todos os direitos reservados para Diego Pires Plentz
 Você pode usar esse código nas suas páginas desde que mantenha os créditos ;-)
 */

 //Verifica qual o browser do visitante e armazena na variável púbica clientNavigator,
 //Caso Internet Explorer(IE) outros (Other)
 if (navigator.appName.indexOf('Microsoft') != -1){
 	clientNavigator = "IE";
 }else{
 	clientNavigator = "Other";
 }
 function Verifica_Data(data, obrigatorio){
 //Se o parâmetro obrigatório for igual à zero, significa que elepode estar vazio, caso contrário, não
 	if(!data instanceof Object)
  		data = document.getElementById(data);

	var strdata = data.value;
 	if((obrigatorio == 1) || (obrigatorio == 0 && strdata != "")){
 		//Verifica a quantidade de digitos informada esta correta.
 		if (strdata.length != 10){
 			alert("Formato da data não é válido.\n Formato correto:\n dd/mm/aaaa.");
 			data.focus();
 			return false
 		}
 		//Verifica máscara da data
 		if ("/" != strdata.substr(2,1) || "/" != strdata.substr(5,1)){
 			alert("Formato da data não é válido.\n Formato correto:\n dd/mm/aaaa.");
 			data.focus();
 			return false
 		}
 		dia = strdata.substr(0,2)
 		mes = strdata.substr(3,2);
 		ano = strdata.substr(6,4);
 		//Verifica o dia
 		if (isNaN(dia) || dia > 31 || dia < 1){
 			alert("Formato do dia não é válido.");
 			data.focus();
 			return false
 		}
 		if (mes == 4 || mes == 6 || mes == 9 || mes == 11){
 			if (dia == "31"){
 				alert("O mês informado não possui 31 dias.");
 				data.focus();
 				return false
 			}
 		}
 		if (mes == "02"){
 			bissexto = ano % 4;
 			if (bissexto == 0){
 				if (dia > 29){
 					alert("O mês informado possui somente 29 dias.");
 					data.focus();
 					return false
 				}
 			}else{
 				if (dia > 28){
 					alert("O mês informado possui somente 28 dias.");
 					data.focus();
 					return false
 				}
 			}
 		}
 	//Verifica o mês
 		if (isNaN(mes) || mes > 12 || mes < 1){
 			alert("Formato do mês não é válido.");
 			data.focus();
 			return false
 		}
 		//Verifica o ano
 		if (isNaN(ano)){
 			alert("Formato do ano não é válido.");
 			data.focus();
 			return false
 		}
 	}
 }

 function Compara_Datas(data2, data1){ 	
						    
	if ( parseInt( data2.split( "/" )[2]) > parseInt( data1.split( "/" )[2]) || parseInt( data2.split( "/" )[1]) >= parseInt( data1.split( "/" )[1]) && parseInt( data2.split( "/" )[0]) > parseInt( data1.split( "/" )[0]))
	{		
		return true;
	}
	else{
		return false;
	}
 }

 /*function Verifica_Hora(hora, obrigatorio){
 //Se o parâmetro obrigatório for igual à zero, significa que elepode estar vazio, caso contrário, não
 	var hora = document.getElementById(hora);
 	if((obrigatorio == 1) || (obrigatorio == 0 && hora.value != "")){
 		if(hora.value.length < 5){
 			alert("Formato da hora inválido.\n Por favor, informe a hora no formato correto: hh:mm");
 			hora.focus();
 			return false
 		}
 		if(hora.value.substr(0,2) > 23 || isNaN(hora.value.substr(0,2))){
 			alert("Formato da hora inválido.");
 			hora.focus();
 			return false
 		}
 		if(hora.value.substr(3,2) > 59 || isNaN(hora.value.substr(3,2))){
 			alert("Formato do minuto inválido.");
 			hora.focus();
 			return false
 		}
 	}
 }*/

 function validaCPF(cpf){
	if (cpf.length < 11)
		return false;

	var nonNumbers = /\D/;

	if (nonNumbers.test(cpf))
		return false;

	if (cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999")
        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])){
       return false;
    }
    if (erro.length > 0){
       return false;
    }
    return true;
}

function validaTelefone(telefone){
	for(i = 0; i < telefone.length; i++)
		telefone = telefone.replace(/\D/,"");
	
	//somente números, com 10 dígitos
	if(telefone.length != 10)
		return false;
		
	return true;
}

 function Verifica_Email(email, obrigatorio){
 //Se o parâmetro obrigatório for igual à zero, significa que elepode estar vazio, caso contrário, não
 	var email = document.getElementById(email);
 	if((obrigatorio == 1) || (obrigatorio == 0 && email.value != "")){
 		if(!email.value.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.[a-zA-Z0-9._-]+)/gi)){
 			alert("Informe um e-mail válido");
 			email.focus();
 			return false
 		}
 	}
 }

 function Verifica_Tamanho(campo, tamanho){
 //usado para campos textarea onde não se tem o atributo maxlenght
 	var campo = document.getElementById(campo);
 	if(campo.value.length > tamanho){
 		alert("O campo suporta no máximo " + tamanho + " caracteres.");
 		campo.focus();
 		return false
 	}
 }

 function Verifica_Cep(cep, obrigatorio){
 //Se o parâmetro obrigatório for igual à zero, significa que elepode estar vazio, caso contrário, não
 	var cep    = document.getElementById(cep);
 	var strcep = cep.value;
 	if((obrigatorio == 1) || (obrigatorio == 0 && strcep != "")){
 		if (strcep.length != 9){
 			alert("CEP informado inválido.");
 			cep.focus();
 			return false
 		}else{
 			if (strcep.indexOf("-") != 5){
 				alert("Formato de CEP informado inválido.");
 				cep.focus();
 				return false
 			}else{
 				if (isNaN(strcep.replace("-","0"))){
 					alert("CEP informado inválido.");
 					cep.focus();
 					return false
 				}
 			}
 		}
 	}
 }

 function Bloqueia_Caracteres(evnt){
 //Função permite digitação de números
 	if (clientNavigator == "IE"){
 		if (evnt.keyCode < 48 || evnt.keyCode > 57){
			evnt.keyCode = 0;
 			return false;
 		}
 	}else{
 		if ((evnt.charCode < 48 || evnt.charCode > 57) && evnt.keyCode == 0){
 			return false;
 		}
 	}
 }

 function Ajusta_Data(input, evnt){
 //Ajusta máscara de Data e só permite digitação de números
 	if (input.value.length == 2 || input.value.length == 5){
 		if(clientNavigator == "IE"){
 			input.value += "/";
 		}else{
 			if(evnt.keyCode == 0){
 				input.value += "/";
 			}
 		}
 	}	
 //Chama a função Bloqueia_Caracteres para só permitir a digitação de números
 	return Bloqueia_Caracteres(evnt);
 }

 function Ajusta_Hora(input, evnt){
 	input.maxLength = 5; 
 //Ajusta máscara de Hora e só permite digitação de números

 	if (input.value.length == 2){
 		if(clientNavigator == "IE"){ 			
 			input.value += ":";
 		}else{
 			if(evnt.keyCode == 0){
 				input.value += ":";
 			}
 		}
 	} 	
 	
 	//Chama a função Bloqueia_Caracteres para só permitir a digitação de números
 	return Bloqueia_Caracteres(evnt);
 	 
}

function Ajusta_Cep(input, evnt){
 //Ajusta máscara de CEP e só permite digitação de números
 	if (input.value.length == 5){
 		if(clientNavigator == "IE"){
 			input.value += "-";
 		}else{
 			if(evnt.keyCode == 0){
 				input.value += "-";
 			}
 		}
 	}
 //Chama a função Bloqueia_Caracteres para só permitir a digitação de números
 	return Bloqueia_Caracteres(evnt);
 }

function Ajusta_Cpf(input, evnt){
 //Ajusta máscara de CPF e só permite digitação de números
 	if(input.value.length > 0){
	 	if(input.value.length == 3 || input.value.length == 7){
	 		if(clientNavigator == "IE"){
	 			input.value += ".";
	 		}else{
	 			if(evnt.keyCode == 0){
	 				input.value += ".";
	 			}
	 		}
	 	}
		else if(input.value.length == 11){
			if(clientNavigator == "IE"){
	 			input.value += "-";
	 		}else{
	 			if(evnt.keyCode == 0){
	 				input.value += "-";
	 			}
	 		}
		}
	}
 //Chama a função Bloqueia_Caracteres para só permitir a digitação de números
 	return Bloqueia_Caracteres(evnt);
}

function Ajusta_Telefone_DDD(input, evnt){
	//Ajusta máscara de telefone com DDD
 	if(input.value.length > 0){
	 	if(input.value.length == 2){
	 		if(clientNavigator == "IE"){
	 			input.value = "(" + input.value + ") ";
	 		}else{
	 			if(evnt.keyCode == 0){
	 				input.value = "(" + input.value + ") ";
	 			}
	 		}
	 	}
		else if(input.value.length == 9){
			if(clientNavigator == "IE"){
	 			input.value += " ";
	 		}else{
	 			if(evnt.keyCode == 0){
	 				input.value += " ";
	 			}
	 		}
		}

	}
 //Chama a função Bloqueia_Caracteres para só permitir a digitação de números
 	return Bloqueia_Caracteres(evnt);
}

 function Atualiza_Opener(){
 //Atualiza a página opener da popup que chamar a função
 	window.opener.location.reload();
 }
