 
  	var map;
    var geocoder;
    var address;

    //Roughly center of Wales
    var defaultLat = 52.469978;
    var defaultLon = -3.830377;

    var searchcenter;
    
    /**
      * Triggered on load
      */
    function load() {
    	if(document.getElementById("map")){
            geocoder = new google.maps.Geocoder();
            var latlng = new google.maps.LatLng(defaultLat, defaultLon);
            var myOptions = {
              zoom: 8,
              center: latlng,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById("map"), myOptions);
    	}
    	else
		{
    		alert("Sorry your browser is not compatible with this service");
		}

    }


    
    /**
     * Display a message to the modal div skin
     * 
     * @param message
     * @return;
     */
    function userMessage(message) {

    	var messages = document.getElementById('userMessages');
    	messages.className = 'overlay';
    	messages.innerHTML = '';
    	messages.innerHTML = '<div class=\"message\">'+
    		'<img src=\"images/ajax-loader.gif\" />'+'<p>'+message+'</p></div>';
    }
    
    /**
     * Take the users input and find its coordinates using the Google API
     * @return;
     */
   function searchLocations1() {
	
   	var outer = document.getElementById('userMessagesOuter');
	outer.style.visibility = 'visible';
	   
     var address = document.getElementById('addressInput').value;
     var messages = document.getElementById('userMessages');
     userMessage('Searching...');
     
     geocoder.getLatLng(address, function(latlng) {
       if (!latlng) {
         userMessage("Address not found using Google, please check your address ...");
         messages.className = '';
       } else {
    	   searchcenter = latlng;
         userMessage("Address found, now searching for properties");
         searchLocationsNear();
       }
     });
   }

   /**
    * Code Address
    */
   function searchLocations() {
	   
	   	var outer = document.getElementById('userMessagesOuter');
		outer.style.visibility = 'visible';
		   
	     var address = document.getElementById('addressInput').value;
	     var messages = document.getElementById('userMessages');
	     userMessage('Searching...');

       geocoder.geocode( { 'address': address,
    	      'partialmatch': true}, function(results, status) {
         if (status == google.maps.GeocoderStatus.OK) {
           map.setCenter(results[0].geometry.location);
           var marker = new google.maps.Marker({
               map: map, 
               position: results[0].geometry.location
           });
           searchcenter = results[0].geometry.location;
           userMessage("Address found, now searching for properties");
           searchLocationsNear();
           
         } else {
           alert("Location Search was not successful for the following reason: " + status);
           userMessage("Address not found using Google, please check your address ...");
           messages.className = '';
         }
       });
     }
   
   /**
    * Performs local database haversine radial search
    * @param center
    * @return
    */
   function searchLocationsNear() {
     var radius = document.getElementById('radiusSelect').value;
     var units = document.getElementById('unitsSelect').value;
     var searchUrl = 'http://www.qualitycottages.co.uk/propclusters.php?lat=' + searchcenter.lat() + '&lon=' + searchcenter.lng() 
     + '&radius=' + radius+'&units='+units;

     var $ = jQuery.noConflict();
     
	 	var params = $("#params").serialize();
		
	 	
		$.ajax({
	        type: "GET",
			url: searchUrl,
			async: false,
			data: params,
			dataType: "xml",
			success: parseResult,
		    error: function(xhr, textStatus, error) {
			    alert('status: ' + textStatus+' '+xhr.responseText+' - '+ xhr.status);
		    }
		});
   
   }

   /**
    * Deal with the local search results
    * @param data
    * @return
    */
   function parseResult(data, responseCode) {
      
	   if(responseCode == 200 || responseCode == "success") {

		   //var xml = GXml.parse(data);
	       var markers = data.childNodes[0].children;//xml.documentElement.getElementsByTagName('marker');/
	       var sidebar = document.getElementById('sidebar');
	       var messages = document.getElementById('userMessages');
	       var radius = document.getElementById('radiusSelect');
	       var radiusPos = radius.value / 5;//radius.selectedIndex;
	       var units = document.getElementById('unitsSelect').value;
	       var unitType = (units == 'm' ? 'Miles':'Kilometers');
	       
	       map.clearOverlays();
	       sidebar.innerHTML = '';
	       
	       if (markers.length == 0 || markers.length <5) {

	    	   if(radius.value == 150) {
	    		   userMessage('Sorry no cottages found for given address within 150 '+unitType+' ');
	    		   radius.value = 5;
	    		   //radius.selectedIndex = 0;
	    		   //messages.className = '';
	    	    	var outer = document.getElementById('userMessagesOuter');
	    	    	outer.style.visibility = 'hidden';
	           }else{
	        	   userMessage('Sorry no cottages found for given address, we are widening your search');
	        	   //radius.selectedIndex = (radiusPos += 1);
	        	   radius.value += 5;
	        	   searchLocationsNear();
	           }
	    	   
	           map.setCenter(new GLatLng(defaultLat, defaultLon), 8);
	           
	           return;
	       }
	       else
	       {
	    	   userMessage('Generating your custom search results');   
	       }

	       var bounds = new GLatLngBounds();

	       for (var i = 0; i < markers.length; i++) {

	         var mapnode = markers[i];
	           
	         var name = mapnode.getAttribute('name');
	         var address = mapnode.getAttribute('address');
	         var distance = parseFloat(mapnode.getAttribute('distance'));
	         var point = new GLatLng(parseFloat(mapnode.getAttribute('lat')),
	                                 parseFloat(mapnode.getAttribute('lng')));

	         var marker = createMarker(mapnode);
	         map.addOverlay(marker);
	         var sidebarEntry = createSidebarEntry(marker, name, address, distance);
	         sidebar.appendChild(sidebarEntry);
	         bounds.extend(point);
	         userMessage('Map generation completed ... ready');


	       }
	       map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	       //radius.selectedIndex = 0;
	   	   radius.value = 5;
	       
	       pausecomp(3000);
	       
	       var outer = document.getElementById('userMessagesOuter');
		   outer.style.visibility = 'hidden';
		
	       message.className = '';
	   }
     }
   
    function createMarker(mapnode) {
      
        var name = mapnode.getAttribute('name');
        var address = mapnode.getAttribute('address');
        var distance = parseFloat(mapnode.getAttribute('distance'));
        var point = new GLatLng(parseFloat(mapnode.getAttribute('lat')),
                                parseFloat(mapnode.getAttribute('lng')));
        var shortdesc = mapnode.getAttribute('shortdesc');
        var imgsrc = mapnode.getAttribute('imgsrc');
        var link = mapnode.getAttribute('ref');
        var smoking = mapnode.getAttribute('smoking');
        var accom = mapnode.getAttribute('accom');
        var pets = mapnode.getAttribute('pets');
    	
      var marker = new GMarker(point);
//'<caption><img src=\"images/new_logo.gif\" alt=\"Quality Cottages Logo\"></caption>'+
      var html =
      '<table width=\"340px\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\">'+
       '<caption><img src=\"images/Q.gif\" alt=\"Quality Cottages Logo\"></caption>'+
       '<tr>'+
        '<td colspan=\"2\"><strong>'+name+'</strong></td>'+
       '</tr>'+
       '<tr>'+
         '<td colspan=\"2\" align=\"left\" valign=\"middle\"><div align=\"justify\"><dfn>'+shortdesc+' ... <a href=\"'+link+'\" target=\"_blank\"> See More... </a></dfn></div></td>'+
       '</tr>'+
       '<tr>'+
        '<td colspan=\"2\"><hr width=\"100%\" /></td>'+
       '</tr>'+
       '<tr>'+
         '<td align=\"left\" valign=\"middle\"><div align=\"left\">'+
             '<ul>'+
               '<li>Sleeps: '+accom+'</li>'+
               '<li>Pets: '+pets+'</li>'+
               '<li>Smoking: '+smoking+'</li>'+
             '</ul>'+
             '<img src=\"mg.gif\" />&nbsp;<a href=\"'+link+'\" target=\"_blank\">View Property Details</a>'+
           '</div></td>'+
         '<td valign=\"middle\"><img name=\"'+name+'\" width=\"130px\" height=\"87px\" src=\"'+imgsrc+'\" alt=\"Picture of '+name+' \"></td>'+
        '</tr>'+
        '<tr>'+
          '<td colspan=\"2\" valign=\"middle\"><hr width=\"100%\" /></td>'+
        '</tr>'+
      '</table>';
      
      GEvent.addListener(marker, 'click', function() {
        marker.openInfoWindowHtml(html);
      });
      return marker;
    }
    
    
    /**
     * Creates a result entry in the sidebar
     * 
     * @param marker
     * @param name
     * @param address
     * @param distance
     * @return
     */
    function createSidebarEntry(marker, name, address, distance) {
      var div = document.createElement('div');
      var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ')<br/>' + address;
      div.innerHTML = html;
      div.style.cursor = 'pointer';
      div.style.marginBottom = '5px'; 
      GEvent.addDomListener(div, 'click', function() {
        GEvent.trigger(marker, 'click');
      });
      GEvent.addDomListener(div, 'mouseover', function() {
        div.style.backgroundColor = '#eee';
      });
      GEvent.addDomListener(div, 'mouseout', function() {
        div.style.backgroundColor = '#fff';
      });
      return div;
    }
    
    /**
     * Naughty little pause function
     * 
     * @param millis
     * @return
     */
    function pausecomp(millis)
    {
	    var date = new Date();
	    var curDate = null;
	
	    do { curDate = new Date(); }
	    while(curDate-date < millis);
    } 
    
