﻿var MarkerType = (function () {
  var position = new google.maps.Point(9, 34);
  var customPosition = new google.maps.Point(13, 36);
  var blipPosition = new google.maps.Point(8, 16);
    
  var newMarker = function (icon, markerPosition) {
    return new google.maps.MarkerImage(icon, null, null, markerPosition);
  };
  return {
    Position: position,
    CustomPosition: customPosition,
    Standard: {
      toString: function () { return "MarkerType.Standard"; },
      MarkerImage: newMarker(CurrentBrowser.mobile ? "/Images/Markers/marker-big.png" : "/Images/Markers/marker.png", position),
      MarkerShadow: newMarker(CurrentBrowser.mobile ? "/Images/Markers/shadow50-big.png" : "/Images/Markers/shadow50.png", position)
    },
    Selected: {
      toString: function () { return "MarkerType.Selected"; },
      MarkerImage: newMarker(CurrentBrowser.mobile ? "/Images/Markers/blue_Marker-big.png" : "/Images/Markers/blue_Marker.png", position),
      MarkerShadow: newMarker(CurrentBrowser.mobile ? "/Images/Markers/shadow50-big.png" : "/Images/Markers/shadow50.png", position)
    },
    TideGauge: {
      toString: function () { return "MarkerType.TideGauge"; },
      MarkerImage: newMarker("/Images/Markers/tideGauge.png", customPosition),
      MarkerShadow: newMarker("/Images/Markers/shadow.png", customPosition)
    },
    StreamGauge: {
      toString: function () { return "MarkerType.StreamGauge"; },
      MarkerImage: newMarker("/Images/Markers/streamGauge.png", customPosition),
      MarkerShadow: newMarker("/Images/Markers/shadow.png", customPosition)
    },
    Blip: {
      toString: function () { return "MarkerType.Blip";  },
      MarkerImage: newMarker(CurrentBrowser.mobile ? "/Images/Markers/blip-big.gif" : "/Images/Markers/blip.gif", blipPosition)
    }
  };
})();

if (!MarkerController) {
  var MarkerController = {
    selectedMarkerId: null,
    selectedMarkerType: null,
    setMarker: function (latitude, longitude, markerType) {
      if (!latitude || !longitude)
        return;

      latitude = latitude.toString().replace(",", ".");
      longitude = longitude.toString().replace(",", ".");
      MapState.currentLatLng = new google.maps.LatLng(latitude, longitude);

      var request = {
        Latitude: latitude,
        Longitude: longitude,
        MarkerType: markerType ? markerType.toString() : MarkerType.Standard.toString()
      };

      AjaxCommands.submitJson(request, "Marker", "Create", "", function () {
        MarkerController.createNewMarker("", markerType, function () {
          MapController.setCurrentMarkerData(MapState.currentLatLng.lat(), MapState.currentLatLng.lng(), null, markerType ? markerType : MarkerType.Standard);
        });
      });
    },
    createNewMarker: function (markerId, markerType, persistSelection, callback) {
      if (persistSelection == null)
        persistSelection = true;
      if (markerId == "" && persistedAjaxResult != null) {
        markerId = persistedAjaxResult;
      }
      if (markerId == "") markerId = 0;
      var marker = new google.maps.Marker({ position: MapState.currentLatLng, map: MapState.map, draggable: true, id: markerId });
      if (markerType) {
        marker.setIcon(markerType.MarkerImage);
        marker.setShadow(markerType.MarkerShadow);
        marker.setDraggable(false);
      }
      MapState.MarkerCollection.push(marker);
      MapController.bindMarkerEvents(marker);
      MapController.setSelectedMarker(marker, persistSelection);

      if (callback)
        callback();
    },
    updateMarker: function (marker) {
      var request = {
        MarkerId: marker.id,
        Latitude: marker.position.lat(),
        Longitude: marker.position.lng(),
        MarkerType: marker.markerType
      };

      AjaxCommands.submitJson(request, "Marker", "Update", "", function () {
        MarkerController.getTripMarkers(TripController.selectedTripId);
      });
    },
    deleteMarker: function (force, marker) {
      if (MapState.selectedMarker == null && marker == null)
        return;

      if (marker == null)
        marker = MapState.selectedMarker;
      
      if (force || confirm(Resources.Marker_DeleteConfirm)) {
        var markerId = marker.id;
        marker.setMap(null);
        MapController.removeMarker(marker);
        
        if (marker == MapState.selectedMarker) {
          MapController.statusDiv.html(Resources.Global_Location + " " + Resources.Marker_NoneSelected);
        }

        if (Session.authenticated && markerId != "0" && markerId != String.empty) {
          var request = {
            MarkerId: markerId
          };

          AjaxCommands.submitJson(request, "Marker", "Delete", "", function () {
            MarkerController.getTripMarkers(TripController.selectedTripId);
          });
        }
        $(document).trigger("marker-deselected", [markerId]);
      }
    },
    getMarkerNotes: function () {
      AjaxCommands.submitHiddenForm(document.forms["frmMarkerNote"], "MarkerNotes", "Index", "notesContainer");
    },
    updateMarkerNote: function (form) {
      form["markerId"].value = MarkerController.selectedMarkerId;
      AjaxCommands.submitHiddenForm(form, "MarkerNotes", "Update", "");
      $("#notesContainer").hide(UIConstants.speed);
    },
    getTripMarkers: function (tripId) {
      if (tripId)
        AjaxCommands.submitGet("/Marker/TripMarkers/" + tripId, "markersAjaxContainer", function () { $(document).trigger("trip-markers-loaded", [tripId]); });
    }
  };
} 

