CruisersWiki:Chartlet-navionics.js

From CruisersWiki

(Redirected from CruisersWiki:Chartlet.js)
Jump to: navigation, search
//
/*
   Chartlet.js

   Copyright (c) 2016 Vadim Shlyakhov
   Licensed MIT
*/

(function () {

    var navKey = 'Navionics_webapi_00572';

    var $chartlets = $('.cw-chartlet');
    if ($chartlets.length === 0) {
        return;
    }

    var standalone_div = $('#cw-chartlet-standalone')[0];
    var standalone = !! standalone_div;

    function initWebApi () {
        var $chartlet = $(this);
        var params = parseParams(standalone ? location.hash.slice(1) : $chartlet.text());

        var mapParams = {
            tagId: this,
            navKey: navKey,
            zoom: +(params.zoom || 0),
            center: [+(params.lon || 0), +(params.lat || 0)],
            // distanceUnit: JNC.DISTANCE_UNIT.NAUTICAL, 
            // depthUnit: JNC.DEPTH_UNIT.METERS,
            // safetyDepth: JNC.SAFETY_DEPTH_LEVEL.METERS_10,
            layer: {
                'N': JNC.MAP_LAYERS.NO_OVERLAY,
                'T': JNC.MAP_LAYERS.TERRAIN,
                'S': JNC.MAP_LAYERS.SATELLITE
            } [params.layer ? params.layer.toUpperCase() : 'N'],
            DistanceUnitControl: false,
            DepthUnitControl: false,
            DistanceControl: false,
            // LayerControl: false,
            SonarControl: false,
            // ZoomControl: false,
        };

        var webapi = new JNC.Views.BoatingNavionicsMap(mapParams);

        // put cross to navionics-map-container
        $chartlet.children('.navionics-map-container').append(
            $('<img class="cw-chartlet-cross" src="data:image/gif;base64,R0lGODlhDQANAKEAAAAAANjY2Nra2gAAACH5BAEKAAMALAAAAAANAA0AAAImnB15ewHBmIOxvWrpESKlxwWcAJTmCYweOY4MixlwTGpVHQ+dPRQAOw==">'
        ));

        if (standalone) {
            initStandalone (webapi, params);

            // load kml
    
            if (params.page) {
                loadWikiScript('CruisersWiki:GetKml.js', function () {
                        getKmlUri(
                            {page: params.page, decorated: true},
                            function (kml_uri) {
                                if (kml_uri) {
                                    var kml_layer = webapi.loadKml(kml_uri, false /* do not move/resize */);
                                    if (kml_layer) {
                                        var src = kml_layer.getSource();
                                        src.once('addfeature', function(e) {
                                            console.log('KML layer ' + kml_layer.getSource().getFeatures().length);
                                        });
                                    }
                                }
                            }
                        );
                });
            }
        }
    }

    function initStandalone (webapi, params) {
        webapi.showDistanceUnitControl(true);
        webapi.showDepthUnitControl(true);
        webapi.showDistanceControl(true);
        // webapi.showLayerControl(true);
        webapi.showSonarControl(true);
        // webapi.showSonarcharts(true);
        // webapi.showZoomControl(true);
        webapi.showScaleLineControl(true);
        
        var doNotTrackHash = false;
        var setHashTimeoutID = null;

        var onChangeCenterZoom = function () {
            var setHashDelay = 1000;

            var setHash = function () {
                var bounds = webapi.getBoundsArea();
                params.lon = (bounds[2] + bounds[0]) / 2;
                params.lat = (bounds[3] + bounds[1]) / 2;
                params.zoom = webapi.getZoom() - zoomDelta;
                //console.log(center, zoom);
                var layer_parm = params.layer ? '|layer=' + params.layer : '';
                var page_parm = params.page ? '|page=' + params.page : '';
        
                doNotTrackHash = true;

                location.hash= 'lat=' + round(params.lat) + '|lon=' + round(params.lon) + '|zoom=' + params.zoom 
                    + layer_parm + page_parm;

                setHashTimeoutID = null;
            };

            if (setHashTimeoutID) {
                window.clearTimeout(setHashTimeoutID);
            }
            setHashTimeoutID = window.setTimeout(setHash, setHashDelay);
        };
        
        JNC.Events.on("map:centerchange", onChangeCenterZoom);
        JNC.Events.on("map:zoomchange", onChangeCenterZoom);

        var trackHash = function trackHash() {
            if (!location.hash || doNotTrackHash) {
                doNotTrackHash = false;
                return;
            }
            params = parseParams(location.hash.slice(1));
            if (params.lat != null && params.lon != null) {
                webapi.goToCoord(params.lon, params.lat, params.zoom);
            }
        };

        window.onhashchange = trackHash;
    }

    function dmsh2deg(dmsh) {
        var dmsFactors = [1, 60, 3600];
        var deg = 0;
        if (!dmsh)
            return deg;

        var parts = dmsh.split('_');
        for (var i=0, li = parts.length; i < li; i++) {
            var p = parts[i];
            if (isNaN(+ p)) {
                if (p == 'S' || p == 's' || p == 'W' || p == 'w')
                    deg = -deg;
                break;
            } else {
                deg += p / dmsFactors[i];
            }
        }
        return deg;
    }

    var zoomDelta = -3; // adjust to Navionics zoom levels

    function parseParams(param_str) {

        var out = {};
        var params = param_str.split('|');

        for (var i=0, li = params.length; i < li; i++) {
            var keyVal = params[i].split('=', 2);
            var key = keyVal[0].toLowerCase();
            var val = keyVal[1];
            if (key == 'lon') {
                out.lon = dmsh2deg(val);
            } else if (key == 'lat') {
                out.lat = dmsh2deg(val);
            } else if (key == 'zoom') {
                out.zoom = +(val || 12) + zoomDelta;
            } else if (key == 'layer') {
                out.layer = val || 'N';
            } else if (key == 'page') {
                out.page = val;
            }
        }
        return out;
    }

    function round(val) {
        var fact = 100000;
        return Math.round(val * fact) / fact;
    }

    if (standalone && location.hash) {
        $('body').empty().append(standalone_div);
        $('body').addClass('cw-chartlet-extend');
    }

    // set location for Navionics images
    $('body').attr('data-root', 'http://webapiv2.navionics.com/dist/webapi/images');
    
    loadCss('http://webapiv2.navionics.com/dist/webapi/webapi.min.css');
    loadWikiCss('CruisersWiki:Chartlet.css');
    loadScript('http://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js',     
        function () {
            if (typeof JNC === 'undefined') {
                return;
            }
            $chartlets.each(initWebApi);
        }
    );

})();
// 
Personal tools
advertisement
Friends of Cruisers Wiki