var gmap;
var markerIds 		= new Array();
var markerObjs 		= new Array();
var hilitMarkerObjs     = new Array();
var normalIcon 		= null;
var hilightedIcon 	= null;
var hilightedMarker 	= null;
var hiddenMarker        = null;

function defaultIconWith( img ) {
    var ret        = new GIcon();
    ret.image      = img;
    ret.shadow     = G_DEFAULT_ICON.shadow;
    ret.iconSize   = G_DEFAULT_ICON.iconSize;
    ret.shadowSize = G_DEFAULT_ICON.shadowSize;
    ret.iconAnchor = G_DEFAULT_ICON.iconAnchor;
    return ret;
}

function getNormalIcon() {
    if( normalIcon == null ) {
        normalIcon = defaultIconWith( "../images/misc/marker.png" );
    }
    return normalIcon;
}

function getHilightedIcon() {
    if( hilightedIcon == null ) {
        hilightedIcon = defaultIconWith( "../images/misc/hmarker.png" );
    }
    return hilightedIcon;
}

function showPubOnMap( id ) {
    var idx = markerIds.indexOf( id );
    if( hilightedMarker != null ) {
        hilightedMarker.hide();
    }
    if( hiddenMarker != null ) {
        hiddenMarker.show();
    }
    hilightedMarker = hilitMarkerObjs[idx];
    hilightedMarker.show();
    hiddenMarker    = markerObjs[idx];
    hiddenMarker.hide();
    gmap.panTo( hilightedMarker.getPoint() );
    hilightedMarker.setPoint( hilightedMarker.getPoint() );
}

function createPubMarker( id, name, district, pnt, doPan ) {      
    var marker = new GMarker( pnt, { title: name + " (" + district + ")",
                                     icon: getNormalIcon() } );
    var hiMarker = new GMarker( pnt, { title: name + " (" + district + ")",
                                       icon: getHilightedIcon() } );
    GEvent.addListener( marker, "click", function() {
            showPubID( id );
        });

    gmap.addOverlay( marker );
    gmap.addOverlay( hiMarker );
    hiMarker.hide();

    markerIds.push( id );
    markerObjs.push( marker );
    hilitMarkerObjs.push( hiMarker );
    if( doPan ) {
        gmap.panTo( pnt );
    }
}

// send xml data from pubdataxml.asp to the gmap
function xml2map( req ) {
    $("pubguidemessage").innerHTML = "For more details, please click a pub above.";
    var doc = req.responseXML;
    // IE and Firefox want to get at the namespaced xml data in
    // slightly different ways. Argh.
    var results = $A(doc.getElementsByTagName("z:row"));
    if( results.length == 0 ) {
        results = $A(doc.getElementsByTagName("row"));
    }
    for( i = 0; i < results.length; i++ ) {
        var id = results[i].getAttribute( "PubID" );
        if( markerIds.include( id ) ) {
            // do nothing
            markerIds.detect( function( val, idx ) {
                if( val == id ) {
                    var marker = markerObjs[idx];
                    gmap.panTo( marker.getPoint() );
                }
            });
        } else {
            var id2    = results[i].getAttribute( "PubID" );
            var name   = results[i].getAttribute("PubName");
            var pnt    = new GLatLng( results[i].getAttribute( "Latitude" ), 
                                      results[i].getAttribute( "Longitude" ) );
            createPubMarker( id2, name, results[i].getAttribute( "DistrictName" ), 
                             pnt, results.length==1 );
        }
    }
    // finally, if there was an appropriate query string, show that pub
    var h = $H( window.location.search.substring(1).toQueryParams() );
    if( $A( h.keys() ).indexOf( "PubID" ) != -1 ) {
	// also zoom in a bit for a closer look at just this pub
	gmap.setZoom( 11 ); 
	showPubID( h["PubID"] );
    }
}

// change scope of pubs to a specific county
function selectCounty( selected ) {
	alert(selected.options[selected.selectedIndex].value);
//	selected.form.submit();
	
}

// get rid of all pubs
function clearMarkers() {
    markerObjs.each( function( marker, idx ) {
        gmap.removeOverlay( marker );
        GEvent.clearInstanceListeners( marker );
        hiMarker = hilitMarkerObjs[idx];
        gmap.removeOverlay( hiMarker );
        GEvent.clearInstanceListeners( hiMarker );
    });
    markerObjs      = new Array();
    hilitMarkerObjs = new Array();
    markerIds       = new Array();
}

// show a given pub by ID in the lower panel
function showPubID( pubId, updateMap ) {
    $("pubguideresult").innerHTML = "Loading pub details...";
    var url   = "pubguide-display-entry.asp";
    var pars  = "SelectPubID=" + pubId;
    var myAjax = new Ajax.Updater( 
        "pubguideresult",
        url,
        {
            method: "get",
            parameters: pars
        });
    showPubOnMap( pubId );
    $("PubIDList").value = pubId;
}

// call this to load all pubs
function showAllPubs() {
    var myLog = new Ajax.Request (
        "national-inventory-pubdataxml.asp",
        {
            method: "get",
            onComplete: xml2map
        });
}

function load() {
    if (GBrowserIsCompatible()) {
        gmap = new GMap2(document.getElementById("pubguidemap"));
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GMapTypeControl());
	gmap.setCenter( new GLatLng(52.967892,-1.160192), 5 );
    }
}