Fork me on GitHub
Show:

File: ../src/maps/gmaps/layers/googlemaptype.js

define([
  'aeris/util',
  'aeris/errors/invalidargumenterror',
  'aeris/maps/strategy/layers/abstractmaptype',
  'googlemaps!'
], function(_, InvalidArgumentError, BaseLayerStrategy, gmaps) {
  /**
   * Strategy for basic map types
   * (roadmap, satellite, terrain, hybrid)
   *
   * @override
   * @class aeris.maps.gmaps.layers.GoogleMapType
   * @extends aeris.maps.layers.LayerStrategy
   * @constructor
   */
  var GoogleMapTypeStrategy = function(layer) {
    /**
     * @override
     * @property mapTypeId_
     */
    this.mapTypeId_ = gmaps.MapTypeId[layer.get('mapTypeId')];


    /**
     * @override
     * @property isBaseLayer_
     */
    this.isBaseLayer_ = true;

    BaseLayerStrategy.call(this, layer);
  };

  _.inherits(GoogleMapTypeStrategy, BaseLayerStrategy);


  GoogleMapTypeStrategy.prototype.createView_ = function() {
    // Do nothing -- view is created by google maps
    return;
  };


  /**
   * Note that google only provide
   * access to the {google.maps.MapType} instance
   * of basic map types via the {google.maps.Map}'s
   * {google.maps.MapRegistry}.
   *
   * @override
   * @method getView
   */
  GoogleMapTypeStrategy.prototype.getView = function() {
    var view;

    if (this.mapView_) {
      view = this.mapView_.mapTypes.get(this.mapTypeId_);
    }

    if (!view) {
      throw new Error('Unable to return MapType view. ' +
        'Basic Google MapTypes must be set to a map' +
        'before they can provide a view');
    }

    return view;
  };


  /**
   * @override
   * @throws {aeris.errors.InvalidArgumentError}
   *        If attempting to set a GoogleMapType as an
   *        overlay layer.
   * @method setMap
   */
  GoogleMapTypeStrategy.prototype.setMap = function(aerisMap, opt_options) {
    var options = _.extend({
      baseLayer: this.isBaseLayer_
    }, opt_options);

    if (!options.baseLayer) {
      throw new InvalidArgumentError('Basic Google MapTypes cannot ' +
        'be set as overlay map types');
    }

    BaseLayerStrategy.prototype.setMap.apply(this, arguments);
  };


  GoogleMapTypeStrategy.prototype.registerMapType_ = function() {
    // Do nothing -- basic map types are already registered.
    return;
  };


  return GoogleMapTypeStrategy;
});