/******************************************************************************************************************
 * Arquivo criado em:		2003-01-11
 * Arquivo atualizado em:	2011-03-24
 * Autor:					Francisco L. de Matos
 * Descricao:				Funcoes de validacao, tratamento e recursos em geral de datas e horas
 ******************************************************************************************************************/

	// 01 - Validação de data - is_data
	/*
		Atributos:  1º data (Ex.: 01/01/2009)
					2º formato (Facultativo - 0 para data brasil e 1 para data de BD - Usado para validar datas de banco de dados. Ex.: 2009-02-01)
		Uso com: 	chamadas normais de funções
		Exemplo: 	if (is_data('01/02/2010')) {...
		Descricao: 	Esta função é utilizada para validação de dados do tipo data. Não aceita-se datas com horas
					e os formatos obrigatórios são dd/mm/yyyy ou yyyy-mm-dd.
	*/
	function is_data(){
		// 1. Vamos receber os argumentos
		var dt = '', ce = 0, dt_br_sql = 0;
		var dtX = '', tmX = '', ano_min = 0, ano_max = 0;
		var diaX = 0, mesX = 0, anoX = 0, horaX = 0, minutoX = 0, segundoX = 0;
		for (i = 0; i < arguments.length; i++) {
			if (i == 0) {dt = arguments[i];}
			if (i == 1) {ano_min = arguments[i];}
			if (i == 2) {ano_max = arguments[i];}
		}
		// 2. Tratamento de erros
		// 2.1. variavel vazia
		if (dt === '') {return false;}
		// 2.2. vamos separar a data do tempo
		if (dt.length > 10) {
			var date_time_ = dt.split(' ');
			if (date_time_.length != 2) {return 0;}
			dtX = date_time_[0]; tmX = date_time_[1];
		} else {
			dtX = dt; tmX = '';
		}
		// 2.3. vamos verificar se a data é brasileira (/) ou mysql (-)
		var data_br_ = dtX.split('/'); // 0 é dia, 1 é mês, 2 é ano
		var data_sql_ = dtX.split('-'); // 0 é ano, 1 é mês, 2 é dia
		if (data_br_.length > 1) {dt_br_sql = 1;}
		if (data_sql_.length > 1) {dt_br_sql = 2;}
		if (dt_br_sql < 1 || dt_br_sql > 2){return false;}
		// 2.3.1. vamos recuperar o dia, mes, ano da data brasileira
		if (dt_br_sql == 1){anoX = data_br_[2]; mesX = data_br_[1]; diaX = data_br_[0];}
		// 2.3.2. vamos recuperar o dia, mes, ano da data mysql
		if (dt_br_sql == 2){anoX = data_sql_[0]; mesX = data_sql_[1]; diaX = data_sql_[2];}
		// 3. Validacoes
		// 3.1. data
		if (!is_numero(diaX)) {return false;}
		if (!is_numero(mesX)) {return false;}
		if (!is_numero(anoX)) {return false;}
		if (parseFloat(diaX) > 31 || parseFloat(diaX) < 1) return false;
		if (parseFloat(mesX) > 12 || parseFloat(mesX) < 1) return false;
		if (ano_max > 0) {
			if (parseFloat(anoX) > ano_max) return false;
		}
		if (ano_min > 0) {
			if (parseFloat(anoX) < ano_min) return false;
		}
		// 3.2. tempo
		if (tmX != '') {
			// 3.2.1. coleta do tempo
			var time_ = tmX.split(':'); // 0 é hora, 1 é minuto, 2 é segundo
			horaX = time_[0]; minutoX = time_[1]; segundoX = time_[2];
			// 3.2.2. validacao numerica
			if (!is_numero(horaX)) {return false;}
			if (!is_numero(minutoX)) {return false;}
			if (!is_numero(segundoX)) {return false;}
			// 3.2.3. validacao de intervalo
			if (parseFloat(horaX) > 23 || parseFloat(horaX) < 0) return false;
			if (parseFloat(minutoX) > 59 || parseFloat(minutoX) < 0) return false;
			if (parseFloat(segundoX) > 59 || parseFloat(segundoX) < 0) return false;
		}
		// 4. Se a função chegou até aqui é porque a data é válida
		return true;
	}
	// 02 - Validar a data de um campo - validar_data
	/*
		Atributos:  1º campo (Ex.: this)
					2º formulario (Ex.: this.form. É usado para identificar campos que são repetidos na página, porém em formulários diferntes)
					3º ano - opcional - (Ex.: 2020. É usado para não aceitar datas com anos maiores)
		Uso com: 	onBlur (geralmente)
		Exemplo: 	onBlur="validar_data(this,this.form,2010)"
		Descricao: 	Esta função é utilizada para validação de dados do tipo data em campos.
	*/
	function validar_data(){
		// 1. vamos receber os parâmetros
		var campo = '', form = "", ano_max = 0, ano_min = 0;
		for (i = 0; i < arguments.length; i++) {
			if (i == 0) {var campo = arguments[i];}
			if (i == 1) {var form = arguments[i];}
			if (i == 2) {var ano_min = arguments[i];}
			if (i == 3) {var ano_max = arguments[i];}
		}
		// 2. tratamento de parametros padroes
		var temp_ = localizar_formulario_campo(campo,form);
		vI = temp_[0]; vJ = temp_[1];
		if (vI == -1 || vJ == -1) {return false;}
		// 3. validação e mensagem de erro
		var dt = document.forms[vI].elements[vJ].value;
		if (dt != "") {
			if (!is_data(dt,ano_min,ano_max)) {
				// 2. Resposta
				alert("ERRO: Data inválida!");
				//document.forms[vI].elements[vJ].value = "";
				window.setTimeout("document.forms["+vI+"].elements["+vJ+"].focus()",20);
			}
		}
	}

	// 03 - Validação de hora - is_hora
	/*
		Atributos:  1º hora (Ex.: 12:56:15)
		Uso com: 	chamadas normais de funções
		Exemplo: 	if (is_hora('12:56:15')) {...
		Descricao: 	Esta função é utilizada para validação de dados do tipo data. Não aceita-se datas com horas
					e os formatos obrigatório são dd/mm/yyyy ou yyyy-mm-dd.
	*/
	function is_hora(){
		// a) vamos receber os parâmetros
		var hr = "00:00:00"; var hora = 0; var minutos = 0; var segundos = 0; var tm;
		for (var i = 0; i < arguments.length; i++) {
			if (i == 0) {hr = arguments[i];}
		}
		// b) vamos iniciar o tratamento
		if (hr === "") {
			return false;
		} else {
			// 1. verificar tamanho do campo
			tm = hr.length;
			if (tm < 5 || tm > 8) return false;
			// 2. vamos contar os divisores dos segundos, minutos e horas
			var n = 0; var contB = 0;
			while (n < 10){
				b = hr.substring(n,n+1);
				if (b == ':') contB++;
				n++;
			}
			if (contB < 1) {return false;}
			if (contB > 2) {return false;}
			// 3. vamos separar o dia, mes e ano
			var hora_ = hr.split(':');
			hora = hora_[0]; minuto = hora_[1]; segundo = hora_[2];
			// 4. verificar regras para dia, mês e ano
			if (parseFloat(hora) > 23 || parseFloat(hora) < 0) return false;
			if (parseFloat(minuto) > 59 || parseFloat(minuto) < 0) return false;
			if (contB == 2 && (parseFloat(segundo) > 59 || parseFloat(segundo) < 0)) return false;
			// 5. se a função chegou até aqui é porque a data é válida
			return true;
		}
	}
	// 04 - Validar a hora de um campo - validar_hora
	/*
		Atributos:  1º campo (Ex.: this)
					2º formulário (Ex.: this.form. É usado para identificar campos que são repetidos na página, porém em formulários diferentes)
		Uso com: 	onBlur (geralmente)
		Exemplo: 	onBlur="validar_hora(this,this.form)"
		Descricao: 	Esta função é utilizada para validação de dados do tipo hora em campos de formulario.
	*/
	function validar_hora(){
		// 1. vamos receber os parâmetros
		var campo = '', form = '';
		for (var i = 0; i < arguments.length; i++) {
			if (i == 0) {var campo = arguments[i];}
			if (i == 1) {var form  = arguments[i];}
		}
		// 2. tratamento de parametros padroes
		var temp_ = localizar_formulario_campo(campo,form);
		vI = temp_[0]; vJ = temp_[1];
		if (vI == -1 || vJ == -1) {return false;}
		// 3. validação e mensagem de erro
		var hr = document.forms[vI].elements[vJ].value;
		if (hr != "") {
			if (!is_hora(hr)) {
				alert("ERRO: Horário inválido!");
				document.forms[vI].elements[vJ].value = "";
				window.setTimeout("document.forms["+vI+"].elements["+vJ+"].focus()",20);
			}
		}
	}

	// 05 - Esta função extrai valores de uma data - data
	/*
		Atributos:  1º data que será pesquisada
					2º termo que será extraido
		Uso com: 	chamadas normais de funções
		Exemplo: 	$dia_hoje = data('2009-12-02 13:52:23',0); ---> 02
		Descricao: 	Esta função é utilizada para extrair algum termo de uma data
	*/
	function data(){
		// 1. Declaracao das variáveis
		var dt = '00/00/0000', td = '', ce = 0;
		var anoX = 0, mesX = 0, diaX = 0;
		var horaX = 0, minutoX = 0, segundoX = 0;
		var dt_br_sql = 0;
		// 2. Coleta de argumentos
		for (i = 0; i < arguments.length; i++) {
			if (i == 0) {var dt = arguments[i];}
			if (i == 1) {var td = arguments[i];}
		}
		// 3. Tratamento de erros
		// 3.1 vamos verificar se a variável é data
		if (!is_data(dt)){return 0;}
		if (dt == ''){return 0;}
		// 4. Extracao / Tratamento
		// 4.1. vamos separar a data do tempo
		if (dt.length > 10) {
			var date_time_ = dt.split(' ');
			if (date_time_.length != 2) {return 0;}
			dtX = date_time_[0]; tmX = date_time_[1];
		} else {
			dtX = dt; tmX = '';
		}
		// 5. Tratamento de comandos
		// 5.1. vamos verificar se a data é brasileira (/) ou mysql (-)
		var data_br_ = dtX.split('/'); // 0 é dia, 1 é mês, 2 é ano
		var data_sql_ = dtX.split('-'); // 0 é ano, 1 é mês, 2 é dia
		if (data_br_.length > 1) {dt_br_sql = 1;}
		if (data_sql_.length > 1) {dt_br_sql = 2;}
		if (dt_br_sql < 1 || dt_br_sql > 2){return 0;} // vamos tratar o erro do formato
		// 5.2. vamos recuperar o dia, mes, ano da data brasileira
		if (dt_br_sql == 1){anoX = data_br_[2]; mesX = data_br_[1]; diaX = data_br_[0];}
		// 5.3. vamos recuperar o dia, mes, ano da data mysql
		if (dt_br_sql == 2){anoX = data_sql_[0]; mesX = data_sql_[1]; diaX = data_sql_[2];}
		// 5.4. vamos verificar se tem tempo
		if (tmX != '') {
			var time_ = tmX.split(':'); // 0 é hora, 1 é minuto, 2 é segundo
			horaX = time_[0]; minutoX = time_[1]; segundoX = time_[2];
		}
		// 6. Retorno - se a função chegou até o fim é por que a data é válida
		var nome_semana = Array('domingo','segunda-feira','terça-feira','quarta-feira','quinta-feira','sexta-feira','sábado');
		var nome_mes = Array('Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro');
		dn = new Date(dt);
		switch (td) { 
			case 'dia': return completar_caracteres(diaX,2,'0'); break;
			case 'mes': return completar_caracteres(mesX,2,'0'); break;
			case 'ano': return completar_caracteres(anoX,4,'0'); break;
			case 'hora': return completar_caracteres(horaX,2,'0'); break;
			case 'minuto': return completar_caracteres(minutoX,2,'0'); break;
			case 'segundo': return completar_caracteres(segundoX,2,'0'); break;
			case 'nome_semana': x = dn.getDay(); return nome_semana[x]; break;
			case 'nome_mes': return nome_mes[parseInt(mesX-1)]; break;
			default: return 0;
		} 
	}
	
	// 06 - Formatar data a partir de uma string - formatar_data
	/*
		Atributos:  1º data que sera formatada
					2º tipo de formatacao (0 = Brasil e 1 = SQL)
					3º  (0 para comecar da esquerda, 1 para comecar da direita)
		Uso com: 	chamadas normais de funções
		Exemplo: 	CodAgencia = mascara('485', '99999-9', 1) | Resp.: 48-5
		Descricao: 	Esta função é utilizada mascarar uma string.
	*/
	function formatar_data() {
		// 1. declaracao das variáveis
		var dt = '', tp = 0, show_time = -1, ce = 0;
		// 2. coleta de atributos
		for (i = 0; i < arguments.length; i++) {
			if (i == 0) {var dt = arguments[i];}
			if (i == 1) {var tp = arguments[i];}
			if (i == 2) {var show_time = arguments[i];}
		}
		// 2. Tratamento de erros
		//alert(dt+' *** '+tp+' *** '+show_time);
		if (!is_data(dt)){return dt;}
		if (!is_numero(tp)){alert(tp); return dt;}
		if (tp < 0 || tp > 1){return dt;}
		// 3. Tratamento de comandos
		diaX = data(dt,'dia');
		mesX = data(dt,'mes');
		anoX = data(dt,'ano');
		horX = data(dt,'hora');
		minX = data(dt,'minuto');
		segX = data(dt,'segundo');
		if (show_time == -1) {if (dt.length < 11){show_time = 0;} else {show_time = 1;}}
		// 4. Retorno final
		if (tp == 0 && show_time == 0){return diaX+'/'+mesX+'/'+anoX;}
		if (tp == 0 && show_time == 1){return diaX+'/'+mesX+'/'+anoX+' '+horX+':'+minX+':'+segX;}
		if (tp == 1 && show_time == 0){return anoX+'-'+mesX+'-'+diaX;}
		if (tp == 1 && show_time == 1){return anoX+'-'+mesX+'-'+diaX+' '+horX+':'+minX+':'+segX;}
		else {return $dt;}
	}
	
	// 07 - Comparacao entre duas datas - data_comparar
	function data_comparar() {
		// 1. Vamos receber os parâmetros
		var d1 = '00/00/0000', h1 = '00:00:00', d2 = '00/00/0000', h2 = '00:00:00', ce = 0, v1 = '', v2 = '', campo = '';
		for (i = 0; i < arguments.length; i++) {
			if (i == 0) {d1 = arguments[i];}
			if (i == 1) {h1 = arguments[i];}
			if (i == 2) {d2 = arguments[i];}
			if (i == 3) {h2 = arguments[i];}
			if (i == 4) {field = arguments[i];}
			if (i == 5) {form = arguments[i];}
		}
		// 2. Tratamento de erros
		if (!is_data(d1)) {ce++;}
		if (!is_data(d2)) {ce++;}
		if (ce != 0) {alert('ERRO [function:data_comparar]: A função foi chamada incorretamente!'); return false;}
		// 3. Tratamento de variaveis
		if (is_hora(h1)) {if (h1.length == 5) {h1 += ':00'} v1 = limpar_string(h1);}
		if (is_hora(h2)) {if (h2.length == 5) {h2 += ':00'} v2 = limpar_string(h2);}
		d1 = parseFloat(limpar_string(formatar_data(d1,1)) + v1);
		d2 = parseFloat(limpar_string(formatar_data(d2,1)) + v2);
		// 4. Tratamento de comandos
		if (d1 >= d2) {
			alert('ERRO: A data final não pode ser menor que a data inicial!');
			if (typeof field == 'object') {campo = field.name;} else if (typeof field == 'string'){campo = field;}
			if (typeof form == 'object') {
				window.setTimeout("form['"+campo+"'].focus()",100);
			} else {
				window.setTimeout("document.getElementById('"+campo+"').focus()",100);
			}
			return false;
		}
		return true;
	}

