
function pharmacy_search_page_setup() {
  var map;
  var baseIcon;

  function initialize() {
    map = new google.maps.Map2(document.getElementById("map"));
    map.setCenter(new GLatLng(37.39, -95.38), 4);   // Middle of America
    //map.setCenter(new GLatLng(31.055579, -97.460686), 13);  // EHO

    //map.setUIToDefault();
    //map.addControl(new GLargeMapControl());
    map.addControl(new GSmallZoomControl3D());

    // Configure Base Icon
    baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(9, 34);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);

    $("#daform").submit(function() {
        $("#page_no").val("1");
        perform_search();
        return false;
        });

    // Configure Pharmacy Search Controls
    $("#pharmacy_city").autocomplete("/ac_phcy_city_lookup", {
        minChars:1,
        matchSubset:1,
        matchContains:1,
        selectFirst: 1,
        cacheLength:10,
        extraParams: {
            'state': function() {
                return $("#pharmacy_state").val();
                }},
        autoFill:true,
        max: 100
        });
    $("#pharmacy_state").change(function() {
        $("#pharmacy_city").flushCache();
    });

    perform_search();
  }

  function add_pharmacy(phcy, bounds, side_pane, index) {
    var letter = String.fromCharCode("A".charCodeAt(0) + index);
    var lettered_icon = new GIcon(baseIcon);
    lettered_icon.image = "http://www.google.com/mapfiles/marker" +
                         letter.toUpperCase() + ".png";

    if(phcy.latitude && phcy.longitude) {
        var node = $("<a href='javascript:'>" + phcy.name + "</a>");
        node.click(function() { GEvent.trigger(marker, "click"); });
    } else {
        var node = $("<u>" + phcy.name + "</u>");
    }
    var cont = $("<div class='sideitem'></div>");
    cont.append("<img style='float: left' src='" + lettered_icon.image +
        "' />");

    xtra = $("<div class='sidextra'></div>");
    xtra.append(node);
    if(!phcy.latitude || !phcy.longitude) { 
        xtra.append("<div>Phone: " + phcy.phone + "</div>");
    }
    xtra.append("<div>" + phcy.addr_2 + " " +
                          phcy.addr_1 + "<br />" + 
                          phcy.city + ", " + 
                          phcy.state + " " + 
                          phcy.zip_code +
                "</div>");

    cont.append(xtra);
    side_pane.append(cont);

    if(!phcy.latitude || !phcy.longitude) { return; }

    var point = new GLatLng(phcy.latitude, phcy.longitude);
    bounds.extend(point);

    var marker = new GMarker(point, {icon: lettered_icon});
    GEvent.addListener(marker, "click", function() {
        var node = $("#marker_template").clone();
        node.removeAttr('id');
        $(".name", node).text(phcy.name);
        $(".phone", node).text(phcy.phone);
        $(".addr_1", node).text(phcy.addr_1);
        $(".addr_2", node).text(phcy.addr_2);
        $(".city", node).text(phcy.city);
        $(".state", node).text(phcy.state);
        $(".zip", node).text(phcy.zip_code);
        $(".daddr", node).val(point.lat() + "," + point.lng());
        node.css("display", "block");
        marker.openInfoWindow(node[0]);
     });
    map.addOverlay(marker);
  }

  function populate_results(data) {
    var pharmacies = data.pharmacies;

    if(pharmacies.length === 0) {
        $("#map").css("display", "none");
        return;
    }
    if($("#map").css("display") === "none") {
        $("#map").css("display", "block");
    }
    var side_pane = $("#phcy_list");
    //side_pane.empty();
    //map.clearOverlays();

    /* Add each pharmacy to the map and the side list */
    var bounds = new GLatLngBounds();
    for(var i=0; i < pharmacies.length; i++) {
        var phcy = pharmacies[i];
        add_pharmacy(phcy, bounds, side_pane, i);
    }

    if(bounds.isEmpty()) {
        $("#map").css("display", "none");
    }


    /* Build paging navigation */

    if(data.page_count > 1) {
        setup_navigation(data, side_pane);
    }

    map.setZoom(map.getBoundsZoomLevel(bounds));
    map.setCenter(bounds.getCenter());
  }

  function setup_navigation(data, side_pane) {
    /* This was factored out because the nesting was getting too deep
     * Figure out page display range based on current page.
     * 10 item sliding window. 2 offset on left.
     */
    var cur_page = parseInt($("#page_no").val());

    if(data.page_count - cur_page < 6) {
        var left = data.page_count - 6;
        if(left < 1) { left = 1; }
        var right = data.page_count;
    } else {
        var left = cur_page - 2;
        if(left < 1) { left = 1; }
        var right = left + 6;
    }

    var navbar = $("<div class='navbar'></div>");
    for(var i=left; i <= right; i++) {
        if(i === cur_page) {
            var node = $("<span class='pagenav'>" + i + "</span>");
            navbar.append(node);
        } else {
            /* Capture index in closure */
            (function(i) {
                var node = $("<a class='pagenav' href='javascript:'>" + i +
                             "</a>");
                node.click(function() {
                    $("#page_no").val(i);
                    perform_search();
                });
                navbar.append(node);
            })(i);
        }
    }
    side_pane.append(navbar);
  }


  function perform_search() {
    var args = {
        zip: $("#pharmacy_zip").val(),
        city: $("#pharmacy_city").val(),
        state: $("#pharmacy_state").val(),
        page_no: $("#page_no").val()
    };

    if(!args.zip.length && !args.city.length && !args.state.length) {
        $("DIV.help").css("display", "block");
        return;
    }
    $("DIV.help").css("display", "none");

    /* Clear the search while we are performing a new one */
    var side_pane = $("#phcy_list");
    side_pane.empty();
    map.clearOverlays();

    $("#search_button").after(
        "<img id='search_loader' src='/img/loader.gif' />");
    $.post("/phcy_geo", args, function(data) {
        $("#search_loader").remove();
        populate_results(data);
    }, "json");

    return false;
  }

  initialize();

}

