var LocOverlays;
var ParkOverlays;
var marker;
var parking;
var map;
var mgr;
$(document).ready(function(){
	if (!GBrowserIsCompatible()) {
		alert('Your browser is not compatible with the Google Maps API');
		return;
	}
	if (!document.getElementById("map")) {
		return;
	}
	var mapBounds = new GLatLngBounds(new GLatLng(34.2352739186, -118.534421751), new GLatLng(34.257466296, -118.522866389));
    var mapMinZoom = 13;
    var mapMaxZoom = 17;
	map = new GMap2(document.getElementById("map"), 
	{mapTypes:[G_HYBRID_MAP]})
	var copyrightCollection = new GCopyrightCollection('Campus');
	copyrightCollection.addCopyright(new GCopyright('CSUN',
	new GLatLngBounds( new GLatLng(34.23513849153678,-118.5350405672787), new GLatLng(34.25747615319455,-118.5222156481575)),
	17,'©2009 California State University Northridge'));
	
	// Create the tile layer overlay and 
	// implement the three abstract methods                 
	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.maptiler.org/img/none.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 "/map/tiles/"+zoom+"/"+tile.x+"/"+y+".png";
        } else {
            return "http://www.maptiler.org/img/none.png";
        }
    }
	tilelayer.isPng = function() { return true;};	
	var custommap = new GMapType([tilelayer], G_SATELLITE_MAP.getProjection(), "Campus", {errorMessage:""});
	map.addMapType(custommap);
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	var overviewmap = new GOverviewMapControl() 
	//map.addControl(overviewmap); 
	//overviewmap.hide(true); 
	//map.enableScrollWheelZoom();
	map.setCenter(new GLatLng(34.2425,-118.52865), 16, custommap);
	    
	LocOverlays = new Array();
	ParkOverlays = new Array();
	ParkingInfoWindowOpen = false;
	MarkerInfoWindowOpen = false;
	$('input.marker').click(function(e) {
		e.preventDefault();
		toggleLoc(this.id);
	});
	$('.centerme').click(function(e) {
		e.preventDefault();
		center();
	});
	$('.clearme').click(function(e) {
		e.preventDefault();
		clear();
	});
	$('.display_point').click(function(e){
		e.preventDefault();
		if (marker != null) {
			map.removeOverlay(marker);
		}
		addJSON(e.target.href, true);
	});
	$('.remove_points').click(function(e){
		e.preventDefault();
		clear();
		center();
	});
	$('.display_parking').click(function(e){
		e.preventDefault();
		if (parking != null) {
			map.removeOverlay(parking);
		}
		addJSON(e.target.href, false);
	});
});

function toggleLoc(id) {
	if (typeof(LocOverlays[id]) != "undefined" && LocOverlays[id] != null) {
		remove(id);
	} else {
		addJSON("points/"+id+".json", LocOverlays[id]);
	}
}

function toggleParking(id) {
	if (typeof(ParkOverlays[id]) != "undefined" && ParkOverlays[id] != null) {
		remove(id);
	} else {
		addJSON("points/"+id+".json", ParkOverlays[id]);
	}
}

function addJSON(url, isMarker) {
	$.getJSON(url,
		function(data){
			var f = new GIcon();
			f.image = data.icon.icon.url;
			f.iconSize = new GSize(32,32);
			f.iconAnchor = new GPoint(16,32);
			f.infoWindowAnchor = new GPoint(22,1);
			f.infoShadowAnchor = new GPoint(13,13);
			markerOptions = { title: data.point.point.name, icon: f };
			point = new GLatLng(data.point.point.lat, data.point.point.long)
			desc = "<span style=\"font-size:16px; font-weight:bold;\">" + data.point.point.name + "</span>";
			if (data.point.point.description != null) {
				desc = desc + "<br />" + data.point.point.description;
			}
			if (isMarker) {
				markerDesc = desc;
				marker = new GMarker(point, markerOptions);
				GEvent.addListener(marker, "click", function(e) {
					if (MarkerInfoWindowOpen) {
						marker.closeInfoWindow()
					} else {
						if (ParkingInfoWindowOpen != null && ParkingInfoWindowOpen) {
							parking.closeInfoWindow()
						}
						marker.openInfoWindowHtml(markerDesc, {maxWidth: 500});
						MarkerInfoWindowOpen = true;	
					}
				});
				GEvent.addListener(marker, "infowindowclose", function() {
					MarkerInfoWindowOpen = false;
				});
				if (ParkingInfoWindowOpen != null && ParkingInfoWindowOpen) {
					parking.closeInfoWindow()
				}
				map.addOverlay(marker);
				marker.openInfoWindowHtml(markerDesc, {maxWidth: 500});
				MarkerInfoWindowOpen = true;
			} else {
				parkingDesc = desc;
				parking = new GMarker(point, markerOptions);
				GEvent.addListener(parking, "click", function(e) {
					if (ParkingInfoWindowOpen) {
						parking.closeInfoWindow()
					} else {
						if (MarkerInfoWindowOpen != null && MarkerInfoWindowOpen) {
							marker.closeInfoWindow()
						}
						parking.openInfoWindowHtml(parkingDesc, {maxWidth: 500});
						ParkingInfoWindowOpen = true;	
					}
				});
				GEvent.addListener(parking, "infowindowclose", function() {
					ParkingInfoWindowOpen = false;
				});
				if (MarkerInfoWindowOpen == null || MarkerInfoWindowOpen) {
					marker.closeInfoWindow()
				}
				map.addOverlay(parking);
				parking.openInfoWindowHtml(parkingDesc, {maxWidth: 500});
				
				ParkingInfoWindowOpen = true;
			}
			map.panTo(point);
							
	});
}

function add(point) {
	var f = new GIcon();
	f.image = point.icon_url;
	f.iconSize = new GSize(32,32);
	f.iconAnchor = new GPoint(16,32);
	f.infoWindowAnchor = new GPoint(22,1);
	f.infoShadowAnchor = new GPoint(13,13);
	markerOptions = { title: point.name, icon: f };
	loc = new GLatLng(point.lat, point.long)	
	marker = new GMarker(loc, markerOptions);
	markerDesc = "<span style=\"font-size:16px; font-weight:bold;\">" + point.name + "</span>";
	if (point.description != null) {
		markerDesc = markerDesc + "<br />" + point.description;
	}
	GEvent.addListener(marker, "click", function(e) {
		if (MarkerInfoWindowOpen) {
			marker.closeInfoWindow()
		} else {
			if (ParkingInfoWindowOpen != null && ParkingInfoWindowOpen) {
				parking.closeInfoWindow()
			}
			marker.openInfoWindowHtml(markerDesc, {maxWidth: 500});
			MarkerInfoWindowOpen = true;	
		}
	});
	GEvent.addListener(marker, "infowindowclose", function() {
		MarkerInfoWindowOpen = false;
	});
	map.addOverlay(marker);
	map.panTo(loc);
	marker.openInfoWindowHtml(markerDesc, {maxWidth: 200});
	MarkerInfoWindowOpen = true;			
}

function makePointObj(name, lat, long, description, icon_url) {
	p = new Object;
	p.name = name;
	p.lat = lat;
	p.long = long;
	p.description = description;
	p.icon_url = icon_url;
	return p;
}

function remove(id) {
	map.removeOverlay(LocOverlays[id]);
	LocOverlays[id] = null;
}

function center() {
	map.panTo(new GLatLng(34.2425,-118.52865), 16);
}

function clear() {
	map.clearOverlays();
}