/*******************************************************
 * Verifica se um caractere é invalido ou seja, contém
 * alguma coisa que não é um gígito de 0 a 9.
 *******************************************************/
function caractereInvalido(c)
	{
	switch(c)
		{
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			return false;
		}

	return true;
	}

/*********************************
 * Obtem um valor decimal a partir de um String do tipo
 *  
 * 10
 *  12,0
 * 12,021
 * 1.234,0
 * 123.456,123
 *  
 * retorna -1 em caso de erro
 *********************************/
function obterValorDecimal(texto)
	{
	//Primeiro, verifica o valor digitado, removendo pontos e 
	//transformando a virgula em ponto
	var corrigido='';
	var virgulas=0;

	for(i=0,t=texto.length; i<t; i++)
		{
		var c=texto.charAt(i);
		if(c==',')
			{
			//Pode ter no máximo uma vírgula ou um ponto
			virgulas++;
			if(virgulas>1)
				//Erro
				return -1; 
			//Ok, troca por ponto
			corrigido+='.';
			}
		else
		if(c=='.')
			{
			//Pode ter no máximo uma virgula ou um ponto
			virgulas++;
			if(virgulas>1)
				//Erro
				return -1; 
			//Ok, mantém o ponto
			corrigido+='.';
			}
		else
		if(caractereInvalido(c))
			//Erro
			return -1;
		else
			corrigido+=c;
		}
	
	return parseFloat(corrigido);
	}


/********************************************************
 * Verifica se uma string contem apenas digitos de 0 a 9
 ********************************************************/
function verificarValor(elemento)
	{
	for(i=0; i<elemento.length; i++)
		{
		if(caractereInvalido(elemento.charAt(i)))
			{
			alert("Favor digitar somente numerais (0 1 2 3 4 5 6 7 8 9)");
			return false;
			}
		}

	return true;
	}

/********************************************************
 * Calcula todos os tempos com base nos valores do ritmo 
 * que está nos inputs:
 * 
 *  document.calculadora.rm
 *  document.calculadora.rs
 ************************************/
function calcularTempos()
	{
	//Pega os objetos
	var m=document.calculadora.rm.value;
	var s=document.calculadora.rs.value;

        //Acerta inicialmente os valores em branco
	if(m.length==0)
		m='0';

	if(s.length==0)
		s='0';

	//Verifica se está certo o que foi digitado no campo ritmo
	if(!verificarValor(m))
		return false;
	if(!verificarValor(s))
		return false;

	//Calcula quantos segundos leva para completar distancia unitaria (m, km, etc)
	var nsegundos=parseFloat(m)*60+parseFloat(s);

	//Limita
	if(nsegundos>1200)
		{
		alert("O valor do ritmo está superior ao máximo tolerado (20 min)! Favor diminuir o valor.");
		return false;
		}

	var metroSegundo=1000.0/nsegundos;

	//Calcula os valores para todas as distâncias
	gravarTextoTempo(document.calculadora.th5,document.calculadora.tm5,document.calculadora.ts5,metroSegundo,5000);
	gravarTextoTempo(document.calculadora.th1,document.calculadora.tm1,document.calculadora.ts1,metroSegundo,10000);
	gravarTextoTempo(document.calculadora.th2,document.calculadora.tm2,document.calculadora.ts2,metroSegundo,20000);
	gravarTextoTempo(document.calculadora.thm,document.calculadora.tmm,document.calculadora.tsm,metroSegundo,21098);
	gravarTextoTempo(document.calculadora.thf,document.calculadora.tmf,document.calculadora.tsf,metroSegundo,42195);

	//Para o último, verifica a distancia em metros
    var distancia=document.calculadora.doutra.value;
	if(distancia.length==0)
		{
		//Coloca o valor 1 se não tiver nada
		distancia='1';
		document.calculadora.doutra.value=distancia;
		}

	//Ajusta o valor para um float (aqui, distancia é ainda string)
	distancia=obterValorDecimal(distancia);
	if(distancia<0)
		{
		alert("O valor do campo Outra (km) deve ser numérico! Exemplos: 214, 9,713 9,32 9,295 3,726 3,3 etc.");
		return false;
		}

	if(distancia>280)
		{
		alert("O valor do campo Outra (km) deve ser no máximo 280! Favor corrigir.");
		return false;
		}
	gravarTextoTempo(document.calculadora.tho,document.calculadora.tmo,document.calculadora.tso,metroSegundo,distancia*1000);
	return true;
	}

/**************************************************************************************
 * Calcula o tempo em horas, minutos e segundos para a velocidade e a distancia
 * 
 * th, tm e ts são <input typpe "text"> usados como parametro. tempo em s e velo em m/s
 *
 *************************************************************************************/
function gravarTextoTempo(inputTextH, inputTextM, inputTextS, velocidade, distancia)
	{

	//Calcula o total de segundos já arredondados que vai levar
	var tbs=Math.round(distancia/velocidade);
	
	//Calcula o numero de horas
	var th=Math.floor(tbs / 3600);

	tbs-=th*3600;

	//Calcula o numero de minutos que sobraram 
	var tm=Math.floor(tbs / 60);
         tbs-=tm*60;

	//Calcula o numero de segundos que sobraram
	var ts=tbs;

	inputTextH.value=th;
	inputTextM.value=tm;
	inputTextS.value=ts;
	}


/************************************************************
 * Utiliza os valores para calcular o ritmo desejado.
 * Após o cáculo do ritmo equivalente, atualiza todos os
 * outros de tempos com os valores equivalentes ao ritmo
 * calculado.
 *
 *   th - tempo em horas (string)
 *   tm - tempo em minutos (string)
 *   ts - tempo em segundos (string)
 *   distancia em km (string), pode ser ponto flutuante (usando virgulas)
 ************************************************************/
function calcularRitmo(th,tm,ts,distancia)
	{
	//Faz uma correção prévia
	if(th.length==0)
		th='0';
	if(tm.length==0)
		tm='0';
	if(ts.length==0)
		ts='0';
	if(distancia.length==0)
		distancia='1';


	//Verifica strings se etão ok
	if(!verificarValor(th))
		return false;
	if(!verificarValor(tm))
		return false;
	if(!verificarValor(ts))
		return false;

	//Pega a distância em decimal
	distancia=obterValorDecimal(distancia);
	if(distancia<0)
		{
		alert("A distância deve ser numérica - exemplos: 214 9,32 3,31  10,250 12,475 etc.");
		return false;
		}

	//transforma distancia em metros
	distancia*=1000;

	//Calcula total de segundos
	var nSegundos=parseFloat(th)*3600+parseFloat(tm)*60+parseFloat(ts);

	//Calcula a velocidade em m/s
	var vel=distancia/nSegundos;

	//Descobre o ritmo, já arrendondando para o segundo mais proximo
	var rs=Math.round(1000/vel);

	//Maximo ritmo permitido
	if(rs>1200)
	  {
	  alert("O ritmo calculado é superior ao máximo tolerado (20 min)! Favor diminuir o tempo.");
	  return false;
	  }

	//Calcula o numero de minutos que sobraram 
	var rm=Math.floor(rs / 60);
        rs-=rm*60;

	//Grava o ritmo
	document.calculadora.rm.value=rm;
	document.calculadora.rs.value=rs;

	//Agora recalcula todos os tempos
	calcularTempos();
	}

