// grab the JSON data 
function findclosest() { 
    var xhr;
    var stationdata;
    try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); }
    catch (e) 
    {
        try { xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
        catch (e2) 
        {
            try { xhr = new XMLHttpRequest(); }
            catch (e3) { xhr = false; }
        }
     }
  
    xhr.onreadystatechange  = function() { 
        foo = document.getElementById('debug');
        //foo.innerHTML = "Checking location...";
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                stationdata = JSON.parse(xhr.responseText);
                test(stationdata);
            } else {
                foo.innerHTML="Error code " + xhr.status;
            }
         }
    }; 

    xhr.open("GET", "stationdata.json",  true); 
    xhr.send(null); 
} 

// actually do all the computations
function test(stationdata) {
    var closestVacancyStation;
    var closestAvailableStation;
    var closestVacancyDistance = 99999;
    var closestAvailableDistance = 99999;


    if(geo_position_js.init()){
        geo_position_js.getCurrentPosition(success_callback,error_callback,{enableHighAccuracy:true});
    } else {
        alert("Functionality not available");
    }

    function success_callback(p) {
        var lat = p.coords.latitude;
        var lng = p.coords.longitude;
        foo = document.getElementById('debug');
        for (s in stationdata) {
            if (stationdata[s].available > 0) { // look for available bikes
                var distance = dist(lat, lng, stationdata[s].lat, stationdata[s].lng);
                if (distance < closestAvailableDistance) { 
                    closestAvailableDistance = distance;
                    closestAvailableStation = s;
                }
            }
            if (stationdata[s].free > 0) { // look for free slots
                var distance = dist(lat, lng, stationdata[s].lat, stationdata[s].lng);
                if (distance < closestVacancyDistance) { 
                    closestVacancyDistance = distance;
                    closestVacancyStation = s;
                }
            }
        }

        // build the message to display
        var message = "Closest bike (" + stationdata[closestAvailableStation].available + "): "+ stationdata[closestAvailableStation].name + ", " + formatDistance(closestAvailableDistance); // + " ("+stationdata[closestAvailableStation].available;
        message += "<br/>Closest slot (" + stationdata[closestVacancyStation].free + "): ";
        if (closestVacancyStation == closestAvailableStation) {
            message += "ditto "; // + stationdata[closestVacancyStation].free;
        } else {
            message += stationdata[closestVacancyStation].name + ", " + formatDistance(closestVacancyDistance);
        }
        foo.innerHTML = message;
    }
		
    function error_callback(p) {
        alert('error=' + p.code);
    }
    
}

function dist(lat1, lon1, lat2, lon2) { 	
    var R = 6371; // km
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1);
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
            Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;
}

function toRad(angle) {
    return angle * Math.PI / 180;
}

function formatDistance(dist) {
    if (dist > 1) {
        return dist.toFixed(1) + " km";
    } else {
        return (dist * 1000).toFixed(0) + "m";
    }
}

