yagoferrer/map-tools

View on GitHub
lib/addMarker.ts

Summary

Maintainability
B
4 hrs
Test Coverage
/// <reference path="typings/tsd.d.ts"/>

import utils = require('./utils');
import addFilter = require('./addFilter');
import infoWindow = require('./infoWindow');

class AddMarker {
  'use strict';

  private addFilter;
  private infoWindow: any = {};

  private add;


  constructor(public that) {

    var addFilterInstance = new addFilter(that, 'markers');
    this.addFilter = function(filters) {
      return addFilterInstance.addFilter(filters);
    };

    var infoWindowInstance = new infoWindow(that);

    this.infoWindow.addEvents = function(marker, options, map) {
      infoWindowInstance.addEvents(marker, options, map);
    }

  }


  addExtraOptions(marker, options) {
    var i;
    for (i in options) {
      if (options.hasOwnProperty(i)) {
        if (!options.filters) { // Filters is a special property that we don't need to add to the Marker.
          marker[i] = options[i];
        }
      }
    }
  }

  addOptions(marker, instance) {
    if (marker.move) {
      instance.setAnimation(google.maps.Animation[marker.move.toUpperCase()]);
    }

    if (marker.infoWindow) {
      this.infoWindow.addEvents(instance, marker.infoWindow, this.that.instance);
    }

    if (marker.on) {
      this.addEvents(marker, instance);
    }


    if (marker.callback) {
      marker.callback(instance);
    }
  }

  private _addMarker(marker, options): {} {
    marker.map = this.that.instance;
    marker.position = new google.maps.LatLng(marker.lat, marker.lng);


    // Adds options set via 2nd parameter. Overwrites any Marker options already set.
    if (options) {
      this.addExtraOptions(marker, options);
    }


    marker.data = marker.data || {};
    marker.data._self = marker; // This helps me to do later resetMarker()

    this.setUid(marker);

    // Because we are not allowing duplicates
    if (this.that.markers.all[marker.uid]) {
      return false;
    }


    if (options && options.filters) {
      // Only add filters if not defined.
      if (!mapTools.maps[this.that.id].markers.filter) {
        this.addFilter(options.filters);
      }
    }

    var instance = new google.maps.Marker(marker);

    this.that.markers.crossfilter = this.that.markers.crossfilter || this.that.crossfilter([]);
    this.that.markers.filter = this.that.markers.filter || {};
    this.that.markers.crossfilter.add([instance]);


    this.addOptions(marker, instance);

    // Adds Marker Reference of each Marker to "markers.all"
    this.that.markers.all = mapTools.maps[this.that.id].markers.all || {};
    this.that.markers.all[marker.uid] = instance;

    if (marker.tags) {
      this.addMarkerByTag(marker, instance);
    }


    return instance;
  }

  public setUid(marker) {

    if (this.that.uid && marker[this.that.uid]) {
      marker.data.uid = marker[this.that.uid];
      marker.uid = marker.data.uid;
    }

    if (marker.data.uid && !marker.uid) {
      marker.uid = marker.data.uid;
    }


    if (!marker.uid) {
      marker.data.uid = utils.createUid();
      marker.uid = marker.data.uid;
    }
  }

  addMarkerByTag(marker, instance) {

    if (utils.isArray(marker.tags)) {
      var i, tag;
      for (i in marker.tags) {
        if (marker.tags.hasOwnProperty(i)) {
          tag = marker.tags[i];
          this.that.markers.tags[tag] = this.that.markers.tags[tag] || {};
          this.that.markers.tags[tag][instance.data.uid] = instance;
        }
      }
    } else {
      this.that.markers.tags[marker.tags] = this.that.markers.tags[marker.tags] || {};
      this.that.markers.tags[marker.tags][instance.data.uid] = instance;
    }

  }

  addEvents(marker, instance) {
    var i;
    for (i in marker.on) {
      if (marker.on.hasOwnProperty(i)) {
        google.maps.event.addListener(instance, i, marker.on[i]);
      }
    }
  }

  /**
   * Adds Markers to the Map
   * @param args Array or Markers
   * @param options things like groups etc
   * @returns {Array} all the instances of the markers.
   */
  public addMarker(args, options) {
    if (utils.isArray(args)) {
      if (args.length >= 1) {
        var marker, markers = [];
        for (var i in args) {
          if (args.hasOwnProperty(i)) {
            marker = this._addMarker(args[i], options);
            markers.push(marker);
          }
        }

        this.that.markers.dataChanged = true;
        return markers;
      }

      return [];
    }

    this.that.markers.dataChanged = true;
    return this._addMarker(args, options);
  }

}

export = AddMarker;