var key1= 'ABQIAAAA-SSwkDqbK8WrKVKPU7ObohRBfps-PCi3ETYFHtU7Yh69l75yMRST0RWE4r7lsAkfAgd1AmTU3QIO3g';
var guri= 'http://maps.google.com/maps/geo?output=json&callback=gCallback&key='+key1+'&q=';
var appid1 = '26WTvi3V34E2DgU20paS4sfmROlawrpYQ31JRFIbSaFUxiMAQlJjxFbjZYApxx5veR59'; var yuri0 = 'http://api.maps.yahoo.com/ajaxymap?appid=' + appid1;
var yuri= 'http://api.maps.yahoo.com/ajax/geocode?appid='+appid1+'&qt=3&qs=';
var quri='';
var query='';
var gFound = false;
var gCalled = false;
var yCalled = false;
var yFound=false;
var yText = '';
var timer=0;
var gScriptObj = null;
var yScriptObj = null;
var gTagOpen= false;
var yTagOpen=false;
var lats = new Array(10);
var lons = new Array(10);

document.write('<script type="text/javascript" src="'+yuri0+'"><\/'+'script>'+'\n');

function closeGoogleTag() {
if (gTagOpen) {
gTagOpen=false;
gScriptObj.removeScriptTag();
}
}

function closeYahooTag() {
if (yTagOpen) {
yTagOpen=false;
yScriptObj.removeScriptTag();
}
}

	function checkTimer() {
closeGoogleTag();
closeYahooTag();
if (!gCalled && !yCalled) {
alert('El servicio del geocoder no ha respondido. Aseg\u00FArese que est\u00E1 conectado al Internet, que escribi\u00F3 el nombre bien y intente de nuevo.');
return false;
}
if (yFound) {
displayYahooResults();
return false;
}
noResults();
}

function launchGeocode() {
query=trim(document.getElementById('search').value);
var l=query.length;
if (l==0) {
alert("Hay que escribir el nombre de una ciudad, pueblo u otro lugar para buscar");
f1.search.focus();
return false;
}
clearRandomPoint();
quri=guri+escape(query);
	gScriptObj = new JSONscriptRequest( quri);
	gScriptObj.buildScriptTag();
	gScriptObj.addScriptTag();
gTagOpen=true;
try {
YGeoCode.getPoint=function(d){ yCallback(d) };
}
catch (err) {
var err0 = 0;
}
quri=yuri+escape(query);
	yScriptObj = new JSONscriptRequest( quri);
	yScriptObj.buildScriptTag();
	yScriptObj.addScriptTag();
yTagOpen=true;
gCalled = false;
gFound = false;
yCalled=false;
yFound = false;
timer=window.setTimeout("checkTimer()", 2800);
}

function gCallback(jData) {
gCalled = true;
if (selectedRegion != 0 || !gTagOpen) {
return false;
}
var r=f1.results;
r.length=0;
if (jData.Status.code == 200) {
gFound = true;
clearTimeout(timer);
closeYahooTag();
var p=jData.Placemark;
var l=p.length;
for(i=0; i<l-1; i++) {
var match=0;
for(j=i+1;j<l; j++) {
if (p[j].address.indexOf('Lng') == -1 && p[i].address == p[j].address && (p[i].Point.coordinates[1]
!= p[j].Point.coordinates[1] || p[i].Point.coordinates[0] != p[j].Point.coordinates[0])) {
p[j].address = p[j].address + " " + (Math.round(p[j].Point.coordinates[1]*100)/100) + " " + (Math.round(p[j].Point.coordinates[0]*100)/100);
match = 1;
}
}
if (match) {
p[i].address = p[i].address + " " + (Math.round(p[i].Point.coordinates[1]*100)/100) + " " + (Math.round(p[i].Point.coordinates[0]*100)/100);
}
}
lats.length=0;
lons.length=0;
for (i=0; i<p.length; i++) {
appendOptionLast("results", p[i].address);
r[r.length-1].value=p[i].Point.coordinates[1] + "|" + p[i].Point.coordinates[0];
lats[i] = p[i].Point.coordinates[1];
lons[i] = p[i].Point.coordinates[0];
}
if (lats.length > 0) {
f1.startlat.value=lats[0];
f1.startlon.value=lons[0];
}
if (r.length == 1) {
document.getElementById("resultslabel").innerHTML = "1 resultado de b\u00FAsqueda:";
} else {
document.getElementById("resultslabel").innerHTML = r.length + " resultados de b\u00FAsqueda:";
}
toggle2Rows("resultsrow", "searchrow");
f1.results.focus();
} else {
// no google results
if (yCalled) {
if (yFound) {
displayYahooResults();
} else {
noResults();
}
}
}
closeGoogleTag();
}

function yCallback(jData) {
yCalled = true;
if (selectedRegion != 0 || gFound || !yTagOpen) {
return false;
}
if (jData.GeoPoint.Lat != "0" || jData.GeoPoint.Lon != "0") {
yFound = true;
yText = jData.GeoAddress;
lats.length=0;
lons.length=0;
lats[0] = jData.GeoPoint.Lat;
lons[0] = jData.GeoPoint.Lon;
f1.startlat.value = lats[0];
f1.startlon.value = lons[0];
}
if (yFound) {
//if (gCalled) {
displayYahooResults();
//}
} else {
//if (gCalled) {
noResults();
//}
}
closeYahooTag();
}

function displayYahooResults() {
clearTimeout(timer);
var r=f1.results;
r.length=0;
toggle2Rows("resultsrow", "searchrow");
document.getElementById("resultslabel").innerHTML = "1 resultado:";
appendOptionLast("results", yText);
f1.results.focus();
}

function noResults() {
clearTimeout(timer);
var r=f1.results;
r.length=0;
toggle2Rows("resultsrow", "searchrow");
document.getElementById("resultslabel").innerHTML = "0 resultados:";
f1.results.focus();
}

function clearGeocode() {
f1.search.value = "";
f1.results.length=0;
document.getElementById("resultslabel").innerHTML = "Resultados:"; 
f1.startlat.value = "";
f1.startlon.value = "";
if (selectedRegion == 0) {
toggle2Rows("searchrow", "resultsrow");
}
clearRandomPoint();
}

function toggle2Rows(div1, div2) {
document.getElementById(div1).style.display = "block";
document.getElementById(div2).style.display = "none";
}

// JSONscriptRequest -- a simple class for accessing Yahoo! Web Services
// using dynamically generated script tags and JSON
// Author: Jason Levitt
// Date: December 7th, 2005
function JSONscriptRequest(fullUrl) {
    this.fullUrl = fullUrl; 
    this.noCacheIE = '&noCacheIE=' + (new Date()).getTime();
    this.headLoc = document.getElementsByTagName("head").item(0);
    this.scriptId = 'YJscriptId' + JSONscriptRequest.scriptCounter++;
}
JSONscriptRequest.scriptCounter = 1;

JSONscriptRequest.prototype.buildScriptTag = function () {
    this.scriptObj = document.createElement("script");
    this.scriptObj.setAttribute("type", "text/javascript");
    this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
    this.scriptObj.setAttribute("id", this.scriptId);
}
 
JSONscriptRequest.prototype.removeScriptTag = function () {
    this.headLoc.removeChild(this.scriptObj);  
}

JSONscriptRequest.prototype.addScriptTag = function () {
    this.headLoc.appendChild(this.scriptObj);
}



var f1;
var sigDigits=8;
var selectedRegion=0;
var selectedFormat = 0;
var units = "mi";
//var cookie = new Array(3);
var mapwin = null;
var circumMiles=12440.883;
var circumKm=20020.732;
var gLatlon="";
var gStartlat=0;
var gStartlon=0;

function writeLatLon() {
var i = f1.results.selectedIndex;
f1.startlat.value = lats[i];
f1.startlon.value = lons[i];
}

function appendOptionLast(combo, item) {
	var elOptNew = document.createElement('option');
	elOptNew.text = item;
	elOptNew.value = item;
	var elSel = document.getElementById(combo);
	try {
		elSel.add(elOptNew, null);
	}
	catch(ex) {
		elSel.add(elOptNew);
	}
}

function initializeLoad() {
f1=document.frm;
f1.circular.checked=true;
f1.wholeearth[1].checked=true;
selectedRegion=0;
switchrows();
f1.results.value = "";
f1.points.value = 1;
}

function clearRandomPoint () {
f1.randompoint.value= "";
gLatlon="";
document.getElementById("randompoint").rows = 2;
document.getElementById("randompointlabel").innerHTML = "Resultados:";
}

function resetValues() {
f1.startlat.value="";
f1.startlon.value="";
f1.maxdist.value="";
f1.northlat.value="";
f1.southlat.value="";
f1.westlon.value="";
f1.eastlon.value="";
f1.search.value = "";
f1.results.length = 0;
clearRandomPoint();
if (f1.wholeearth[0].checked) {
	if (f1.region[0].checked) {
// circular
f1.startlat.value=0;
f1.startlon.value=0;
if (f1.distunits[1].checked) {
f1.maxdist.value=circumKm;
} else {
f1.maxdist.value=circumMiles;
}
} else {
//rectangular
f1.northlat.value=90;
f1.southlat.value=-90;
f1.westlon.value=-180;
f1.eastlon.value=180;
}
}
document.getElementById("resultsrow").style.display = "none";
if (!f1.wholeearth[0].checked && f1.region[0].checked) {
document.getElementById("searchrow").style.display = "block";
} else {
document.getElementById("searchrow").style.display = "none";
}
}

function switchrows() {
	if (f1.region[1].checked) {
// rectangular is checked
document.getElementById("northlatrow").style.display="block";
document.getElementById("westlonrow").style.display="block";
document.getElementById("startlatrow").style.display="none";
document.getElementById("maxdistrow").style.display="none";
		selectedRegion=1;
} else {
// circular
document.getElementById("startlatrow").style.display="block";
document.getElementById("maxdistrow").style.display="block";
document.getElementById("northlatrow").style.display="none";
document.getElementById("westlonrow").style.display="none";
selectedRegion=0;
	}
resetValues();
}

function changeMiles() {
if (f1.maxdist.value==circumKm) {
f1.maxdist.value=circumMiles;
}
}

function changeKm() {
if (f1.maxdist.value==circumMiles) {
f1.maxdist.value=circumKm;
}
}

function rad(dg) {
	return (dg* Math.PI / 180);
}

function deg(rd) {
	return (rd* 180 / Math.PI);
}

function trim(sString) {
	while(sString.charCodeAt(0)<33)
	sString=sString.substring(1,sString.length);
	while(sString.charCodeAt(sString.length-1)<33)
	sString=sString.substring(0,sString.length-1);
	return sString;
}

function normalizeLongitude(lon) {
var n=Math.PI;
if (lon > n) {
lon = lon - 2*n
} else if (lon < -n) {
lon = lon + 2*n
}
return lon;
}

function isNumeric(s, mn, mx, allowNull) {
	var result = true;
	if (s == "" && !allowNull) {
return false;
} else {
		if ((parseFloat(s, 10) != s) || (s<mn) || (s>mx)) {
			return false;
		}
	}
	return result;
}

function changeUnits() {
var x=f1.maxdist;
if (f1.distunits[0].checked) {
units = "mi";
if (x.value == circumKm) {
x.value = circumMiles;
}
} else {
units = "km";
if (x.value == circumMiles) {
x.value = circumKm;
}
}
}

function changeFormat() {
for (i=0; i<3; i++) {
if (f1.format[i].checked) {
selectedFormat = i;
}
}
if (f1.randompoint.value.length == 0) {
return false;
}
timer=window.setTimeout("displayResults()", 1);
document.getElementById("randompointlabel").innerHTML = "Espere por favor...";
}

function displayResults(p) {
var p=trim(f1.points.value);
var w1= new Array("Latitud: ", "", "");
var x1 = new Array("   ", "\t", ",");
var y1 = new Array("\nLongitud: ", "\t", ",");
var j1 = new Array("\nDistancia: ", "\t", ",");
var q1 = new Array(" " + units + "  Br\u00FAjula: ", "\t", ",");
var ll = gLatlon;
ll = ll.replace(/w/g, w1[selectedFormat]);
ll=ll.replace(/x/g, x1[selectedFormat]);
ll=ll.replace(/y/g, y1[selectedFormat]);
ll=ll.replace(/z/g, x1[selectedFormat]);
ll=ll.replace(/j/g, j1[selectedFormat]);
ll=ll.replace(/q/g, q1[selectedFormat]);
f1.randompoint.value=ll;
if (p == 1) {
document.getElementById("randompointlabel").innerHTML = "1 punto:";
} else {
document.getElementById("randompointlabel").innerHTML = p + " puntos:";
}
if (p==1 && f1.format[0].checked && (f1.region[0].checked && f1.wholeearth[0].checked && f1.startlat.value==0 && f1.startlon.value==0 || f1.region[1].checked)) {
document.getElementById("randompoint").rows = 2;
} else {
document.getElementById("randompoint").rows = 3;
}
}

function calcStub() {
timer=window.setTimeout("calculate()", 1);
clearRandomPoint();
document.getElementById("randompointlabel").innerHTML = "Calculando...";
}

function calculate() {
var array1 = new Array();
var lat=0;
var lon=0;
var p=trim(f1.points.value);
with (Math) {
if (parseInt(p) != p || p<1) {
alert('El n\u00FAmero de puntos no es v\u00E1lido');
f1.points.focus();
clearRandomPoint();
return;
}
if (p>2000) {
alert('Se permite un m\u00E1ximo de 2000 puntos');
f1.points.focus();
clearRandomPoint();
return;
}
	if (f1.region[0].checked) {
// circular
var startlat=latLonToDecimal(f1.startlat.value, 1, "latitude");
if (startlat == -999) {
f1.startlat.focus();
clearRandomPoint();
return;
}
gStartlat=startlat;
var brg = new Array(0, 180, 0);
var j=0;
if (startlat == 90) {
startlat = 89.99999999;
j=1
}
if (startlat == -90) {
startlat = -89.99999999;
j=2;
}
startlat=rad(startlat);
startlon=latLonToDecimal(f1.startlon.value, 0, "longitude");
if (startlon == -999) {
f1.startlon.focus();
clearRandomPoint();
return;
}
gStartlon=startlon;
startlon=rad(startlon);
if (f1.distunits[1].checked) {
var mx=circumKm;
var radiusEarth=6372.796924;
} else {
var mx=circumMiles;
var radiusEarth=3960.056052;
}
var maxdist=f1.maxdist.value;
	if (isNumeric(maxdist, 0, mx, false) == false) {
alert("La distancia debe ser un n\u00FAmero v\u00E1lido entre 0 y " + mx);
		f1.maxdist.focus();
clearRandomPoint();
return;
	}
maxdist=maxdist/radiusEarth;
var cosdif = cos(maxdist) - 1;
var sinstartlat = sin(startlat);
var cosstartlat = cos(startlat);
var dist = 0;
var rad360=2*PI;
var displayDist = (f1.wholeearth[1].checked || f1.wholeearth[0].checked && (f1.startlat.value != 0 || f1.startlon.value != 0));

for (i=0; i<p; i++) {
dist = acos(random()*cosdif + 1);
brg[0] = rad360*random();
lat=asin(sinstartlat*cos(dist) + cosstartlat*sin(dist)*cos(brg[0]));
lon=deg(normalizeLongitude(startlon*1 + atan2(sin(brg[0])*sin(dist)*cosstartlat, cos(dist)-sinstartlat*sin(lat))));
lat = deg(lat);
dist=round(dist*radiusEarth*10000)/10000;
brg[0]=round(deg(brg[0])*1000)/1000;
if (!displayDist) {
array1.push("w" + decimalToDMS(lat, 1) + "x" + padZeroRight(lat) + "y" + decimalToDMS(lon, 0) + "z" + padZeroRight(lon) + "\n");
} else {
array1.push("w" + decimalToDMS(lat, 1) + "x" + padZeroRight(lat) + "y" + decimalToDMS(lon, 0) + "z" + padZeroRight(lon) + "j" + dist + "q" + brg[j] + "\u00B0\n");
}
}

} else {
var northlimit=latLonToDecimal(f1.northlat.value, 1, "latitud l\u00EDmite del norte");
if (northlimit == -999) {
f1.northlat.focus();
clearRandomPoint();
return;
}
var southlimit=latLonToDecimal(f1.southlat.value, 1, "latitud l\u00EDmite del sur");
if (southlimit == -999) {
f1.southlat.focus();
clearRandomPoint();
return;
}
if (northlimit*1 < 1*southlimit) {
alert('El l\u00EDmite del sur no debe ser mayor que el l\u00EDmite del norte');
f1.northlat.focus();
clearRandomPoint();
return;
}
var westlimit=latLonToDecimal(f1.westlon.value, 0, "longitud l\u00EDmite del oeste");
if (westlimit == -999) {
f1.westlon.focus();
clearRandomPoint();
return;
}
var eastlimit=latLonToDecimal(f1.eastlon.value, 0, "longitud l\u00EDmite del este");
if (eastlimit == -999) {
f1.eastlon.focus();
clearRandomPoint();
return;
}
gStartlat=(northlimit-southlimit)/2 + 1*southlimit;
northlimit=rad(northlimit);
southlimit=rad(southlimit);
westlimit=rad(westlimit);
eastlimit=rad(eastlimit);
var sinsl=sin(southlimit);
var width = eastlimit - westlimit;
if (width<0) {
width = width + 2*PI;
}
gStartlon=deg(normalizeLongitude(westlimit + width/2));
for (i=0; i<p; i++) {
lat = deg(asin(random()*(sin(northlimit) - sinsl) + sinsl));
lon = deg(normalizeLongitude(westlimit + width*random()));
array1.push("w" + decimalToDMS(lat, 1) + "x" + padZeroRight(lat) + "y" + decimalToDMS(lon, 0) + "z" + padZeroRight(lon) + "\n");
}
}
gLatlon= array1.join("");
displayResults(p);
}
}

function latLonToDecimal(ll, lat, f) {
	var sChar;
	var decCoord;
	var array1 = new Array(10);
	var l;
	var fail;
	ll=trim(ll);
	msg= "inv\u00E1lida";
	if (ll == "") {
		msg= "requerida";
		fail=true;
	}
	sChar=ll.substring(ll.length-1);
	sChar=sChar.toLowerCase();
	if (sChar != "n" && sChar != "s" && sChar != "e" && sChar != "w") {
		if ((ll != parseFloat(ll, 10))
			|| (lat == 1 && (ll<-90 || ll > 90))
			|| (lat==0 && (ll<-180 || ll>180))) {
			fail = true;
			} else {
			decCoord=ll;
		}
		} else {
		// ends in N, S, E or W
		ll = trim(ll.substring(0, ll.length-1));
		l=ll.length;
		// test for pure integer
		if ((ll == parseInt(ll, 10)) && l>4) {
			array1[2]=(ll.substring(l-2, l));
			array1[1]= (ll.substring(l-4, l-2));
			array1[0]=(ll.substring(0, l-4));
			} else {
			// validate DMS formats
			var dms= /^\d{1,3}\W{1}\d{1,2}\W{1}\d{1,2}\W?$/
			var dm= /^\d{1,3}\W{1}\d{1,2}\W?$/
			var d = /^\d{1,3}\W?$/
			if (dms.test(ll) || dm.test(ll) || d.test(ll)) {
				array1=ll.match(/\d+/g)
				} else {
				fail=true;
			}
		}
		l=array1.length;
		if (l >= 1) {
			decCoord = array1[0] * 1;
		}
		if (l >= 2) {
			decCoord = decCoord + (array1[1]/60);
		}
		if (l >= 3) {
			decCoord = decCoord + (array1[2]/3600);
		}
		if ((lat == 1 && (decCoord>90 || sChar!="n" && sChar!="s")
			|| lat==0 && (decCoord>180 || sChar!="e" && sChar!="w"))
			|| array1[1]>59 || array1[2]>59) {
			fail = true;
		}
		if (sChar == "w" || sChar == "s") {
			decCoord = decCoord * -1;
		}
	}
	if (fail) {
			alert ('La ' + f + ' es ' + msg);
		return -999;
		} else {
		return decCoord;
	}
}

function padWithZero(s) {
	if (s<10) {
		s= "0" + s;
	}
	return s;
}

function padZeroRight(s) {
if (sigDigits>8) {
sigDigits=8;
} else if (sigDigits < 5) {
sigDigits=5;
}
	s="" + Math.round(s*Math.pow(10, sigDigits))/Math.pow(10, sigDigits);
	var i = s.indexOf('.');
var d=(s.length-i-1);
	if (i == -1) {
		return (s + ".00");
		} else if (d == 1) {
		return (s + "0");
	} else {
return s;
}
}

function getSigDigits(s) {
var sig=0;
	var i = s.indexOf('.');
	if (i != -1) {
sig=s.length - i - 1;
}
if (sig >= sigDigits) {
if (sig > 8) {
sigDigits = 8;
} else {
sigDigits = sig+1;
}
}
}

function decimalToDMS(l, isLat) {
	var dir1="";
if (isLat==1) {
	if (l<0) {
		dir1= "S";
		} else {
		dir1 = "N";
	}
} else {
	if (l<0) {
		dir1= "W";
		} else {
		dir1= "E";
	}
}
	l=Math.abs(Math.round(l*3600)/3600);
	var deg1= Math.floor(l);
	var temp=(l-deg1)*60;
	var min1=padWithZero(Math.floor(temp));
	temp=(temp-min1);
	var sec1=padWithZero(Math.round(temp*60));
if (sec1 == 60) {
sec1 = 59;
}
return Math.abs(deg1) + '\u00B0' + min1 + '\u2032' + sec1 + '\u2033' + dir1;
}

function viewMap() {
var p=gLatlon.split("\n");
	if (p.length > 1) {
var circ=0;
if (f1.region[0].checked) {
circ=1;
}
var lat1 = gStartlat;
var lon1 = gStartlon;
var j;
for (i=0; i<p.length-1; i++) {
lat1 = lat1 + "|" + p[i].substring(p[i].indexOf("x")+1, p[i].indexOf("y"));
j=p[i].indexOf("j");
if (j == -1) {
lon1 = lon1 + "|" + p[i].substring(p[i].indexOf("z")+1);
} else {
lon1 = lon1+ "|" + p[i].substring(p[i].indexOf("z")+1, j);
}
}
if ((lat1.length + lon1.length) < 2050) {
var url = "viewmap.html?" + lat1 + "&" + lon1 + "&" + circ;
} else {
var url = "viewmap.php";
}
f1.target = "mapwin";
if (screen.height <= 600) {
mapwin=window.open(url,"mapwin","menubar=1,toolbar=0,directories=0,location=0,status=1,resizable=1,scrollbars=1");
} else {
mapwin=window.open(url,"mapwin","menubar=1,toolbar=1,directories=1,location=1,status=1,resizable=1,scrollbars=1");
}
if (url == "viewmap.php") {
f1.data.value = lat1 + "&" + lon1 + "&" + circ;
f1.submit();
}
		} else {
alert ('Hay que calcular un punto al azar antes de ver el mapa');
	}
}

var recipient="C" + "o" + "n" + "t" + "a" + "c" + "t" + "o";
var eml = "mailto:" + "&#100;&#101;" + "a" + "&#110;&#64;&#103;&#101;&#111;&#109;&#105;&#100;&#112;&#111;&#105;&#110;&#116;&#46;&#99;&#111;&#109;";

function e() {
document.write('<a href=' + eml + '>' + recipient + '</a>');
}

/*
function readCookie(cookieName) {
 var theCookie=""+document.cookie;
 var ind=theCookie.indexOf(cookieName);
 if (ind==-1 || cookieName=="") return "";
 var ind1=theCookie.indexOf(';',ind);
 if (ind1==-1) ind1=theCookie.length; 
 var s= unescape(theCookie.substring(ind+cookieName.length+1,ind1));
cookie = s.split("|");
}

function setCookie(cookieName,visited,region,testValue, method) {
var nDays = 2500;
 var today = new Date();
 var expire = new Date();
 expire.setTime(today.getTime() + 3600000*24*nDays);
var cookieValue = visited + "|" + region + "|" + testValue + "|" + method;
 document.cookie = cookieName+"="+escape(cookieValue)
+ ";expires="+expire.toGMTString();
}

function cookiesEnabled() {
readCookie('ckData');
testValue=Math.floor(1000*Math.random());
setCookie('ckData', cookie[0], cookie[1], testValue, cookie[3]);
readCookie('ckData');
if (testValue==cookie[2]) { 
return true;
} else {
return false;
}
}

function unload() {
setCookie('ckData', '1', selectedRegion, '', selectedMethod);
}
*/
