/**
 *
 * Copyright 2010 Limepark AB
 * Endast för användning på www.visitnora.se
 *
 */

var mapCanvases = new Array();
var addMapCanvas = function (canvasFn) {
	mapCanvases.push(canvasFn);
}

function initializeMaps(){
	for (i=0;i<mapCanvases.length;i++) {
		mapObject = mapCanvases[i];
		mapObject.init();

	}
}
var limeparkMap = function(canvId,canvProps,mapMarks,remNodesURL,filterLinksSel) {
	var canvasId = canvId;
	var canvasProperties = canvProps;
	var map = null;
	var markers = mapMarks;
	var markerData = {};
	var realMarkers = new Array();
	var connectedMarkers = new Array();
	var remoteNodesURL = remNodesURL;
	var filterLinksSelector = filterLinksSel;
	var directionsService = null;
	var geocoder = null;
	var directionsDisplay = null;
	var path = null;
	var infoWindow = new google.maps.InfoWindow();
	var playMp3 = function() {
		$(".mp3player_placeholder:not(\".fixed\")").each(function(indIndex) {
			//infoWindow.close();
			elmt = $(this);
			$("<div></div>").attr('id',elmt.attr("id")+'_player').appendTo(elmt);
			idA = elmt.attr("id").split("_");
			markerId = idA[1];
			//alert("Ska spela " + markers[markerId].mp3file);
			elmt = $(this).addClass("fixed");//.addClass("clearfix");
			// http://www.visitnora.se/download/18.539d1c491275e7d056480002198/player_mp3_maxi.swf
			var flashvars = {};
			var params = {};
			var attributes = {};
			flashvars.mp3 = markers[markerId].mp3file;
			flashvars.autoload = 0;
			flashvars.autoplay = 1;
			flashvars.showslider = 1;
			swfobject.embedSWF("http://www.visitnora.se/download/18.539d1c491275e7d056480002198/player_mp3_maxi.swf", elmt.attr("id")+'_player', "200", "20", "9.0.0","expressInstall.swf", flashvars, params, attributes);
			//infoWindow.open(map,realMarkers[markerId]);
		});
	};
	var filterClickEvent = function(){
			//alert("Filtrerar på: "+$(this).attr("title"));
			var filterValue = $(this).attr("title")
			//alert(reloadMarkers);
			params = {
				"mapAction":"getNodes",
				"X-Requested-With":"XMLHttpRequest"
			}
			params[canvasProperties.mapCategoriesMetadataName] = filterValue;
			$.get(remoteNodesURL,params,reloadMarkers,'json');

			return false;
		};
	var drawRoute = function(directionResult, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			//directionsDisplay.setDirections(directionResult);
		}
		routeLogContainer = $("#routeLog");
		routeLogList = $("<ol></ol>").appendTo(routeLogContainer);
		function log(text) {
			routeLogList = $("<li></li>").text(text).appendTo(routeLogList);
		}
		//log("Antal rutter: "+directionResult.routes.length + " (första rutten = 0)");
		directionCoordinates = new Array();
		for (routeIter = 0;routeIter<directionResult.routes.length;routeIter++) {
			//log("Analyserar rutt : "+routeIter);
			route = directionResult.routes[routeIter];
			//log("Rutt "+routeIter + " består av " + route.legs.length+" etapper (första etappen = 0)");
			for (legIter=0;legIter<route.legs.length;legIter++) {
				leg = route.legs[legIter];
				//log("Etapp "+legIter + " består av " + leg.steps.length+" steg");
				for (stepIter = 0;stepIter < leg.steps.length;stepIter++) {
					step = leg.steps[stepIter];
					//log("steg "+stepIter+" startar på "+JSON.stringify(step.start_point)+" och slutar på "+JSON.stringify(step.end_point)+" och består av "+step.lat_lngs.length+" småsteg (vägkurvor etc...) (" + JSON.stringify(step.lat_lngs) + ") tar "+step.duration.text);
					directionCoordinates.push(step.start_point);
					for (tStepIter=1;tStepIter < (step.lat_lngs.length-1);tStepIter++)
						directionCoordinates.push(step.lat_lngs[tStepIter]);

					if (stepIter == (leg.steps.length-1))
						directionCoordinates.push(step.end_point);
				}
			}
		}
		path = new google.maps.Polyline({
			path: directionCoordinates,
			strokeColor: "#FF0000",
			strokeOpacity: 1.0,
			strokeWeight: 2
		});

		path.setMap(map);

	};
	var initDirections = function() {
		if (directionsService == null)
			directionsService = new google.maps.DirectionsService();

		directionStart = connectedMarkers[0].getPosition();
		wayPoints = new Array();
		for (i=1;i<(connectedMarkers.length-1);i++) {
			wayPoints.push({location:connectedMarkers[i].getPosition(),stopover:true});
		}
		directionEnd = connectedMarkers[(connectedMarkers.length-1)].getPosition();
		request = {
			origin:directionStart,
			destination:directionEnd,
			provideRouteAlternatives: false,
			travelMode: google.maps.DirectionsTravelMode.WALKING,
			unitSystem: google.maps.DirectionsUnitSystem.METRIC
		};
		if (wayPoints.length > 0)
			request.waypoints = wayPoints;
		directionsService.route(request, drawRoute);

	}
	var attachInfoWindow = function(marker,index) {

		google.maps.event.addListener(marker, 'click', function() {
			content = "<h2>" + markers[index].mapTitle + "</h2><br />" + markers[index].markerInfo;
			
			infoWindow.close();
			if (markers[index].mp3file != "")
				content = '<div id="mp3file_'+index+'" class="mp3player_placeholder" style="width:250px;height:20px;"></div>' + content;
			infoWindow.setContent(content);
			infoWindow.open(map,marker);
			//if (markers[index].mp3file != "")
				playMp3();
		});

	};
	var setupFilterClickEvent = function(){
		$("."+filterLinksSelector).click(filterClickEvent);
	};
	var reloadMarkers = function(data, textStatus, XMLHttpRequest) {
		if (data.length >0) {
			infoWindow.close();
			markers = data;
			construct.updateMarkers();
		} else {
			alert('Hittade inget att visa...');
		}
	};
	var saveCompleted = function(data) {
		alert (data.message);
		makeMapStale();
	};
	var hideMarkers = function () {
		for (i=0;i<realMarkers.length;i++) {
			realMarkers[i].setMap(null);
		}
	};
	var showMarkers = function () {
		for (i=0;i<realMarkers.length;i++) {
			realMarkers[i].setMap(map);
		}
	};
	var markerPositionListener = function() {
		geocodePosition(realMarkers[0].getPosition())
	}
	var makeMarkerMovable = function() {
		realMarkers[0].setDraggable(true);
		realMarkers[0].setFlat(true);
		realMarkers[0].setCursor('move');
		google.maps.event.addListener(realMarkers[0], 'dragend', markerPositionListener);
	}
	var makeMarkerStale = function() {
		realMarkers[0].setDraggable(false);
		realMarkers[0].setFlat(false);
		realMarkers[0].setCursor('pointer');
	}
	var makeMapEditable = function() {
		if (map.controls[google.maps.ControlPosition.TOP].getLength() == 1)
			map.controls[google.maps.ControlPosition.TOP].removeAt(0);
		if (canvasProperties.mapType == "collected")
			hideMarkers();
		else if (canvasProperties.mapType == "object")
			makeMarkerMovable();
		addEditOption();
	};
	var makeMapStale = function() {
		if (map.controls[google.maps.ControlPosition.TOP].getLength() == 1)
			map.controls[google.maps.ControlPosition.TOP].removeAt(0);
		$('#'+canvasId+'_editExt').remove();
		$('#'+canvasId).removeClass("ubordered");
		if (canvasProperties.mapType == "collected")
			showMarkers();
		else if (canvasProperties.mapType == "object")
			makeMarkerStale();
		makeEditableButton();
	};
	var moveMarker = function(position) {
		realMarkers[0].setPosition(position);
	};
	var displayAddressInfo = function(addresses) {
		if (addresses.length == 0) {
			markerData.geocodeAddress = "";
			$("#"+canvasId+'_addressInfo').text("Ingen adress funnen");
		} else if (addresses.length == 1) {
			resultA = addresses[0];
			markerData.geocodeAddress = resultA.formatted_address;
			if(typeof resultA.geometry.location !== "undefined") {
				moveMarker(resultA.geometry.location);
			}
			if(typeof resultA.geometry.viewport !== "undefined") {
				map.fitBounds(resultA.geometry.viewport);
			}
			$("#"+canvasId+'_addressInfo').text(resultA.formatted_address);
		} else if (addresses.length > 1) {
			$("#"+canvasId+'_addressInfo').text("");
			var precisionChanged = function() {
				//alert(responses.length +' svar. Första: '+responses[0].formatted_address);
				if ($(this).val() != "") {
					resultA = addresses[parseInt($(this).val())];

					markerData.geocodeAddress = resultA.formatted_address;
					//alert(resultA.geometry)
					//ne = new google.maps.LatLng(resultA.geometry.viewport.northeast.lat, resultA.geometry.viewport.northeast.lng);
					//sw = new google.maps.LatLng(resultA.geometry.viewport.southwest.lat, resultA.geometry.viewport.southwest.lng);
					if(typeof resultA.geometry.location !== "undefined") {
						moveMarker(resultA.geometry.location);
					}
					if(typeof resultA.geometry.viewport !== "undefined") {
						map.fitBounds(resultA.geometry.viewport);
					}

					//alert(markerData.geocodeAddress);
				}
			}
			selectElement = $('<select></select>').change(precisionChanged).attr('id',canvasId+'addressOption');

			$('<option></option>').attr('value',"").text("Välj precision...").appendTo(selectElement);
			for (i=0;i<addresses.length;i++) {
				$('<option></option>').attr('value',i).text(addresses[i].formatted_address+(i==0?" (förvald)":'')).appendTo(selectElement);
			}
			selectElement.appendTo($("#"+canvasId+'_addressInfo'));
		}
	}
	var geocodePosition = function (pos) {
		if (geocoder == null)
			geocoder = new google.maps.Geocoder();

		geocoder.geocode({
			latLng: pos,
			language:'sv',
			'region':'se'
			},
			displayAddressInfo);
	}
	var geocodeAddress = function() {
		if (geocoder == null)
			geocoder = new google.maps.Geocoder();
		elmt = $('#'+canvasId + '_lookupAddress');
		addressToLookUp = elmt.val();
		geocoder.geocode({
			'address': addressToLookUp,
			'partialmatch': true,
			'language':'sv','region':'se'}, displayAddressInfo);

	};
	var saveMapView = function() {
		saveData = new Object();
		mBounds = map.getBounds();
		msBounds = new Object();
		saveData.bounds = mBounds;
		saveData.mapZoomLevel = map.getZoom();
		saveData.mapTypeId = map.getMapTypeId();
		saveData.center = {"a":map.getCenter().lat(),"b":map.getCenter().lng()};
		//alert(map.getCenter().toUrlValue());
		if (canvasProperties.mapType == "object" && realMarkers.length == 1) {
			oMarker = new Object();
			oMarker.position = {"a":realMarkers[0].getPosition().lat(),"b":realMarkers[0].getPosition().lng()};
			oMarker.geocodeAddress = markerData.geocodeAddress;
			saveData.markers = new Array();
			saveData.markers.push(oMarker);
		}




		mapData = JSON.stringify(saveData);
		//alert(mapData);
		$.post(remoteNodesURL,{"mapAction":"save",mapData:mapData,"X-Requested-With":"XMLHttpRequest"},saveCompleted,"json");
	};
	var publishMapView = function() {
		saveData = new Object();
		mBounds = map.getBounds();
		saveData.bounds = mBounds;
		saveData.mapZoomLevel = map.getZoom();
		saveData.mapTypeId = map.getMapTypeId();
		saveData.center = {"a":map.getCenter().lat(),"b":map.getCenter().lng()};

		if (canvasProperties.mapType == "object" && realMarkers.length == 1) {
			oMarker = new Object();
			oMarker.position = {"a":realMarkers[0].getPosition().lat(),"b":realMarkers[0].getPosition().lng()};
			oMarker.geocodeAddress = markerData.geocodeAddress;
			saveData.markers = new Array();
			saveData.markers.push(oMarker);
		}




		mapData = JSON.stringify(saveData);
		$.post(remoteNodesURL,{"mapAction":"savepublish",mapData:mapData,"X-Requested-With":"XMLHttpRequest"},saveCompleted,"json");
	};
	var addEditOption = function() {
		controllerContainer = $("<div></div>").addClass("controllerContainer").get(0);
		controllerSaveButton = $("<div></div>").addClass("controllerButton").get(0);
		controllerPublishButton = $("<div></div>").addClass("controllerButton").get(0);
		controllerAbortButton = $("<div></div>").addClass("controllerButton").get(0);
		if (canvasProperties.mapType == 'object' && realMarkers.length == 1) {
			searchAddressContainer = $("<div></div>").addClass("controllerContainer").addClass("clearfix").attr('id',canvasId+'_editExt');

			controllerAddressField = $("<div></div>").addClass("controllerButton").append($("<input type='text'>").attr('id',canvasId+'_lookupAddress').addClass("controllerText"));
			controllerFindAddressButton = $("<div></div>").addClass("controllerButton");
			controllerFindAddressButton.click(geocodeAddress);
			controllerFindAddressText = $("<div></div>").addClass("controllerText").text('Hitta address');
			addressInfo = $("<div></div>").addClass("infoBox").attr('id',canvasId+'_addressInfo');

			controllerFindAddressButton.append(controllerFindAddressText);
			searchAddressContainer.append(controllerAddressField);
			searchAddressContainer.append(controllerFindAddressButton);
			searchAddressContainer.append(addressInfo);
			$("#"+canvasId).after(searchAddressContainer);
			$("#"+canvasId).addClass("ubordered");
		}
		google.maps.event.addDomListener(controllerSaveButton, 'click', saveMapView);
		google.maps.event.addDomListener(controllerPublishButton, 'click', publishMapView);
		google.maps.event.addDomListener(controllerAbortButton, 'click', makeMapStale);

		controllerSaveText = $("<div></div>").addClass("controllerText").text('Spara Kartvy').get(0);
		controllerPublishText = $("<div></div>").addClass("controllerText").text('Spara & Publicera Kartvy').get(0);
		controllerAbortText = $("<div></div>").addClass("controllerText").text('Avbryt').get(0);


		controllerSaveButton.appendChild(controllerSaveText);
		controllerPublishButton.appendChild(controllerPublishText);
		controllerAbortButton.appendChild(controllerAbortText);


		controllerContainer.appendChild(controllerSaveButton);
		if (canvasProperties.publishable)
		controllerContainer.appendChild(controllerPublishButton);
		controllerContainer.appendChild(controllerAbortButton);
		//controllerContainer.appendChild(controllerAddressField);
		//controllerContainer.appendChild(controllerFindAddressButton);
		controllerContainer.index=1;
		map.controls[google.maps.ControlPosition.TOP].push(controllerContainer);
	};
	var makeEditableButton = function() {
		controllerContainer = $("<div></div>").addClass("controllerContainer").get(0);
			controllerMakeEditableButton = $("<div></div>").addClass("controllerButton").get(0);
			google.maps.event.addDomListener(controllerMakeEditableButton, 'click', makeMapEditable);

			controllerMakeEditableText = $("<div></div>").addClass("controllerText").text('Redigera kartinställningar').get(0);

			controllerMakeEditableButton.appendChild(controllerMakeEditableText);

			controllerContainer.appendChild(controllerMakeEditableButton);

			//controllerContainer.append(controllerButton.append(controllerText));
			//alert(controllerContainer.get(0));

			controllerContainer.index=1;
			//elmt.innerHTML = 'Home';
			//

			map.controls[google.maps.ControlPosition.TOP].push(controllerContainer);
	};
	var construct = {
		init:function() {

			if (typeof canvasId == 'undefined') {
				alert("MapCanvasId is not defined");
			} else if (typeof canvasProperties == 'undefined') {
				alert("The maps canvas properties is not defined");
			} else {
				if ((typeof canvasProperties.center.a !== "undefined") && (typeof canvasProperties.center.b !== "undefined"))
				latLng = new google.maps.LatLng(canvasProperties.center.a, canvasProperties.center.b);
				else if ((typeof canvasProperties.center.b !== "undefined") && (typeof canvasProperties.center.c !== "undefined"))
				latLng = new google.maps.LatLng(canvasProperties.center.b, canvasProperties.center.c);
				//latLng = new google.maps.LatLng(canvasProperties.center.b,canvasProperties.center.c);
				mapConf = {
				zoom: canvasProperties.mapZoomLevel,
				center: latLng,
				mapTypeId: canvasProperties.mapTypeId,
				mapTypeControlOptions: {
					style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
					position: google.maps.ControlPosition.TOP_RIGHT
				}
			  };
			  //alert (JSON.stringify(canvasProperties));
				//alert (JSON.stringify(mapConf));

				map = new google.maps.Map(document.getElementById(canvasId), mapConf);

			}

			google.maps.event.addListenerOnce(map,'tilesloaded',this.initMarkers);
			//this.initMarkers();
			if (typeof canvasProperties.editable !== "undefined" && canvasProperties.editable == true)
				google.maps.event.addListenerOnce(map,'tilesloaded',this.makeEditable);

			//this.initMarkers();
		},
		initMarkers:function() {
			//alert(canvasProperties.mapType);
			if (canvasProperties.mapType == "collected") {
				setupFilterClickEvent();
				//alert("setting up filterclickevents");
			}
			if (typeof markers == 'undefined') {
				//alert("The maps got no markers");

			} else if (canvasProperties.mapType == "collected" && markers.length > 0) {
				//alert("Sökte och fann "+markers.length+" saker att plutta ut...");

				bounds = new google.maps.LatLngBounds();
				for (i=0;i<markers.length;i++) {
					poi = markers[i];
					if ((typeof poi.position.a !== "undefined") && (typeof poi.position.b !== "undefined"))
					latLng = new google.maps.LatLng(poi.position.a, poi.position.b);
					else if ((typeof poi.position.b !== "undefined") && (typeof poi.position.c !== "undefined"))
					latLng = new google.maps.LatLng(poi.position.b, poi.position.c);
					//alert("pluttar ut: "+poi.position.a);
					markerSettings = {
						position: latLng,
						title: poi.mapTitle,
						map: map
					}
					if (poi.mapObjectIcon != "")
						markerSettings['icon'] = poi.mapObjectIcon;
					marker = new google.maps.Marker(markerSettings);


					attachInfoWindow(marker,i);


					realMarkers.push(marker);
					if (poi.connect)
						connectedMarkers.push(marker);
					if (canvasProperties.customPredefinedSearch) {
						if (!bounds.contains(latLng)) {
							bounds.extend(latLng);
						}
					}
				}
				if (connectedMarkers.length > 1)
					initDirections();
				
				if (canvasProperties.customPredefinedSearch) {
					map.fitBounds(bounds);
					//map.setCenter(bounds.getCenter());
				}
			} else if (canvasProperties.mapType == "object") {
				//alert(typeof canvasProperties.markers);
				if (typeof canvasProperties.markers === "undefined") {
				latLng = new google.maps.LatLng(map.getCenter().lat(), map.getCenter().lng());
				realMarkers.push(new google.maps.Marker({
						position: latLng,
						title: "Kartmarkör",
						map: map
					}));
				} else {
					for (i=0;i<canvasProperties.markers.length;i++) {
						//alert(JSON.stringify(canvasProperties.markers[i]));
						poi = canvasProperties.markers[i];
						if ((typeof poi.position.a !== "undefined") && (typeof poi.position.b !== "undefined"))
						latLng = new google.maps.LatLng(poi.position.a, poi.position.b);
						else if ((typeof poi.position.b !== "undefined") && (typeof poi.position.c !== "undefined"))
						latLng = new google.maps.LatLng(poi.position.b, poi.position.c);
						//latLng = new google.maps.LatLng(poi.position.b, poi.position.c);
						//alert("pluttar ut: "+poi.displayAddress);
						realMarkers.push(new google.maps.Marker({
							position: latLng,
							title: poi.geocodeAddress,
							map: map
						}));

					}
				}
			}
		},
		updateMarkers:function() {
			if (typeof markers == 'undefined') {
				//alert("The maps got no markers");

			} else {
				//alert("Sökte och fann "+markers.length+" saker att plutta ut...");
				connectedMarkers = new Array();
				for (i=0;i<realMarkers.length;i++) {
					realMarkers[i].setMap(null);
				}
				if (path != null)
					path.setMap(null);
				bounds = new google.maps.LatLngBounds();
				for (i=0;i<markers.length;i++) {
					poi = markers[i];
					if ((typeof poi.position.a !== "undefined") && (typeof poi.position.b !== "undefined"))
					latLng = new google.maps.LatLng(poi.position.a, poi.position.b);
					else if ((typeof poi.position.b !== "undefined") && (typeof poi.position.c !== "undefined"))
					latLng = new google.maps.LatLng(poi.position.b, poi.position.c);

					//alert("pluttar ut: "+poi.position.a);
					markerSettings = {
						position: latLng,
						title: poi.mapTitle,
						map: map
					}
					if (poi.mapObjectIcon != "")
						markerSettings['icon'] = poi.mapObjectIcon;
					marker = new google.maps.Marker(markerSettings);


					attachInfoWindow(marker,i);


					realMarkers.push(marker);
					if (poi.connect)
						connectedMarkers.push(marker);
					if (!bounds.contains(latLng)) {
						//alert ("extending bounds to..." + JSON.stringify(latLng))
						bounds.extend(latLng);
					}
				}
				if (connectedMarkers.length > 1)
					initDirections();
				}
				//alert(JSON.stringify(bounds));
				map.fitBounds(bounds);
				map.setCenter(bounds.getCenter());

		},
		makeEditable:function () {
			makeEditableButton();
		}
	}
	return construct;
};

google.maps.event.addDomListener(window, 'load', initializeMaps);

