function showGlobalMap(options) {

	var residences = options.residences,
		texts = options.texts;

	var geocoder = new google.maps.Geocoder();
	var service = new google.maps.DistanceMatrixService();
	var initialPosition = new google.maps.LatLng(options.initialPosition.lat, options.initialPosition.long);
	var map = new google.maps.Map(document.getElementById("map_canvas"), {
		zoom: 5,
		center: initialPosition,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	});

    var positionMarker;

	var positionsArray = [];

	function showAllMarkers () {
		for (var i = 0; i<residences.length; i++) {
			var pos = new google.maps.LatLng(residences[i]["lat"], residences[i]["long"]);
			positionsArray.push(pos);
			residences[i]["marker"] = new google.maps.Marker({
				position: pos, 
				map: map,
				title:residences[i]["city"],
				icon : "/css/i/marker.png"
			});
			bindClick(residences[i]);
		}
	}

	function bindClick(residence) {
		google.maps.event.addListener(residence.marker, 'click', function() {
			var oneSearch = [];
			oneSearch.push({'residence' : residence});
			showResidence(residence);
		});
	}

	function clearListeners() {
		for (var i = 0; i<residences.length; i++) {
			google.maps.event.clearListeners(residences[i].marker, 'click');
		}
	}




	function setResultMarker (options) {
		if (positionMarker) {
			positionMarker.setMap(null);
		}
		positionMarker = new google.maps.Marker(options);
	}

	function getSearchPosition () {

		var name = $('#location-name').val();
		if (name !== "") {
			geocoder.geocode({'address': name}, function (results, status) {

				if (status == google.maps.GeocoderStatus.OK) {

					var resultPosition = results[0].geometry.location,
						resultName = results[0].formatted_address;

					map.setCenter(resultPosition);

					setResultMarker({
						position: resultPosition, 
						map: map,
						title: resultName
					});

					distance(resultName, positionsArray);

				} else {
					//error
				}

			});
		}
	}

	function sortDistances(a, b) {

		return a.value - b.value;
	}

	function getZoom(distance) {

		var zoomResult;

		function recursiveMeasure(distance, number, zoomLevel) {

			var number = number || 7000000,
				zoomLevel = zoomLevel || 0;

			if (number > distance) {
				recursiveMeasure(distance, number / 2, zoomLevel + 1);
			}
			else {
				zoomResult = zoomLevel;
			}
		}

		recursiveMeasure(distance);
		return zoomResult;

	}

	function getMarkerImage(position) {

		var aSources = [
			"/css/i/marker-a.png",
			"/css/i/marker-b.png",
			"/css/i/marker-c.png",
			"/css/i/marker-d.png",
			"/css/i/marker-e.png",
			"/css/i/marker-f.png",
			"/css/i/marker-g.png",
			"/css/i/marker-h.png",
			"/css/i/marker-i.png",
			"/css/i/marker-j.png",
			"/css/i/marker-k.png",
			"/css/i/marker-l.png",
			"/css/i/marker-m.png",
			"/css/i/marker-n.png",
			"/css/i/marker-o.png",
			"/css/i/marker-p.png",
			"/css/i/marker-q.png",
			"/css/i/marker-r.png",
			"/css/i/marker-s.png",
			"/css/i/marker-t.png",
			"/css/i/marker-u.png",
			"/css/i/marker-v.png",
			"/css/i/marker-w.png",
			"/css/i/marker-x.png",
			"/css/i/marker-y.png",
			"/css/i/marker-z.png"
		]
		return aSources[position];
	}

	function getMarketLetter(position) {
		
		var aLetters = [
			"A",
			"B",
			"C",
			"D",
			"E",
			"F",
			"G",
			"H",
			"I",
			"J",
			"K",
			"L",
			"M",
			"N",
			"O",
			"P",
			"Q",
			"R",
			"S",
			"T",
			"U",
			"V",
			"W",
			"X",
			"Y",
			"Z"
		]
		return aLetters[position];
	}

	function showResidence(residence) {
		var resultContainer = $('#page-content').html("<h2>"+texts.resultsHeading+"</h2>");
		var result = $("#resultTemplate").tmpl(residence).appendTo(resultContainer).addClass('box-list-first');
		if (residence.marker.getIcon() == "/css/i/marker.png") {
			result.find('.marker').hide();
		}
	}

	function showResults(aResidences) {

		var resultContainer = $('#page-content').html("<h2>"+texts.resultsHeading+"</h2>"),
			zoom = getZoom(aResidences[0].value);

		map.setZoom(zoom);

		for (var i = 0; i<aResidences.length; i++) {
			//if (i<4) {
				aResidences[i].residence.marker.setVisible(true);
				aResidences[i].residence.marker.setIcon(getMarkerImage(i));
				aResidences[i].residence.distance = aResidences[i].text;
				aResidences[i].residence.markerLetter = getMarketLetter(i);
				if (i == 0) {
					aResidences[i].residence.additionalClass="box-list-first";
				}
				else {
					aResidences[i].residence.additionalClass="";
				}
				$("#resultTemplate").tmpl(aResidences[i].residence).appendTo(resultContainer);
			//}
			//else {
			//	aResidences[i].residence.marker.setVisible(false);
			//}
		}
	}

	function showErrorMessage () {
		var resultContainer = $('#page-content').html("<h2>"+texts.resultsHeading+"</h2>");
		$("#errorTemplate").tmpl({}).appendTo(resultContainer);
	}

	function distance (origin, destinations) {

		service.getDistanceMatrix({
			origins: [origin],
			destinations: destinations,
			travelMode: google.maps.TravelMode.DRIVING,
			avoidHighways: false,
			avoidTolls: false
		}, function (response, status) {

			var result = response.rows[0].elements,
				unsortedArray = [];

			for (var i = 0; i < result.length; i++) {

				if (result[i].status != "ZERO_RESULTS") {

					var toAdd = result[i].distance;
					toAdd.residence = residences[i];
					unsortedArray.push(toAdd);
				}
			}

			if (unsortedArray.length) {
				showResults(unsortedArray.sort(sortDistances));
			}
			else {
				showErrorMessage();
			}
		});
	}

	/* Init */
	showAllMarkers();

	/* On search */
	$('#search button').click(function(e){
		e.preventDefault();
		getSearchPosition();
		/*clearListeners();*/
	});
}

function showLocalMap (options) {

	var markers = options.markers;
	var initialPosition = new google.maps.LatLng(options.initialPosition.lat, options.initialPosition.long);
	var map = new google.maps.Map(document.getElementById("local-map"), {
		zoom: 16,
		center: initialPosition,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	});

	// Set Initial Marker
	var m = new google.maps.Marker({
		position : initialPosition,
		map : map
	});

	var service = new google.maps.DistanceMatrixService();


	var windows = [];

	function closeWindows () {
		for (var i = 0; i<windows.length; i++) {
			windows[i].close(map);
		}
	}

	function attachWindow (marker, content, pos) {
		var w = new google.maps.InfoWindow({
			content:content,
			mawWidth:100,
			position:pos
		});
		windows.push(w);
		google.maps.event.addListener(marker, 'click', function() {
			closeWindows();
			w.open(map);
		});

	}

	getDistance = function (pos, index, m) {
		service.getDistanceMatrix({
			origins: [initialPosition],
			destinations: [pos],
			travelMode: google.maps.TravelMode.WALKING,
			avoidHighways: false,
			avoidTolls: false
		}, function (response, status) {
				attachWindow(m, '<strong style="display:block; margin-bottom:3px">'+markers[index].title+' ('+response.rows[0].elements[0].distance.text+')</strong>'+markers[index].address, pos);
		});
	}

	// Set other markers

	for (var i = 0; i < markers.length; i++) {

		var pos = new google.maps.LatLng(markers[i].positions[0], markers[i].positions[1]);

		var m = new google.maps.Marker({
			position : pos,
			map : map,
			icon : markers[i].icon,
			title : markers[i].title
		});

		getDistance(pos, i, m);

	}
}
