var gmap;
var markerIds 		= new Array();
var markerObjs 		= new Array();
var hilitMarkerObjs     = new Array();
var normalIcon 		= null;
var localeIcon 		= null;
var localeHiIcon 	= null;
var hilightedIcon 	= null;
var hilightedMarker 	= null;
var breweryIcon         = null;
var hiddenMarker        = null;

var showCircle = false;
var circle = null;
var breweryMarkers = new Array();

var LocAleRadius = 30;

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 getLocAleIcon() {
    if ( localeIcon == null ) {
        localeIcon = defaultIconWith( "../images/misc/locale.png" );
    }
    return localeIcon;
}

function getLocAleHiIcon() {
    if( localeHiIcon == null ) {
        localeHiIcon = defaultIconWith( "../images/misc/localeHi.png" );
    }
    return localeHiIcon;
}

function getHilightedIcon() {
    if( hilightedIcon == null ) {
        hilightedIcon = defaultIconWith( "../images/misc/hmarker.png" );
    }
    return hilightedIcon;
}

function getBreweryIcon() {
    if ( breweryIcon == null ) {
        breweryIcon = defaultIconWith( "../images/misc/bmarker.gif" );
    }
    return breweryIcon;
}

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() );
    if ( circle != null ) {
        gmap.removeOverlay( circle );
    }
    circle = drawCircle( hilightedMarker.getPoint(), LocAleRadius );
    if ( showCircle ) {
        circle.show();
    } else {
        circle.hide();
    }
}

function createPubMarker( id, name, district, locale, pnt, doPan ) {      
    var marker = new GMarker( pnt, { title: name + " (" + district + ")",
                                     icon: (locale == "True" ? getLocAleIcon() : getNormalIcon() ) } );
    var hiMarker = new GMarker( pnt, { title: name + " (" + district + ")",
                                       icon: (locale == "True" ? getLocAleHiIcon() : 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 );
    }
}

function xml2map( req ) {
    try {
        xml2mapI( req );
    } catch ( E ) {
        //alert( "Fail! " + E.message );
    }
           
}

// send xml data from pubdataxml.asp to the gmap
function xml2mapI( req ) {
    // $("pubguidemessage").innerHTML = "For more details, please click on a pub above, or select a pub from the menu below.";
    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" ), 
                             results[i].getAttribute( "LocAle" ),
                             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"] );
    }
    if( $A( h.keys() ).indexOf( "SelectPubID" ) != -1 ) {
	// also zoom in a bit for a closer look at just this pub
	gmap.setZoom( 11 ); 
	showPubID( h["SelectPubID"] );
    }

}

// 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 h = $H( window.location.search.substring(1).toQueryParams() );
    if( $A( h.keys() ).indexOf( "OnePhotoOnly" ) != -1 ) {
        pars += "&OnePhotoOnly=False";
    }

    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 (
        "pubdataxml.asp",
        {
            method: "get",
            onComplete: xml2map
        });
}

function drawCircle(pnt, radius)
{
    var centre = pnt

    var circlePoints = Array();

    with (Math)
    {
        var d = radius/3963.189;  // radians

        var lat1 = (PI/180)* centre.lat(); // radians
        var lng1 = (PI/180)* centre.lng(); // radians

        for (var a = 0 ; a <= 360 ; a += 10)
        {
            var tc = (PI/180)*a;
            var y = asin (sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
            var dlng = atan2 (sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
            var x = ((lng1-dlng+PI) % (2*PI)) - PI ;
            var point = new GLatLng (y*(180/PI),x*(180/PI));
            circlePoints.push(point);
        }
        
        var c;
        
        if (d < 1.5678565720686044)
        {
            c = new GPolygon(circlePoints, "#f00", 2, 0.6, "#f00", 0.05);
        }
        else {
            c = new GPolygon(circlePoints, "#f00", 2, 0.6);
        }

        gmap.addOverlay(c);
    }
    return c;

}

function addAllBreweries() {
    for ( i = 0; i < breweries.length; ++i ) {
        var m = new GMarker( new GLatLng( breweries[i].lat, breweries[i].lng ),
                             { title: breweries[i].name, 
                                     icon: getBreweryIcon() } );
        gmap.addOverlay( m );
        breweryMarkers.push( m );
        m.hide();
    }
}

function localeChange() {
    if( $("localeBox") == null ) { return; }
    if( $("localeBox").checked ) {
        showCircle = true;
        if ( circle != null ) {
            circle.show();
        } else {
            if ( hilightedMarker != null ) {
                circle = drawCircle( hilightedMarker.getPoint(), LocAleRadius );
            }
        }
        if ( breweryMarkers.length == 0 ) {
            addAllBreweries();
        }
        for ( i = 0; i < breweryMarkers.length; i++ ) {
            breweryMarkers[i].show();
        }
    } else {
        showCircle = false;
        if ( circle != null ) {
            gmap.removeOverlay( circle );
            circle = null;
        }
        for ( i = 0; i < breweryMarkers.length; i++ ) {
            breweryMarkers[i].hide();
        }
    }
}

function recenterMap( position ) {
    gmap.setCenter( new GLatLng(position.coords.latitude, position.coords.longitude), 13 );

}

function load() {
    if (GBrowserIsCompatible()) {
        gmap = new GMap2(document.getElementById("pubguidemap"));
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GMapTypeControl());
        
	gmap.setCenter( new GLatLng(52.314387, -0.166389), 9 );
	gmap.addOverlay( new GPolyline( points, "#000000", 5, 1 ) );
        gmap.enableScrollWheelZoom();
        localeChange();
        try {
            navigator.geolocation.getCurrentPosition( recenterMap );
        } catch( e ) {
            // swallow - can't do it
        }
    }
}

