/*
 * Extra info added to marker class.
 * 1. marker.number (order of appearance for sorting)
 * 2. marker.infowindow (reference to infowindow)
 */
var geocoder;
var map;
var userMarker = null;
var redrawing = false;
var enableResize = true;
var enableZoom = false;
var mapReady = false;
var randomPoints = [
	//{ lat: 37.98995, lng: -95.716962, zoom: 3 }, // approx. center of US
	{ lat: 40.74846, lng: -73.985764, zoom: 17 }, // empire state building
	{ lat: 37.818684, lng: -122.478333, zoom: 14 }, // golden gate bridge
	{ lat: 38.888093, lng: -77.028751, zoom: 15 }, // national mall, washington, dc
	{ lat: 36.113471, lng: -115.172424, zoom: 12 }, // willis (sears) tower, chicago
	{ lat: 43.880573, lng: -103.454132, zoom: 12 } // mount rushmore
];

$(function () {
  $('#map_canvas').parent().prepend('<div id="map-area-loader"><img src="/img/medium-ajax-loader.gif"/><h3 id="map-area-loader-message" class="main pad-top">Loading map...</h3></div>');

  $('body').bind('orientationchange', resizeLoadingOverlay);
  resizeLoadingOverlay();
	$('#map-area-loader').fadeIn();

	geocoder = new google.maps.Geocoder();

	$('#map-user-address').focus(function(){ $(this).css('background', '#fff'); });
	if ($('#map-user-address').val() == '') {
		$('#map-user-address').css('background', '#fff url(../img/map-bank-enter-address-text.gif) 10px 9px no-repeat');
	}

	$('#map-bank-form').submit(function(){
		var address = $('#map-user-address').val();

		if (address == '') { return false; }

		// track user input
		pageTracker._trackEvent('Bank Map', 'Address', $('#map-user-address').val(), 1);

		// record user input
		$.get(LEARN_PATH + '?map_location='+escape(address)+'&break='+(new Date()).getTime());

		if (geocoder) {
			geocoder.geocode({'address': address}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					location.hash = '#' + results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng();

					$.get(LEARN_PATH + '?map_lat=' + results[0].geometry.location.lat() + '&map_lng=' + results[0].geometry.location.lng() + '&break=' + (new Date()).getTime());

					redrawing = true;
					$('#map-area-loader').fadeIn();

					if (!enableZoom && !enableResize) { enableResize = true; }

					$.getJSON(MARKER_FETCH_PATH + '?lat=' + results[0].geometry.location.lat() + '&lng=' + results[0].geometry.location.lng(), drawMarkers);

					map.setCenter(results[0].geometry.location);

					// disable the marker if we are deep linking from the result banks
					if (!enableZoom) {
						if (!userMarker) {
							userMarker = new google.maps.Marker({
								map: map,
								position: results[0].geometry.location,
								clickable: false,
								zIndex: 999999,
								flat: true
							});
						} else {
							userMarker.setPosition(results[0].geometry.location);
							userMarker.setZIndex(999999);
						}
					}
				}
			});
		}

		return false;
	});
});

function resizeLoadingOverlay() {
	$('#map-area-loader').css({
	  'width': $('#map_canvas').width(),
	  'height': $('#map_canvas').height(),
	  'opacity': 0.5
	});
	$('#map-area-loader img').css('padding-top', ($('#map_canvas').height() / 2 - $('#map-area-loader img').height()));
}

function mapStart() {
	var lat = SESSION_LAT;
	var lng = SESSION_LNG;
	var zoom = 16;

	if (location.hash) {
		var hash = (location.hash + "").replace(/^#/, '').split(',');
		if (hash.length == 2) {
			lat = parseFloat(hash[0]);
			lng = parseFloat(hash[1]);
			enableResize = false;
			// track user input
			if ($('#map-user-address').val() != '') {
				pageTracker._trackEvent('Bank Map', 'Deep link address', $('#map-user-address').val(), 1);
			} else {
				pageTracker._trackEvent('Bank Map', 'Deep link share', hash[0] + ',' + hash[1], 1);
			}
		}
	}

	if (isNaN(lat) || lat == 0 || isNaN(lng) || lng == 0) {
		var point = randomPoints[Math.floor(Math.random()*randomPoints.length)];
		if (!point) { point = randomPoints[0]; }

		zoom = point.zoom;
		lat = point.lat;
		lng = point.lng;
	}

	var latlng = new google.maps.LatLng(lat, lng);
	var myOptions = {
		zoom: zoom,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		mapTypeControl: false,
		scaleControl: false,
		navigationControl: true
	};

	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	google.maps.event.addListener(map, 'dragend', redraw);
	redraw();
}

function setMapLocation(lat, lng) {
  if (mapReady) {
    map.setCenter(new google.maps.LatLng(parseFloat(lat), parseFloat(lng)));
    redraw();
  } else {
    setTimeout(function(){
      setMapLocation(lat, lng);
    }, 200);
  }
}

function setPrettyLocation(latlng) {
	if (geocoder) {
		geocoder.geocode({'latLng': latlng}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				if (results[1]) {
					$('#user-address').text(results[1].formatted_address);
					// try to find the number of locations in that area
      		if (typeof LOCATION_COUNTS !== 'undefined' && $('#map-banks-found-out-of') !== null) {
      		  for (var i in results[1].address_components) {
      		    if (typeof LOCATION_COUNTS[results[1].address_components[i].short_name] !== 'undefined') {
          		  $('#map-banks-found-out-of').text(' out of ' + LOCATION_COUNTS[results[1].address_components[i].short_name] + ' ');
          		  break;
      		    }
      		  }
      		}

        	// track user input
      		pageTracker._trackEvent('Bank Map', 'Found', results[1].formatted_address, $('#map-banks-found').text());
				}
			}
		});
	}
}

var numbers = [];
var markers = {};
var numberedMarkers = [];
var dots = {};
var openInfoWindow = null;
var nextZIndex = 200;

function drawMarkers(data) {
	$('#map-bank-list-body').children().remove();

	if (data.length > 0) {
		$('#map-bank-list').show();
		$('#map-banks-found').text(data.length);
	} else {
		$('#map-bank-list').hide();
	}

	setPrettyLocation(map.getCenter());

	// clear the markers
	for (var i in markers) {
		markers[i].setMap(null);
		dots[i].setMap(map);
	}

	// clear the number markers
	for (var i = 0; i < numbers.length; i++) {
		numbers[i].setMap(null);
	}
	numbers = [];

	var markersToSort = [];
	numberedMarkers = [];

	// make this synchronous to prevent multiple markers
	$.each(data, function(i, item){
		var hash = item.BankLocation.lat + ',' + item.BankLocation.lng;
		var marker = markers[hash];

		if (!marker) {
			marker = attachMarkerToMap(item);
			markers[hash] = marker;

			var dot = new google.maps.Marker({
				map: null,
				position: new google.maps.LatLng(parseFloat(item.BankLocation.lat), parseFloat(item.BankLocation.lng)),
				icon: '/img/map-bank-dot.png'
			});

			google.maps.event.addListener(dot, 'click', function(event) {
				map.setCenter(dot.getPosition());
				redraw();
			});

			dots[hash] = dot;
		} else {
			marker.setMap(map);
			dots[hash].setMap(null);
		}
		marker.number = item.BankLocation.number;
		markersToSort.push(marker);

    var html = formatOutput(item, (i + 1) % 2 == 0);
		$('#map-bank-list-body').append(html);
		numberedMarkers.push(marker);
	});

	// sort by reverse latitude, so the zIndex are correct
	markersToSort = markersToSort.sort(function(a, b){
		return b.getPosition().lat() - a.getPosition().lat();
	});

	for (var i = 0; i < markersToSort.length; i++) {
		markersToSort[i].setZIndex(++nextZIndex);

		/* recreate the numbers */
		var numberImage = new google.maps.MarkerImage('/img/map-bank-location-numbers.gif?r=' + REV,
			new google.maps.Size(14, 10),
			new google.maps.Point(0, (markersToSort[i].number - 1) * 10),
		  	new google.maps.Point(6, 21)
		);

		var number = new google.maps.Marker({
			map: map,
			position: new google.maps.LatLng(markersToSort[i].getPosition().lat(), markersToSort[i].getPosition().lng()),
			icon: numberImage,
			//clickable: false,
			zIndex: ++nextZIndex,
			flat: true
		});
		numbers.push(number);
	}

	nextZIndex += 100;
	redrawing = false;
	$('#map-area-loader').fadeOut();
	$('#map-area-loader-message').text('');

	if (enableZoom) {
		var nz = map.getZoom() + 2 > 18 ? 18 : map.getZoom() + 2;
		map.setZoom(nz);
	} else if (enableResize) {
		resizeMap();
	}

	enableResize = false;
	enableZoom = false;
	mapReady = true;
}

function attachMarkerToMap(item) {
	var image = new google.maps.MarkerImage(MARKER_PATH + item.Company.marker_path + '?r=' + REV,
		// Marker size w,h
		new google.maps.Size(49, 57),
		// Origin viewport x,y
		new google.maps.Point(0, 0),
		// Anchor point for LatLng
		new google.maps.Point(20, 52)
	);

	var shadow = new google.maps.MarkerImage('/img/map-bank-marker-shadow.png?r=' + REV,
		new google.maps.Size(49, 57),
		new google.maps.Point(0, 0),
    new google.maps.Point(20, 52)
	);

/*
	var shape = {
		coord: [1, 1, 1, 59, 30, 59, 30, 1],
		type: 'poly'
	};
*/
	var marker = new google.maps.Marker({
		map: map, 
		position: new google.maps.LatLng(parseFloat(item.BankLocation.lat), parseFloat(item.BankLocation.lng)),
		title: item.Company.name,
		//shape: shape,
		shadow: shadow,
		icon: image
	});

	var contentString = '<div class="map-bank-content-bubble clearfix" style="overflow:hidden"><div class="bank-logo">' + item.Company.companyImageLink + '</div><div class="bank-details"><h3 class="main"><strong>' + item.Company.name + '</strong></h3><p>' + item.BankLocation.address + '<br/>' + item.BankLocation.city + ', ' + item.BankLocation.state_iso + '<br/>' + item.Company.phone + '<br/><a class="read-more" href="' + COMPANY_VIEW_PATH + '/' + item.Company.slug + '">' + 'View profile</a></p></div>';

	var infowindow = new google.maps.InfoWindow({
		content: contentString
	});
	marker.infowindow = infowindow;
	google.maps.event.addListener(marker, 'click', function() {
		if (openInfoWindow) { openInfoWindow.close(); }
		infowindow.open(map, marker);
		openInfoWindow = infowindow;
	});

	return marker;
}

function distancePretty(distance) {
	distance = ((Math.round(parseFloat(distance) * 10) / 10) + ' ').split('.');
	if (distance.length > 1) {
		distance = distance[0] + '.' + distance[1].substring(0, 1);
	} else {
		distance = parseInt(distance[0]);
	}

	if (distance == 1) {
		distance = '1 mile';
	} else {
		distance = distance + ' miles';
	}

	return distance;
}

function redraw(event) {
	if (map.getZoom() > 8 && !redrawing) {
		if (openInfoWindow) { openInfoWindow.close(); }
		redrawing = true;
		$('#map-area-loader').fadeIn();
		var center = map.getCenter();
		$.getJSON(MARKER_FETCH_PATH + '?lat=' + center.lat() + '&lng=' + center.lng(), drawMarkers);
	}
}

function in_array(needle, haystack) {
      for (var i = 0; i < haystack.length; i++) {
          if (haystack[i] == needle) {
              return true;
          }
      }
	return false;
}

function resizeMap() {
	var mapBounds = new google.maps.LatLngBounds();

	for (var i = 0; i < numberedMarkers.length; i++) {
		mapBounds.extend(numberedMarkers[i].position);
	}

	map.fitBounds(mapBounds);
}
