﻿/// <reference path="./ContextUtil.js" />


Agility.RegisterNamespace("Subaru.MapUtils");

(function(MapUtils) {


    MapUtils.map = null;
    MapUtils._mapDivID = null;
    MapUtils.MinZoomLevelForActivities = 3;
    MapUtils.DataRecordOffset = 0;
    MapUtils.MaxRecordsPerCall = 25;
    MapUtils.MinZoomLevelForActivities = 16;
    MapUtils.ModeIsPreview = false;
    MapUtils.MapMode = "Default";


    MapUtils.TopLeft = null;
    MapUtils.TopRight = null;
    MapUtils.BottomLeft = null;
    MapUtils.BottomRight = null;
    MapUtils.NotHereLayer = null;
    MapUtils.ActivityPointLayer = null;

    MapUtils.NotHereImageUrl = null;

    MapUtils.LoadedActivities = new Array();
    MapUtils.RouteLayer = null;
    MapUtils.ClickedShape = null;
    MapUtils.SelectedActivityID = null;
    MapUtils.ClientToken = null;
    MapUtils.IsFirstLoad = true;


    MapUtils.MapEdge =
        {
            TopLeft: 0,
            TopRight: 1,
            BottomLeft: 2,
            BottomRight: 3
        };

    MapUtils.GetMap = function() {
        return MapUtils.map;
    }

    MapUtils.GetMapDiv = function() {
        if (MapUtils._mapDivID != null) {
            return $("#" + MapUtils._mapDivID);
        }
        return null;
    }

    var _mapLoaded = false;

    MapUtils.InitializeMap = function(divName, isPreview, notHereImageURL, clientToken) {

        MapUtils._mapDivID = divName;

        MapUtils.ModeIsPreview = isPreview;
        MapUtils.NotHereImageUrl = notHereImageURL;
        MapUtils.SetMapHeight(MapUtils.ModeIsPreview);
        $(window).bind("resize", MapUtils.resizeWindow);
        MapUtils.ClientToken = clientToken;

        Subaru.AgilityData.LoadContentItem("MapSettings", MapUtils.MapSettingsCallback);

        MapUtils.IntializeRoutePointUploads();
    };

    MapUtils.IntializeRoutePointUploads = function() {

        if ((typeof SWFUpload == "undefined") || (SWFUpload == null)) {
            setTimeout(function() { MapUtils.IntializeRoutePointUploads(); }, 500);
            return;
        }

        Agility.UGC.API.GetAllRecordTypes(function(dRecordTypes) {

            if (dRecordTypes.ResponseType == Agility.UGC.API.ResponseType.OK) {

                var lstRecordTypes = $.grep(dRecordTypes.ResponseData, function(elem, index) { return elem.Name == "ActivityPointMetaData"; });

                Agility.UGC.API.GetRecordType(lstRecordTypes[0].ID, function(dRecordType) {
                    if (dRecordType.ResponseType == Agility.UGC.API.ResponseType.OK) {

                        var recordType = dRecordType.ResponseData;

                        Subaru.NewsletterSignup.RenderAttachment(recordType.FieldTypes, "Photo", "hdnRoutePointPhoto", "pnlRoutePointPhotoUpload", "pnlRoutePointPhotoProgress");
                        Subaru.NewsletterSignup.RenderAttachment(recordType.FieldTypes, "Video", "hdnRoutePointVideo", "pnlRoutePointVideoUpload", "pnlRoutePointVideoProgress");
                    }
                });
            }
        });
    }

    MapUtils.MapSettingsCallback = function(data) {

        MapUtils.MinZoomLevelForActivities = Subaru.AgilityData.FindContentItemProperty(data, "MinimumZoomLevel");
        MapUtils.MaxRecordsPerCall = Subaru.AgilityData.FindContentItemProperty(data, "MaximumItemLoadPerZoomLevel");

        if (MapUtils.MinZoomLevelForActivities == null || MapUtils.MinZoomLevelForActivities == undefined) {
            MapUtils.MinZoomLevelForActivities = 16;
        }
        if (MapUtils.MaxRecordsPerCall == null || MapUtils.MaxRecordsPerCall == undefined) {
            MapUtils.MaxRecordsPerCall = 25;
        }

        MapUtils.LoadMap();
        setTimeout("Subaru.MapUtils.LoadDefaultMapEvents()", 1100);
    };

    MapUtils.LoadMap = function() {
        if (MapUtils.map != null) {
            MapUtils.map.Dispose();
        }

        MapUtils.map = new VEMap(MapUtils._mapDivID);
        MapUtils.map.SetDashboardSize(VEDashboardSize.Small);
        MapUtils.map.HideScalebar();

        if (MapUtils.ClientToken.length > 0) {
            MapUtils.map.SetClientToken(MapUtils.ClientToken);
        }

        MapUtils.map.LoadMap();

        //add the activity layer...
        if (MapUtils.ActivityPointLayer == null) {
            //add the layer for all activity points
            MapUtils.ActivityPointLayer = new VEShapeLayer();
            MapUtils.map.AddShapeLayer(MapUtils.ActivityPointLayer);
        }

        //allow the other layers to be on top of this...
        _mapLoaded = true;
    };

    MapUtils.MyHandleTokenError = function() {

    };

    MapUtils.LoadDefaultMapEvents = function() {

        MapUtils.map.AttachEvent("onendzoom", MapUtils.EndZoomHandler);

        MapUtils.map.AttachEvent("onmousedown", MapUtils.MouseHandler);
        MapUtils.map.AttachEvent("onmouseup", MapUtils.MouseHandler);
        MapUtils.map.AttachEvent("onmousemove", MapUtils.MouseHandler);

        MapUtils.map.AttachEvent("onclick", MapUtils.DefaultClickHandler);

        //Hide the default context menu
        if ($.browser.safari) { //Webkit browser Safari or Chrome
            $("div[id$=MainContentArea]").contextMenu("MainMap_RightClick", {
                onContextMenu: function(e) {
                }
            });
        }

        MapUtils.map.AttachEvent("onendzoom", MapUtils.ZoomEnd);
    };

    MapUtils.ZoomEnd = function(e) {
        if ((MapUtils.MapMode != "Route") && (MapUtils.MapMode != "RouteEdit")) {
            if (!MapUtils.IsFirstLoad) {
                MapUtils.ActivityPointLayer.DeleteAllShapes();

                MapUtils.LoadedActivities = new Array();
                MapUtils.LoadActivities();
            }
            MapUtils.IsFirstLoad = false;
        }
    };

    MapUtils.DefaultClickHandler = function(e) {
        MapUtils.HideContextMenu();
        MapUtils.HideAllDialogs();

        if (MapUtils.MapMode == "RouteEdit") {

            return;
        } else if (MapUtils.MapMode == "Route") {

            if (Subaru.ActivityDetails.CurrentActivity.Route == null) {

                return;
            } else {

                if (e.elementID != null) {

                    var pushPin = MapUtils.map.GetShapeByID(e.elementID);
                    if ((pushPin != null) && (pushPin.PointId != null)) {

                        var routePoint = Subaru.ActivityDetails.CurrentActivity.Route[pushPin.PointId];
                        var pixel = MapUtils.map.LatLongToPixel(new VELatLong(pushPin.Latitude, pushPin.Longitude));

                        if (routePoint.Note.length > 0) {
                            MapUtils.ShowViewNoteDialog(routePoint.Note, pixel);
                        }

                        if (routePoint.Photo.length > 0) {
                            MapUtils.ShowViewPhotoDialog(routePoint.Photo, pixel);
                        }

                        if (routePoint.Video.length > 0) {
                            MapUtils.ShowViewVideoDialog(routePoint.Video, pixel);
                        }
                    }
                }
            }
        } else {

            if (e.rightMouseButton) {
                MapUtils.ShowContextMenu(e.clientX, e.clientY, e.latLong);
            }

            if (e.elementID != null) {

                var pushPin = MapUtils.map.GetShapeByID(e.elementID);

                if (pushPin == null) {
                    return;
                }
                if (pushPin.GetType() == VEShapeType.Pushpin) {

                    MapUtils.ClickedShape = null;

                    if (pushPin.IsAreYouHere != null && pushPin.IsAreYouHere == true) {
                        Subaru.WelcomeScreen.ShowNotHereDialog(true);
                    }
                    else {
                        try {
                            //make sure welcome screen is closed
                            Subaru.WelcomeScreen.Close();
                            Subaru.MapUtils.DeleteYouAreHereLayer();
                        }
                        catch (e) {

                        }

                        var zoomLevel = MapUtils.map.GetZoomLevel();


                        if (zoomLevel == 15) {
                            //if the user is already zoomed in... load activity on click
                            Subaru.ActivityDetails.LoadActivity(pushPin.ActivityID);
                            return;
                        }
                        else {

                            MapUtils.ClickedShape = pushPin;
                            var latitude = pushPin.Latitude;
                            var longitude = pushPin.Longitude;

                            var x = 100;
                            var y = 200;

                            var point = new VELatLong(latitude, longitude + 0.015);
                            MapUtils.map.SetCenterAndZoom(point, 15);


                            setTimeout("Subaru.MapUtils.ShowActivityMiniPopup()", 500);
                        }
                    }
                }
            }
        }
    }

    MapUtils.RoutingClickHandler = function(e) {

        MapUtils.HideNoteDialog();
        MapUtils.HidePhotoDialog();
        MapUtils.HideVideoDialog();

        if (e.elementID != null) {

            var shape = MapUtils.map.GetShapeByID(e.elementID);

            Subaru.SubmitActivity.LastSelectedPoint = shape.PointId;
            MapUtils.ShowSubPointMenu();
        } else if (e.rightMouseButton) {

            if ((Subaru.SubmitActivity.Route.points.length >= 25) && ($("#chkRouteControlSnapToRoads").is(":checked"))) {
                //Display an error message
            } else {

                var latLong = MapUtils.map.PixelToLatLong(new VEPixel(e.mapX, e.mapY));
                Subaru.SubmitActivity.Route.points.push(Subaru.SubmitActivity.CreatePointDataItem(latLong.Latitude, latLong.Longitude));
                Subaru.SubmitActivity.LastSelectedPoint = (Subaru.SubmitActivity.Route.points.length - 1);

                MapUtils.HideSubPointMenu();
                MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);

                if (Subaru.SubmitActivity.Route.points.length == 1) {
                    MapUtils.UpdateRouteStartLocation();
                }
            }
        } else {

            $("#SubPointMenu").hide();
        }
    }

    MapUtils.UpdateRouteStartLocation = function() {

        if (Subaru.SubmitActivity.Route.points.length > 0) {
            var latLong = new VELatLong(Subaru.SubmitActivity.Route.points[0].Latitude, Subaru.SubmitActivity.Route.points[0].Longitude);
            MapUtils.map.FindLocations(latLong, MapUtils.FindLocationCallback);
        }
    }

    MapUtils.FindLocationCallback = function(data) {

        if ((data != null) && (data.length > 0)) {
            $("#txtFoundStartLocation_SubmitActivity").val(data[0].Name);
        } else {
            $("#txtFoundStartLocation_SubmitActivity").val($("#txtFindStartLocation_SubmitActivity").val());
        }
    }

    MapUtils.ShowSubPointMenu = function() {

        if (Subaru.SubmitActivity.LastSelectedPoint != null) {
            var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];
            var pixel = MapUtils.map.LatLongToPixel(new VELatLong(point.Latitude, point.Longitude));

            $("#SubPointMenu").css("left", pixel.x);
            $("#SubPointMenu").css("top", pixel.y + MapUtils.map.GetTop() - 123);
            $("#SubPointMenu").show();
        } else {
            MapUtils.HideSubPointMenu();
        }
    }

    MapUtils.HideSubPointMenu = function() {
        $("#SubPointMenu").hide();
    }

    MapUtils.ShowNoteDialog = function() {

        var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];

        if ((point.Photo.length == 0) && (point.Video.length == 0)) {
            MapUtils.HideSubPointMenu();

            var pixel = MapUtils.map.LatLongToPixel(new VELatLong(point.Latitude, point.Longitude));

            $("#RouteControlAddNote").css("left", pixel.x - 80);
            $("#RouteControlAddNote").css("top", pixel.y + MapUtils.map.GetTop() - 12);
            $("#RouteControlAddNote").show();
            $("#txtRouteControlNote").val(Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint].Note);
            $("#txtRouteControlNote").focus();
        }
    }

    MapUtils.ShowViewNoteDialog = function(text, pixel) {

        $("#RouteControlViewNoteText").html(text);
        $("#RouteControlViewNote").css("left", pixel.x - 32);
        $("#RouteControlViewNote").css("top", pixel.y + MapUtils.map.GetTop() - 10);
        $("#RouteControlViewNote").show();
    }

    MapUtils.HideViewNoteDialog = function() {

        $("#RouteControlViewNote").hide();
    }

    MapUtils.ShowViewPhotoDialog = function(url, pixel) {

        var fullUrl = Agility_BaseS3Url + "/" + escape(url);
        $("#RouteControlViewPhotoThumbnail").attr("src", Subaru.TemplateUtils.S3ThumbURL(fullUrl, 100, 50));
        $("#RouteControlViewPhotoThumbnail").click(function() { Subaru.ActivityDetails.ShowGallerySingleItem(fullUrl, "Image"); });

        $("#RouteControlViewPhoto").css("left", pixel.x - 24);
        $("#RouteControlViewPhoto").css("top", pixel.y + MapUtils.map.GetTop() - 3);
        $("#RouteControlViewPhoto").show();
    }

    MapUtils.HideViewPhotoDialog = function() {

        $("#RouteControlViewPhoto").hide();
    }

    MapUtils.ShowViewVideoDialog = function(url, pixel) {

        var fullUrl = Agility_BaseS3Url + "/" + escape(url);
        $("#RouteControlViewVideoThumbnail").click(function() { Subaru.ActivityDetails.ShowGallerySingleItem(fullUrl, "Video"); });

        $("#RouteControlViewVideo").css("left", pixel.x - 24);
        $("#RouteControlViewVideo").css("top", pixel.y + MapUtils.map.GetTop() - 3);
        $("#RouteControlViewVideo").show();
    }

    MapUtils.HideViewVideoDialog = function() {

        $("#RouteControlViewVideo").hide();
    }

    MapUtils.HideAllDialogs = function() {
        MapUtils.HideViewNoteDialog();
        MapUtils.HideViewPhotoDialog();
        MapUtils.HideViewVideoDialog();
    }

    MapUtils.SaveRouteNote = function() {
        Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint].Note = $("#txtRouteControlNote").val();
        MapUtils.HideNoteDialog();
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
    }

    MapUtils.HideNoteDialog = function() {
        $("#txtRouteControlNote").val("");
        $("#RouteControlAddNote").hide();
    }

    MapUtils.ShowPhotoDialog = function() {

        var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];

        if ((point.Note.length == 0) && (point.Video.length == 0)) {

            MapUtils.HideSubPointMenu();

            var pixel = MapUtils.map.LatLongToPixel(new VELatLong(point.Latitude, point.Longitude));

            $("#hdnRoutePointPhoto").val(point.Photo);
            $("#pnlRoutePointPhotoProgress").html(point.PhotoCaption);

            $("#RouteControlAddPhoto").css("left", pixel.x - 73);
            $("#RouteControlAddPhoto").css("top", pixel.y + MapUtils.map.GetTop() - 10);
            $("#RouteControlAddPhoto").show();
        }
    }

    MapUtils.SaveRoutePhoto = function() {

        var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];

        if ($("#pnlRoutePointPhotoProgress").html().indexOf("UploadProgress") > -1) {
            point.Photo = "";
            point.PhotoCaption = "";
        } else {
            point.Photo = $("#hdnRoutePointPhoto").val();
            point.PhotoCaption = $("#pnlRoutePointPhotoProgress").html().replace(/&nbsp;/g, "");
        }

        MapUtils.HidePhotoDialog();
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
    }

    MapUtils.HidePhotoDialog = function() {

        $("#hdnRoutePointPhoto").val("");
        $("#pnlRoutePointPhotoProgress").html("");
        $("#RouteControlAddPhoto").hide();
    }

    MapUtils.ShowVideoDialog = function() {

        var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];

        if ((point.Note.length == 0) && (point.Photo.length == 0)) {

            MapUtils.HideSubPointMenu();

            var pixel = MapUtils.map.LatLongToPixel(new VELatLong(point.Latitude, point.Longitude));

            $("#hdnRoutePointVideo").val(point.Video);
            $("#pnlRoutePointVideoProgress").html(point.VideoCaption);

            $("#RouteControlAddVideo").css("left", pixel.x - 73);
            $("#RouteControlAddVideo").css("top", pixel.y + MapUtils.map.GetTop() - 10);
            $("#RouteControlAddVideo").show();
        }
    }

    MapUtils.SaveRouteVideo = function() {

        var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];

        if ($("#pnlRoutePointVideoProgress").html().indexOf("UploadProgress") > -1) {
            point.Video = "";
            point.VideoCaption = "";
        } else {
            point.Video = $("#hdnRoutePointVideo").val();
            point.VideoCaption = $("#pnlRoutePointVideoProgress").html().replace(/&nbsp;/g, "");
        }

        MapUtils.HideVideoDialog();
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
    }

    MapUtils.HideVideoDialog = function() {

        $("#hdnRoutePointVideo").val("");
        $("#pnlRoutePointVideoProgress").html("");
        $("#RouteControlAddVideo").hide();
    }

    MapUtils.RemoveLastSelectedPoint = function() {

        if ((Subaru.SubmitActivity.LastSelectedPoint != null) && (Subaru.SubmitActivity.LastSelectedPoint < Subaru.SubmitActivity.Route.points.length)) {
            var newArray = [];


            for (var i = 0; i < Subaru.SubmitActivity.Route.points.length; i++) {
                if (i != Subaru.SubmitActivity.LastSelectedPoint) {
                    newArray.push(Subaru.SubmitActivity.Route.points[i]);
                }
            }

            Subaru.SubmitActivity.Route.points = newArray;
        }

        Subaru.SubmitActivity.LastSelectedPoint = null;
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
        MapUtils.HideSubPointMenu();
    }

    MapUtils.AddMidPoint = function() {

        MapUtils.HideSubPointMenu();

        if ((Subaru.SubmitActivity.LastSelectedPoint != null) && (Subaru.SubmitActivity.LastSelectedPoint < Subaru.SubmitActivity.Route.points.length) && (Subaru.SubmitActivity.Route.points.length > 1)) {
            var newArray = [];

            for (var i = 0; i < Subaru.SubmitActivity.Route.points.length; i++) {

                if ((Subaru.SubmitActivity.LastSelectedPoint != 0) && (i == Subaru.SubmitActivity.LastSelectedPoint)) {
                    var latitude = ((Subaru.SubmitActivity.Route.points[i].Latitude + Subaru.SubmitActivity.Route.points[i - 1].Latitude) / 2);
                    var longitude = ((Subaru.SubmitActivity.Route.points[i].Longitude + Subaru.SubmitActivity.Route.points[i - 1].Longitude) / 2);

                    newArray.push(Subaru.SubmitActivity.CreatePointDataItem(latitude, longitude));
                }

                newArray.push(Subaru.SubmitActivity.Route.points[i]);

                if ((Subaru.SubmitActivity.LastSelectedPoint == 0) && (i == 0)) {
                    var latitude = ((Subaru.SubmitActivity.Route.points[i].Latitude + Subaru.SubmitActivity.Route.points[i + 1].Latitude) / 2);
                    var longitude = ((Subaru.SubmitActivity.Route.points[i].Longitude + Subaru.SubmitActivity.Route.points[i + 1].Longitude) / 2);

                    newArray.push(Subaru.SubmitActivity.CreatePointDataItem(latitude, longitude));
                }
            }

            Subaru.SubmitActivity.Route.points = newArray;

            if (Subaru.SubmitActivity.LastSelectedPoint == 0) {
                Subaru.SubmitActivity.LastSelectedPoint = 1;
            }
        }

        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
    }

    MapUtils.ClearActivityRoute = function() {
        Subaru.SubmitActivity.Route.points = [];
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
        MapUtils.HideSubPointMenu();
    }

    MapUtils.RefreshRoute = function() {
        MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
    }

    MapUtils.UpdateView = function(points) {

        var latLongArray = [];

        for (var i = 0; i < points.length; i++) {
            latLongArray.push(new VELatLong(points[i].Latitude, points[i].Longitude));
        }

        MapUtils.map.SetMapView(latLongArray);
    }

    MapUtils.DrawActivityRoute = function(routePoints, snapToRoads) {
        MapUtils.map.DeleteAllShapes();
        var points = new Array();

        for (var i = 0; i < routePoints.length; i++) {
            var point = routePoints[i];
            var latLong = new VELatLong(point.Latitude, point.Longitude)
            points.push(latLong);

            var routePoint = new VEShape(VEShapeType.Pushpin, latLong);
            routePoint.PointId = i;

            var iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/BetweenIcon.png";
            var top = "5";
            var left = "5";

            if ((i == 0) && (MapUtils.MapMode == "RouteEdit")) {
                iconUrl = Subaru.AgilityData.GetActivityTypeIconUrl(Subaru.SubmitActivity.Route.typeId);
                left = "-4";
                top = "-2";
            } else if ((i == 0) && (MapUtils.MapMode == "Route") && (Subaru.ActivityDetails.CurrentActivity.Activity != null)) {
                iconUrl = Subaru.AgilityData.GetActivityTypeIconUrl(Subaru.ActivityDetails.CurrentActivity.Activity.TypeID);
                left = "-4";
                top = "-2";
            } else if ((i == routePoints.length - 1) && (i > 0)) {
                iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/RouteEndIcon.png";
                left = "0";
                top = "-2";
            } else if ((point.Note.length > 0) && (MapUtils.MapMode == "RouteEdit")) {
                iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/NoteIcon.png";
            } else if ((point.Photo.length > 0) && (MapUtils.MapMode == "RouteEdit")) {
                iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/PhotoIcon.png";
            } else if ((point.Video.length > 0) && (MapUtils.MapMode == "RouteEdit")) {
                iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/VideoIcon.png";
            } else if ((point.Note.length > 0) || (point.Photo.length > 0) || (point.Video.length > 0)) {
                iconUrl = "http://getoutmore.s3.amazonaws.com/RouteIcons/AddBetweenIcon.png";
            }


            routePoint.SetCustomIcon("<div style=\'position: relative; top: " + top + "px; left:" + left + "px;\'><img src=\'" + iconUrl + "\'></div>");

            MapUtils.map.AddShape(routePoint);
        }

        if (routePoints.length > 1) {

            var lineColor = new VEColor(143, 104, 0, 1);

            if (MapUtils.MapMode == "RouteEdit") {
                snapToRoads = $("#chkRouteControlSnapToRoads").is(":checked");
            } else if (snapToRoads == null) {
                snapToRoads = false;
            }

            if (!snapToRoads) {
                var routeShape = new VEShape(VEShapeType.Polyline, points);
                routeShape.HideIcon();
                routeShape.SetLineColor(lineColor);
                MapUtils.map.AddShape(routeShape);

                if (MapUtils.MapMode == "RouteEdit") {
                    Subaru.SubmitActivity.UpdateDistance(Subaru.Common.StraightlineDistance(points));
                }
            } else {
                var options = new VERouteOptions();
                options.RouteWeight = 5;
                options.RouteColor = lineColor;
                options.SetBestMapView = false;
                options.DrawRoute = false;
                options.RouteCallback = MapUtils.GetDirectionsCallback;
                options.RouteMode = VERouteMode.Driving;
                options.RouteOptimize = VERouteOptimize.MinimizeDistance; //TODO: refine options.
                options.ShowErrorMessages = false;
                options.DistanceUnit = VERouteDistanceUnit.Kilometer;

                MapUtils.map.GetDirections(points, options);
            }
        } else {

            if (MapUtils.MapMode == "RouteEdit") {
                Subaru.SubmitActivity.UpdateDistance(0);
            }
        }
    }

    MapUtils.GetDirectionsCallback = function(route) {

        if ((route.ShapePoints != null) && (route.ShapePoints.length > 0)) {
            var routeShape = new VEShape(VEShapeType.Polyline, route.ShapePoints);
            routeShape.HideIcon();
            routeShape.SetLineColor(new VEColor(143, 104, 0, 1));
            MapUtils.map.AddShape(routeShape);
        }

        if (MapUtils.MapMode == "RouteEdit") {
            Subaru.SubmitActivity.UpdateDistance(route.Distance);
        }
    }

    MapUtils.HideContextMenu = function() {
        $("#Map_RightClickContextMenu").hide();
    }

    MapUtils.ShowContextMenu = function(clientX, clientY, latLong) {

        if (Subaru.ContextUtil.IsAuthenticated()) {

            var contextMenu = $("#Map_RightClickContextMenu");
            contextMenu.css("left", clientX);
            contextMenu.css("top", clientY);

            contextMenu.show();
        }
    }

    MapUtils.ShowActivityInfoBox = function() {

        var shape;
        for (var i = 0; i < MapUtils.ActivityPointLayer.GetShapeCount(); i++) {
            shape = MapUtils.ActivityPointLayer.GetShapeByIndex(i);
            if (shape.GetType() == VEShapeType.Pushpin) {

                if (shape.ActivityID != null && shape.ActivityID != undefined) {
                    if (shape.ActivityID == MapUtils.SelectedActivityID) {

                        MapUtils.JumpToPoint(shape.Latitude, shape.Longitude);
                        MapUtils.ClickedShape = shape;


                        setTimeout("Subaru.MapUtils.ShowActivityMiniPopup()", 500);
                    }
                }
            }
        }
    }

    MapUtils.ShowActivityMiniPopup = function() {
        if (MapUtils.ClickedShape != null) {

            MapUtils.map.ShowInfoBox(MapUtils.ClickedShape);
        }
    }


    MapUtils.resizeWindow = function(e) {
        MapUtils.SetMapHeight(MapUtils.ModeIsPreview);
    }


    MapUtils.LoadDefaultStartLocation = function(position) {

        //GeoLocation by IP
        if ((_mapLoaded == false) || (Subaru.AgilityData.Provinces == null)) {
            setTimeout(function() {
                MapUtils.LoadDefaultStartLocation();
            }, 50);
            return;
        }

        //do not do the geolocation and are you here if in Route mode on refresh with activity hash
        if ((MapUtils.MapMode != "Route") && (MapUtils.MapMode != "RouteEdit")) {

            var shape = null;
            var lat = null;
            var lon = null;
            var zoom = null;

            var geolocationCookie = $.cookie("Subaru.Geolocation");

            if (position != undefined && position != null && position.coords != undefined && position.coords != null) {

                lat = position.coords.latitude;
                lon = position.coords.longitude;
                zoom = 8;
                MapUtils.AddYouAreHerePushPin(lat, lon);
            } else if ((geolocationCookie != null) && (geolocationCookie.indexOf("^") > -1)) {
                lat = geolocationCookie.substring(0, geolocationCookie.indexOf("^"));
                lon = geolocationCookie.substring(geolocationCookie.indexOf("^") + 1, geolocationCookie.length);
                zoom = 8;
                MapUtils.AddYouAreHerePushPin(lat, lon);
            } else {
                //fix the location to Toronto if none is found			
                lat = 43.675293;
                lon = -79.299902;
                zoom = 6;

                Subaru.WelcomeScreen.ShowNotHereDialog(false);
            }

            MapUtils.map.SetCenterAndZoom(new VELatLong(lat, lon), zoom);

            //load the activities
            setTimeout("Subaru.MapUtils.LoadActivities()", 1000);
        }
    }

    MapUtils.AddYouAreHerePushPin = function(lat, lon) {

        if (MapUtils.NotHereLayer != null) {
            MapUtils.NotHereLayer.DeleteAllShapes();
        }

        shape = new VEShape(VEShapeType.Pushpin, new VELatLong(lat, lon));

        MapUtils.NotHereLayer = new VEShapeLayer();
        MapUtils.map.AddShapeLayer(MapUtils.NotHereLayer);
        shape.SetCustomIcon(MapUtils.NotHereImageUrl);
        shape.IsAreYouHere = true;
        MapUtils.NotHereLayer.AddShape(shape);

    }

    MapUtils.SetLocation = function(city, province, postalCode) {

        var locationStr = "";
        if (postalCode != null && postalCode.length > 0) {
            locationStr = " Canada " + postalCode;
        }
        else {

            locationStr = city + " " + province + " Canada ";
        }

        MapUtils.map.Find(null, locationStr, null, null, null, null, null, null, null, null, Subaru.MapUtils.SetLocationCallback);
    }

    MapUtils.SetLocationCallback = function(layer, resultsArray, places, hasMore, veErrorMessage) {

        if ((places != null) && (places.length > 0)) {
            var newLocation = places[0].LatLong;
            
            if ((newLocation != null) && (newLocation != undefined)) {
            
                var expiryDate = new Date();
                expiryDate.setFullYear(expiryDate.getFullYear() + 100, expiryDate.getMonth(), expiryDate.getDay());
                $.cookie("Subaru.Geolocation", newLocation.Latitude + "^" + newLocation.Longitude, { expires: expiryDate });

                MapUtils.AddYouAreHerePushPin(newLocation.Latitude, newLocation.Longitude);
            }
        }
    }

    MapUtils.DeleteYouAreHereLayer = function() {
        try {
            MapUtils.map.DeleteShapeLayer(MapUtils.NotHereLayer);
        } catch (e) { }
    }

    MapUtils.SetMapHeight = function(isPreview) {
        var mapDivObj = MapUtils.GetMapDiv();
        var windowHeight = $(window).height();

        windowHeight = windowHeight - 204;

        if (isPreview) {
            windowHeight = windowHeight - 84;
        }


        if (windowHeight < 400) {
            windowHeight = 400;
        }

        mapDivObj.height(windowHeight);

    }

    MapUtils.GetMapEdgePoint = function(edge) {
        var x = null;
        var y = null;


        var left = MapUtils.map.GetLeft();
        var top = MapUtils.map.GetTop();



        var mapDivObj = MapUtils.GetMapDiv();

        if (edge == MapUtils.MapEdge.TopLeft) {
            x = left;
            y = top;
        }
        else if (edge == MapUtils.MapEdge.TopRight) {
            x = left + mapDivObj.width();
            y = top;
        }
        else if (edge == MapUtils.MapEdge.BottomLeft) {
            x = left;
            y = top + mapDivObj.height();
        }
        else if (edge == MapUtils.MapEdge.BottomRight) {
            x = left + mapDivObj.width();
            y = top + mapDivObj.height();
        }

        if (x != null && y != null) {
            var Point = MapUtils.map.PixelToLatLong(new VEPixel(x, y));


            return Point;
        }

        return null;

    }

    MapUtils.ClearMap = function() {
        MapUtils.map.Clear();
    }

    MapUtils.LoadMapCorners = function() {
        MapUtils.TopLeft = MapUtils.GetMapEdgePoint(MapUtils.MapEdge.TopLeft);
        MapUtils.TopRight = MapUtils.GetMapEdgePoint(MapUtils.MapEdge.TopRight);
        MapUtils.BottomLeft = MapUtils.GetMapEdgePoint(MapUtils.MapEdge.BottomLeft);
        MapUtils.BottomRight = MapUtils.GetMapEdgePoint(MapUtils.MapEdge.BottomRight);
    }

    MapUtils.EndZoomHandler = function(e) {
        MapUtils.RefreshMapActivities();
        MapUtils.HideAllDialogs();
    }

    MapUtils.EndMouseEventHandler = function(e) {
        MapUtils.RefreshMapActivities();
        MapUtils.HideAllDialogs();
    }

    MapUtils.RefreshMapActivities = function() {

        MapUtils.LoadMapCorners();
        MapUtils.LoadActivities();
    }


    MapUtils.LoadActivities = function() {



        if ((MapUtils.MapMode == "Route") || (MapUtils.MapMode == "RouteEdit")) {
            //do no do the data load operations when in Route Mode
            return;
        }

        if (MapUtils.ActivityPointLayer == null) {
            MapUtils.ActivityPointLayer = new VEShapeLayer();
            MapUtils.map.AddShapeLayer(MapUtils.ActivityPointLayer);
        }

        var currentZoomLevel = MapUtils.map.GetZoomLevel();


        if (currentZoomLevel < MapUtils.MinZoomLevelForActivities) {

            MapUtils.ActivityPointLayer.DeleteAllShapes();

            return;
        }

        MapUtils.LoadMapCorners();

        if (MapUtils.TopLeft == null || MapUtils.TopRight == null || MapUtils.BottomLeft == null || MapUtils.BottomRight == null) {
            return;
        }


        var precision = 4;

        var searchQuery = "";


        if (Subaru.ContextUtil.SelectedActivityType != null && Subaru.ContextUtil.SelectedActivityType > 0) {
            searchQuery += "TypeID = " + Subaru.ContextUtil.SelectedActivityType + " && ";
        }
        if (Subaru.ContextUtil.SelectedProvince != null && Subaru.ContextUtil.SelectedProvince > 0) {
            searchQuery += "ProvinceID = " + Subaru.ContextUtil.SelectedProvince + " && ";
        }
        if (Subaru.ContextUtil.SelectedActivityType != null && Subaru.ContextUtil.SelectedActivityType == -2) {
            searchQuery += "WinterGames = 'True' && ";
        }
        searchQuery += "StartLatitude < " + MapUtils.ShrinkDecimal(MapUtils.TopLeft.Latitude, precision) + " && StartLongitude > " + MapUtils.ShrinkDecimal(MapUtils.TopLeft.Longitude, precision);
        searchQuery += " && StartLatitude < " + MapUtils.ShrinkDecimal(MapUtils.TopRight.Latitude, precision) + " && StartLongitude < " + MapUtils.ShrinkDecimal(MapUtils.TopRight.Longitude, precision);
        searchQuery += " && StartLatitude > " + MapUtils.ShrinkDecimal(MapUtils.BottomLeft.Latitude, precision) + " && StartLongitude > " + MapUtils.ShrinkDecimal(MapUtils.BottomLeft.Longitude, precision);
        searchQuery += " && StartLatitude > " + MapUtils.ShrinkDecimal(MapUtils.BottomRight.Latitude, precision) + " && StartLongitude < " + MapUtils.ShrinkDecimal(MapUtils.BottomRight.Longitude, precision);

        var searchArg = {
            RecordTypeName: "Activity",
            PageSize: MapUtils.MaxRecordsPerCall,
            RecordOffset: MapUtils.DataRecordOffset,
            SortedField: "CreatedOn",
            SortDirection: Agility.UGC.API.SortDirection.DESC,
            Search: searchQuery
        }
        Agility.UGC.API.SearchRecords(searchArg, function(data) {
            if (data.ResponseType != Agility.UGC.API.ResponseType.OK) {

            } else {

                for (var i = 0; i < data.ResponseData.Records.length; i++) {

                    MapUtils.PlaceActivityPin(data.ResponseData.Records[i]);
                }
            }
        });


    }

    MapUtils.AddActivityToDataSet = function(record) {
        MapUtils.LoadedActivities[MapUtils.LoadedActivities.length] = record;
    }

    MapUtils.PlaceActivityPin = function(record) {

        MapUtils.AddActivityToDataSet(record);

        var point = new VELatLong(record.StartLatitude, record.StartLongitude);
        var activity = new VEShape(VEShapeType.Pushpin, point);

        activity.SetDescription(MapUtils.GeneratePopupContent(record));

        var iconURL;

        if (record.WinterGames && (Subaru.AgilityData.FindContentItemProperty(Subaru.AgilityData.WinterGames, "ShowOnActivityMenu").toLowerCase() == "true")) {
            
            iconURL = Subaru.AgilityData.FindContentItemProperty(Subaru.AgilityData.WinterGames, "ActivityIcon");
        } else {
            
            iconURL = Subaru.AgilityData.GetActivityTypeIconUrl(record.TypeID);
        }         

        if (iconURL != null) {

            activity.SetCustomIcon(iconURL);
        }
        activity.ActivityID = record.ID;

        if (MapUtils.ActivityPointLayer == null) {
            MapUtils.ActivityPointLayer = new VEShapeLayer();
            MapUtils.map.AddShapeLayer(MapUtils.ActivityPointLayer);
        }
        MapUtils.ActivityPointLayer.AddShape(activity);
    }


    MapUtils.GeneratePopupContent = function(activityRecord) {
        var divContainer = $(document.createElement("div"));

        var data = new Array();
        data[0] = activityRecord;

        templateUrl = Agility.ResolveUrl("~/ClientTemplates/ActivitySimplePopup.htm");
        divContainer.setTemplateURL(templateUrl);
        //divContainer.setParam("BaseS3Url", Agility_BaseS3Url);
        divContainer.setParam("ReadMoreAndReview", Subaru.AgilityData.GetGlobalLanguageResource("ActivityPopup_ReadMoreAndReview"));
        divContainer.setParam("ImageURL", Subaru.TemplateUtils.S3ThumbURL(Agility_BaseS3Url + "/" + activityRecord.PrimaryImage, 230, 140));

        var count = 0;
        if (activityRecord.LikeCount > 0) {
            count = activityRecord.LikeCount;
        }

        divContainer.setParam("PeopleCallFav", count.toString() + " " + Subaru.AgilityData.GetGlobalLanguageResource("ActivityPopup_PeopleCallFav"));
        divContainer.setParam("SubmittedBy", Subaru.AgilityData.GetGlobalLanguageResource("ActivityPopup_SubmittedBy"));
        //divContainer.setParam("SubmittedByUser", "Subaru");

        divContainer.processTemplate(data);

        var htmlResult = divContainer.html();
        divContainer = null;


        if (htmlResult != null && htmlResult != undefined) {
            return htmlResult;
        }
        else {
            return "Error Loading Activity Data";
        }

    }

    MapUtils.HasRecordBeenPlaced = function(record) {

        if (MapUtils.LoadedActivities != null) {

            for (var i = 0; i < MapUtils.LoadedActivities.length; i++) {

                if (MapUtils.LoadedActivities[i] != null) {

                    if (MapUtils.LoadedActivities[i].ID == record.ID) {

                        return true;
                    }
                }
            }
        }
        return false;
    }

    MapUtils.ShrinkDecimal = function(value, maxDecimalCount) {

        var multiplier = 1;

        for (var i = 0; i < maxDecimalCount; i++) {
            multiplier = multiplier * 10;
        }

        var result = Math.round(value * multiplier) / multiplier;
        return result;
    }

    MapUtils.MapDrag = false;
    MapUtils.CheckForNewActivities = false;
    MapUtils.DragShape = null;

    MapUtils.MouseHandler = function(e) {
        var msg;
        if (e.eventName == "onmousedown") {

            if ((e.elementID != null) && (MapUtils.MapMode == "RouteEdit")) {
                MapUtils.DragShape = MapUtils.map.GetShapeByID(e.elementID);

                if ((MapUtils.DragShape != null) && (MapUtils.DragShape.PointId != null)) {
                    Subaru.SubmitActivity.LastSelectedPoint = MapUtils.DragShape.PointId;
                }

                MapUtils.MapDrag = false;
            } else {
                MapUtils.MapDrag = true
            }
        }
        else if (e.eventName == "onmouseup") {

            if (MapUtils.MapDrag && MapUtils.CheckForNewActivities) {
                MapUtils.RefreshMapActivities();
            }

            if ((MapUtils.DragShape != null) && (Subaru.SubmitActivity.LastSelectedPoint == 0)) {
                MapUtils.UpdateRouteStartLocation();
            }

            MapUtils.MapDrag = false;
            MapUtils.CheckForNewActivities = false;
            MapUtils.DragShape = null;

        } else if (e.eventName == "onmousemove" && MapUtils.MapDrag == true) {

            MapUtils.CheckForNewActivities = true;
        } else if (e.eventName == "onmousemove" && MapUtils.DragShape != null) {

            var newPosition = MapUtils.map.PixelToLatLong(new VEPixel(e.mapX, e.mapY));
            var point = Subaru.SubmitActivity.Route.points[Subaru.SubmitActivity.LastSelectedPoint];
            point.Latitude = newPosition.Latitude;
            point.Longitude = newPosition.Longitude;

            MapUtils.HideSubPointMenu();
            MapUtils.DrawActivityRoute(Subaru.SubmitActivity.Route.points);
            return true;
        }
    }

    MapUtils.ToggleControls = function(turnControlsOn) {
        try {
            if (turnControlsOn) {
                MapUtils.map.ShowDashboard();
            }
            else {
                MapUtils.map.HideDashboard();
            }
        }
        catch (e) {

        }
    }


    MapUtils.ClearAllMapData = function() {

        MapUtils.NotHereLayer = null;
        MapUtils.ActivityPointLayer = null;

        try {
            MapUtils.map.DeleteAllShapes();
        } catch (e) { }

        //MapUtils.LoadMapEvents();
        MapUtils.LoadedActivities = new Array();



    }

    MapUtils.JumpToPoint = function(latitude, longitude, activityID) {

        MapUtils.map.SetCenterAndZoom(new VELatLong(latitude, longitude + 0.015), 15);

        setTimeout("Subaru.MapUtils.LoadActivities()", 800);

        if (activityID != null && activityID != undefined && activityID > 0) {
            MapUtils.SelectedActivityID = activityID;
            setTimeout("Subaru.MapUtils.ShowActivityInfoBox()", 1500);
        }

    }

    MapUtils.ReturnToDefaultMap = function() {
        MapUtils.MapMode = "Default";
        MapUtils.ClearAllMapData();
        MapUtils.LoadActivities();
    }


    MapUtils.CreateRoute = function(StartLat, StartLong, TypeID, MapData) {
        MapUtils.MapMode = "Route";

        MapUtils.JumpToPoint(StartLat, StartLong);

        try {
            if (MapUtils.RouteLayer != null) {
                MapUtils.map.DeleteShapeLayer(MapUtils.RouteLayer);

            }
        }
        catch (e) { }
        MapUtils.RouteLayer = null;
        MapUtils.RouteLayer = new VEShapeLayer();
        MapUtils.map.AddShapeLayer(MapUtils.RouteLayer);



        var point = new VELatLong(StartLat, StartLong);
        var activity = new VEShape(VEShapeType.Pushpin, point);


        var iconURL = Subaru.AgilityData.GetActivityTypeIconUrl(TypeID);

        if (iconURL != null) {
            activity.SetCustomIcon(iconURL);
        }


        MapUtils.RouteLayer.AddShape(activity);

        if (MapData != null && MapData != undefined && MapData != "") {

            var iconURL = "http://getoutmore.s3.amazonaws.com/RoutePoint.png";
            var mappingData = "[" + MapData + "]";

            var mappingDataJSON = eval(mappingData);


            for (var i = 0; i < mappingDataJSON.length; i++) {
                var point = new VELatLong(mappingDataJSON[i].Latitude, mappingDataJSON[i].Longitude);
                var routePoint = new VEShape(VEShapeType.Pushpin, point);
                routePoint.SetCustomIcon(iconURL);


                MapUtils.RouteLayer.AddShape(routePoint);
            }
        }

    }

    MapUtils.ProvinceZoom = function(provinceID) {

        try {
            if (Subaru.AgilityData.Provinces != null && Subaru.AgilityData.Provinces.length > 0) {
                for (var i = 0; i < Subaru.AgilityData.Provinces.length; i++) {
                    if (Subaru.AgilityData.Provinces[i].ProvinceID == provinceID) {
                        var point = new VELatLong(Subaru.AgilityData.Provinces[i].CenterLatitude, Subaru.AgilityData.Provinces[i].CenterLongitude);


                        var zoomLevel = Subaru.AgilityData.Provinces[i].ZoomLevel;
                        zoomLevel = 5;
                        MapUtils.map.SetCenterAndZoom(point, zoomLevel);

                        setTimeout("Subaru.MapUtils.LoadActivities()", 1000);
                        return;
                    }
                }
            }
        }
        catch (e) {
            return;
        }
    }


})(Subaru.MapUtils);



