Fork me on GitHub
Show:

File: ../src/directions/googledirectionsservice.js

define([
  'aeris/util',
  'aeris/util/gmaps',
  'aeris/directions/results/directionsresultsstatus',
  'aeris/directions/promises/promisetofetchgoogledirections',
  'googlemaps!'
], function(_, mapUtils, DirectionsResultsStatus, PromiseToFetchGoogleDirections, gmaps) {


  /**
   * A wrapper around the google directions service.
   *
   * @class aeris.directions.GoogleDirectionsService
   * @implements aeris.directions.DirectionsServiceInterface
   *
   * @constructor
   *
   * @param {Object=} opt_options
   * @param {google.maps.DirectionsService=} opt_options.directionsServiceApi
   */
  var GoogleDirectionsService = function(opt_options) {
    var options = _.defaults(opt_options || {}, {
      PromiseToFetchDirections: PromiseToFetchGoogleDirections
    });

    /**
     * @type {google.maps.DirectionsService}
     * @private
     * @property directionsServiceApi_
     */
    this.directionsServiceApi_ = options.directionsServiceApi || new gmaps.DirectionsService();


    /**
     * Constructor for {aeris.directions.promises.this.PromiseToFetchDirections_}
     * object.
     *
     * @type {Function}
     * @private
     * @default aeris.directions.promises.this.PromiseToFetchDirections_
     * @property PromiseToFetchDirections_
     */
    this.PromiseToFetchDirections_ = options.PromiseToFetchDirections;
  };


  /**
   * @override
   *
   * @param {aeris.maps.LatLon} origin
   * @param {aeris.maps.LatLon} destination
   *
   * @param {Object=} opt_options
   * @param {string=} opt_options.travelMode Defaults to 'WALKING'.
   * @method fetchPath
   */
  GoogleDirectionsService.prototype.fetchPath = function(origin, destination, opt_options) {
    var options = _.defaults(opt_options || {}, {
      travelMode: 'WALKING'
    });
    var promise = new this.PromiseToFetchDirections_();
    var requestObject = this.createRequestObject_(origin, destination, options.travelMode);

    this.requestDirections_(requestObject, function(response, status) {
      promise.settleUsingResponse(response, status);
    });

    return promise;
  };


  /**
   * @param {aeris.maps.LatLon} origin
   * @param {aeris.maps.LatLon} destination
   * @param {string} travelMode
   * @return {google.maps.DirectionsRequest}
   * @private
   * @method createRequestObject_
   */
  GoogleDirectionsService.prototype.createRequestObject_ = function(origin, destination, travelMode) {
    return {
      origin: mapUtils.arrayToLatLng(origin),
      destination: mapUtils.arrayToLatLng(destination),
      travelMode: gmaps.TravelMode[travelMode]
    };
  };


  /**
   * @param {google.maps.DirectionsRequest} requestObj
   * @param {Function} callback
   * @private
   * @method requestDirections_
   */
  GoogleDirectionsService.prototype.requestDirections_ = function(requestObj, callback) {
    this.directionsServiceApi_.route(requestObj, _.bind(callback, this));
  };



  return _.expose(GoogleDirectionsService, 'aeris.directions.GoogleDirectionsService');
});