var xavg = 0;
var yavg = 0;
var last_d = 1000000000;
var hinting = true;
var t_dateObj;
var running = 0;
var xp;
var yp;
var xs = "";
var ys = "";
var points = [];
var map;
var drawing = 0;
var zoom = 2;
var current_zoom = 0;
var location_name = "";
var polyline_s;

function change_location_cat(cat)
{
    window.location.href="http://landmark.mapsgame.com/?cat="+cat;
}

function zoom_and_wait() {
    if (current_zoom == zoom) {
        callback();
        return;
    } 

    if (current_zoom < zoom) {
        map.setZoom(current_zoom+1);
        current_zoom++;
    } else {
        map.setZoom(current_zoom-1);
        current_zoom--;
    }
    
    setTimeout("zoom_and_wait()",300);
}

function show_solution()
{
    running = 0;
    document.getElementById("clock1").value = 3000;
    map.setCenter(new google.maps.LatLng(yavg, xavg));
//    var zoom = 0;
    var points = [];
    var minx = xavg;
    var miny = yavg;
    var maxx = xavg;
    var maxy = yavg;
    for (var i = 0; i < xp.length; i++)
    {
        minx = Math.min(minx,xp[i]);
        maxx = Math.max(maxx,xp[i]);
        miny = Math.min(miny,yp[i]);
        maxy = Math.max(maxy,yp[i]);
        points.push(new google.maps.LatLng(yp[i], xp[i]));
    }
    spanx = maxx - minx;
    spany = maxy - miny;
    maxspan = Math.max(spanx, spany);
    console.log('maxx= ' +maxx);
    console.log('minx = ' +minx);
    console.log('maxy= ' +maxy);
    console.log('miny = ' +miny);
    console.log('spanx= ' +spanx);
    console.log('spany = ' +spany);
    console.log('max span = ' +maxspan);
    if (maxspan > 170)
        zoom = 2;
    else if (maxspan > 150)
        zoom = 2;
    else if (maxspan > 30)
        zoom = 3;
    else if (maxspan > 25)
        zoom = 3;
    else if (maxspan > 4)
        zoom = 4;
    else if (maxspan > 3.5)
        zoom = 5;
    else if (maxspan > 3)
        zoom = 6;
    else if (maxspan > 2.5)
        zoom = 7;
    else if (maxspan > 2)
        zoom = 8;
    else if (maxspan > 1)
        zoom = 9;
    else if (maxspan > 0.5)
        zoom = 10;
    else if (maxspan > 0.1)
        zoom = 11;
    else if (maxspan > 0.05)
        zoom = 12;
    else if (maxspan > 0.01)
        zoom = 13;
    else if (maxspan > 0.005)
        zoom = 14;
    else if (maxspan > 0.002)
        zoom = 15;
    else if (maxspan > 0.001)
        zoom = 16;
    else if (maxspan > 0.0005)
        zoom = 17;
    else if (maxspan > 0.00001)
        zoom = 18;
    else if (maxspan > 0)
        zoom = 19;
    console.log('setting zoom to ' + zoom);
//    map.setZoom(zoom);
    points.push(points[0]);
//    polyline_s = new google.maps.Polyline(points, "#0000FF", 2, 1);
    var poly_options = {
        path: points,
        strokeColor: "#0000FF", 
        strokeOpacity: 1,
        strokeWeight: 2
    }
    polyline_s = new google.maps.Polyline(poly_options);
    polyline_s.setMap(map);
    current_zoom = map.getZoom();
//    current_zoom = 2;
    zoom_and_wait();

//    map.addOverlay(polyline_s);
}

/* convert degrees to radians */
function deg2rad(deg)
{
    rad = deg * Math.PI/180; // radians = degrees * pi/180
    return rad;
}


/* round to the nearest 1/1000 */
function round(x)
{
    r = Math.round(x*1000)/1000;
    return r;
}

/* main function */
function findDistance(lon1, lat1, lon2, lat2)
{
    Rm = 3961; // mean radius of the earth (miles) at 39 degrees from the equator
    Rk = 6373; // mean radius of the earth (km) at 39 degrees from the equator

    // get values for lat1, lon1, lat2, and lon2
    t1 = lat1;
    n1 = lon1;
    t2 = lat2;
    n2 = lon2;
    
    // convert coordinates to radians
    lat1 = deg2rad(t1);
    lon1 = deg2rad(n1);
    lat2 = deg2rad(t2);
    lon2 = deg2rad(n2);
    
    // find the differences between the coordinates
    dlat = lat2 - lat1;
    dlon = lon2 - lon1;
    
    // here's the heavy lifting
    a  = Math.pow(Math.sin(dlat/2),2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dlon/2),2);
    c  = 2 * Math.atan(Math.sqrt(a),Math.sqrt(1-a)); // great circle distance in radians
    dm = c * Rm; // great circle distance in miles
    dk = c * Rk; // great circle distance in km
    
    // round the results down to the nearest 1/1000
    mi = round(dm);
    km = round(dk);
    
    // display the result
//    frm.mi.value = mi;
//    frm.km.value = km;
    return km;
}


// Returns a new XMLHTTPRequest object
function create_XMLHTTP()
{
    var xmlhttp;
    var alerted;

    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    // JScript gives us Conditional compilation, we can cope with old IE versions.
    try {
    xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
    } catch (e) {
    try {
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
    } catch (E) {
    alert("You must have Microsofts XML parsers available")
    }
    }
    @else
    alert("You must have JScript version 5 or above.")
    xmlhttp=false
    alerted=true
    @end @*/
    if (!xmlhttp && !alerted) 
    {
        // Non ECMAScript Ed. 3 will error here (IE<5 ok), nothing I can
        // realistically do about it, blame the w3c or ECMA for not
        // having a working versioning capability in  <SCRIPT> or
        // ECMAScript.
        try 
        {
            xmlhttp = new XMLHttpRequest();
        } 
        catch (e) 
        {
            alert("You need a browser which supports an XMLHttpRequest Object.")
        }
    }

    return xmlhttp;
}

function cat(l, v)
{
    xmlhttp = create_XMLHTTP();
    var url = 'gm_index.php?c=' + v + '&l=' + l;
    xmlhttp.open('GET', url, true);
    xmlhttp.send(null);
    document.getElementById("cat_span").innerHTML = url;
}

function rate_this(l)
{
    xmlhttp = create_XMLHTTP();
    var url = '?r=' + document.getElementById("rate_this").value + '&l=' + l;
    xmlhttp.open('GET', url, true);
    xmlhttp.send(null);
    document.getElementById("rate").innerHTML = "Rated, thanks.";
}

function flag(l)
{
    xmlhttp = create_XMLHTTP();
    var url = '?f=1' + '&l=' + l;
    xmlhttp.open('GET', url, true);
    xmlhttp.send(null);
    document.getElementById("flag").innerHTML = "Landmark flagged, thanks.";
}

function flag_this(l, c)
{
    xmlhttp = create_XMLHTTP();
    var url = '?f=1' + '&l=' + l + '&c=' + c;
    xmlhttp.open('GET', url, true);
    xmlhttp.send(null);
    document.getElementById("flag").innerHTML = "Landmark flagged " + c + ".";
}

function save_time(s,t)
{
    xmlhttp = create_XMLHTTP();
    var z = map.getZoom();
    var url = '?s=' + s + '&t=' + t + '&z=' + z;
    xmlhttp.open('GET', url, true);
    xmlhttp.send(null);
}

function time()
{
    if (running)
    {
        var cdateObj = new Date();
        var delta = (cdateObj.getTime() - t_dateObj.getTime());
        delta = delta / 10; // round off the error
        delta = Math.round(delta);
        delta = delta / 100; // convert to seconds.
        document.getElementById("clock1").value = delta;
        setTimeout("time()",1);
    }
}

function time2()
{
    if (running)
    {
        var cdateObj = new Date();
        var delta = (cdateObj.getTime() - t_dateObj.getTime());
        delta = delta / 10; // round off the error
        delta = Math.round(delta);
        delta = delta / 100; // convert to seconds.
        document.getElementById("clock2").innerHTML = delta;
        setTimeout("time2()",1);
    }
}

function PointInPoly(num_verts, xp, yp, x, y)
{
    var i = 0;
    var j = 0;
    var c = false;

    for(i = 0, j = num_verts - 1; i < num_verts; j = i++)
    {
     if((((yp[i] <= y) && (y < yp[j])) ||
      ((yp[j] <= y) && (y < yp[i]))) &&
      (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
     {
      c = !c;
     }
    }

    return c;
}


function startDraw()
{
    drawing = 1;
    points = [];
    document.getElementById("drawmode").innerHTML = "Drawing...";

}
function stopDraw()
{
    if (points.length > 2)
    {
        drawing = 0;
        map.clearOverlays();

        xs = "";
        ys = "";
        // save to globals
        for (var i = 0; i < points.length; i++)
        {
            xs += (points[i].x + " "); 
            ys += (points[i].y + " "); 
        }
        points.push(points[0]);
        map.addOverlay(new GPolyline(points, "#00FFFF", 2, 1));
        points = [];
   
        document.getElementById("drawmode").innerHTML = "Polygon Set!";
    }
}

function showhint()
{
  var points = [];
  for (var i = 0; i < xp.length; i++)
  {
      points.push(new GPoint(xp[i], yp[i]));
  }
  points.push(points[0]);
  polyline = new GPolyline(points, "#0000FF", 2, 1);
  map.addOverlay(polyline);
  setTimeout("map.clearOverlays()", 100);
}

function showhint2()
{
    var center = map.getCenterLatLng();
    var d = findDistance(center.x, center.y, xavg, yavg);
    alert(d);
}

function clearPolys()
{
  map.clearOverlays();
  drawing = 0;
  points = [];
  xs = "";
  ys = "";
  document.getElementById("drawmode").innerHTML = "No polygons set.";
}

function submit_form()
{
    var error = 0;
    if (drawing)
    {
        stopDraw();    
    }
    if (xs == "" || ys == "")
    {
        alert("No polygon information set.");
        error = 1;
    }
    if (document.getElementById("input_landmark_name").value == "")
    {
        alert("No landmark name given.");
        error = 1;
    }
    if (!error)
    {
        document.getElementById("xs").value = xs;
        document.getElementById("ys").value = ys;
        document.getElementById("zoom_level").value = map.getZoomLevel();
        document.add.submit();
    }
}

function hints_off()
{
    hinting = false;
    document.getElementById("hint").innerHTML = "";
}

function hints_on()
{
    hinting = true;
}

function toggle_hinting()
{
    hinting = !hinting;
    if (hinting)
    {
        document.getElementById("hint_control").innerHTML = "Turn <a href='#' onClick='toggle_hinting()'>off hinting</a>. <span id='hint'></span>";
    }
    else
    {
        document.getElementById("hint_control").innerHTML = "Turn <a href='#' onClick='toggle_hinting()'>on hinting</a>. <span id='hint'></span>";
        document.getElementById("hint").innerHTML = "";
    }
}

function show_cats(cat, p)
{
    xmlhttp = create_XMLHTTP();
    var url = '?cat=' + cat + '&p=' + p;
    xmlhttp.open('GET', url, true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
//        javascript:alert(xmlhttp.responseText);
        document.getElementById('main_message').innerHTML = xmlhttp.responseText + ' ';
        }
    }
    xmlhttp.send(null);
}

function check_dupe(name)
{
    xmlhttp = create_XMLHTTP();
    var url = '?check=' + name;
    xmlhttp.open('GET', url, true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
//        javascript:alert(xmlhttp.responseText);
            if (xmlhttp.responseText != "0")
            {
                document.getElementById('add_landmark_href').innerHTML = "";
                var message = "<font color='red'><br/>We already have a landmark by that name.</font> ";
                message += "<a href='?l=" + xmlhttp.responseText + "'>Check it out!</a>";
                document.getElementById('dupe_message').innerHTML = message;
            }
            else
            {
                document.getElementById('add_landmark_href').innerHTML = "<a href='#' onClick='submit_form()'>add landmark</a>";
                document.getElementById('dupe_message').innerHTML = "";
            }
        }
    }
    xmlhttp.send(null);
}
