    //  ***
    //  *** Find My Nearest *** 
    //  *** Paul Phillips 2008
    //  *** Neath Port Talbot County Borough Council
    //  ***

	 var map;
     var DirHtml;
     var AddMarker = null;
     var MarkerListHtml = '';
     var LayerListHtml = '';
     var LayerListActive = 'True';
     var bounds = null;
     var baseIcon;
     var ISHow;
     var INormal;
     var IHouse;
     var menu_status = new Array();
     var XmlFileName = '';

     var mLat;
     var mLng;
     var mZoom = 10;

     var MapFeatures = new Array();
        function Feature(Title, Address, Telephone, GMarker, distance) {
            this.Title = Title;
            this.Address = Address;
            this.Telephone = Telephone;
            this.GMarker = GMarker;
            this.Distance = distance;
        }
     
    var localSearch = new GlocalSearch();

    function initialize() {
        LoadIndex();
        InitMap();
    }
    
    function InitMap() {
               
        if (GBrowserIsCompatible()) {
	   
            mLat = gup('X');
            if (mLat == '') { mLat = 51.662253;}
               mLat = parseFloat(mLat);

            mLng = gup('Y');
            if (mLng == '') { mLng = -3.82473;}
               mLng = parseFloat(mLng);

            mZoom = gup('Z');
            if (mZoom == '') { mZoom = 10;}

            var DE = gup('E');
            var DN = gup('N');

            if (DE !='') {
              if (DN != '') {
                 OSLL = NEtoLL (DE, DN);
                 WGLL = OGBToWGS84(OSLL.lat, OSLL.lon, 0);
                 mLat = WGLL.lat;
                 mLng = WGLL.lon;
               }
            };

            map = new GMap2(document.getElementById("map"));
            map.setCenter(new GLatLng(mLat, mLng),parseFloat(mZoom));
            map.addControl(new GMapTypeControl());
            map.addControl(new GLargeMapControl());

            var Mk = gup('P');
            if (Mk != '') {
               var point = new GLatLng(parseFloat(mLat),parseFloat(mLng));
               var Html ='<div>Planning Application : ' + Mk + '<br/><br/><a href="http://fastweb/fastweb/detail.asp?AltRef=' + Mk + '&ApplicationNumber=&AddressPrefix=&submit1=Go">Visit the planning website</a><br/><br/><img src="images/logo.gif" alt="Council Logo" width="197" height="41" /></div>';
               var marker = createMarker( point, 1, Html);
               map.addOverlay(marker);
               //GEvent.trigger(marker, "click");
               map.setMapType(G_SATELLITE_MAP);  // G_NORMAL_MAP
            }

	    var mT = gup('mT');
	    if (mT != '') {
	      if (mT == 'S') {
		map.setMapType(G_SATELLITE_MAP);
	      } else if (mT == 'H') {
	        map.setMapType(G_HYBRID_MAP);
	      } else {
	        map.setMapType(G_NORMAL_MAP);
	      }
	    }

            var options = {
                //onMarkersSetCallback : markersSet,
                onGenerateMarkerHtmlCallback : extendMarker,
                searchFormHint : "Search"
            };

            map.addControl(new google.maps.LocalSearch(options));

            baseIcon = new GIcon();
            baseIcon.shadow = "images/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);

            IShow = new GIcon(baseIcon);
            IShow.image = 'images/IShow.png';
            INormal = new GIcon(baseIcon);
            INormal.image = 'images/INormal.png';
     
            IHouse = new GIcon();
            IHouse.iconSize = new GSize(32, 32);
            IHouse.shadowSize = new GSize(59, 32);
            IHouse.iconAnchor = new GPoint(9, 32);
            IHouse.infoWindowAnchor = new GPoint(16, 2);
            IHouse.image = 'images/Addressbase.png';
            IHouse.shadow = 'images/Addressbaseshadow.png';

            GEvent.addListener(map, "moveend", GetMapCentre);
            GetMapCentre();
	    //LoadDataFile();
	    var MapDataFile = gup('Mf');
            if (MapDataFile != '') {LoadMapFile(MapDataFile);}
	    GEvent.addListener(map, "load", MapFinishedLoading());

          }
     }

    function LoadDataFile() {
        MapLoadingBanner('True');
        ClearMapFeatures();
        MapWaitFeaturesCleared();
    }

    function ClearMapFeatures() {
        document.getElementById("SideBar_Content").innerHTML = LayerListHtml;
        for (var i = 0; i < MapFeatures.length; i++) {
	        var Feat = MapFeatures[i];
	        map.removeOverlay(Feat.GMarker);
	    }
        MapFeatures = [];
        map.setCenter(new GLatLng(mLat, mLng),mZoom);
    }

    function MapWaitFeaturesCleared() {
	if (MapFeatures.length != 0) {
	   setTimeout('MapWaitFeaturesCleared()',1);
	} else {
	   ContinueLoadDataFile();
	}
    }

    function ContinueLoadDataFile() {

	    var DataFile = document.getElementById("XmlFileName").value;
	    //document.getElementById("SideBar_Content").innerHTML = 'Please Wait - Loading Datasets';

	    if (DataFile != '') {
	        	GDownloadUrl(DataFile, function(data, responseCode) {
        			var xml = GXml.parse(data);
        			//bounds = new GLatLngBounds();
        			//var notes = xml.documentElement.getElementsByTagName("Note");
        			//for (var n = 0; n < notes.length; n++) {
        			//    side_bar_html += notes[n].getAttribute("id") + '<p></p>';
        			//}
        			var markers = xml.documentElement.getElementsByTagName("marker");
            		        for (var i = 0; i < markers.length && i < 500; i++) {
        			var point = new GLatLng(parseFloat(markers[i].getAttribute("Lat")),parseFloat(markers[i].getAttribute("Lng")));
	            		//bounds.extend(point);
	            		var id = markers[i].getAttribute("id");
	            		var Label = markers[i].getAttribute("Label");
	            		var Address = markers[i].getAttribute("Address");
	            		var Telephone = markers[i].getAttribute("Telephone");
	            		var WebUrl = markers[i].getAttribute("WebUrl");

                                var Html = '<div>';
                                Html = Html + Address + '<br/>';
                                Html = Html + Telephone + '<br/><br/>';
                                Html = Html + 'Get Directions: ';
                                Html = Html + '<a href="http://maps.google.co.uk/maps?f=d&hl=en&daddr=' + markers[i].getAttribute("Lat") + ' ' + markers[i].getAttribute("Lng") + '">To here</a>';
                                Html = Html + ' - ';
                                Html = Html + '<a href="http://maps.google.co.uk/maps?f=d&hl=en&saddr=' + markers[i].getAttribute("Lat") + ' ' + markers[i].getAttribute("Lng") + '">From here</a>';
                                Html = Html + '<br/><br/>';
                                if (WebUrl != null) {
                                   Html = Html + '<a href="' + WebUrl + '">Visit the website</a>';
                                }
                                Html = Html + '<br/><br/>';
                                Html = Html + '<img src="images/logo.gif" alt="Council Logo" width="197" height="41" />';
                                Html = Html + '</div>';

				var marker = createMarker( point, id, Html);
				marker.title = Label;
                		map.addOverlay(marker);
                		MapFeatures.push(new Feature(Label, Address, Telephone, marker,0));
	            		marker = null;
	            		if (i > 498) {alert('Warning - only the first 500 items in this dataset has been displayed');}
           		    }
				});
            }
            MapFinishedLoading();
     }

         function LoadMapFile(DataFile) {

        if (DataFile != '') {

       	        GDownloadUrl(DataFile, function(data, responseCode) {
                   var xml = GXml.parse(data);
                   var markers = xml.documentElement.getElementsByTagName("rte");
                   for (var i = 0; i < markers.length; i++) {
                       var mPoints;
                       var points = [];
                       if (mPoints = markers[i].getElementsByTagName("rtept")) {
                          for (var z = 0; z < mPoints.length; z++) {
                              //points.push(new GPoint(parseFloat(mPoints[z].getAttribute("lat")),parseFloat(mPoints[z].getAttribute("lon"))));
                              var polyPixel = new GLatLng(mPoints[z].getAttribute("lat"),mPoints[z].getAttribute("lon"));
                              points.push(polyPixel);
                          }
                          var CPoly = new GPolyline(points, "#000000", 5);
                          map.addOverlay(CPoly);
		          points = [];
                       }
                    }
                });
       }
    }

     function MapFinishedLoading() {
        setTimeout('MapWaitFeaturesLoaded()', 1);
     }
     
     function MapWaitFeaturesLoaded() {
        if (MapFeatures.length ==0) {
            setTimeout('MapWaitFeaturesLoaded()', 1);
        } else {
            BuildMarkerList();
            MapBounds();
            MapLoadingBanner('False');
        }
     }

     function MapLoadingBanner(State) {

             if (State=='True') {
               document.getElementById("Banner").className = "ShowMapLoading";
               //alert ('show');
             } else {
               document.getElementById("Banner").className = "HideMapLoading";
               //alert ('hide');
             }
     }

     function markersSet(markers) {

     // note: markers is an array of LocalResult
        for (var i = 0; i < markers.length; i++) {
            var Html = '<table width="250" border="0">';
            Html = Html + '<tr><td colspan="3"><img src="images/logo.gif" alt="Council Logo" width="197" height="41" /></td></tr>';
            Html = Html + '<tr><td colspan="2" align="left" valign="top">' + markers[i].result.titleNoFormatting + '<br>' + markers[i].result.phoneNumbers[0] + '</td><td></td></tr>';
            Html = Html + '<tr><td width="127" colspan="1">&nbsp;</td><td colspan="2"><img src="images/DirTo.gif" width="29" height="17" >&nbsp;Get Directions</td></tr>';
            Html = Html + '<tr><td colspan="1" align="left"><a href="javascript:SideBarZoom(' + i + ')">+ zoom in</a></td><td width="53"><div align="left"><a href="http://maps.google.co.uk/maps?f=d&hl=en&saddr=' + markers[i].result.lat + ' ' + markers[i].result.lng + '">from here</a></div></td><td width="56"><div align="right"><a href="http://maps.google.co.uk/maps?f=d&hl=en&daddr=' + markers[i].result.lat + ' ' + markers[i].result.lng + '">to here</a></div></td></tr>';
            Html = Html + '<tr><td colspan="3">&nbsp;</td></tr>';
            if (markers[i].result.url != null) {
            Html = Html + '<tr><td colspan="3" align="left">' + markers[i].result.url + '</td></tr>';
            }
            Html = Html + '</table>';
            markers.html = Html;
            alert (Html);
        }
     }

     function extendMarker(marker, html, result) {
        // extend the passed in html for this result
        myStuff = document.createElement("div");
        myStuff.innerHTML =  '<br/><img src="images/logo.gif" alt="Council Logo" width="197" height="41" />';
        html.appendChild(myStuff);
     return html;
     }


     function BuildMarkerList() {

          if (AddMarker != undefined) {SortFeaturesByDistance();}

          MarkerListHtml = '<div id="MLC" class="mainmenu"><a href="javascript:CloseMarkerList()">back to Map Layers</a></div>';

	  for (var i = 0; i < MapFeatures.length; i++) {
	        MarkerListHtml += '<div id="ML' + i + '" class="markeritem"><img src="images/sidebaricon.gif" /><a href="javascript:SideBarClick(' + i + ')">' + MapFeatures[i].Title + '</a>';
	        if (AddMarker != undefined) {
                   MarkerListHtml += '<br/><label>' + MapFeatures[i].Distance.toFixed(2) + ' Miles </label>';
                }
                MarkerListHtml += '</div>';
          }

	  document.getElementById("SideBar_Content").innerHTML = MarkerListHtml;
	  document.getElementById("SideBar_Content").setfocus;
          LayerListActive = 'False';
	}

    function MapBounds() {

      bounds = new GLatLngBounds();
      for (var i = 0; i < MapFeatures.length; i++) {
	  bounds.extend(MapFeatures[i].GMarker.getPoint());
      }

      if (AddMarker != null) {bounds.extend(AddMarker.getPoint());}

      map.setZoom(map.getBoundsZoomLevel(bounds));
      map.setCenter(bounds.getCenter());

     }

    function CloseMarkerList() {
      document.getElementById("SideBar_Content").innerHTML = LayerListHtml;
      document.getElementById("SideBar_Content").setfocus;
      ClearMapFeatures();
      LayerListActive = 'True';
    }

    function createMarker(point, id, Html) {
        var marker = new GMarker(point, INormal);
	marker.id = id;
        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(Html);
         });
        GEvent.addListener(marker,'mouseover',function(){
            //marker.setImage(IShow.image);
	    //marker.openInfoWindowHtml(Html);
        });
        GEvent.addListener(marker,'mouseout',function(){
            //marker.setImage(INormal.image);
	    //marker.closeInfoWindow();
        });
        GEvent.addListener(marker,'SideBar',function(){
            marker.setImage(IShow.image);
            map.panTo(marker.getPoint());
            marker.openInfoWindowHtml(Html);
        });
        GEvent.addListener(marker,'ZoomTo',function(){
            map.setZoom(15);
            marker.setImage(IShow.image);
            map.panTo(marker.getPoint());
        });
        return marker;
     }
	 
     function SideBarClick(i) {
              ResetMarkers();
	      var Feat = MapFeatures[i];
              GEvent.trigger(Feat.GMarker, "SideBar");
     }

     function SideBarZoom(i) {
            ResetMarkers();
	    var Feat = MapFeatures[i];
            GEvent.trigger(Feat.GMarker, "ZoomTo");
     }
     
     function ResetMarkers() {
	    for (var i = 0; i < MapFeatures.length; i++) {
	        var Feat = MapFeatures[i];
	        Feat.GMarker.setImage(INormal.image);
	        Feat.GMarker.closeInfoWindow(); 
	    }
	 }

     function GetMapCentre() {
	    var mapCntr = map.getCenter();
	    if (mapCntr != null) {
            document.getElementById("Lng").value = mapCntr.lng();
            document.getElementById("Lat").value = mapCntr.lat();
            document.getElementById("Zoom").value = map.getZoom();
            window.status = 'Current Position is Longitude:' + document.getElementById("Lng").value + ', Latitude:' + document.getElementById("Lat").value;
        }
    }

    function addAddressToMap(response) {
      
      if (null != AddMarker) {map.removeOverlay(AddMarker);}

      if (!response || response.Status.code != 200) {
        document.all('Tx_Address').value = '';
        alert("Sorry, we cannot locate that address"); 
      } else {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
        //if (point.lng() < -5 || point.lng() > -2.3 || point.lat() < 52.12 || point.lat() > 51.22) {
        //    alert('This address is not in south wales');
        //} else {
            AddMarker = CreateAddressMarker(point, 1, document.getElementById('Tx_Address').value, place.address);
            map.addOverlay(AddMarker);
            WaitAddressLoaded();
        //}
      }
    }

    function CreateAddressMarker(Point, Id, Title, Address) {
        Marker = new GMarker(Point, IHouse);
        Marker.id = Id;
        Marker.title = Title;
        GEvent.addListener(Marker, "click", function() {
            var s = Address;
            s = s.replace(/,/g,"<br>");
            s += '<br><br><a href="javascript:map.setZoom(15);map.panTo(AddMarker.getPoint());">Zoom in</a>';
            Marker.openInfoWindowHtml(s);
        });
        return (Marker);
    }

    function AddressSearch() {
      ClearAddMarker();
    }

    function ClearAddMarker() {
        if (AddMarker != undefined) {
          map.removeOverlay(AddMarker);
          AddMarker = this.undefined;
        }
        WaituntilAddMarkerClear();
    }

    function WaituntilAddMarkerClear() {
        if (AddMarker!= undefined) {
            setTimeout('WaituntilAddMarkerClear()',1);
	} else {
	    FindAddress();
	}
     }

    function FindAddress() {
        var address = document.all('Tx_Address').value;
        if (address != '') {
            usePointFromPostcode(document.all('Tx_Address').value,
            function (point) {
                     var Aname = document.getElementById('Tx_Address').value;
                     AddMarker = CreateAddressMarker(point, 1, Aname, Aname);
                     map.addOverlay(AddMarker);
                     WaitAddressLoaded();
            })
        } 
    }

    function WaitAddressLoaded() {
       if (AddMarker == null) {
          setTimeout('WaitAddressLoaded()',1);
       } else {
          if (LayerListActive == 'False') {BuildMarkerList();}
	  MapBounds();
	  }
    }

    function usePointFromPostcode(postcode, callbackFunction) {

             localSearch.setSearchCompleteCallback(null,
             function() {
                        if (localSearch.results[0]) {
                        var resultLat = localSearch.results[0].lat;
                        var resultLng = localSearch.results[0].lng;
                        var point = new GLatLng(resultLat,resultLng);
                        callbackFunction(point);
                        }else{
                         alert("Postcode not found!");
                         }
             });

             localSearch.execute(postcode + ", UK");
    }

    function SortFeaturesByDistance() {
    	for (var i = 0; i < MapFeatures.length; i++) {
	        var Feat = MapFeatures[i];
	        var Mp = Feat.GMarker.getPoint();
	        var Ap = AddMarker.getPoint();
            var Dist = CalcDistance (Ap.lat(), Ap.lng(), Mp.lat(), Mp.lng()); 
            Feat.Distance = Dist;
            MapFeatures[i] = Feat;
	    }
	    MapFeatures.sort(function(a,b){return a.Distance - b.Distance});
    }


  
    function CalcDistance (lat1, lon1, lat2, lon2) {
        var R = 6371; // earth's mean radius in km
        var dLat = (lat2-lat1).toRad();
        var dLon = (lon2-lon1).toRad();
            lat1 = lat1.toRad(), lat2 = lat2.toRad();
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(lat1) * Math.cos(lat2) * 
            Math.sin(dLon/2) * Math.sin(dLon/2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;
        d = d / 1.6; // convert to miles from Km
        return d;
    }

    Number.prototype.toRad = function() {  // convert degrees to radians
        return this * Math.PI / 180;
    }

    Number.prototype.toDeg = function() {  // convert radians to degrees (signed)
        return this * 180 / Math.PI;
    }

    Number.prototype.toBrng = function() {  // convert radians to degrees (as bearing: 0...360)
        return (this.toDeg()+360) % 360;
    }

    function showHide(theid){
       if (document.getElementById) {
          var switch_id = document.getElementById(theid);
          if(menu_status[theid] != 'show') {
             switch_id.className = 'show';
             menu_status[theid] = 'show';
          }else{
             switch_id.className = 'hide';
             menu_status[theid] = 'hide';
          }
       }
    }
    
     function gup(name){
              name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
              var regexS = "[\\?&]"+name+"=([^&#]*)";
              var regex = new RegExp( regexS );
              var results = regex.exec( window.location.href );
              if( results == null )    return "";
              else return results[1];
     }




