var GronoGeoFinder= {
    geocoder: new GClientGeocoder(),
    accuracyToZoom: {
        8: 15, // address level acc
        7: 15, // intersection level acc
        6: 15, // street level acc
        5: 13, // zip code level
        4: 12, // town level
        3: 9, // sub-region level
        2: 8 // region level
    }
}
var fx;

GronoGeoFinder.setup = function(options) {
    GronoGeoFinder.notFoundMsg = options.notFoundMsg;
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

GronoGeoFinder.find = function(address, mapobj) {
    //GronoGeoFinder.geocoder.setBaseCountryCode('pl');
    //GronoGeoFinder.geocoder.setViewport(mapobj.googleMap.getBounds());
    var realaddr;
    if (address.constructor === Array)
        realaddr = address.join(",");
    else
        realaddr = address;
    GronoGeoFinder.geocoder.getLocations(realaddr, GRONO.func.partial(GronoGeoFinder.findCallback, mapobj)); 
}

GronoGeoFinder.findCallback = function(mapobj, response) {
    fx = response;
    if (GronoGeoFinder.resultsPane) {
        // wywalamy stary panel
        GronoGeoFinder.resultsPane.parentNode.removeChild(GronoGeoFinder.resultsPane);
        GronoGeoFinder.resultsPane = null;
    }
    if (response.Status.code != 200) {
        var maindiv = mapobj.googleMap.getContainer();
        var pane = GronoGeoFinder.createResultsPane();
        pane.appendChild(GRONO.dom.builder.span({'class': 'orange'}, GronoGeoFinder.notFoundMsg));
        GronoGeoFinder.resultsPane = pane;
        maindiv.appendChild(pane);
        return;
    }
    if (response.Placemark.length == 1) {
        // mamy pojedynczy result
        GronoGeoFinder.panToPlacemark(mapobj, response.Placemark[0]);
    } else {
        var maindiv = mapobj.googleMap.getContainer();
        var pane = GronoGeoFinder.createResultsPane();
        var items = document.createElement("div");
        items.style.listStyleType = 'none';
        for (var i = 0; i < response.Placemark.length; i++) {
            var pm = response.Placemark[i];
            // XXX: accuracy tylko dla debugu
            var link = GRONO.dom.builder.a({onclick: GRONO.func.partial(GronoGeoFinder.panToPlacemark, mapobj, pm), 'class': 'block bold'}, pm.address); // + ' ' + pm.AddressDetails.Accuracy);
            link.style.cursor = 'pointer'
            items.appendChild(link);
        }
        pane.appendChild(items);
        GronoGeoFinder.resultsPane = pane;
        maindiv.appendChild(pane);
    }
}

GronoGeoFinder.panToPlacemark = function(mapobj, placemark) {
    var coords = placemark.Point.coordinates;
    var acc = placemark.AddressDetails.Accuracy;
    var ll = new GLatLng(coords[1], coords[0])
    if (acc in GronoGeoFinder.accuracyToZoom)
        mapobj.googleMap.setZoom(GronoGeoFinder.accuracyToZoom[acc]);
    mapobj.googleMap.panTo(ll);
}

GronoGeoFinder.createResultsPane = function() {
    var pane = document.createElement("div");
    pane.style.position = 'absolute';
    pane.style.border = '1px solid black';
    pane.style.padding = '2px';
    pane.style.width = '320px';
    pane.style.background = 'white';
    var closeLink = GRONO.dom.builder.span({'class': 'floatRight'}, 
       GRONO.dom.builder.a({onclick: function() { 
               pane.parentNode.removeChild(pane); 
               GronoGeoFinder.resultsPane = null; 
           }
         }, GRONO.dom.builder.img({src: '/s/style/common/close.gif'})))
    pane.appendChild(closeLink);
    return pane;
}
