PowerPan/leaflet-ais-tracksymbol

View on GitHub
src/aisTrackLayer.js

Summary

Maintainability
A
1 hr
Test Coverage
/**
 * Created by Johannes Rudolph <johannes.rudolph@gmx.com> on 16.02.2016.
 */

/**
 *
 */
L.AISTrackSymbolLayer = L.FeatureGroup.extend({

    /**
     *
     * @param layers
     */
    initialize: function(layers,iconListByTypeOfShip){
        L.LayerGroup.prototype.initialize.call(this, layers);
        this._intervalDeadObjs = setInterval(this._checkDeadObjects,1000,this);
        this.setRemoveTime(10);
        if(iconListByTypeOfShip !== undefined){
            this._iconListByTypeOfShip = iconListByTypeOfShip;
        }
    },

    /**
     *
     * @param mmsi
     * @param data
     */
    addAisData: function(data){
        var mmsi = data.mmsi;
        var trackMarker;
        if(this.getLayer(mmsi)){
            trackMarker = this.getLayer(mmsi);
            trackMarker.addData(data);
        }
        else{
            var options = {
                contextmenu: true,
                contextmenuItems: [{
                    text: 'Details',
                    callback: this.showDetails,
                    index: 0
                }, {
                    text: 'MarineTraffic.com',
                    callback: this.openMarineTraffic,
                    index: 1
                },{
                    separator: true,
                    index: 2
                }]};
            if(this._iconListByTypeOfShip !== undefined){
                options.iconListByTypeOfShip = this._iconListByTypeOfShip;
            }
            trackMarker = L.aisTrackSymbol( options );
            trackMarker.addData(data);
            this.addLayer(trackMarker);
        }
    },

    /**
     *
     * @param e
     */
    openMarineTraffic: function (e) {
        e.relatedTarget.openMarineTraffic();
    },

    /**
     *
     * @param e
     */
    showDetails: function (e) {
        e.relatedTarget.openPopup();
    },

    /**
     *
     * @param layerGroup
     * @private
     */
    _checkDeadObjects: function(layerGroup) {
        var now = new Date();
        layerGroup.eachLayer(function(layer){
            if((now - layer.getLastUpdate()) > (layerGroup.getRemoveTime() * 60 * 1000 ))
                layerGroup.removeLayer(layer);
        });
    },

    /**
     *
     * @param searchText
     * @returns {*}
     */
    searchTrack: function (searchText) {
        for(var i = 0 ; i < this.getLayers().length; i++){
            var obj = this.getLayers()[i];
            if(obj.getMmsi() === parseInt(searchText,10)){
                return obj;
            }
            if(obj.getName().toLowerCase() === searchText.toLowerCase()){
                return obj;
            }
            if(obj.getImoNumber() === parseInt(searchText)){
                return obj;
            }
        }
        return false;
    },

    /**
     *
     * @param minutes
     */
    setRemoveTime: function(minutes){
        this._removeMinutes = minutes;
    },

    /**
     *
     * @returns {*}
     */
    getRemoveTime: function(){
        return this._removeMinutes;
    }
});

/**
 *
 * @returns {*}
 */
L.aisTrackSymbolLayer = function() {
    return new L.AISTrackSymbolLayer();
};