public ActionResult BeforeLogin(RouteData routeData)
        {
            if (!ModelState.IsValid)
                return new JsonResult { Data = new { Completed = false, Reason = "Please provide a route name." } };

            Trace.TraceInformation("Saving route before login process - id {0}, name {1}, notes {2}, is public? {3}, points: {4}", routeData.Id, routeData.Name, routeData.Notes, routeData.Public, routeData.Points);
            Session["rp_RouteInfoPreLogin"] = routeData;

            return new JsonResult { Data = new { Completed = true } };
        }
        public ActionResult Save(RouteData routeData)
        {
            if (!ModelState.IsValid)
                return new JsonResult { Data = new { Completed = false, Reason = "Please provide a route name." } };
            if (!ControllerContext.HasValidUserAccount())
                return new JsonResult { Data = new { Completed = false, Reason = "Please create an account." } };

            var userUnits = ControllerContext.UserDistanceUnits();
            Distance distance = new Distance(routeData.Distance, userUnits);

            Trace.TraceInformation("Saving route {0} name {1}, notes {2}, is public? {3}, points: {4}", routeData.Id, routeData.Name, routeData.Notes, routeData.Public, routeData.Points);

            string lastRun;
            string lastRunBy;
            if (routeData.Id == 0)
            {
                var newRoute = MassiveDB.Current.CreateRoute(ControllerContext.UserAccount(), routeData.Name, routeData.Notes ?? "", distance, (routeData.Public ?? false) ? Route.PublicRoute : Route.PrivateRoute, routeData.Points);
                routeData.Id = Convert.ToInt64(newRoute.Id);
                lastRun = "";
                lastRunBy = "";
            }
            else
            {
                var currentRoute = MassiveDB.Current.FindRoute(routeData.Id);
                var currentUser = ControllerContext.UserAccount();
                var isRouteOwnedByAnotherUser = currentUser.Id != currentRoute.Creator;

                if (isRouteOwnedByAnotherUser && currentRoute.RouteType != Route.PublicRoute.ToString())
                    return new JsonResult { Data = new { Completed = false, Reason = "Cannot save the route - you can only save routes you have created." } };

                if (isRouteOwnedByAnotherUser || currentRoute.MapPoints != routeData.Points)
                {
                    if (!isRouteOwnedByAnotherUser)
                    {
                        // delete old
                        currentRoute.RouteType = Route.DeletedRoute;
                        MassiveDB.Current.UpdateRoute(currentRoute);
                    }

                    // add new
                    currentRoute = MassiveDB.Current.CreateRoute(currentUser, routeData.Name, routeData.Notes ?? "", distance, (routeData.Public ?? false) ? Route.PublicRoute : Route.PrivateRoute, routeData.Points, currentRoute.Id);
                    routeData.Id = Convert.ToInt64(currentRoute.Id);

                    lastRun = "";
                    lastRunBy = "";
                }
                else
                {
                    currentRoute.Name = routeData.Name;
                    currentRoute.Notes = routeData.Notes ?? "";
                    currentRoute.RouteType = (routeData.Public ?? false) ? Route.PublicRoute : Route.PrivateRoute;

                    MassiveDB.Current.UpdateRoute(currentRoute);

                    // get last run info
                    var runInfo = MassiveDB.Current.FindLatestRunLogForRoutes(new[] { routeData.Id }).FirstOrDefault();
                    if (runInfo == null)
                    {
                        lastRunBy = "";
                        lastRun = "";
                    }
                    else
                    {
                        lastRunBy = runInfo.DisplayName;
                        lastRun = runInfo.Date == null ? "" : runInfo.Date.ToString("ddd, dd/MMM/yyyy");
                    }
                }
            }

            return new JsonResult { Data = new { Completed = true, Route = new { Id = routeData.Id, Name = routeData.Name, Notes = routeData.Notes ?? "", Public = routeData.Public ?? false, Points = routeData.Points, Distance = distance.BaseDistance, LastRun = lastRun, PublicOther = false, Deleted = false } } };
        }