/*
 * createPointOfInterest:   creates a GoogleMap's marker which
 *                          will show popUpText when clicked.
 */
function createPointOfInterest(point, popUpText) {
    poiIcon = new GIcon(G_DEFAULT_ICON);
    markerOptions = { icon:poiIcon };
    marker = new GMarker(point, markerOptions);
    marker.bindInfoWindowHtml(popUpText);
    return marker;
}

/*
 * get_search_complete_callback: creates a callback function to be used with
 *                               a Google Searcher object, specifically
 *                               to create markers from the search results and
 *                               add them to a map. If `cluster' is true,
 *                               markers will be added to a MarkerClusterer
 *                               object instead of drawn individually. 
 */
function get_search_complete_callback(map, cluster, clusterer, markers) {
    function search_complete_callback() {
        key = this.xf;  // get search term from Searcher object
        results = this.results;
        if (typeof markers[key] == "undefined") {
            markers[key] = [];
        }
        points = [];
        for (i=0; i<results.length; i++) {
            markerLatLng = new google.maps.LatLng(parseFloat(results[i].lat),
                                                  parseFloat(results[i].lng));
            poi_marker = createPointOfInterest(markerLatLng,
                                               results[i].html.innerHTML);
            markers[key].push(poi_marker);

            if (cluster) {
                points.push(poi_marker);
            } else {
                map.addOverlay(poi_marker);
            }
        }
        if (cluster) {
            clusterer.addMarkers(points);
        }
    }
    return search_complete_callback;
}


function get_nearby_adder(map, markers, clusterer) {
    function nearby_add(search_term) {
        if (typeof markers[search_term] == "undefined") {
            searcher = new google.search.LocalSearch();
            searcher.setCenterPoint(map);
            cluster = (typeof clusterer != "undefined");
            on_search_complete = get_search_complete_callback(map,
                                                              cluster,
                                                              clusterer,
                                                              markers);
            searcher.setSearchCompleteCallback(searcher, on_search_complete);
            searcher.execute(search_term);
        } else {
            for (i=0; i<markers[search_term].length; i++) {
                markers[search_term][i].show();
            }
        }
    }
    return nearby_add;
}

function get_nearby_remover(markers) {
    function nearby_remover(search_term) {
        if (typeof markers != "undefined") {
            for (i=0; i<markers[search_term].length; i++) {
                markers[search_term][i].hide();
            }
        }
    }
    return nearby_remover;
}

var pointsOfInterest = function (map, clusterer) {
    cluster = typeof clusterer != "undefined";
    this.markers = {};
    this.map = map;
    this.clusterer = clusterer;
    this.show_nearby = get_nearby_adder(this.map,
                                        this.markers,
                                        this.clusterer);
    this.hide_nearby = get_nearby_remover(this.markers);
};
