// herdometer_utils.js

var reports ;               // Array of reports to display
var i = -1;                  // Index of current report in the array
var gettingReports = false; // Semaphore to signal that a report is being requested asycnhronously
var timeout = herdometerUpdateInterval;        // Time each report is displayed, in milliseconds
var currentOverlay = null;  // Pointer to the current marker, so it can be removed
var map;                    // The google map
var geocoder = new GClientGeocoder();   // The geocoder. Keep one throughout the lifetime of the page to
                                        // use its internal cache

var sheepIcon = null;

// Get the next report from the array of reports retrieved. Don't display two in a row from the same country
function getNextReport() {
    var result = null;
    if (reports && (reports.length > 0)) {
        var currentCountry = (i < 0) ? "none" : reports[i].country.shortName;

        i++;
        while ((i < reports.length) && (currentCountry == reports[i].country.shortName))
            i++;

        if (i >= reports.length) {
            i = -1;
            result = null // need to get more reports
        } else {
            result = reports[i];
        }
    }
    return result;
}

// Get a fuzzy description of the date based on the date/time reported
function getFuzzyDate(date) {
    var result;
    var now = new Date().getTime();
    var then = date.getTime();
    var diff = now - then;
    if (diff < (1000 * 60))
        result = fuzzyDateLessMinute;
    else if (diff < (1000 * 60 * 60)) {
        var num = new Number(diff / (1000 * 60));
        result = fuzzyDateMinutes.format(num.toFixed(0));
    } else if (diff < (1000 * 60 * 60 * 24)) {
        var num = new Number(diff / (1000 * 60 * 60));
        result = fuzzyDateHours.format(num.toFixed(0));
    } else {
        var num = new Number(diff / (1000 * 60 * 60 * 24));
        result = fuzzyDateDays.format(num.toFixed(0));
    }
    return result;
}

// Info balloon displayed next to each marker
// The 'inaccessibleTemplate' variable is set by the calling page
function createHTML(r) {

    var encodedSiteUrl = HTMLEncode(r.page.site.url);

    var siteLink = "<a href='{0}/explore/id/{1}'>{2}</a><br>".format(contextRoot,r.page.site.id, encodedSiteUrl);
    var countryLink = "<a href='{0}/explore/country/{1}'>{2}</a>".format(contextRoot,r.country.shortName, r.displayCountry);
    var text = inaccessibleTemplate.format(siteLink,countryLink);  
    return result = "<div id='herdometer'>" + text +
                 "<br/>" +
                 "  <span class='date'>" + getFuzzyDate(r.reportDate) + "</span>" +
                 "</div>";
}

function setupSheepIcon() {
    sheepIcon = new GIcon();
    sheepIcon.image = contextRoot + "/includes/img/home/icon_herdometer_sheep.png";
    sheepIcon.shadow = contextRoot + "/includes/img/home/icon_herdometer_sheep_shadow.png";
    sheepIcon.iconSize = new GSize(33,37);
    sheepIcon.shadowSize = new GSize(57,39);
    sheepIcon.iconAnchor = new GPoint(16,18);
}

// Actually place the marker on the map
function placeMarker(r) {
    if (currentOverlay != null) {
        map.removeOverlay(currentOverlay);
    }
    if (r != null) {
        geocoder.getLatLng(r.country.longName,function(point) {

            if (sheepIcon == null) {
                setupSheepIcon();
            }
            
            currentOverlay = new GMarker(point, {icon : sheepIcon} );
            map.addOverlay(currentOverlay);
            map.openInfoWindowHtml(point,createHTML(r));
            map.panTo(point);
        });
    }
}

// Display a report on the map. If none are available, request more. The gettingReports
// variable ensures that we only have one request at a time.
function displayReport(map) {
    if (!gettingReports) {
        var r = getNextReport();
        if (r == null) {
            gettingReports = true;

            $.ajax({
                   type: "POST",
                   dataType: "text",
                   url: contextRoot + "/action/ajax/recentreports",
                   success: function(data){
                       gettingReports = false;
                       reports = eval(data);
                       placeMarker(getNextReport());
                   }
                 });
        } else {
            placeMarker(r);
        }
    }
}
