// editmap.js
//

var mw = '640px';
var mh = '480px';
var map;
var MP;
var qrz;
var Grids = new Object;
var hams = 0;
var xmlHttp;
var mI;
var zl = [0.4,0.6,0.8,1.0,1.4,1.7,2,2.5,3.0,4.0];


function autoCenter(i) {
    if (i) map.setCenter(MP.getPoint());
}

function clickGrid(ol,ll,oll) {
    if (!ll) return;
    MP.setLatLng(ll);
    setGrid();
}

function newPos() {
    var np = new GLatLng(e('lat').value,e('lon').value);
    MP.setLatLng(np);
    setGrid();
}

function newGrid(d) {
    var pos = grid2ll(d);
    var np = new GLatLng(pos.lat+0.02,pos.lon+0.04);
    MP.setLatLng(np);
    setGrid();
}

function toGrid(mpLat,mpLon) {

       /* Long/Lat to QTH locator conversion largely        */
       /* inspired from the DL4MFM code found here :        */
       /* http://members.aol.com/mfietz/ham/calcloce.html   */
     
       var ychr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
       var ynum = "0123456789";
       var yqth, yi, yk, ydiv, yres, ylp, y;
       var y     = 0;
       var ycalc = new Array(0,0,0);
       var yn    = new Array(0,0,0,0,0,0,0);

       ycalc[1] = mpLon + 180;
       ycalc[2] = mpLat +  90;

       for (yi = 1; yi < 3; ++yi) {
	for (yk = 1; yk < 4; ++yk) {
	  if (yk != 3) {
	    if (yi == 1) {
	      if (yk == 1) ydiv = 20;
	      if (yk == 2) ydiv = 2;
	    }
	    if (yi == 2) {
	      if (yk == 1) ydiv = 10;
	      if (yk == 2) ydiv = 1;
	    }

	    yres = ycalc[yi] / ydiv;
	    ycalc[yi] = yres;
	    if (ycalc[yi]>0)
	      ylp = Math.floor(yres)
	    else
	      ylp = Math.ceil(yres);
	    ycalc[yi] = (ycalc[yi] - ylp) * ydiv;
	  }
	  else {
	    if (yi == 1)
	      ydiv = 12
	    else
	      ydiv = 24;

	    yres = ycalc[yi] * ydiv;
	    ycalc[yi] = yres;
	    if (ycalc[yi] > 0)
	      ylp = Math.floor(yres)
	    else
	      ylp = Math.ceil(yres);
	  }

	++y;
	yn[y] = ylp;
	}
       }

       yqth = ychr.charAt(yn[1]) + ychr.charAt(yn[4]) + ynum.charAt(yn[2]);
       yqth += ynum.charAt(yn[5]) + ychr.charAt(yn[3]).toLowerCase() + ychr.charAt(yn[6]).toLowerCase();

       return(yqth);
}


function toDMS(mpLat,mpLon) {
    var Result = new Object;
    var longDir = "E";
    var longDeg;
    var longMin;
    var latDir = "N";
    var latDeg;
    var latMin;

    if (mpLon < 0) longDir = "W";
    if (mpLat < 0)  latDir = "S";

    if (mpLon > 0) {
	longDeg = Math.floor(mpLon);
	longMin = (mpLon - longDeg) * 100;
    } else {
	longDeg = Math.ceil(mpLon);
	longMin = (longDeg - mpLon) * 100;
    }
    if (mpLat > 0) {
	latDeg = Math.floor(mpLat);
	latMin = (mpLat - latDeg) * 100;
    } else {
	latDeg = Math.ceil(mpLat);
	latMin = (latDeg - mpLat) * 100;
    }

    var longMin2 = longMin * 60 / 100;
    var longSec = Math.round((longMin2 - Math.floor(longMin2)) * 60);
    var latMin2 = latMin * 60 / 100;
    var latSec = Math.round((latMin2 - Math.floor(latMin2)) * 60);

    Result.lonDMS = longDeg + "&deg; " + Math.floor(longMin2) + "' " + longSec + "'' "+ longDir;
    Result.latDMS = latDeg + "&deg; " + Math.floor(latMin2) + "' " + latSec + "'' "+ latDir;

    return Result;
}



function loadG() {

    if (GBrowserIsCompatible()) {
	var panel = e('mapbox');
	panel.style.height = mh;
	panel.style.width = mw;

	var zoom = 4;
	if (z = n('mapscale')) zoom = parseInt(z.value);

	var pt = new GLatLng(e("lat").value, e("lon").value);
	MP = new GMarker(pt, {draggable: true});

	/* Portions of this script were inspired by Laurent Haas, F6FVY and DL4MFM */

	map = new GMap2(e("mapbox"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	map.ao = function(n) { return this.addOverlay(n); };
	map.ro = function(n) { return this.removeOverlay(n); };

	map.setCenter(pt, zoom);
	map.ao(MP);

	GEvent.addListener(MP, 'dragend', setGrid);
	GEvent.addListener(map, 'click', clickGrid);
	GEvent.addListener(map, 'zoomend', newZoom);

	mI = new GIcon();
	mI.image = "http://www.qrz.com/si/station2.png";
	mI.iconSize = new GSize(12,12);
	mI.shadow = null;
	mI.iconAnchor = new GPoint(6,6);
	mI.infoWindowAnchor = new GPoint(6,6);

	var sg = n('sg');
	if (sg.value.length > 0) {
	    e('sh').checked = false;
	    var nm = sg.value;
	    qrz = new GMarker(pt,{ icon:new GIcon(mI,"http://www.qrz.com/si/wblue.png"), title:nm });
	    qrz.info = "<b><a href='/db/" + nm + "'>" + nm + "</a></b>";
	    qrz.cs = nm;
	    google.maps.event.addListener(qrz, "click" , function() {this.openInfoWindowHtml(this.info);});
	    map.ao(qrz);
	    setGrid();
	}

    } else {
	// Display a warning if the browser is not compatible
	alert("Sorry, the Google Maps API is not compatible with your browser.");
    }
} 


function grid2ll(grid) {
    var result = new Object;
    grid = grid.toUpperCase();

    result.lon = (20*(grid.charCodeAt(0)-65) + 2*(grid.charCodeAt(2)-48) + 5*(grid.charCodeAt(4)-65)/60) - 180;
    result.lat = (10*(grid.charCodeAt(1)-65) +   (grid.charCodeAt(3)-48) + 5*(grid.charCodeAt(5)-65)/120) - 90;

    return(result);
}


function addGrid(grid,xml) {
    if (! Grids[grid]) return;  // error

    var g = Grids[grid];

    var h = xml.getElementsByTagName("Ham");
    g.data = true;
    if (h.length) {
	for (i=0; i<h.length; i++) {
	    var cs = h[i].getAttribute('cs');
	    var nm = h[i].getAttribute('nm');
	    var lat = h[i].getAttribute('lat');
	    var lon = h[i].getAttribute('lon');
//	    if (qrz && cs == qrz.cs) continue;
	    g.hams[i] = new GMarker(new GLatLng(lat,lon),{ icon:new GIcon(mI), title:cs });
	    g.hams[i].info = "<b><a href='/db/" + cs + "'>" + cs + "</a><br />" + nm;
	    google.maps.event.addListener(g.hams[i], "click" , function() {this.openInfoWindowHtml(this.info);});
	}
    }

    g.blon = Math.floor(g.mpLon / 0.0833333333) * 0.0833333333;
    g.blat = Math.floor(g.mpLat / 0.0416666666) * 0.0416666666;
	 
    g.box = new GPolyline([
	new GLatLng(g.blat, g.blon),
	new GLatLng(g.blat, g.blon + 0.0833333333),
	new GLatLng(g.blat + 0.0416666666, g.blon + 0.0833333333),
	new GLatLng(g.blat + 0.0416666666, g.blon),
	new GLatLng(g.blat, g.blon)
    ], "#FF0000", 3);

    g.label = new ELabel(new GLatLng(g.blat,g.blon), grid, "glab",new GSize(2,0),50);
    showGrid(grid);
}


function showGrid(grid) {
    if (! Grids[grid]) return;  // error
    var g = Grids[grid];

    if (e('sh').checked) {
	for (var i=0; i<g.hams.length; i++) {
	    map.ao(g.hams[i]);
	}
    }
    map.ao(g.box);
    map.ao(g.label);
    var z = map.getZoom();
    if (z < 10) g.label.hide(); else g.label.div_.style.fontSize = zl[map.getZoom()-10] + 'em';
    g.label.setPoint(new GLatLng(g.blat,g.blon));
    g.shown = true;
    e('pop').innerHTML = hams;
    e('grh').innerHTML = g.hams.length;
}


function hideGrid(grid) {
    if (! Grids[grid]) return;  // error
    var g = Grids[grid];
    for (i=0; i<g.hams.length; i++) {
	map.ro(g.hams[i]);
    }
    if (g.box) map.ro(g.box);
    g.shown = false;
}

function showHams(c) {
    for (var i in Grids) {
        var g = Grids[i];
	if (g.shown && g.hams.length) {
	    for (i=0; i<g.hams.length; i++) {
		if (c) map.ao(g.hams[i]); else map.ro(g.hams[i]);
	    }
	}
    }
} 


function mapClear() {
    map.clearOverlays();
    map.ao(MP);
    if (qrz) map.ao(qrz);
    for (var g in Grids) {
        Grids[g].shown = false;
    }
}



function newZoom(oldz,newz) {

//    e('zl').innerHTML = newz;

    if (newz < 10) {
	for (var i in Grids) {
	    var g = Grids[i];
	    if (g.label) g.label.hide();
	}
	return;
    }
    for (var i in Grids) {
        var g = Grids[i];
	if (g.label) {
	    g.label.show();
	    g.label.div_.style.fontSize = zl[newz-10] + 'em';
	    g.label.setPoint(new GLatLng(g.blat,g.blon));
	}
    }
    return;
}



function getGridInfo(grid) { 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null) {
     alert ("Browser does not support HTTP Request")
     return;
    } 
    var url="http://www.qrz.com/grinfo";
    xmlHttp.onreadystatechange=stateChanged ;
    xmlHttp.open("post",url,true);
    xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');

    var data = 'grid=' + grid;

    xmlHttp.send(data);
}


function stateChanged() { 
    var r;
    var grid;
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
	xmlDoc=xmlHttp.responseXML;
	r = xmlDoc.getElementsByTagName("Grid");
	if (r.length) {
	    hams += parseInt(r[0].getAttribute('count'));
	    grid = r[0].getAttribute('name');
	    addGrid(grid,xmlDoc);
	}
    }
} 


function GetXmlHttpObject() { 
    var objXMLHttp=null;
    if (window.XMLHttpRequest) {
	 objXMLHttp=new XMLHttpRequest();

    } else if (window.ActiveXObject) {
	 objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    return objXMLHttp;
}


function locateHelp() {
    window.open("http://www.qrz.com/locatehelp.html","_blank","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width=450, height=400");
}

/* ******************************************************************************** */


function setGrid() {

    var mp = MP.getPoint();
    var la = Math.round(mp.lat() * 1000000)/1000000;
    var lo = Math.round(mp.lng() * 1000000)/1000000;
    var dms = toDMS(la,lo);
    var gr = toGrid(la,lo);

    e('lat').value = la;
    e('lon').value = lo;
    e('grid').value = gr;
    e('mll').innerHTML = dms.latDMS + '&nbsp;' + dms.lonDMS;
    e('grd').innerHTML = gr;

    if (e('ac').checked) map.setCenter(mp);

    if (! Grids[gr]) {
        Grids[gr] = new Object(
	    {
		hams:new Array,
		shown:false,
		data:false,
		mpLat:la,
		mpLon:lo
	    }
	);
	return getGridInfo(gr);
    }

    if (! Grids[gr].data) {
	map.ro(Grids[gr].box);
	map.ro(Grids[gr].label);
	return getGridInfo(gr);
    }

    if (!Grids[gr].shown) showGrid(gr);
    e('grh').innerHTML = Grids[gr].hams.length;
}


function loadMap() {
    loadG();
} 


