function CustomMap(containerId) {
    this.containerId = (containerId ? containerId : "map");
    this.allMarkers = {"atm": [], "computerLab": [], "emergency": [], 
			   		   "libraries": [], "loadingDock": [], "none": [], 
			   		   "parking": [], "path": [], "restaurants": [],
			   		   "buildingCodes": [], "buildingNames": [], "lightedPath": [],
			   		   "wheelchairAccess": [], "entrances": [], "accessibleParking": [],
			   		   "parkingLot": [], "payDisplayParking": [], "meterParking": [], 
			   		   "shuttleBus": [], "overpass": [], "taxi": [], "perezGarage": [],
			   		   "solowayGarage": [], "desmaraisGarage": [], "mannGarage": [],
			   		   "brooksGarage": [], "protectionServices": [], "octranspo": []};
    this.types = ["atm","computerLab","emergency","loadingDock","none","parking","path","restaurants","buildingCodes",
                  "buildingNames","lightedPath","wheelchairAccess","entrances","accessibleParking","parkingLot",
                  "payDisplayParking","meterParking","shuttleBus","overpass","libraries","taxi","perezGarage",
                  "solowayGarage","desmaraisGarage","mannGarage","brooksGarage","protectionServices","octranspo"];
    this.tileLayers = {"main": [], "lees": [], "altaVista": [], "mba": []};
    this.allPaths = new Array();
    this.shortestPolyArray = new Array();
    this.insidePolyArray = new Array();
}

//Global variables
CustomMap.ICON20 = new GIcon();
//CustomMap.ICON20.shadow = "images/SHADOWS/24.png";
CustomMap.ICON20.iconSize = new GSize(0,0);
//CustomMap.ICON20.shadowSize = new GSize(20,20);
CustomMap.ICON20.iconAnchor = new GPoint(20,20);
CustomMap.ICON20.infoWindowAnchor = new GPoint(20,20);
//CustomMap.ICON20.transparent = "images/transparent.png";
//CustomMap.ICON20.imageMap = [1,1,22,1,22,22,1,22];

CustomMap.prototype.initialize = function() {
	if (!GBrowserIsCompatible()) {
		// display a warning if the browser was not compatible
		alert("Sorry, the Google Maps API is not compatible with this browser");
		return;
	}

	this.gmap = new GMap2(document.getElementById(this.containerId));
	
	// ====== Restricting the range of Zoom Levels =====
    // Get the list of map types      
    var mt = this.gmap.getMapTypes();
    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
      //mt[i].getMinimumResolution = function() {return 7;}
      mt[i].getMaximumResolution = function() {return 18;}
    }
	
	this.gmap.addControl(new GLargeMapControl());
	this.gmap.addControl(new GMapTypeControl());

	// set the centre point
	this.gmap.setCenter(new GLatLng(45.4223, -75.6823), 17, G_NORMAL_MAP);
	
	if(UOM.isIE()){
		var gsizeSelect = new GSize(180,2);
		var gsizeCheckbox = new GSize(7,30);
	} else {
		var gsizeSelect = new GSize(170,2);
		var gsizeCheckbox = new GSize(7,30);
	}
	
	var gsizeSelect = new GSize(this.gmap.getSize().width/4,2);
	
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, gsizeSelect);
    pos.apply(e("uo_campus"));
    this.gmap.getContainer().appendChild(e("uo_campus"));
    
    var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, gsizeCheckbox);
	pos.apply(e("uo_open_full_screen"));
	this.gmap.getContainer().appendChild(e("uo_open_full_screen"));
	
	var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, gsizeCheckbox);
	pos.apply(e("uo_close_full_screen"));
	this.gmap.getContainer().appendChild(e("uo_close_full_screen"));
    
    this.gmap.enableScrollWheelZoom();
    
    GEvent.addListener(this.gmap,"zoomend", this.toggleBuildings);
    
    this.showPaths();

    this.showBuildingMarkers('');
    
    var points = new Array();
    if (UOM._campus != "") {
    	var points = new Array();
    	if (UOM._buildingId != "") {
	    	for (var i = 0; i < BUILDINGS.length; i++) {
	        	if (BUILDINGS[i].id == UOM._buildingId) {
	        		if (UOM._priority == "building" || UOM._poiId == "") {
	        			this.openBuildingInfoWindow(i,"buildingCodes");
	            	}
	        		points.push(new GLatLng(BUILDINGS[i].lat,BUILDINGS[i].lng));
	        	}
	        }
    	}
    	if (UOM._poiId != "") {
	    	var marker;
	    	switch(UOM._poiCategory) {
	    	case "access":
	    		this.access = new UOACCESS();
	            marker = this.access.plotAccess(this.gmap, UOM._poiId, UOM._poiType, this.allMarkers, false);
	            break;
	    	case "parking":
	    		this.parking = new UOPARKING();
	            marker = this.parking.plotParking(this.gmap, UOM._poiId, UOM._poiType, this.allMarkers, false);
	            break;
	    	case "library":
	    		this.libraries = new UOLIBRARIES();
	    		marker = this.libraries.plotLibrary(this.gmap, UOM._poiId, UOM._poiId, this.allMarkers, false);
	    		break;
	    	case "restaurant":
	    		this.restaurants = new UORESTAURANTS();
	    		marker = this.restaurants.plotRestaurant(this.gmap, UOM._poiId, RESTAURANTS[UOM._poiId].code, this.allMarkers, false);
	    		break;
	    	case "atm":
	    		this.atm = new UOATM();
	            marker = this.atm.plotATM(this.gmap, UOM._poiId, ATM[UOM._poiId].id, this.allMarkers, false);
	    		break;
	    	}
	    	points.push(marker.getPoint());
        	this.gmap.addOverlay(marker);
	    	if (UOM._priority == "poi" || UOM._buildingId == "") {
	    		GEvent.trigger(marker,"click");
	    	}
    	}
    	if (points.length > 0) {
    		var boundingBox = new GLatLngBounds();
    		for (var i = 0; i < points.length; i++) {
    			boundingBox.extend(points[i]);
    		}
    		var boundingBoxCenter = boundingBox.getCenter();
    		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
    		if ((UOM._priority == "") || (points.length == 1)) {
    			this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
    		} else {
    			this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom-1);
    		}
    	}
    	if (UOM._buildingId != "") {
    		this.hideBuildingMarkers(UOM._buildingId,"");
    	}
    }
}

CustomMap.prototype.toggleBuildings = function (oldLevel, newLevel) {
	if (newLevel < 16) {
		UOM._map.hideBuildingMarkers("","");
	} else {
		UOM._map.showBuildingMarkers(e("radioValue").value);
	}
}

CustomMap.fixTiles = function() {
	var pane = MAP.gmap.getPane(1);
	var tiles = pane.getElementsByTagName("img");
	for (var loop=0; tiles[loop]; loop++) {
		tiles[loop].style.display="";
	}
}

CustomMap.prototype.createTileOverlay = function(campus){
	// ============================================================
	// ====== Create a copyright entry =====
	var copyright = new GCopyright(1,
			new GLatLngBounds(new GLatLng(45.4,-75.7),new GLatLng(45.5,-75.6) ),
			14, "Development");

	// ============================================================
	// ====== Create a copyright collection =====
	// ====== and add the copyright to it   =====
	var copyrightCollection = new GCopyrightCollection('Layouts (c) 2008');
	copyrightCollection.addCopyright(copyright);     

	// ============================================================
	// == Write our own getTileUrl functions ========
	var customGetTileUrl=function(pt,zm){
		if (zm < 12) return "http://maps.google.com/intl/en_ALL/mapfiles/transparent.png";
		// convert the point to latlng and determine if we have this tiles

		// Define our tile boundaries--should do this outside of this function
		//	or store it once calculated for future use
		// Note: origin in google maps is top-left
		if (campus.toString() == "mba") {
			var topLeft = new GLatLng(45.421739,-75.699180);
			var bottomRight = new GLatLng(45.420918,-75.695736);
		} else if (campus.toString() == "lees") {
			var topLeft = new GLatLng(45.416573,-75.669966);
			var bottomRight = new GLatLng(45.414871,-75.665331);
		} else if (campus.toString() == "altaVista") {
			var topLeft = new GLatLng(45.404476, -75.654516);
			var bottomRight = new GLatLng(45.398571, -75.637608);
		} else { //Default to main
			var topLeft = new GLatLng(45.426573,-75.689707);
			var bottomRight = new GLatLng(45.4188,-75.67);
		}
		
		// convert our lat/long values to world pixel coordinates
		var currentProjection = G_NORMAL_MAP.getProjection();
		var minPixelPt = currentProjection.fromLatLngToPixel(topLeft, zm);
		var maxPixelPt = currentProjection.fromLatLngToPixel(bottomRight, zm);

		// convert our world pixel coordinates to tile coordinates

		var minTileCoord = new GPoint();
		minTileCoord.x = Math.floor(minPixelPt.x / 256);
		minTileCoord.y = Math.floor(minPixelPt.y / 256);

		var maxTileCoord = new GPoint();
		maxTileCoord.x = Math.floor(maxPixelPt.x / 256);
		maxTileCoord.y = Math.floor(maxPixelPt.y / 256);

		// filter out any tile requests outside of our bounds
		if (pt.x < minTileCoord.x ||
				pt.x > maxTileCoord.x ||
				pt.y < minTileCoord.y ||
				pt.y > maxTileCoord.y)
		{
			return 'http://maps.google.com/intl/en_ALL/mapfiles/transparent.png';
		}

		// use this formula for tiles cut with Map Cruncher
		if (campus.toString() == "mba") {
			var tileurl = "tiles/mba/"+CustomMap.TileToQuadKey(pt.x,pt.y,zm) + ".png";
		} else if (campus.toString() == "lees") {
			var tileurl = "tiles/lees/"+CustomMap.TileToQuadKey(pt.x,pt.y,zm) + ".png";
		} else if (campus.toString() == "altaVista") {
			var tileurl = "tiles/altaVista/"+CustomMap.TileToQuadKey(pt.x,pt.y,zm) + ".png";
		} else { //Default to main
			var tileurl = "tiles/"+CustomMap.TileToQuadKey(pt.x,pt.y,zm) + ".png";
		}
		
		//GLog.write ("Requesting tile " + tileurl);
		return tileurl;
	}
	// ============================================================
	// ===== Create the GTileLayer =====
	// ===== and apply the CustomGetTileUrl to it
	var layer = new GTileLayer(copyrightCollection,14,18);
	layer.getTileUrl = customGetTileUrl;
	layer.isPng = function() {return true;};
	layer.getOpacity = function() {return 1.0;};
	// ============================================================
	// ===== Return the GTileLayerOverlay =====
	var overlay = new GTileLayerOverlay(layer);
	this.tileLayers[campus].push(overlay);
	this.gmap.addOverlay(overlay);

	// This Javascript is based on code provided by the
	// Blackpool Community Church Javascript Team
	// http://www.commchurch.freeserve.co.uk/   
	// http://econym.googlepages.com/index.htm
	// --------------------------------------------------------------------------------------
}

//the following function taken from Bill Chadwick at http://www.bdcc.co.uk/GoogleCrunch/Crunch.htm
CustomMap.TileToQuadKey = function(x, y, zoom){
	var quad = "";
	for (var i = zoom; i > 0; i--){
		var mask = 1 << (i - 1);
		var cell = 0;
		if ((x & mask) != 0)
			cell++;
		if ((y & mask) != 0)
			cell += 2;
		quad += cell;
		quad=zoom+"_"+(x)+"_"+y;
	}
	return quad;
}

CustomMap.prototype.toggleEntrances = function(type){
	if (this.allMarkers[type].length == 0) {
		this.entrances = new UOENTRANCES();
		this.entrances.plotEntrances(this.gmap, this.allMarkers, type);
	} else {
		for (var i = 0; i < this.allMarkers[type].length; i++) {
			var array = this.allMarkers[type][i];
			if (ENTRANCES[array[0]].campus == getCampus()) {
				var marker = array[1];
				if (marker.isHidden()) {
					marker.show();
				} else {
					marker.hide();
				}	
			}
		}
	}
}

CustomMap.prototype.toggleRestaurants = function(code) {
	this.gmap.closeInfoWindow();
	var sameRestaurants = new Array();
	if (this.allMarkers["restaurants"].length == 0) {
		this.restaurants = new UORESTAURANTS();
		for (var i = 0; i < RESTAURANTS.length; i++) {
			var marker = this.restaurants.plotRestaurant(this.gmap, i, code, false);
			this.gmap.addOverlay(marker);
			this.allMarkers["restaurants"].push([i,marker]);
			if (RESTAURANTS[i].code == code) {
				if (!RESTAURANTS[i].multiple) {
					this.openRestaurantInfoWindow(i,marker);
				} else {
					sameRestaurants.push(RESTAURANTS[i]);
				}
			}
		}
	} else {
		for (var i = 0; i < this.allMarkers["restaurants"].length; i++) {
			if (RESTAURANTS[i].code == code) {
				var array = this.allMarkers["restaurants"][i];
				var marker = array[1];
				if (marker.isHidden()) {
					marker.show();
					if (!RESTAURANTS[i].multiple) {
						this.openRestaurantInfoWindow(i,marker);
					} else {
						sameRestaurants.push(RESTAURANTS[i]);
					}
				} else {
					marker.hide();
				}
			}
		}
	}
	if (sameRestaurants.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < sameRestaurants.length; i++) {
			boundingBox.extend(new GLatLng(sameRestaurants[i].lat, sameRestaurants[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.toggleLibraries = function(index) {
	if (this.allMarkers["libraries"].length == 0) {
		this.libraries = new UOLIBRARIES();
		for (var i = 0; i < LIBRARIES.length; i++) {
			var marker = this.libraries.plotLibrary(this.gmap, i, index, false);
			this.gmap.addOverlay(marker);
			if (i == index) {
				this.openLibraryInfoWindow(i,marker);
			}
			this.allMarkers["libraries"].push([i,marker]);
		}
	} else {
		var isLibrariesSelected = e("allLibrariesDiv").className.indexOf("bold") != -1;
		var isComputersSelected = e("allComputersDiv").className.indexOf("bold") != -1;
		var array = this.allMarkers["libraries"][index];
		var marker = array[1];
		if (marker.isHidden()) {
			marker.show();
			this.openLibraryInfoWindow(index,marker);
		} else {
			marker.hide();
			if (isLibrariesSelected && LIBRARIES[index].isLibrary) {
				e("allLibrariesDiv").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border";
			} else if (isComputersSelected && LIBRARIES[index].isComputerLab) {
				e("allComputersDiv").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border";
			}
		}
	}
}

CustomMap.prototype.toggleAllLibraries = function() {
	this.gmap.closeInfoWindow();
	var allLibraries = new Array();
	if (this.allMarkers["libraries"].length == 0) {
		this.libraries = new UOLIBRARIES();
		for (var i = 0; i < LIBRARIES.length; i++) {
			var marker = this.libraries.plotLibrary(this.gmap, i, LIBRARIES[i].isLibrary&&LIBRARIES[i].campus==getCampus()?i:-1, false);
			this.gmap.addOverlay(marker);
			if (LIBRARIES[i].isLibrary && LIBRARIES[i].campus==getCampus()) {
				allLibraries.push(LIBRARIES[i]);
				UOM.changeClassName(e(LIBRARIES[i].id+"Div"), "uo_filter_blade_poi_lib uo_buildings_table_bottom_border", "uo_filter_blade_poi_bold");
			}
			this.allMarkers["libraries"].push([i,marker]);
		}
	} else {
		var isSelected = e("allLibrariesDiv").className.indexOf("bold") != -1;
		for (var i = 0; i < this.allMarkers["libraries"].length; i++) {
			if (LIBRARIES[i].isLibrary && LIBRARIES[i].campus == getCampus()) {
				var marker = (this.allMarkers["libraries"][i])[1];
				allLibraries.push(LIBRARIES[i]);
				if (isSelected) {
					marker.hide();
					e(LIBRARIES[i].id+"Div").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border";
				} else {
					marker.show();
					e(LIBRARIES[i].id+"Div").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border uo_filter_blade_poi_bold";
				}
			}
		}
	}
	if (allLibraries.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < allLibraries.length; i++) {
			boundingBox.extend(new GLatLng(allLibraries[i].lat, allLibraries[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.toggleAllComputerLabs = function() {
	this.gmap.closeInfoWindow();
	var allComputers = new Array();
	if (this.allMarkers["libraries"].length == 0) {
		this.libraries = new UOLIBRARIES();
		for (var i = 0; i < LIBRARIES.length; i++) {
			var marker = this.libraries.plotLibrary(this.gmap, i, LIBRARIES[i].isComputerLab&&LIBRARIES[i].campus==getCampus()?i:-1, false);
			this.gmap.addOverlay(marker);
			if (LIBRARIES[i].isComputerLab && LIBRARIES[i].campus==getCampus()) {
				allComputers.push(LIBRARIES[i]);
				UOM.changeClassName(e(LIBRARIES[i].id+"Div"), "uo_filter_blade_poi_lib uo_buildings_table_bottom_border", "uo_filter_blade_poi_bold");
			}
			this.allMarkers["libraries"].push([i,marker]);
		}
	} else {
		var isSelected = e("allComputersDiv").className.indexOf("bold") != -1;
		for (var i = 0; i < this.allMarkers["libraries"].length; i++) {
			if (LIBRARIES[i].isComputerLab && LIBRARIES[i].campus == getCampus()) {
				var marker = (this.allMarkers["libraries"][i])[1];
				allComputers.push(LIBRARIES[i]);
				if (isSelected) {
					marker.hide();
					e(LIBRARIES[i].id+"Div").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border";
				} else {
					marker.show();
					e(LIBRARIES[i].id+"Div").className = "uo_filter_blade_poi_lib uo_buildings_table_bottom_border uo_filter_blade_poi_bold";
				}
			}
		}
	}
	if (allComputers.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < allComputers.length; i++) {
			boundingBox.extend(new GLatLng(allComputers[i].lat, allComputers[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.toggleAtm = function(id) {
	this.gmap.closeInfoWindow();
	var sameAtm = new Array();
	if (this.allMarkers["atm"].length == 0) {
		this.atm = new UOATM();
		for (var i = 0; i < ATM.length; i++) {
			var marker = this.atm.plotATM(this.gmap, i, id, false);
			this.gmap.addOverlay(marker);
			this.allMarkers["atm"].push([i,marker]);
			if (ATM[i].id == id && ATM[i].campus == getCampus()) {
				sameAtm.push(ATM[i]);
			}
		}
	} else {
		var isAllSelected = e("allAtmDiv").className.indexOf("bold") != -1;
		for (var i = 0; i < this.allMarkers["atm"].length; i++) {
			if (ATM[i].id == id && ATM[i].campus == getCampus()) {
				var array = this.allMarkers["atm"][i];
				var marker = array[1];
				if (marker.isHidden()) {
					marker.show();
					sameAtm.push(ATM[i]);
				} else {
					marker.hide();
					if (isAllSelected) {
						e("allAtmDiv").className = "uo_filter_blade_poi uo_buildings_table_bottom_border";
					}
				}
			}
		}
	}
	if (sameAtm.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < sameAtm.length; i++) {
			boundingBox.extend(new GLatLng(sameAtm[i].lat, sameAtm[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.toggleAllAtm = function() {
	this.gmap.closeInfoWindow();
	var allAtm = new Array();
	if (this.allMarkers["atm"].length == 0) {
		this.atm = new UOATM();
		for (var i = 0; i < ATM.length; i++) {
			var marker = this.atm.plotATM(this.gmap, i, ATM[i].id, false);
			this.gmap.addOverlay(marker);
			this.allMarkers["atm"].push([i,marker]);
			if (ATM[i].campus == getCampus()) {
				allAtm.push(ATM[i]);
				e(ATM[i].id+"Div").className = "uo_filter_blade_poi uo_buildings_table_bottom_border uo_filter_blade_poi_bold";
			}
		}
	} else {
		var isSelected = e("allAtmDiv").className.indexOf("bold") != -1;
		for (var i = 0; i < this.allMarkers["atm"].length; i++) {
			if (ATM[i].campus == getCampus()) {
				var marker = (this.allMarkers["atm"][i])[1];
				allAtm.push(ATM[i]);
				if (isSelected) {
					marker.hide();
					e(ATM[i].id+"Div").className = "uo_filter_blade_poi uo_buildings_table_bottom_border";
				} else {
					marker.show();
					e(ATM[i].id+"Div").className = "uo_filter_blade_poi uo_buildings_table_bottom_border uo_filter_blade_poi_bold";
				}
			}
		}
	}
	if (allAtm.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < allAtm.length; i++) {
			boundingBox.extend(new GLatLng(allAtm[i].lat, allAtm[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.toggleParking = function(type){
	var sameParking = new Array();
	if (this.allMarkers[type].length == 0) {
		this.parking = new UOPARKING();
		for(var i=0; i<PARKING[type].length; i++){
			var marker = this.parking.plotParking(this.gmap, i, type, this.allMarkers, false);
			this.gmap.addOverlay(marker);
			if (getCampus()!=PARKING[type][i].campus) {
				marker.hide();
			} else {
				if (PARKING[type][i].hide) {
					marker.hide();
				}
				if (PARKING[type][i].zoom) {
					var boundingBox = new GLatLngBounds();
					var lat = marker.getLatLng().lat() + 0.001;
					var lng = marker.getLatLng().lng();
					var point = new GLatLng(lat, lng);
					boundingBox.extend(point);
					var boundingBoxCenter = boundingBox.getCenter();
					//var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
					this.gmap.setCenter(boundingBoxCenter, 18);
					if (PARKING[type][i].info) {
						this.openParkingInfoWindow(i,marker,type);
					}
					if (PARKING[type][i].html) {
						marker.openInfoWindowHtml(PARKING[type][i].html);
					}
				} else {
					sameParking.push(PARKING[type][i]);
				}
			}
		}
	} else {
		for (var i = 0; i < this.allMarkers[type].length; i++) {
			if (PARKING[type][i].campus == getCampus()) {
				var array = this.allMarkers[type][i];
				var marker = array[1];
				if (marker.isHidden()) {
					if (!PARKING[type][i].hide) {
						marker.show();
					}
					if (PARKING[type][i].zoom) {
						var boundingBox = new GLatLngBounds();
						var lat = marker.getLatLng().lat() + 0.001;
						var lng = marker.getLatLng().lng();
						var point = new GLatLng(lat, lng);
						boundingBox.extend(point);
						var boundingBoxCenter = boundingBox.getCenter();
						//var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
						this.gmap.setCenter(boundingBoxCenter, 18);
						if (PARKING[type][i].info) {
							this.openParkingInfoWindow(i,marker,type);
						}
						if (PARKING[type][i].html) {
							marker.openInfoWindowHtml(PARKING[type][i].html);
						}
					} else {
						sameParking.push(PARKING[type][i]);
					}
				} else {
					marker.hide();
				}
			}
		}
	}
	if (sameParking.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < sameParking.length; i++) {
			boundingBox.extend(new GLatLng(sameParking[i].lat, sameParking[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.showShuttleLees = function(type,direction){
	var wasVisible = false;
	if (this.allMarkers[type].length == 0) {
		this.access = new UOACCESS();
		for(var i=0; i<ACCESS[type].length; i++){
			var marker = this.access.plotAccess(this.gmap, i, type, this.allMarkers, false);
			this.gmap.addOverlay(marker);
			if (getCampus()!=ACCESS[type][i].campus) {
				marker.hide();
			} else {
				if (ACCESS[type][i].direction == direction) {
					var boundingBox = new GLatLngBounds();
					var lat = marker.getLatLng().lat() + 0.001;
					var lng = marker.getLatLng().lng();
					var point = new GLatLng(lat, lng);
					boundingBox.extend(point);
					var boundingBoxCenter = boundingBox.getCenter();
					this.gmap.setCenter(boundingBoxCenter, 18);
					marker.openInfoWindowHtml(ACCESS[type][i].info);
				}
			}
		}
	} else {
		for (var i = 0; i < this.allMarkers[type].length; i++) {
			if (ACCESS[type][i].campus == getCampus()) {
				var array = this.allMarkers[type][i];
				var marker = array[1];
				if (marker.isHidden()) {
					marker.show();
				} else {
					wasVisible = true;
				}
				if (ACCESS[type][i].direction == direction) {
					var boundingBox = new GLatLngBounds();
					var lat = marker.getLatLng().lat() + 0.001;
					var lng = marker.getLatLng().lng();
					var point = new GLatLng(lat, lng);
					boundingBox.extend(point);
					var boundingBoxCenter = boundingBox.getCenter();
					this.gmap.setCenter(boundingBoxCenter, 18);
					marker.openInfoWindowHtml(ACCESS[type][i].info);
				}
			}
		}
	}
	return wasVisible;
}

CustomMap.prototype.toggleAccess = function(type){
	var sameAccess = new Array();
	if (this.allMarkers[type].length == 0) {
		this.access = new UOACCESS();
		for(var i=0; i<ACCESS[type].length; i++){
			var marker = this.access.plotAccess(this.gmap, i, type, this.allMarkers, false);
			this.gmap.addOverlay(marker);
			if (getCampus()!=ACCESS[type][i].campus) {
				marker.hide();
			} else {
				if (ACCESS[type][i].zoom) {
					var boundingBox = new GLatLngBounds();
					var lat = marker.getLatLng().lat() + 0.001;
					var lng = marker.getLatLng().lng();
					var point = new GLatLng(lat, lng);
					boundingBox.extend(point);
					var boundingBoxCenter = boundingBox.getCenter();
					this.gmap.setCenter(boundingBoxCenter, 18);
					if (ACCESS[type][i].info) {
						marker.openInfoWindowHtml(ACCESS[type][i].info);
					}
				} else {
					sameAccess.push(ACCESS[type][i]);
				}
			}
		}
	} else {
		for (var i = 0; i < this.allMarkers[type].length; i++) {
			if (ACCESS[type][i].campus == getCampus()) {
				var array = this.allMarkers[type][i];
				var marker = array[1];
				if (marker.isHidden()) {
					marker.show();
					if (ACCESS[type][i].zoom) {
						var boundingBox = new GLatLngBounds();
						var lat = marker.getLatLng().lat() + 0.001;
						var lng = marker.getLatLng().lng();
						var point = new GLatLng(lat, lng);
						boundingBox.extend(point);
						var boundingBoxCenter = boundingBox.getCenter();
						this.gmap.setCenter(boundingBoxCenter, 18);
						if (ACCESS[type][i].info) {
							marker.openInfoWindowHtml(ACCESS[type][i].info);
						}
					} else {
						sameAccess.push(ACCESS[type][i]);
					}
				} else {
					marker.hide();
				}
			}
		}
	}
	if (sameAccess.length > 0) {
		var boundingBox = new GLatLngBounds();
		for (var i = 0; i < sameAccess.length; i++) {
			boundingBox.extend(new GLatLng(sameAccess[i].lat, sameAccess[i].lng));
		}
		var boundingBoxCenter = boundingBox.getCenter();
		var boundingBoxZoom = this.gmap.getBoundsZoomLevel(boundingBox);
		this.gmap.setCenter(boundingBoxCenter, boundingBoxZoom);
	}
}

CustomMap.prototype.openRestaurantInfoWindow = function(i,marker){
	var bounds = new GLatLngBounds();
	//var marker = this.allMarkers["restaurants"][i];
	var lat = marker.getLatLng().lat() + 0.001;
	var lng = marker.getLatLng().lng();
	var point = new GLatLng(lat, lng);
	//bounds.extend(marker.getPoint());
	bounds.extend(point);
	var height = RESTAURANTS[i].iconHeight + 50;
	var html = "<img src='images/icons/"+RESTAURANTS[i].icon+".jpg' /><br><br><b>Name:</b> "+RESTAURANTS[i].name+"<br><b>Location:</b> "+RESTAURANTS[i].location;
	if (RESTAURANTS[i].phone != "") {
		html = html + "<br><b>Phone:</b> "+RESTAURANTS[i].phone;
		height += 20;
	}
	if (RESTAURANTS[i].ps != "") {
		html = html + "<br><br>"+RESTAURANTS[i].ps;
		height += 20;
	}
	if (UOM.isIE6()) {
		marker.openInfoWindowHtml("<div style='height:"+height+"px;width:300px;'>"+html+"</div>");
	} else {
		marker.openInfoWindowHtml("<div style='height:"+height+"px'>"+html+"</div>");
	}
	this.gmap.setZoom(18);
    this.gmap.setCenter(bounds.getCenter());
}

CustomMap.prototype.openLibraryInfoWindow = function(i,marker){
	var bounds = new GLatLngBounds();
	var lat = marker.getLatLng().lat() + 0.001;
	var lng = marker.getLatLng().lng();
	var point = new GLatLng(lat, lng);
	bounds.extend(point);
	var html = "<div><b>"+LIBRARIES[i].name+"</b><br><br>";
	if (LIBRARIES[i].location != "") {
		html = html + "<b>Location:</b> "+LIBRARIES[i].location;
	}
	if (LIBRARIES[i].address != "") {
		html = html + "<br><b>Address:</b> "+LIBRARIES[i].address;
	}
	if (LIBRARIES[i].link != "") {
		html = html + "<br><a href=\'"+LIBRARIES[i].link+"\' target=\'_blank\'>More Information</a>";
	}
	html = html + "<br><br><br></div>";
	marker.openInfoWindowHtml(html);
	this.gmap.setZoom(18);
    this.gmap.setCenter(bounds.getCenter());
}

CustomMap.prototype.openParkingInfoWindow = function(i,marker,type){
	var html = "<div><b>"+PARKING_DESC_MAP[type]+"</b><br><br>";
	html += "<br><a href=\'"+PARKING[type][i].info+"\' target=\'_blank\'>More Information</a>";
	html += "<br><br><br></div>";
	marker.openInfoWindowHtml(html);
}

CustomMap.prototype.hideAllMarkers = function(hideBuildings) {
	for (var i = 0; i < this.types.length; i++) {
		if (hideBuildings || (this.types[i] != "buildingNames" && this.types[i] != "buildingCodes")) {
			for (var j = 0; j < this.allMarkers[this.types[i]].length; j++) {
				var array = this.allMarkers[this.types[i]][j];
				var marker = array[1];
				if (!marker.isHidden()) {
					marker.hide();
				}
			}
		}
	}
}

CustomMap.prototype.hideBuildingMarkers = function(startBuildingId, endBuildingId) {
	var type = e("radioValue").value == "codes" ? "buildingCodes" : "buildingNames";
	for (var i = 0; i < this.allMarkers[type].length; i++) {
		if (startBuildingId != BUILDINGS[i].id && endBuildingId != BUILDINGS[i].id && UOM._buildingId != BUILDINGS[i].id) {
			var array = this.allMarkers[type][i];
			array[1].hide();
		} else {
			var array = this.allMarkers[type][i];
			array[1].show();
		}
	}
}

CustomMap.prototype.showBuildingMarkers = function(value) {
	var showNames = false;
	if (UOM._buildingId != "") {
		showNames = true;
		e("radioValue").value = "names";
		e("namesRadio").src = "images/radio_checked.png";
		e("codesRadio").src = "images/radio_unchecked.png";
	}
	if (this.allMarkers["buildingCodes"].length == 0) {
		this.buildings = new UOBUILDINGS();
		for(var i=0; i<BUILDINGS.length; i++){
			var marker = this.buildings.plotBuilding(this.gmap, i, false, true, false);
			this.gmap.addOverlay(marker);
			if (showNames || (BUILDINGS[i].campus != getCampus())) {
				marker.hide();
			}
			this.allMarkers["buildingCodes"].push([i,marker]);
			marker = this.buildings.plotBuilding(this.gmap, i, true, true, false);
			this.gmap.addOverlay(marker);
			if (!showNames || (BUILDINGS[i].campus != getCampus())) {
				marker.hide();
			}
			this.allMarkers["buildingNames"].push([i,marker]);
		}
	} else {
		var type = value == "codes" ? "buildingCodes" : "buildingNames";
		for (var i = 0; i < this.allMarkers[type].length; i++) {
			var array = this.allMarkers[type][i];
			if (BUILDINGS[array[0]].campus == getCampus()) {
				array[1].show();
			}
		}
	}
}

CustomMap.prototype.showPaths = function() {
	if (this.allPaths.length > 0) {
		for(var i=0; i<this.allPaths.length; i++){
			this.allPaths[i].show();
		}
	} else {
		this.paths = new UOPATHS();
		for(var i=0; i<PATHS.length; i++){
			var polyline = this.paths.plotPath(i);
			polyline.html = PATHS[i].html;
			GEvent.addListener(polyline, "click", function(latlng){
				UOM._map.gmap.openInfoWindowHtml(latlng, this.html);
			});
			this.allPaths.push(polyline);
			this.gmap.addOverlay(polyline);
		}
	}
}

CustomMap.prototype.hidePaths = function() {
	for(var i=0; i<this.allPaths.length; i++){
		this.allPaths[i].hide();
	}
}

CustomMap.prototype.hideMarkers = function(type) {
	for (var i = 0; i < this.allMarkers[type].length; i++) {
		var array = this.allMarkers[type][i];
		array[1].hide();
	}
}

CustomMap.prototype.openBuildingInfoWindow = function(i,type){
	var array = this.allMarkers[type][i];
	var marker = array[1];
	GEvent.trigger(marker,"click");
	GEvent.addListener(marker, "infowindowclose", function(){
		var rows = e("buildingsTable").rows; 
	    for (var j = 0; j < rows.length; j++) {
	    	var row = rows[j];
	    	row.className = '';
	    }
	});
}

CustomMap.prototype.setCenter = function(campus) {
	if (campus.toString() == "mba") {
		this.gmap.setCenter(new GLatLng(45.421219, -75.697947), 17, G_NORMAL_MAP);
	} else if (campus.toString() == "altaVista") {
		this.gmap.setCenter(new GLatLng(45.402789, -75.646620), 16, G_NORMAL_MAP);
	} else if (campus.toString() == "lees") {
		this.gmap.setCenter(new GLatLng(45.415835, -75.668882), 17, G_NORMAL_MAP);
	} else { //default main campus
		this.gmap.setCenter(new GLatLng(45.4223, -75.6823), 17, G_NORMAL_MAP);
	} 
}
