﻿
addLoadEvent(onLoad);
var params;

function onLoad()
{
	if(listarLugares()) return; 
	var nombre;
	seleccionar(1);
	params = parseSearch();
	nombre = nombres[params["oaci"]];
	text("nombre", nombre ? nombre : "?");
	periodica();
	if(nombre) setInterval("periodica()",1000);
}
var nombres={
LEZG: "Zaragoza",
LEMD: "Madrid",
LEBL: "Barcelona",
LEMG: "Málaga",
LEVC: "Valencia",
LEPA: "Palma",
LEST: "Santiago",
LEAL: "Almería",
LEGE: "Gerona",
GCFV: "Fuertev.",
GCLA: "La Palma",
GCLP: "Las Palmas",
GCXO: "Tenerife",
GCTS: "Tenerife",
GCRR: "Lanzarote"
};
/*
2010/02/16 19:30
LEZG 161930Z 11006KT 080V140 2000 BR BKN010 06/06 Q0990
*/
var ajax = new Ajax("desktop.php");
ajax.onCallbackOk = onResponseOk;
ajax.onCallbackKo = onResponseKo;
function peticion(op)
{
	TRACELN("peticion : " + op + "  " + (new Date).toUTCString());
	params["op"] = op;
	params["tick"] = "" + (new Date()).getTime(); 
	ajax.getphp(params);
}
function onResponseOk(txt)
{
	TRACELN(txt);
	if(txt.length > 30 
	&& txt.charAt(4) == "/"  
	&& txt.charAt(7) == "/"  
	&& txt.charAt(10) == " "  
	&& txt.charAt(13) == ":"  
	&& txt.charAt(16) == "\n" ){
		if(txt.substr(17, 4) == "TAF "){
			text("item3", text2html(txt));
			t2_tafor = txt2tick(txt) + 6*3600*1000 + 5*60*1000;
		}
		else{
			text("item2", text2html(txt));
			t2_metar = txt2tick(txt) + 35*60*1000;
			parseMetar(txt);
		}
	}
	setTimeout("periodica()",3000);
}
function onResponseKo()
{
//	alert("errorrrrrrrr");
}
function parseResponse(txt)
{
}
function text2html(txt)
{
	var ar = txt.split("\n");
	txt = "";
	for(i in ar){
		txt += trim(ar[i]) + "<br>";
	}
	return txt;
}
function txt2tick(txt)
{
	var d = txt2date(txt);
	TRACELN("parte : " + d.toUTCString());
	return d.getTime();
}
function txt2date(txt)
{	//2010/02/16 19:30
	var d = new Date();
	d.setUTCFullYear (getInt(txt.substr(0, 4)));
	d.setUTCMonth    (getInt(txt.substr(5, 2)) - 1);
	d.setUTCDate     (getInt(txt.substr(8, 2)));
	d.setUTCHours    (getInt(txt.substr(11, 2)));
	d.setUTCMinutes  (getInt(txt.substr(14, 2)));
	d.setUTCSeconds     (0);
	d.setUTCMilliseconds(0);
	return d;
}
function getInt(txt)
{
	var n = 0;
	var c, i;
	for(i=0;i<txt.length;i++){
		c = txt.charCodeAt(i);
		if(c < "0".charCodeAt(0)) continue;
		if(c > "9".charCodeAt(0)) continue;
		n = n * 10 + (c & 0x0F);
	}
	return n;
}
function recargar()
{
	window.location.reload();
}
function deseleccionar(id)
{
	var tab = $("tab" + id);

	tab.style.backgroundColor = "#cccc99";
	tab.style.color = "#666666";
	tab.style.fontWeight = "normal";
	
	show("item" + id, false);
	
}
function seleccionar(id)
{
	var tab = $("tab" + id);
	
	deseleccionar(1);
	deseleccionar(2);
	deseleccionar(3);
	
	tab.style.backgroundColor = "#AFEEEE";
	tab.style.color = "#FFFFFF";
	tab.style.fontWeight = "bold";

	show("item" + id, true);
}
var t1_metar=0;
var t2_metar=0;
var t1_tafor=0;
var t2_tafor=0;
var t_global=0;
function periodica()
{
	var d = new Date();
	var ac = d.getTime();
	
	if(ajax.isRunning() && t_global > ac) return;
	t_global = ac + 30000; //tiempo esperando a una peticion
	//mostrarAvance(d);	//RELOJ en pantalla
	
	TRACELN("peridica : " + d.toUTCString());
	if(ac > t1_metar && ac > t2_metar){
		t1_metar = ac + 290000;
		peticion("metar");
		return;
	}
	if(ac > t1_tafor && ac > t2_tafor){
		t1_tafor = ac + 290000;
		peticion("tafor");
		return;
	}
}
function mostrarAvance(d)
{
	var h = d.getUTCHours();
	var m = d.getUTCMinutes();
	var s = d.getUTCSeconds();
	if(s < 10) s = ":0" + s;
	else       s = ":"  + s;
	if(m < 10) m = ":0" + m;
	else       m = ":"  + m;
	text("libre", h+m+s);
}
/*
2010/02/16 19:30
LEZG 161930Z 11006KT 080V140 2000 BR BKN010 06/06 Q0990
*/
function parseMetar(txt)
{
	var trozos;
	var graf;
	var dia = esDia(txt);
	text("hora", txt.substr(11, 5));

	trozos = txt.split(" ");
	
	var qnh = getQNH(trozos);
	var ts  = getTS(trozos);
	var td  = getTD(trozos);
	var dir = getDIR(trozos);
	var vel = getVEL(trozos);
	var sig = getSIG(trozos);
	
	
	text("pres", "" + qnh);
	text("temp", "" + ts);
	text("hum", "" + getH(ts, td));
	text("dir",  dir);
	text("vel",  "" + vel);
	//decidir nuboisidad
	switch(sig){
		case "CAV":
		case "NSC":
			graf = dia ? "d_cavok" : "n_cavok";
			break;
		case "FEW":
			graf = dia ? "d_few" : "n_few";
			break;
		case "SCT":
		case "BKN":
			graf = dia ? "d_bkn" : "n_bkn";
			break;
		case "OVC":
		case "VV0":
			graf = "ovc"; 
			break;
		default:
			graf = "na";
			break;
	}
	//casos RA,SN,FG,BR,TS
	
	if(flags_sig & FLAG_BR){
		graf = dia ? "d_br" : "n_br";
	}
	if(flags_sig & FLAG_TS){
		if(flags_sig & FLAG_OVC) graf = "ts";
		else                     graf = dia ? "d_ts" : "n_ts";
	}
	if(flags_sig & FLAG_FG){
		if(flags_sig & FLAG_OVC) graf = "fg";
	}
	if(flags_sig & FLAG_RA){
		if(flags_sig & FLAG_OVC) graf = "ra";
		else                     graf = dia ? "d_ra" : "n_ra";
	}
	if(flags_sig & FLAG_SN){
		if(flags_sig & FLAG_OVC) graf = "sn";
		else                     graf = dia ? "d_sn" : "n_sn";
	}
	
	$("grafico").src = "img/" + graf + ".png"
}
function esDia(txt)
{
	var d = txt2date(txt);
	var t = d.getTime();
	var m;
	m = d.getUTCHours()+ d.getUTCMinutes() / 60; 
	//TRACELN("m = " + m);
	d.setUTCMonth(2);
	d.setUTCDate(21);
	t = (t - d.getTime()) / (24*3600*1000); 
	t = Math.sin(2 * Math.PI * t / 365);
	//TRACELN("s = " + t);
	t = 12 + t * 2.5;		
	//TRACELN("d = " + t);
	var min = 12.5 - t/2;
	var max = 12.5 + t/2;
	//TRACELN("min = " + min);
	//TRACELN("max = " + max);
	return m > min && m < max;
}	
	
function getQNH(trozos)
{
	var v, txt, i;
	v = 0;
	for(i in trozos){
		txt = trozos[i];
		if(txt.substr(0, 1) == 'Q'){
			v = getInt(txt.substr(1));
		}
	}
	return v;
}
function getTS(trozos)
{
	var v, i;
	for(i in trozos){
		if(trozos[i].substr(0, 1) == 'Q'){
			v = trozos[i-1].split("/");
		}
	}
	return v.length == 2 ? getTemp(v[0]) : "0";
}
function getTD(trozos)
{
	var v, i;
	for(i in trozos){
		if(trozos[i].substr(0, 1) == 'Q'){
			v = trozos[i-1].split("/");
		}
	}
	return v.length == 2 ? getTemp(v[1]) : "0";
}
function getTemp(txt)
{
	return txt.charAt(0) == "M" ? -getInt(txt.substr(1)) : getInt(txt);
}
var rosa=["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N"]; 
function getDIR(trozos)
{
	var v, i, n, txt;
	v = -1;
	for(i in trozos){
		txt = trozos[i];
		n   = txt.length;
		if(txt.substr(n-2) != "KT") continue;
		v = txt.substr(0, 2);
		break;
	}
	if(v == -1)   return "???";
	if(v == "VR") return "VRB";
	v = getInt(v);
	v = parseInt(0.5 + 16.0 * v / 36.0);
	return rosa[v];
}
function getVEL(trozos)
{
	var v, i, n, txt;
	v = 0;
	for(i in trozos){
		txt = trozos[i];
		n   = txt.length;
		if(txt.substr(n-2) != "KT") continue;
		v = getInt(txt.substr(n-4, 2));
		break;
	}
	return parseInt(1.852 * v + 0.5);
}
function getSIG_kk(trozos)
{
	var v, i, txt, tr;
	v = "UNK";
	for(i in trozos){
		//TRACELN(trozos[i]);
		txt = trozos[i].substr(0, 3);
		if(txt == "CAV"
		|| txt == "NSC"
		|| txt == "FEW"
		|| txt == "SCT"
		|| txt == "BKN"
		|| txt == "OVC"
		|| txt == "VV0") v = txt; 
	}
	return v;
}
var flags_sig;
var FLAG_TS = 1;
var FLAG_RA = 2;
var FLAG_SN = 4;
var FLAG_FG = 8;
var FLAG_BR = 16;
var FLAG_BR = 32;
var FLAG_OVC = 256;
function getSIG(trozos)
{
	var v, i, txt, kt;
	v = "UNK";
	flags_sig = 0;
	kt = 0;
	for(i in trozos){
		txt = trozos[i].substr(0, 3);
		if(txt == "CAV"
		|| txt == "NSC"
		|| txt == "FEW"
		|| txt == "SCT"
		|| txt == "BKN") v = txt; 
		
		if(txt == "OVC"
		|| txt == "VV0") {v = txt;  flags_sig |= FLAG_OVC;}

		if(i > 2 && v == "UNK"){
			if(txt.indexOf("TS") > -1) flags_sig |= FLAG_TS;
			if(txt.indexOf("RA") > -1) flags_sig |= FLAG_RA;
			if(txt.indexOf("SN") > -1) flags_sig |= FLAG_SN;
			if(txt.indexOf("FG") > -1) flags_sig |= FLAG_FG;
			if(txt.indexOf("BR") > -1) flags_sig |= FLAG_BR;
		}
	}
//	flags_sig |= FLAG_RA; //test
	return v;
}
function getH(ts, td)
{
	var h = tensionVapor(td) / tensionVapor(ts);
	return parseInt(100*h + 0.5);
}
function tensionVapor(t)
{
  return 193145600.0 * Math.pow(10,-1779.75/(237.3+t));
}
function listarLugares()
{
	var div = $("listado");
	if(!div) return false;
	var lista = "";
	var url;
	for(oaci in nombres){
		url = "desktop.html?oaci=" + oaci;
		url = "<a href=\"" + url + "\">" + nombres[oaci] + "</a>";
		lista = lista + "<li>" + url + "</li>";
	}	
	
	div.innerHTML = "<ul>" + lista + "</ul>";
	return true;
}


