//<![CDATA[

    var mapBounds = new GLatLngBounds(new GLatLng(-31.9869302902, 115.810940266), new GLatLng(-31.9735070257, 115.823901178));
    var mapMinZoom = 14;
    var mapMaxZoom = 20;

    var opacity = 0.65;
    var map;
    var ge;
    var uwaOverlay;

    //used to compensate for the movement of google satellite images.
    var lngOffset = 0.000;
    var latOffset = 0.000; 

    var uwaOverlay;
    var mm;
    var gmarkers = [];
    var pmarkers = [];
    var tmarkers = [];

    var baseIcon = new GIcon();
    baseIcon.iconSize=new GSize(32,32);
    baseIcon.shadowSize=new GSize(56,32);
    baseIcon.iconAnchor=new GPoint(16,32);
    baseIcon.infoWindowAnchor=new GPoint(16,0);

    var pIcon = new GIcon(baseIcon, "/templates/gmap_new/images/icons/icon7.png", null, "/templates/gmap_new/images/icons/icon7s.png");
    var tIcon = new GIcon(baseIcon, "/templates/gmap_new/images/icons/icon22.png", null, "/templates/gmap_new/images/icons/icon22s.png");


    var CTransparencyLENGTH = 58; 

    
    function createMarker(point,label,desc,type,inert, id) 
    {
        var marker = new GMarker(point);
        if(type == "cp") 
        {
            marker = new GMarker(point,pIcon);
        }
        else if(type == "tour") 
        {
            marker = new GMarker(point,tIcon);
        }

        if(!inert) 
        {
            if(type == "tour") 
            {
                GEvent.addListener(marker, "click", function() 
                {
                    marker.openInfoWindowHtml("<b>"+label+"</b><br/><iframe src=\""+desc+"\" width=\"300\" height=\"280\" scrolling=\"no\" />");
                });
            }
            else 
            {
                GEvent.addListener(marker, "click", function() {
                    //marker.openInfoWindowHtml("<b>"+label+"</b><br /><br />"+desc+"<br /><br /><span style=\"font-size:60%\"><a href=\"gmap.php?lat="+point.lat()+"&lng="+point.lng()+"&zoom=16\">Send</a> | <a href=\"gmap.php?lat="+point.lat()+"&lng="+point.lng()+"&zoom=16&embed=1\">Embed</a> | <a href=\"javascript:cpLayer("+point.lat()+","+point.lng()+")\">Nearest Carparks</a></span>");
// remove nearest car park links as they are not functional - van.tran@uwa.edu.au
//                    marker.openInfoWindowHtml("<b>"+label+"</b><br /><br />"+desc+"<br /><br /><span><a href='?id="+id+"'>Link to this location</a> | <a onclick='cpLayer("+point.lat()+","+point.lng()+")'>Nearest Carparks</a></span>");
                    marker.openInfoWindowHtml("<b>"+label+"</b><br /><br />"+desc+"<br /><br /><span><a href='?id="+id+"'>Link to this location</a></span>");
                });
            }

	    }
	    return marker;
    }

    function clearmarkers() 
    {
        for(i=0;i<gmarkers.length;i++) {
            map.removeOverlay(gmarkers[i]);
        }
        gmarkers = [];
        for(i=0;i<pmarkers.length;i++) {
            map.removeOverlay(pmarkers[i]);
        }
        pmarkers = [];
        for(i=0;i<tmarkers.length;i++) {
            map.removeOverlay(tmarkers[i]);
        }
        tmarkers = [];
    }

    function buildIndex() 
    {
        var request = GXmlHttp.create();
        var resulttxt = "";
        //request.open("GET", "index.xml", true);
        request.open("GET", "/templates/gmap_new/mapindex.php", true);
        request.onreadystatechange = function() {
            indexstr = "<ul class='nobullet'>";
            if (request.readyState == 4) {
                var xmlDoc = GXml.parse(request.responseText);
                var cats = xmlDoc.documentElement.getElementsByTagName("category");
                for (var i = 0; i < cats.length; i++) {
                    indexstr+="<li><a onclick='populateIndex(\""+cats[i].getAttribute("name")+"\");'>"+cats[i].getAttribute("name")+"</a> <div id='"+cats[i].getAttribute("name")+"' style='display:none' ></div></li>";
                }
            }
            indexstr+="</ul>";
            blah = document.getElementById("index_contents");
            blah.innerHTML = indexstr;
        };
        request.send(null);
    }

    
    function movecenter() {
        //map.setCenter(new GLatLng(parseFloat(document.form.lat.value), parseFloat(document.form.lng.value)), 16);
        var newcord = new GLatLng(parseFloat(document.mapform.lat.value), parseFloat(document.mapform.lng.value));
        map.panTo(newcord);
    }


    function getcenter() {
        c = map.getCenter();
        document.mapform.lat.value = c.lat();
        document.mapform.lng.value = c.lng();
    }

    function movelng(dir) {
        //+1 right, -1 left
        c = map.getCenter();
        cd = new GLatLng(c.lat(),c.lng()+(dir * lngOffset));
        map.panTo(cd);
    }

    function movelat(dir) {
        //+1 up, -1 down
        c = map.getCenter();
        cd = new GLatLng(c.lat()+(dir * latOffset),c.lng());
        map.panTo(cd);
    }




    function clearpmarkers() {
        for(i=0;i<pmarkers.length;i++) {
            map.removeOverlay(pmarkers[i]);
        }
        pmarkers = [];
    }

    function cleartmarkers() {
        for(i=0;i<tmarkers.length;i++) {
            map.removeOverlay(tmarkers[i]);
        }
        tmarkers = [];

    }

    function tourClick(i) {
        GEvent.trigger(tmarkers[i], "click");
    }

    function myclick(i) {
        GEvent.trigger(gmarkers[i], "click");
    }

    //end custom above
    //map stuff here

    function CTransparencyControl( overlay ) {
        this.overlay = overlay;
        this.opacity = overlay.getTileLayer().getOpacity();
    }
    CTransparencyControl.prototype = new GControl();

    CTransparencyControl.prototype.setSlider = function(pos) {
        var left = Math.round((CTransparencyLENGTH*pos));
        this.slide.left = left;
        this.knob.style.left = left+"px";
        this.knob.style.top = "0px";
    }

    CTransparencyControl.prototype.setOpacity = function() {
        // set the global variable
        opacity = this.slide.left/CTransparencyLENGTH;
        this.map.clearOverlays();
        this.map.addOverlay(this.overlay, { zPriority: 0 });
        if (this.map.getCurrentMapType() == G_HYBRID_MAP) {
            this.map.addOverlay(uwaOverlay);
        }
    }

    CTransparencyControl.prototype.initialize = function(map) 
    {
        var that=this;
        this.map = map;

        // Is this MSIE, if so we need to use AlphaImageLoader
        var agent = navigator.userAgent.toLowerCase();
        if ((agent.indexOf("msie") > -1) && (agent.indexOf("opera") < 1)){this.ie = true} else {this.ie = false}

        // create the background graphic as a <div> containing an image
        var container = document.createElement("div");
        container.style.width="70px";
        container.style.height="21px";

        // Handle transparent PNG files in MSIE
        if (this.ie) {
          var loader = "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='', sizingMethod='crop');";
          container.innerHTML = '<div style="height:21px; width:70px; ' +loader+ '" ></div>';
        } else {
          container.innerHTML = '<div style="height:21px; width:70px; background-image: url(/templates/gmap_new/images/icons/opacity-slider.png)" ></div>';
        }

        // create the knob as a GDraggableObject
        // Handle transparent PNG files in MSIE
        if (this.ie) {
          var loader = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/templates/gmap_new/images/icons/opacity-slider.png', sizingMethod='crop');";
          this.knob = document.createElement("div"); 
          this.knob.style.height="21px";
          this.knob.style.width="13px";
          this.knob.style.overflow="hidden";
          this.knob_img = document.createElement("div"); 
          this.knob_img.style.height="21px";
          this.knob_img.style.width="83px";
          this.knob_img.style.filter=loader;
          this.knob_img.style.position="relative";
          this.knob_img.style.left="-70px";
          this.knob.appendChild(this.knob_img);
        } else {
          this.knob = document.createElement("div"); 
          this.knob.style.height="21px";
          this.knob.style.width="13px";
          this.knob.style.backgroundImage="url(/templates/gmap_new/images/icons/opacity-slider.png)";
          this.knob.style.backgroundPosition="-70px 0px";
        }
        container.appendChild(this.knob);
        this.slide=new GDraggableObject(this.knob, {container:container});
        this.slide.setDraggableCursor('pointer');
        this.slide.setDraggingCursor('pointer');
        this.container = container;

        // attach the control to the map
        map.getContainer().appendChild(container);

        // init slider
        this.setSlider(this.opacity);

        // Listen for the slider being moved and set the opacity
        GEvent.addListener(this.slide, "dragend", function() {that.setOpacity()});
        //GEvent.addListener(this.container, "click", function( x, y ) { alert(x, y) });

        return container;
      }

      // Set the default position for the control
      CTransparencyControl.prototype.getDefaultPosition = function() {
        return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 47));
      }

    /*
     * Full-screen Window Resize
     */

    function getWindowHeight() {
        if (self.innerHeight) return self.innerHeight;
        if (document.documentElement && document.documentElement.clientHeight)
            return document.documentElement.clientHeight;
        if (document.body) return document.body.clientHeight;
        return 0;
    }

    function getWindowWidth() {
        if (self.innerWidth) return self.innerWidth;
        if (document.documentElement && document.documentElement.clientWidth)
            return document.documentElement.clientWidth;
        if (document.body) return document.body.clientWidth;
        return 0;
    }

    function resize() {  
        var map = document.getElementById("map");  
        var header = document.getElementById("header");  
        var subheader = document.getElementById("subheader");  
        map.style.height = (getWindowHeight()-80) + "px";
        map.style.width = (getWindowWidth()-20) + "px";
        header.style.width = (getWindowWidth()-20) + "px";
        subheader.style.width = (getWindowWidth()-20) + "px";
        // map.checkResize();
    } 


    /*
     * Main load function:
     */

    function ExtrasControl()
    {
    }

    /*
     * Function to retrieve existing id in url for link to location
    */

    function get_request( 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];
    }

    function load() {

       if (GBrowserIsCompatible()) {

          // Bug in the Google Maps: Copyright for Overlay is not correctly displayed
          var gcr = GMapType.prototype.getCopyrights;
          GMapType.prototype.getCopyrights = function(bounds,zoom) {
              return ["&copy;"].concat(gcr.call(this,bounds,zoom));
          }

          map = new GMap2( document.getElementById("map"), { backgroundColor: '#fff' } );

          map.addMapType(G_PHYSICAL_MAP);
          map.setMapType(G_PHYSICAL_MAP);

          map.setCenter( mapBounds.getCenter(), map.getBoundsZoomLevel( mapBounds )+1);

          uwaOverlay = new GTileLayerOverlay( G_HYBRID_MAP.getTileLayers()[1] );
          GEvent.addListener(map, "maptypechanged", function() {
            if (map.getCurrentMapType() == G_HYBRID_MAP) {
                map.addOverlay(uwaOverlay);
            } else {
               map.removeOverlay(uwaOverlay);
            }
          } );

          var copyright = new GCopyright(1,new GLatLngBounds(new GLatLng(-41.977921000069, 105.81868648529), new GLatLng(-21.977921000069, 125.81868648529)), 0, "University of Western Australia");
          var copyrightCollection = new GCopyrightCollection();
          copyrightCollection.addCopyright(copyright);


          //var tilelayer = new GTileLayer(GCopyrightCollection(''), mapMinZoom, mapMaxZoom);
          var tilelayer = new GTileLayer(copyrightCollection, mapMinZoom, mapMaxZoom);
          var mercator = new GMercatorProjection(mapMaxZoom+1);
          tilelayer.getTileUrl = function(tile,zoom) {
              if ((zoom < mapMinZoom) || (zoom > mapMaxZoom)) {
                  return "http://www.google.com/mapfiles/transparent.png";
              } 
              var ymax = 1 << zoom;
              var y = ymax - tile.y -1;
              var tileBounds = new GLatLngBounds(
                  mercator.fromPixelToLatLng( new GPoint( (tile.x)*256, (tile.y+1)*256 ) , zoom ),
                  mercator.fromPixelToLatLng( new GPoint( (tile.x+1)*256, (tile.y)*256 ) , zoom )
              );
              if (mapBounds.intersects(tileBounds)) {
                  return zoom+"/"+tile.x+"/"+y+".png";
              } else {
                  return "http://www.google.com/mapfiles/transparent.png";
              }
          }


          var iconlayer = new GTileLayer(copyrightCollection, mapMinZoom, mapMaxZoom);
          iconlayer.getTileUrl = function(tile,zoom) {
          if ((zoom < mapMinZoom) || (zoom > mapMaxZoom)) {
                  return "http://www.google.com/mapfiles/transparent.png";
              } 
              var ymax = 1 << zoom;
              var y = ymax - tile.y -1;
              var tileBounds = new GLatLngBounds(
                  mercator.fromPixelToLatLng( new GPoint( (tile.x)*256, (tile.y+1)*256 ) , zoom ),
                  mercator.fromPixelToLatLng( new GPoint( (tile.x+1)*256, (tile.y)*256 ) , zoom )
              );
              if (mapBounds.intersects(tileBounds)) {
                  return zoom+"/"+tile.x+"/"+y+"_ic.png";
              } else {
                  return "http://www.google.com/mapfiles/transparent.png";
              }
          }

          ExtrasControl.prototype = new GControl();
          ExtrasControl.prototype.initialize = function(map) {
	       var container = document.createElement("div");
              var extraDiv = document.createElement("div");
                this.setButtonStyle_(extraDiv);
                container.appendChild(extraDiv);
                extraDiv.appendChild(document.createTextNode("Access"));
                GEvent.addDomListener(extraDiv, "click", function() {
                    if(this.style.fontWeight != "bold") {
                        this.style.fontWeight = "bold";
                        map.removeOverlay(overlay2);
                        map.addOverlay(overlay2);
                    }
                    else {
                        this.style.fontWeight = "";
                        map.removeOverlay(overlay2);
                    }
                });
            map.getContainer().appendChild(container);
			return container;
          };

ExtrasControl.prototype.getDefaultPosition = function() {
			return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(8, 50));
		};


        ExtrasControl.prototype.setButtonStyle_ = function(button) {
			button.style.textDecoration = "none";
			button.style.color = "#000000";
			button.style.backgroundColor = "white";
			button.style.font = "small Arial";
			button.style.border = "solid";
			button.style.borderColor = "black";
			button.style.borderWidth = "1px";
			button.style.padding = "1px";
			button.style.marginBottom = "1px";
			button.style.textAlign = "center";
			button.style.cursor = "pointer";
			button.style.width = "5em";
		};



          // IE 7-: support for PNG alpha channel
          // Unfortunately, the opacity for whole overlay is then not changeable, either or...
          tilelayer.isPng = function() { return true;};
          tilelayer.getOpacity = function() { return opacity; }

          iconlayer.isPng = function() { return true;};
          iconlayer.getOpacity = function() { return opacity; }

          overlay = new GTileLayerOverlay( tilelayer );
          map.addOverlay(overlay);

          overlay2 = new GTileLayerOverlay( iconlayer );


          map.addControl(new GLargeMapControl3D());
          map.addControl(new GHierarchicalMapTypeControl());
          map.addControl(new CTransparencyControl( overlay ));
          map.addControl(new GScaleControl());
          map.addControl(new ExtrasControl());


          map.addControl(new GMapTypeControl());
          map.addControl(new GOverviewMapControl());



          map.enableContinuousZoom();
          map.enableScrollWheelZoom();

          map.setMapType(G_HYBRID_MAP);
       }
       //resize();

       buildIndex();

       // if id is in the url and is numeric, do a search on load - van.tran@uwa.edu.au
       map_id = get_request('id');
       if(map_id!=''&&!isNaN(map_id))
          doSearch("/templates/gmap_new/mapsearch.php?id="+map_id, "id");

    }

    //onresize=function(){ resize(); };

function showTours() {
  var request = GXmlHttp.create();
  var resulttxt = "";
  //request.open("GET", "/daltrey/tours.xml", true);
  request.open("GET", "/templates/gmap_new/mapsearch.php?mode=tours", true);
  request.onreadystatechange = function() {
	if (request.readyState == 4) {
	  clearmarkers();
	  var xmlDoc = GXml.parse(request.responseText);
	  // obtain the array of markers and loop through it
	  var markers = xmlDoc.documentElement.getElementsByTagName("marker");
	  for (var i = 0; i < markers.length; i++) {
		// obtain the attribues of each marker
		var id = markers[i].getAttribute("id");
		var lat = parseFloat(markers[i].getAttribute("lat")) + latOffset;
		var lng = parseFloat(markers[i].getAttribute("lng")) + lngOffset;
		var point = new GLatLng(lat,lng);
		var url = markers[i].getAttribute("picture");
		var name = markers[i].getAttribute("name");
		tmarkers[i] = createMarker(point, name, url, "tour",0,id);
		//map.addOverlay(marker);
		map.addOverlay(tmarkers[i]);
		//mm.addMarker(marker,0,17); 
	  }
	}
  };
  request.send(null);
  //mm.refresh();

}

function doSearch(address, type, zoom) {
	var request = GXmlHttp.create();
	var resulttxt = "";
	//request.open("GET", "test.xml", true);
	request.open("GET", address, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			clearmarkers();
			if(request.responseText == "<markers>\n</markers>\n") {
				resulttxt = "No Results Found";
			}
			else {
				var xmlDoc = GXml.parse(request.responseText);
				// obtain the array of markers and loop through it
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				resulttxt = "<ul class='nobullet'>";

				for (var i = 0; i < markers.length; i++) {
					// obtain the attribues of each marker
					var id = markers[i].getAttribute("id");
					var lat = parseFloat(markers[i].getAttribute("lat")) + latOffset;
					var lng = parseFloat(markers[i].getAttribute("lng")) + lngOffset;
					var point = new GLatLng(lat,lng);
					var html = markers[i].getAttribute("html");
					var label = markers[i].getAttribute("name");
					var desc = markers[i].getAttribute("description");
					var image = markers[i].getAttribute("picture");
					if(image !== "") {
						desc = "<img src='"+image+"' alt='"+label+"' /><br />\n"+desc;
					}
					// create the marker
					//var marker = createMarker(point,label);
					//gmarkers[markers.length] = marker;
					gmarkers[i] = createMarker(point, label, desc,"",0, id);
					//map.addOverlay(marker);
					map.addOverlay(gmarkers[i]);
					//mm.addMarker(marker,0,17); 
					resulttxt += '<li><a onclick="myclick(' + i + ')">' + label + '</a></li>';
				}
			}
			resulttxt += "</ul>";
			blah = document.getElementById("searchresults");
			blah.innerHTML = resulttxt;
			if(type == "id") {
				myclick(0);
				if (zoom !== "") {
					map.setZoom(zoom);
				}
			}
		}
	};
	request.send(null);
	//mm.refresh();
}

function searchId(id, zoom) {
	doSearch("/templates/gmap_new/mapsearch.php?id="+id, "id", zoom);
}

function searchMap() {
	doSearch("/templates/gmap_new/mapsearch.php?search="+document.mapform.search.value, "map", "");
}


function populateIndex(category) {
	indexdiv = document.getElementById(category);
	if(indexdiv.innerHTML === "") {
		var request = GXmlHttp.create();
		var resulttxt = "";
		//request.open("GET", "test.xml", true);
		request.open("GET", "/templates/gmap_new/mapindex.php?category="+category, true);
		request.onreadystatechange = function() {
			indexstr = "<ul class='nobullet'>";
			if (request.readyState == 4) {
				var xmlDoc = GXml.parse(request.responseText);
				var loc = xmlDoc.documentElement.getElementsByTagName("location");
				for (var i = 0; i < loc.length; i++) {
					var id = loc[i].getAttribute("id");
					var lat = parseFloat(loc[i].getAttribute("lat")) + latOffset;
					var lng = parseFloat(loc[i].getAttribute("lng")) + lngOffset;
					var point = new GLatLng(lat,lng);
					var html = loc[i].getAttribute("html");
					var label = loc[i].getAttribute("name");
					var desc = loc[i].getAttribute("description");
					var image = loc[i].getAttribute("picture");
					if(image !== "") {
						desc = "<img src='"+image+"' alt='"+label+"' /><br />\n"+desc;
					}
					if(loc[i].getAttribute("category") == "Virtual Tours") {
						indexstr+="<li><a onclick=\"createTourMarker("+lat+","+lng+",'"+label+"','"+loc[i].getAttribute("picture")+"', "+id+");\">"+loc[i].getAttribute("name")+"</li>\n";
					}
					else {
						indexstr+="<li><a onclick=\"createIndexMarker("+lat+","+lng+",'"+label+"','"+desc+"',"+id+");\">"+loc[i].getAttribute("name")+"</li>\n";
					}
				}
			}
			indexstr+= "</ul>";
			indexdiv.innerHTML = indexstr;
		};
		indexdiv.style.display = "block";
		request.send(null);
	}
	else {
		if(indexdiv.style.display == "block") {
			indexdiv.style.display = "none";
		}
		else {
			indexdiv.style.display = "block";
		}
		
	}
}

function createIndexMarker(lat,lng,label,desc,id) {
	clearmarkers();
	var point = new GLatLng(lat,lng);
	gmarkers[0] = createMarker(point, label, desc,"",0,id);
	map.addOverlay(gmarkers[0]);
	myclick(0);

}

function createTourMarker(lat,lng,name,url,id) {
	clearmarkers();
	var point = new GLatLng(lat,lng);
	tmarkers[0] = createMarker(point, name, url,"tour",0,id);
	map.addOverlay(tmarkers[0]);
	tourClick(0);
}


function cpLayer(lat,lng) {
  var request = GXmlHttp.create();
  var resulttxt = "";
  //request.open("GET", "test.xml", true);
  request.open("GET", "/templates/gmap_new/mapsearch.php?mode=carparks&lat="+lat+"&lng="+lng, true);
  request.onreadystatechange = function() {
	if (request.readyState == 4) {
	  clearpmarkers();
	  var xmlDoc = GXml.parse(request.responseText);
	  // obtain the array of markers and loop through it
	  var markers = xmlDoc.documentElement.getElementsByTagName("marker");
	  
	  for (var i = 0; i < markers.length; i++) {
		// obtain the attribues of each marker
		var id = markers[i].getAttribute("id");
		var lat = parseFloat(markers[i].getAttribute("lat")) + latOffset;
		var lng = parseFloat(markers[i].getAttribute("lng")) + lngOffset;
		var point = new GLatLng(lat,lng);
		var html = markers[i].getAttribute("html");
		var label = markers[i].getAttribute("name");
		var desc = markers[i].getAttribute("description");
		var image = markers[i].getAttribute("picture");
		if(image !== "") {
			desc = "<img src='"+image+"' alt='"+label+"' /><br />\n"+desc;
		}
		// create the marker
		//var marker = createMarker(point,label);
		//gmarkers[markers.length] = marker;
		pmarkers[i] = createMarker(point, label, desc,"cp",0,id);
		//map.addOverlay(marker);
		map.addOverlay(pmarkers[i]);
		//mm.addMarker(marker,0,17); 
	  }
	}
  };
  request.send(null);
  //mm.refresh();

}




//]]>


