﻿/// <reference path="~/scripts/jsonhelper.js" />
/// <reference path="~/scripts/conf/ui.js" />

ui.map = {
	gmap: undefined,
	infoWindow: undefined,
	markersBounds: undefined,
	allowedBounds: undefined,
	center: undefined,
	doLatLngSearch: false,
	initialized: false,
	regions: undefined,
	regionSearch: false,

    DEFAULT_ZOOM: 6,

	// --------------------------------------------------------

	init: function() {
		if (!this.initialized) {
			//console.info("ui.map init");

		    this.center = new GLatLng(55.924586, 10.524902);

			this.gmap = new GMap2(document.getElementById("map_container"), { size: new GSize(682, 360) });

			this.gmap.setMapType(G_NORMAL_MAP);

			var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(15, 15));

			this.gmap.addControl(new GLargeMapControl3D());
			this.gmap.addControl(new GMenuMapTypeControl(), topRight);
			this.gmap.enableScrollWheelZoom();

			this.zoomDefault();

			this.gmap.savePosition();

			//this.allowedBounds = new GLatLngBounds(new GLatLng(49.5, -10), new GLatLng(59, 2.6));

			var mt = this.gmap.getMapTypes();
			for (var i = 0; i < mt.length; i++) {
				mt[i].getMinimumResolution = function() { return 6; }
				//mt[i].getMaximumResolution = function() { return 12; }
			}

			this.infoWindow = this.gmap.getInfoWindow();

			GEvent.addListener(this.gmap, "moveend", this.updated);

			this.markersBounds = new GLatLngBounds();

			this.initialized = true;
		}
	},

	// --------------------------------------------------------

	addHotels: function(hotels, autoZoom) {
		//console.info("ui.map addHotels");

		ui.map.gmap.clearOverlays();
		ui.map.markersBounds = new GLatLngBounds();

		var iconDefault = new GIcon(G_DEFAULT_ICON);
		iconDefault.image = "/assets/images/conf/icon_map.png";
		iconDefault.iconAnchor = new GPoint(16, 32);
		iconDefault.iconSize = new GSize(32, 32);
		iconDefault.shadowSize = new GSize(48, 32);
		iconDefault.infoWindowAnchor = new GPoint(16, 0);

		var markerDefault = { icon: iconDefault };

		/*
		var iconAdded = new GIcon(G_DEFAULT_ICON);
		iconAdded.image = "/assets/images/conf/icon_added.png";
		iconAdded.iconAnchor = new GPoint(16, 32);
		iconAdded.iconSize = new GSize(32, 32);
		iconAdded.shadowSize = new GSize(48, 32);
		iconAdded.infoWindowAnchor = new GPoint(16, 0);

		var markerAdded = { icon: iconAdded };
		
		icon: ui.cart.isHotelInCart(hotel.Id) ? markerDefault : markerDefault
		*/

		$.each(hotels, function(i, hotel) {
			markerDefault.title = hotel.Name;

			var latlng = new GLatLng(parseFloat(hotel.Latitude), parseFloat(hotel.Longitude));
			var marker = new GMarker(latlng, markerDefault);

			GEvent.addListener(marker, "click", function() {
			    var html = "<h1>" + hotel.Name + "</h1><br /><a href='/" + hotel.FriendlyCategorizedUrl + "'>Se Detaljer</a> - <a href='javascript:ui.search.addToCart({ Id:" + hotel.Id + ", Name:\"" + hotel.Name + "\"});'>Tilføj til arrangement</a>";
				marker.openInfoWindowHtml(html);
			});

			ui.map.gmap.addOverlay(marker);
			ui.map.markersBounds.extend(latlng);
		});

		ui.map.doLatLngSearch = !autoZoom;

		if (autoZoom) {
			if (hotels.length == 0) {
				ui.map.zoomDefault();
			} else {
				ui.map.zoomMarkerBounds();
			}
		}
	},

	// --------------------------------------------------------

	zoomDefault: function() {
	    this.gmap.setCenter(ui.map.center, ui.map.DEFAULT_ZOOM);
	},

	// --------------------------------------------------------

	zoomMarkerBounds: function() {
		var markersCenter = this.markersBounds.getCenter();
		var markersZoom = this.gmap.getBoundsZoomLevel(this.markersBounds);

		this.gmap.setCenter(markersCenter, Math.min(markersZoom, 12));
	},

	// --------------------------------------------------------

	updated: function() {
		//console.info("ui.map updated");
		//console.info("ui.map.regionSearch: " + ui.map.regionSearch);

		//ui.map.gmap.getCenter() != ui.map.center
		if (ui.map.infoWindow.isHidden() && ui.map.doLatLngSearch) {

			if (!ui.map.regionSearch) {
				$("label[for='dd_region'] + .jqTransformSelectWrapper li a").toggleClass("selected", false);
				$("label[for='dd_region'] + .jqTransformSelectWrapper li a:first").toggleClass("selected", true);
				$("label[for='dd_region'] + .jqTransformSelectWrapper span").html("-");

				$("select#dd_region").val(0);
			}

			ui.search.doLatLongSearch(ui.map.gmap.getBounds(), ui.map.regionSearch);
		}

		ui.map.regionSearch = false;
		ui.map.doLatLngSearch = true;
	},

	// --------------------------------------------------------

	initializeRegions: function(regions) {
		//console.info("ui.map initializeRegions");

		this.regions = regions;
	},

	// --------------------------------------------------------

	zoomRegion: function(id) {
		//console.info("ui.map zoomRegion");

		var region;

		for (var i = 0; i < this.regions.length; i++) {
			region = this.regions[i];
			if (id == region.Id)
				break;
		}

		ui.map.regionSearch = true;

		var bounds = new GLatLngBounds(new GLatLng(region.LatitudeSouthWest, region.LongitudeSouthWest), new GLatLng(region.LatitudeNorthEast, region.LongitudeNorthEast));

		var center = bounds.getCenter();
		var zoom = this.gmap.getBoundsZoomLevel(bounds);

		this.gmap.setCenter(center, zoom);

		if (!$("div#search_result").is(':visible')) {
			ui.search.doLatLongSearch(bounds, true);
		}
	},

	// -------------------------------------------------------

	checkBounds: function() {
		// Perform the check and return if OK
		if (ui.map.allowedBounds.contains(ui.map.gmap.getCenter())) {
			return;
		}
		// It's not OK, so find the nearest allowed point and move there
		var C = ui.map.gmap.getCenter();
		var X = C.lng();
		var Y = C.lat();

		var AmaxX = ui.map.allowedBounds.getNorthEast().lng();
		var AmaxY = ui.map.allowedBounds.getNorthEast().lat();
		var AminX = ui.map.allowedBounds.getSouthWest().lng();
		var AminY = ui.map.allowedBounds.getSouthWest().lat();

		if (X < AminX) { X = AminX; }
		if (X > AmaxX) { X = AmaxX; }
		if (Y < AminY) { Y = AminY; }
		if (Y > AmaxY) { Y = AmaxY; }
		//alert ("Restricting "+Y+" "+X);
		ui.map.gmap.setCenter(new GLatLng(Y, X));
	}
};
