var map = null;
var directions_map = null;
var geocoder = null;
var gdir = null;

//artists
var artistIcon = new GIcon();
artistIcon.image = BASEPATH + "/images/mpin-red.png";
artistIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
artistIcon.iconSize = new GSize(13, 28);
artistIcon.shadowSize = new GSize(33, 28);
artistIcon.iconAnchor = new GPoint(1, 31);
artistIcon.infoWindowAnchor = new GPoint(10, 36);
artistIcon.infoShadowAnchor = new GPoint(10, 36);

//arts orgs blue
var artOrgIcon = new GIcon();
artOrgIcon.image = BASEPATH + "/images/mpin-blue.png";
artOrgIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
artOrgIcon.iconSize = new GSize(13, 28);
artOrgIcon.shadowSize = new GSize(33, 28);
artOrgIcon.iconAnchor = new GPoint(1, 31);
artOrgIcon.infoWindowAnchor = new GPoint(10, 36);
artOrgIcon.infoShadowAnchor = new GPoint(10, 36);


//galleries turquoise
var galleryIcon = new GIcon();
galleryIcon.image = BASEPATH + "/images/mpin-turquoise.png";
galleryIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
galleryIcon.iconSize = new GSize(13, 28);
galleryIcon.shadowSize = new GSize(33, 28);
galleryIcon.iconAnchor = new GPoint(1, 31);
galleryIcon.infoWindowAnchor = new GPoint(10, 36);
galleryIcon.infoShadowAnchor = new GPoint(10, 36);

//museums purple
var museumIcon = new GIcon();
museumIcon.image = BASEPATH + "/images/mpin-purple.png";
museumIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
museumIcon.iconSize = new GSize(13, 28);
museumIcon.shadowSize = new GSize(33, 28);
museumIcon.iconAnchor = new GPoint(1, 31);
museumIcon.infoWindowAnchor = new GPoint(10, 36);
museumIcon.infoShadowAnchor = new GPoint(10, 36);

//public art dkgreen
var publicArtIcon = new GIcon();
publicArtIcon.image = BASEPATH + "/images/mpin-dkgreen.png";
publicArtIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
publicArtIcon.iconSize = new GSize(13, 28);
publicArtIcon.shadowSize = new GSize(33, 28);
publicArtIcon.iconAnchor = new GPoint(1, 31);
publicArtIcon.infoWindowAnchor = new GPoint(10, 36);
publicArtIcon.infoShadowAnchor = new GPoint(10, 36);

//art schools orange
var schoolIcon = new GIcon();
schoolIcon.image = BASEPATH + "/images/mpin-orange.png";
schoolIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
schoolIcon.iconSize = new GSize(13, 28);
schoolIcon.shadowSize = new GSize(33, 28);
schoolIcon.iconAnchor = new GPoint(1, 31);
schoolIcon.infoWindowAnchor = new GPoint(10, 36);
schoolIcon.infoShadowAnchor = new GPoint(10, 36);

//services green
var serviceIcon = new GIcon();
serviceIcon.image = BASEPATH + "/images/mpin-green.png";
serviceIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
serviceIcon.iconSize = new GSize(13, 28);
serviceIcon.shadowSize = new GSize(33, 28);
serviceIcon.iconAnchor = new GPoint(1, 31);
serviceIcon.infoWindowAnchor = new GPoint(10, 36);
serviceIcon.infoShadowAnchor = new GPoint(10, 36);

//other silver
var otherIcon = new GIcon();
otherIcon.image = BASEPATH + "/images/mpin-silver.png";
otherIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
otherIcon.iconSize = new GSize(13, 28);
otherIcon.shadowSize = new GSize(33, 28);
otherIcon.iconAnchor = new GPoint(1, 31);
otherIcon.infoWindowAnchor = new GPoint(10, 36);
otherIcon.infoShadowAnchor = new GPoint(10, 36);


//multi at address
var multiIcon = new GIcon();
multiIcon.image = BASEPATH + "/images/map-pin-redandblue.png";
multiIcon.shadow = BASEPATH + "/images/map-pin40-B-shadow-only.png";
multiIcon.iconSize = new GSize(13, 28);
multiIcon.shadowSize = new GSize(33, 28);
multiIcon.iconAnchor = new GPoint(1, 31);
multiIcon.infoWindowAnchor = new GPoint(10, 36);
multiIcon.infoShadowAnchor = new GPoint(10, 36);


//clusters
var clusterIcon = new GIcon();
clusterIcon.image = BASEPATH + "/images/rainbowclusterpins.png";
clusterIcon.shadow = BASEPATH + "/images/rainbowclustershadow.png";
clusterIcon.iconSize = new GSize(26, 26);
clusterIcon.shadowSize = new GSize(36, 25);
clusterIcon.iconAnchor = new GPoint(18, 27);
clusterIcon.infoWindowAnchor = new GPoint(13, 1);
clusterIcon.infoShadowAnchor = new GPoint(26, 13);

function getIconForType(loctype) {
	
	/*
	1 - artistIcon
	3 - artOrgIcon
	2 - galleryIcon
	4 - museumIcon
	6 - publicArtIcon
	8 - schoolIcon
	7 - serviceIcon
	5 - otherIcon
	"multi" = multiIcon
	*/
	
	loctype = parseInt(loctype);
	var ic = artistIcon;

	switch(loctype)
	{
	case 1:
	  	ic = artistIcon;
	  	break;
	case 2:
		ic = galleryIcon;
	  break;
	case 3:
		ic = artOrgIcon;
	  break;
	case 4:
		ic = museumIcon;
	  break;
	case 5:
		ic = otherIcon;
	  break;
	case 6:
		ic = publicArtIcon;
	  break;
	case 7:
		ic = serviceIcon;
	  break;
	case 8:
		ic = schoolIcon;
	   break;
	default:
		ic = multiIcon;
	}

	return ic;
	
}



// Call this function when the page has been loaded
function initializeWithCookie(zoom) {

		var clat = Get_Cookie("lat");
		if (clat != "null") {
			lat = clat;
			var clng = Get_Cookie("lng");
			if (clng != "null")
				lng = clng;
			var czoom = Get_Cookie("zoom");
			if (czoom != "null")
				zoom = czoom;

			//Default to world view
			if (!lat || !lng) {
				lat = DEFAULT_LAT;
				lng = DEFAULT_LNG;
			}
			if (!zoom)
				zoom = MIN_ZOOM;

			zoom = parseInt(zoom);
			initialize(false,lat,lng,zoom)
		} else {
			//Defaults to worldview
			initialize(false,DEFAULT_LAT,DEFAULT_LNG,MIN_ZOOM);
		}
		
}

// Call this function when the page has been loaded
function initialize(isdetailpage,lat,lng,zoom,map_div) {
	
	zoom = parseInt(zoom);

	//Defaults are the whole US for homepage
  	//Whole US: map.setCenter(new google.maps.LatLng(37.0902,-95.7129), 4);
  	//Boston: map.setCenter(new google.maps.LatLng(42.6586964,-70.6124845), 8);
	if (!lat || !lng) {
		lat = DEFAULT_LAT;
		lng = DEFAULT_LNG;
	}

	if (!zoom || zoom == 0)
		zoom = MIN_ZOOM;

	if (!map_div)
		map_div = "map_canvas";

	var mapTypes = G_DEFAULT_MAP_TYPES;
	for(var i = 0; i < mapTypes.length; i++){
		mapTypes[i].getMinimumResolution = function(latlng){ return MIN_ZOOM;};
	}
	map = new GMap2(document.getElementById(map_div), {mapTypes: mapTypes});
  	geocoder = new GClientGeocoder();

	lat = parseFloat(lat);
	lng = parseFloat(lng);
	
	map.setCenter(new google.maps.LatLng(lat,lng),zoom);

    //map.addControl(new GLargeMapControl());
    //map.addControl(new GMapTypeControl());

	map.setUIToDefault();
	map.openinginfowindow = false;
	
	if (isdetailpage) {
		if (document.getElementById('directions_map_canvas')) {
			directions_map = new GMap2(document.getElementById('directions_map_canvas'));
			directions_map.setCenter(new google.maps.LatLng(lat,lng), zoom);
			directions_map.setUIToDefault();
			var txtdiv = document.getElementById('directions_text');
			gdir = new GDirections(directions_map, txtdiv);
		}
		if (typeof addArtMapLocations != "undefined")
			addArtMapLocations();
	} else {
		GEvent.addListener(map,'zoomend',function() {
			updateMarkers();
		});
		GEvent.addListener(map,'moveend',function() {
			if (!map.openinginfowindow)
				updateMarkers();
		});

		if (typeof loadingCheckboxes == "undefined" || !loadingCheckboxes)
			updateMarkers();
	}
}

function updateMarkers() {

	//create the boundary for the data
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();

	var f = document.mapcontrol_form;
	if ((null != document.getElementById("instrsearch")) && (document.getElementById("instrsearch").className == "showSwitch"))
		f = document.instruction_form;

	f.northeast.value = northEast.toUrlValue();
	f.southwest.value = southWest.toUrlValue();
	f.submit();

}

function getSingleMarker(lat,lng,id,title,loc_type) {
	var point = new GLatLng(lat,lng);
	var ic = getIconForType(loc_type);
	var marker = new GMarker(point,{icon:ic,title:title});
	GEvent.addListener(marker, "click", function() {
		var request = GXmlHttp.create();
		var getVars = "id=" + id + "&lat=" + lat + "&lng=" + lng;
		request.open('GET', BASEPATH + '/ajax/get_infowindow_details.php?' + getVars, true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var html = request.responseText;
				map.openinginfowindow = true;
			  	map.openInfoWindowHtml(point, html,{onOpenFn: function() {setTimeout("map.openinginfowindow = false;",1000);}});
			}
		}
		request.send(null);
	});

	if (typeof visibleMarkers != "undefined")
		visibleMarkers[id] = {"marker": marker};
	return marker;
}

function openPopupBubble(id,lat,lng) {
	var point = new GLatLng(lat,lng);
	var request = GXmlHttp.create();
	var getVars = "id=" + id + "&lat=" + lat + "&lng=" + lng + "&load_single_id=true";
	request.open('GET', BASEPATH + '/ajax/get_infowindow_details.php?' + getVars, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var html = request.responseText;
			map.openinginfowindow = true;
		  	map.openInfoWindowHtml(point, html,{pixelOffset: new GSize(10,0),onOpenFn: function() {setTimeout("map.openinginfowindow = false;",1000);}});
		}
	}
	request.send(null);
}

function getClusterMarker(lat,lng,cid,title) {
	var point = new GLatLng(lat,lng);
	var marker = new GMarker(point,{icon: clusterIcon,title:title});
	GEvent.addListener(marker, "click", function() { 
		var html = "<div style=\"text-align:left;\"><b>" + ZOOM_IN_TO_SEE_LOCATIONS + "</b><br/><br/>" + 
			ZOOM_INSTRUCTIONS + "<br/><br/>";
		html += "<a href=\"javascript://\" onclick=\"zoomIn(" + lat + "," + lng + "," + MEDIUM_ZOOM + ");\">" + ZOOM_IN + "</a></div><br/>";
		map.openinginfowindow = true;
		map.openInfoWindowHtml(point, html,{onOpenFn: function() {setTimeout("map.openinginfowindow = false;",1500);}});
	});
	if (typeof visibleMarkers != "undefined")
		visibleMarkers[cid] = {"marker": marker};
	return marker;
}

function addLocation(multi,loc_data,lat,lng,detailpage) {
	if (map)
		map.addOverlay(createMarker(loc_data,new google.maps.LatLng(lat,lng),detailpage));

	if (directions_map) {
		directions_map.addOverlay(createMarker(loc_data,new google.maps.LatLng(lat,lng),detailpage));
		var dm = document.getElementById("detail_map");
		dm.className = "hideSwitch";
	}
}

function locationSearch(address) {
  document.pressed='nosubmit';
  if (geocoder && address) {
    geocoder.getLatLng(
      address,
      function(point) {
        if (!point) {
			alert(COULD_NOT_FIND_ADDRESS + ": \n" +  address);
        } else {
          map.setCenter(point, SEARCH_ZOOM);
        }
      }
    );
  }
}

function createMarker(loc_data,point,detailpage) {
  var loc_type = loc_data.location_type;
  var ic = getIconForType(loc_type);
  if (detailpage == "preview")
	markeroptions = {draggable: true,icon:ic};
  else
	markeroptions = {icon:ic};
  var marker = new GMarker(point,markeroptions);
  if (!detailpage) {
  	GEvent.addListener(marker, "click", function() {
		var html = "<div style=\"text-align:left;\"><b>" + loc_data.display_name + "</b><br/>" + loc_data.brief_desc + "<br/>";
		html += "<table><tr><td>" + loc_data.address + "<br/><br/>";
		if (loc_data.phone)
			html += loc_data.phone + "<br/></td>";
		html += "<td width=\"100\">";
		if (loc_data.thumb)
			html +="<div style=\"display: block; width: 100px; height: 100px; background-image: url(artist_images/" + loc_data.thumb + ");background-repeat:no-repeat;\"></div>";
		html += "</td></tr></table>";
		html += "<a href=\"javascript://\" onclick=\"openDetailPopup('detail.php?id=" + loc_data.id + "')\">" + MORE_INFO + "</a></div><br/>";

		map.openinginfowindow = true;
	  	map.openInfoWindowHtml(point, html,{onOpenFn: function() {setTimeout("map.openinginfowindow = false;",1000);}});
	}
  );
  } else if (detailpage == "preview") {
	GEvent.addListener(marker, "dragend", function(marker) {
		var point = marker;
		document.preview_form.lat.value = point.lat();
		document.preview_form.lng.value = point.lng();
	 });
  }

  return marker;
}

function getDirections(fromto,otherplace,loc) {
	//gdir.clear();
	var from = otherplace;
	var to = loc;
	if (fromto == "to") {
		from = loc;
		to = otherplace;
	}
	gdir.load("from: " + from + " to: " + to);
}

function saveMapPostion() {
	//get map center geocode
	var ctr = map.getCenter();
	//get map zoom
	var zoom = map.getZoom();
	//store vals in cookies
	Set_Cookie("lat", ctr.lat());
	Set_Cookie("lng", ctr.lng());
	Set_Cookie("zoom", zoom);
}

function reflowMap(lat,lng) {
	lat = parseFloat(lat);
	lng = parseFloat(lng);
	directions_map.checkResize();
	//now we need to recenter the map
	directions_map.setCenter(new google.maps.LatLng(lat,lng),directions_map.getZoom());
}

function loadPoint(lat,lng,zoom,id) {
	if (!lat || !lng)
		return;
	lat = parseFloat(lat);
	lng = parseFloat(lng);
	zoom = parseInt(zoom);
	map.setCenter(new google.maps.LatLng(lat,lng),zoom);
	var cmd = "openPopupBubble(" + id + "," + lat + "," + lng + ")";
    setTimeout(cmd,1000);
}

function zoomIn(lat,lng,zoom) {
	if (!lat || !lng)
		return;
	lat = parseFloat(lat);
	lng = parseFloat(lng);
	zoom = parseInt(zoom);
	if (map.getZoom() >= zoom)
		zoom = map.getZoom() + 4;
	map.setCenter(new google.maps.LatLng(lat,lng),zoom);
	updateMarkers();

}
