private bool SendMovedStopToGEP(Stop stopToMove, Stop beforeStop)
        {
            Graphic newStop = CreateNewStopToMove(stopToMove, beforeStop);
              if (newStop == null)
            return false;

              return SendStopToGEP(newStop, "Move Stop");
        }
        private Graphic CreateNewStopToMove(Stop stopToMove, Stop beforeStop)
        {
            string sequenceFieldAlias = Stop.SequenceFieldAlias;
              string sequenceFieldName = beforeStop.AliasToName(sequenceFieldAlias);
              if (stopToMove.Graphic == null || !stopToMove.Graphic.Attributes.ContainsKey(sequenceFieldName))
            return null;
              if (beforeStop.Graphic == null || !beforeStop.Graphic.Attributes.ContainsKey(sequenceFieldName))
            return null;

              object newSequence = CalculateMovedStopNewSequence(stopToMove, beforeStop);
              if (newSequence == null)
            return null;

              Graphic newStop = Helper.CloneGraphic(stopToMove.Graphic);
              newStop.Attributes[sequenceFieldName] = newSequence;

              return newStop;
        }
 private bool MoveStop(Stop stopToMove, Stop beforeStop)
 {
     //return CalculateRoute(stopToMove, beforeStop, false);
       //return AddMovedStopToPending(stopToMove, beforeStop);
       return SendMovedStopToGEP(stopToMove, beforeStop);
 }
        private Graphic CreateNewStopToAdd(Stop beforeStop, int durationInMinutes)
        {
            string sequenceFieldAlias = Stop.SequenceFieldAlias;
              string sequenceFieldName = beforeStop.AliasToName(sequenceFieldAlias);
              if (beforeStop.Graphic == null || !beforeStop.Graphic.Attributes.ContainsKey(sequenceFieldName))
            return null;

              Graphic newStop = Helper.CloneGraphic(beforeStop.Graphic);

              // sequence
              object newSequence = beforeStop.GetPropertyValue(sequenceFieldAlias);
              newStop.Attributes[sequenceFieldName] = newSequence;

              // name
              string idFieldAlias = Stop.IdFieldAlias;
              string idFieldName = beforeStop.AliasToName(idFieldAlias);
              string newName = "Break-" + _routeName + "-Created-" + DateTime.Now.ToString("MM_dd-HH_mm_ss");
              newStop.Attributes[idFieldName] = newName;

              // type
              string typeFieldAlias = Stop.TypeFieldAlias;
              string typeFieldName = beforeStop.AliasToName(typeFieldAlias);
              string typeBreak = Stop.BreakType;
              newStop.Attributes[typeFieldName] = typeBreak;

              // scheduled duration
              string scheduledDurationFieldAlias = Stop.ScheduledDurationFieldAlias;
              string scheduledDurationFieldName = beforeStop.AliasToName(scheduledDurationFieldAlias);
              newStop.Attributes[scheduledDurationFieldName] = durationInMinutes;

              return newStop;
        }
        private Graphic CreateNewStopToEdit(Stop stop, int durationInMinutes)
        {
            if (stop.Graphic == null)
            return null;

              Graphic newStop = Helper.CloneGraphic(stop.Graphic);

              // scheduled duration
              string scheduledDurationFieldAlias = Stop.ScheduledDurationFieldAlias;
              string scheduledDurationFieldName = stop.AliasToName(scheduledDurationFieldAlias);
              newStop.Attributes[scheduledDurationFieldName] = durationInMinutes;

              return newStop;
        }
        private object CalculateMovedStopNewSequence(Stop stopToMove, Stop beforeStop)
        {
            if (stopToMove == null)
            return null;
              if (beforeStop == null)
            return null;

              string sequenceFieldAlias = Stop.SequenceFieldAlias;

              ICollectionView cv = CollectionViewSource.GetDefaultView(Items);
              int newSequence = 0;
              foreach (Stop stop in cv)
              {
            if (stop == beforeStop)
              return stopToMove.ConvertValueByPropertyType(sequenceFieldAlias, newSequence);
            if (stop != stopToMove)
              newSequence++;
              }

              return null;
        }
        private bool CalculateRoute(Stop stopToMove, Stop beforeStop, bool bOptimize)
        {
            if (stopToMove == null)
            return false;
              if (beforeStop == null)
            return false;

              string fromRouteName = stopToMove.GetPropertyValueAsString(Stop.RouteNameFieldAlias);
              string toRouteName   = beforeStop.GetPropertyValueAsString(Stop.RouteNameFieldAlias);

              // create a list of stops in the new order
              List<string> stops = new List<string>();

              ICollectionView cv = CollectionViewSource.GetDefaultView(Items);
              foreach (Stop stop in cv)
              {
            if (stop == beforeStop)
              stops.Add("\"" + stopToMove.GetPropertyValueAsString(Stop.IdFieldAlias) + "\"");
            if (stop != stopToMove)
              stops.Add("\"" + stop.GetPropertyValueAsString(Stop.IdFieldAlias) + "\"");
              }

              // return if there is nothing to do
              if (stops == null)
            return true;

              // create a list of requests
              List<string> calculateRequests = new List<string>();
              calculateRequests.Add(FormulateHttpRouteRequestBody(fromRouteName, stops, false));

              // merge all requests to one request
              string requestId = GenerateRequestId("Calculate-Routes");
              string httpRequestBodyJSON = "{\"route\":[";
              httpRequestBodyJSON += String.Join(",", calculateRequests);
              httpRequestBodyJSON += "],\"commit\":true,\"RequestId\":\"" + requestId + "\"}";
              string uri = AppSettings.GetCalculateRoutesUrl() + ".json";
              PostHttpRequest(uri, httpRequestBodyJSON, "Calculate Routes");

              return true;
        }
        private bool AddMovedStopToPending(Stop stopToMove, Stop beforeStop)
        {
            Graphic newStop = CreateNewStopToMove(stopToMove, beforeStop);
              if (newStop == null)
            return false;

              _flStopsPending.AddFeature(newStop, false);
              _flStopsPending.SaveEdits();
              _flStopsPending.Update();
              return true;
        }
 protected void OnEdit(object stopObject)
 {
     _editStop = stopObject as Stop;
 }
 protected void OnAdd(object stopObject)
 {
     _addStopBeforeStop = stopObject as Stop;
 }
 protected override Item CreateItem()
 {
     Item stop = new Stop(this);
       return stop;
 }
        private void SetStopStatus(Stop stop, string status, string remark)
        {
            if (stop == null || status == null)
            return;

              _skipUpdates = true;

              //RefreshStopsFeatureLayer();

              // find the corresponding feature
              Graphic feature = _flStops.FindFeatureByOID(stop.Graphic);
              if (feature == null)
              {
            _skipUpdates = false;
            return;
              }

              // Set the status
              SetItemAttribute(stop, feature, Stop.StatusFieldAlias, status);

              // Set the remark
              if (remark != null)
            SetItemAttribute(stop, feature, Stop.RemarkFieldAlias, remark);

              // Stop Last Updated
              DateTime now = DateTime.Now;
              SetItemAttribute(stop, feature, Stop.LastUpdatedFieldAlias, now);

              // Stop Actual Arrival
              if (status.Equals("AtStop"))
            SetItemAttribute(stop, feature, Stop.ActualArrivalFieldAlias, DateTime.Now);

              if (status.Equals("Completed") || status.Equals("Exception"))
              {
            // Stop Actual Departure
            string stopsActualDepartureAlias = ConfigurationManager.AppSettings.Get("StopsActualDepartureAlias");
            SetItemAttribute(stop, feature, stopsActualDepartureAlias, now);

            // Stop Actual Duration
            string stopsActualArrivalAlias = ConfigurationManager.AppSettings.Get("StopsActualArrivalAlias");
            object actualArrivalObj = stop.GetPropertyValue(stopsActualArrivalAlias);
            if (actualArrivalObj is DateTime)
            {
              DateTime actualArrival = (DateTime)actualArrivalObj;
              TimeSpan duration = now - actualArrival;
              string stopsActualDurationAlias = ConfigurationManager.AppSettings.Get("StopsActualDurationAlias");
              SetItemAttribute(stop, feature, stopsActualDurationAlias, duration.TotalMinutes);
            }
              }

              _flStopsPending.AddFeature(feature, true);
              _flStopsPending.SaveEdits();
              //_flStopsPending.Update();

              _flStops.SaveEdits();
              _flStops.Update();

              _skipUpdates = false;
        }