//<![cdata[
var map = null;
var geocoder = null;
function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    geocoder = new GClientGeocoder(); 
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    GEvent.addListener(map, "moveend", update_map);
    
    var regions = document.getElementById('regions')
    //setMapRegion(regions.options[regions.selectedIndex].value, 7)
    setMapRegion("Australia", 4)
  }
}
window.onload = load;
window.onunload = GUnload;
// Message div
var mapMessage = document.getElementById("mapMessage");
//the ajax request object
var request;
//array of markers so we can keep track of which to remove
var marks = new Array();
//is the a fetch in progress?
var running = false;
//these are for zoomin optimization (if prev zoom had all markers then no need to load them again for zooming in)
var prevZoom = 1000;
var prevCount = "250";
var shownall = false;
var sentBounds = '';
function createMarker(point, id) {
      var marker = new GMarker(point);
           
      GEvent.addListener(marker, "click", function() {
      
            request = GXmlHttp.create();
            request.open("GET", "webservice.php?id=" + id, true);
        
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                              var xmlDoc = request.responseXML;
                        }
                        
                        if (xmlDoc == null || !xmlDoc.documentElement) {
                              //mapMessage.innerHTML = "Error: Unable to Parse XML";
                              return;
                        }
                              
                        var html = "";
                                    var text = "";
                        var store = xmlDoc.documentElement.getElementsByTagName("store");
                        html += "<strong>" + store[0].childNodes[0].getAttribute("val") + "</strong>";
                                    text += store[0].childNodes[0].getAttribute("val") + "\n";
                        html += "<br>" + store[0].childNodes[1].getAttribute("val");
                                    text += store[0].childNodes[1].getAttribute("val") + "\n";
                        if (store[0].childNodes[2].getAttribute("val").length > 0)
                                    {
                              html += "<br>" + store[0].childNodes[2].getAttribute("val");
                                            text += store[0].childNodes[2].getAttribute("val") + "\n";
                                  }
                        html += "<br>" + store[0].childNodes[3].getAttribute("val");
                                    text += store[0].childNodes[3].getAttribute("val") + "\n";
                        html += "<br>" + store[0].childNodes[4].getAttribute("val");
                                    text += store[0].childNodes[4].getAttribute("val") + "\n";
									
									html += " - " + store[0].childNodes[5].getAttribute("val");
                                    text += store[0].childNodes[5].getAttribute("val") + "\n";
									
									html += "<br>" + store[0].childNodes[6].getAttribute("val");
                                    text += store[0].childNodes[6].getAttribute("val") + "\n";
									
									if (store[0].childNodes[7].getAttribute("val")!="none")
                                    {
										html += "<br><a style='color:#069' href='" + store[0].childNodes[7].getAttribute("val") + "'>" + store[0].childNodes[7].getAttribute("val") + "</a>" + "\n";
										text += store[0].childNodes[7].getAttribute("val") + "\n";
									}
                        
						if (store[0].childNodes[8].getAttribute("val")!="none")
                                    {
									html += "<br><a style='color:#069' href='mailto:" + store[0].childNodes[8].getAttribute("val") + "'>" + store[0].childNodes[8].getAttribute("val") + "</a>" + "\n";
									text += store[0].childNodes[8].getAttribute("val") + "\n";
								}
			
                       
					   //                         
                                    //alert(text);
                        marker.openInfoWindowHtml(html);
            }
            
            request.send(null);
          
      });
    
    
      return marker;
}
function update_map()
{
    if (running) {
            request.abort();
            running = false;
      }
      if ((map.getZoom() <= prevZoom || prevCount == "250") && map.getZoom() >= 10) {
            var bounds = map.getBounds();
            
            var center = map.getCenter();
            var zoom = map.getZoom();
            
            sentBounds = bounds.toString()
            
            request = GXmlHttp.create();
            request.open("GET", "webservice.php?bounds="+bounds.getNorthEast().lat()+"|"+bounds.getNorthEast().lng()+"|"+bounds.getSouthWest().lat()+"|"+bounds.getSouthWest().lng(), true);
            
            request.onreadystatechange = function() {
                if (request.readyState == 4 && running) {
                    //alert("done");
                    var xmlDoc = request.responseXML;
                    
                    if (xmlDoc == null || !xmlDoc.documentElement) {
                              //mapMessage.innerHTML = "Error: Unable to Parse XML";
                              running = false;
                              return;
                        }
                        var markers = xmlDoc.documentElement.getElementsByTagName("marker");
                        prevCount = xmlDoc.documentElement.getElementsByTagName("count")[0].getAttribute("value");
                    //mapMessage.innerHTML = "Loading " + prevCount + " entries.";
                        
                        //flag all current markers as old
                        for (i in marks) 
                              if (marks[i] != null) 
                                    marks[i].old = true;
                                    
                        for (var i = 0; i <markers.length; i++) {
                              id = markers[i].getAttribute("id");
                              if (marks[id] && marks[id] != null) {
                                    //we have this one so lets flag it as valid
                                    marks[id].old = false;
                              } else {
                                    var point = new GPoint(parseFloat(markers[i].getAttribute("lng")), parseFloat(markers[i].getAttribute("lat")));
                                    
                                    //add any extra fields to this line
                                    marks[id] = createMarker(point,id);
                                    
                                    map.addOverlay(marks[id]); 
                                    
                                    
                              }
                        }
                        
                        //if (prevCount == "250")
                        //mapMessage.innerHTML = "Last 250 entries loaded. Zoom in for more.";
                        //else
                        //mapMessage.innerHTML = prevCount + " entries loaded.";
                        
                        // remove old marks
                        for (i in marks) 
                          if (marks[i] != null) 
                                if (marks[i].old == true) {
                                      map.removeOverlay(marks[i]);
                                      marks[i] = null; //marks.splice(i,1);
                                }
                                
                        running = false;
                }
            }
            //mapMessage.innerHTML = "Loading. Please wait....";
            running = true;
            request.send(null);
      }
      prevZoom = map.getZoom();
}
function setMapRegion(address, zoom)
{
    geocoder.getLatLng(
            address,
            function(point) {
                if (!point) {
                    alert(address.replace(/\+/g, ' ') + " not found");
                } else {
                    map.setCenter(point, zoom);
                }
            }
        );
}
//]]>
