var map;
var campusOverlay;
var icons = {};
var campusMarker = null;
var buildingMarkers = [];
var testMarker = null;
var infoWindow = null;

NSUOverlay.prototype = new google.maps.OverlayView();
NSUMarker.prototype = new google.maps.Marker();

function initialize() {
		
		var latlng = new google.maps.LatLng(params.CenterLat,params.CenterLng);
		var mapOptions = {
			zoom:params.CenterZoom,
			center: latlng,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
		
		var swBound = new google.maps.LatLng(31.737470,-93.109109); //31.745910,-93.093068
		var neBound = new google.maps.LatLng(31.756246,-93.087180); //31.743386,-93.107599
		var bounds = new google.maps.LatLngBounds(swBound,neBound);
		var campusImage = 'http://static.nsula.edu/images/maps/campus_overlay.png';
		campusOverlay = new NSUOverlay(bounds, campusImage, map);
		google.maps.event.addListener(map,'maptypeid_changed', function() {
			if(map.getMapTypeId() == 'roadmap' || map.getMapTypeId() == 'terrain') {
				campusOverlay.show();
			} else {
				campusOverlay.hide();
			}
		});
		google.maps.event.addListener(map, 'zoom_changed', function() {
		   if(map.getZoom() < '12' || map.getZoom() > '17') {
				campusOverlay.hide();
		   } else {
		   		campusOverlay.show();
		   }
		   if(map.getZoom() < '15') {
		   		campusMarker.setVisible(true);
		   		removeAllMarkers();
		   } else {
		   		campusMarker.setVisible(false);
		   }
		});
		createMarkers();
		infoWindow = new google.maps.InfoWindow({
			content: "",
			maxWidth: 500
		});
		
		var checkboxArea = document.getElementById('GMapOptionsCheckboxes');
		$.ajax({
			url: this.location + "/getCategories",
			dataType: 'json',
			success: function(data) {
				for (var i in data) {
					var thisCategory = data[i];
					var html = '<label for="' + thisCategory + '"><input class="categoryCheckbox" type="checkbox" id="' + thisCategory + '" name="' + thisCategory + '" value="' + thisCategory + '" />' + thisCategory + '</label><br />';
					$(checkboxArea).append(html);
				}
				$('.categoryCheckbox').click(function(e) {
					infoWindow.close();
					var category = $(this).attr('name');
					var visible = null;
					if($(this).is(':checked')) {
						visible = true
					} else {
						visible = false
					}
					for(var j in buildingMarkers) {
						var thisMarker = buildingMarkers[j];
						if(thisMarker.getCategory() == category) {
							thisMarker.setVisible(visible);
						}
					}
				});
			}
		});
		
		google.maps.event.addListener(map, 'click', find_closest_marker);
		
		var allPinControlDiv = document.createElement('DIV');
		allPinControlDiv.id = "AllPinControlDiv";
		var showAll = allPinControlObject(allPinControlDiv, map, 'ShowAllPins', 'gMapControlButtonLeft', 'Show all locations');
		google.maps.event.addDomListener(showAll, 'click', function(){showAllMarkers()});
		var removeAll = allPinControlObject(allPinControlDiv, map, 'HideAllPins', 'gMapControlButtonLeft', 'Hide all locations');
		google.maps.event.addDomListener(removeAll, 'click', function(){removeAllMarkers()});
		map.controls[google.maps.ControlPosition.RIGHT_TOP].push(allPinControlDiv);
		
		var locationSelectControlDiv = document.createElement('DIV');
		locationSelectControlDiv.id = "LocationSelectControls";
		map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(locationSelectControlDiv);
		var locationSelectControl = $('#gMapSelectControls');
		$(locationSelectControlDiv).html(locationSelectControl);
		$(locationSelectControl).css('display', 'block');
}

function NSUOverlay(bounds,image,map) {
	this.bounds_ = bounds;
	this.image_ = image;
	this.map_ = map;
	
	this.div_ = null;
	
	this.setMap(map);
}

NSUOverlay.prototype.onAdd = function() {
	var div = document.createElement('DIV');
	div.style.border = "none";
	div.style.borderWidth = "0px";
	div.style.position = "absolute";
	
	var img = document.createElement("img");
	img.src = this.image_;
	img.style.width = "100%";
	img.style.height = "100%";
	div.appendChild(img);
	
	this.div_ = div;
	
	var panes = this.getPanes();
	panes.overlayLayer.appendChild(div);
}

NSUOverlay.prototype.draw = function() {
	var overlayProjection = this.getProjection();
	
	var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
	var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());
	
	var div = this.div_;
	div.style.left = sw.x + 'px';
	div.style.top = ne.y + 'px';
	div.style.width = (ne.x-sw.x) + 'px';
	div.style.height = (sw.y - ne.y) + 'px';
}

NSUOverlay.prototype.hide = function() {
	if(this.div_) {
		this.div_.style.visibility = 'hidden';
	}
}

NSUOverlay.prototype.show = function() {
	if(this.div_) {
		this.div_.style.visibility = 'visible';
	}
}

function NSUMarker(opts) {
	this.setValues(opts);
} 

NSUMarker.prototype.category_ = '';
NSUMarker.prototype.setCategory = function(category) {
	this.category_ = category;
}
NSUMarker.prototype.getCategory = function() {
	return this.category_
}
NSUMarker.prototype.id_ = '';
NSUMarker.prototype.setId = function(id) {
	this.id_ = id;
}
NSUMarker.prototype.getId = function() {
	return this.id_;
}
NSUMarker.prototype.desc_ = '';
NSUMarker.prototype.setDesc = function(desc) {
	this.desc_ = desc;
}
NSUMarker.prototype.getDesc = function() {
	return this.desc_;
}

function createMarkers() {
	var icon = params.baseHref + "/assets/Campus-Maps/marker.png"; 
	
	var campusMarkerData = buildings[0]["places"][0];
	var campusMarkerLatLng = new google.maps.LatLng(campusMarkerData.posn[0], campusMarkerData.posn[1]);
	campusMarker = new google.maps.Marker({
		position: campusMarkerLatLng,
		map: map,
		title: campusMarkerData.name,
		icon: icon,
		visible: false
	});
	var campusBuildings = buildings[1]['places'];
	for(var i in campusBuildings) {
		var thisBuilding = campusBuildings[i];
		var thisLatLng = new google.maps.LatLng(thisBuilding.posn[0], thisBuilding.posn[1]);
		var thisMarker = new NSUMarker({
			position: thisLatLng,
			map: map,
			title: thisBuilding.name,
			icon: icon,
			visible: false,
			zindex: 1000
		});
		thisMarker.setCategory(thisBuilding.cat);
		thisMarker.setId(thisBuilding.id);
		thisMarker.setDesc(thisBuilding.desc);
		google.maps.event.addListener(thisMarker, 'click', function() {
			infoWindow.setContent(this.getDesc());
			infoWindow.open(map, this);
		});
		
		buildingMarkers.push(thisMarker);
	}
}

function removeAllMarkers() {
	for (var i in buildingMarkers) {
		var thisMarker = buildingMarkers[i];
		thisMarker.setVisible(false);
	}
	$('.categoryCheckbox').attr('checked', false);
	infoWindow.close();
}

function showAllMarkers() {
	for (var i in buildingMarkers) {
		var thisMarker = buildingMarkers[i];
		thisMarker.setAnimation('DROP');
		thisMarker.setVisible(true);
	}
	$('.categoryCheckbox').attr('checked', true);
}

function link_from_dropmenu(index) {
	
	var myMarker = null;
	var myindex = index.selectedIndex;
	var menuopt = index.options[myindex].value;
	
	for (var i in buildingMarkers) {
		var thisMarker = buildingMarkers[i];
		if (thisMarker.getId() == menuopt) {
			thisMarker.setAnimation('DROP');
			thisMarker.setVisible(true);
			infoWindow.setContent(thisMarker.getDesc());
			infoWindow.open(map,thisMarker);
		} 
	}
}

function rad(x) {return x*Math.PI/180;}
function find_closest_marker( event ) {
    var lat = event.latLng.lat();
    var lng = event.latLng.lng();
    var R = 6371;
    var distances = [];
    var closest = -1;
    for( i=1;i<buildingMarkers.length; i++ ) {
        var mlat = buildingMarkers[i].position.lat();
        var mlng = buildingMarkers[i].position.lng();
        var dLat  = rad(mlat - lat);
        var dLong = rad(mlng - lng);
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;
        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    thisMarker = buildingMarkers[closest];
    thisMarker.setVisible(true);
    infoWindow.setContent(thisMarker.getDesc());
	infoWindow.open(map,thisMarker);
}

function allPinControlObject(controlDiv, map, id, className, text) {
	//controlDiv.style.padding = '5px';
	
	// Set CSS for the control border
	var showAllUI = document.createElement('DIV');
	showAllUI.id = id;
	showAllUI.className += className;
	showAllUI.title = text;
	controlDiv.appendChild(showAllUI);
	
	// Set CSS for the control interior
	var showAllText = document.createElement('DIV');
	showAllText.innerHTML = text;
	showAllUI.appendChild(showAllText);
	
	return showAllUI;
}
