{"version":3,"sources":["webpack:///homeController_f61149ed4534c2438558.js","webpack:///webpack/bootstrap f61149ed4534c2438558","webpack:///./src/home/home.controller.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","44","homeController","$scope","$location","$localStorage","$sessionStorage","$interval","configBaseLayers","configLayers","leafletData","markerService","vesselPathService","emissionControlAreaService","vesselService","cargoService","vm","this","storage","$default","center","lat","lng","zoom","overlayDefaults","seamarks","visible","weather","clouds","precipitationForecasts","windSpeed","windStream","windBarb","surfacePressure","airTemperature","precipitation","significantWaveHeight","harbours","vessels","eca","timeStep","timeWaypoint","angular","extend","error","clearLastError","localTime","sidebarVisible","showBunkerAllowed","showBunker","showVesselSummary","showPositioning","lastVesselPath","vesselData","bunkerAis","bunkerCalculator","portCalls","cargo","cargoInformationActiveTab","refreshInSeconds","$storage","defaults","minZoom","worldCopyJump","controls","layers","paths","markers","events","map","enable","logic","marker","path","vesselInfoLoading","cargoDetailsLoading","timeStepActive","timeWaypointActive","searchArgs","absUrl","indexOf","_","chain","split","pop","ary","partial","fromPairs","value","isUndefined","getEmissionControlAreas","then","data","environment","openWeatherMapApiKey","removeLayers","overlays","pickBy","overlay","url","some","includes","trim","forEach","key","catch","e","$on","event","leafletObject","options","tooltip","bindTooltip","openTooltip","layerName","model","showPath","vesselArrowClicked","vesselNameClicked","leafletOverlay","layerCode","findKey","leafletEvent","undefined","removeListener","doRefresh","getMap","getMarkers","getBounds","mmsi","result","assign","filter","layer","message","Message","code","showVesselPath","vesselCode","timeInHours","RangeError","getPath","VesselCode","getVesselDetails","lastReportDate","vesselInfo","calculateAisBunker","nextPortId","getCargoInfo","length","totalCargo","last","orderCargoTypeByTons","reverse","sortBy","tabIndex","tons","container","total","breakBulk","roro","selectedPod","speed","SpeedAis","getBunkerConsumption","AisNextPort","processBunkerResponse","calculateBunker","bunker","startsWith","BunkerCostCosp","bunkerCosts","bunkerCostsError","BunkerCostCospCurrency","consumptionIfo","ConsumptionIfo","consumptionMgo","ConsumptionMgo","calculatedETA","CalculatedEta","closeSidebar","timeStepChanged","isDefined","layerOptions","getTimeStepHours","index","timeWaypointChanged","getTimeWaypointHours","getDate","date","Local","Utc","scale","createSummaryControl","position","createTimestepControl","logonInfo","security","hasAdminRole","push","createTimeWaypointControl","hasAdminOrAgentRole","cargoInformationEnabled","hasBunkerPlannerRole","custom","cod","config","$routeProvider","when","templateUrl","controller","controllerAs","authorize","otherwise","redirectTo","$inject"],"mappings":"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","file":"homeController_f61149ed4534c2438558.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"assets/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 44);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 44:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// var angular = require('angular');\n// var _ = require('lodash');\n\n(function () {\n 'use strict';\n\n angular.module('app').config(['$routeProvider', function ($routeProvider) {\n $routeProvider.when('/home', {\n templateUrl: 'assets/home/home.html',\n controller: 'HomeController',\n controllerAs: 'vm',\n authorize: true\n }).otherwise({\n redirectTo: '/home'\n });\n }]).controller('HomeController', homeController);\n\n homeController.$inject = ['$scope', '$location', '$localStorage', '$sessionStorage', '$interval', 'configBaseLayers', 'configLayers', 'leafletData', 'markerService', 'vesselPathService', 'emissionControlAreaService', 'vesselService', 'cargoService'];\n\n function homeController($scope, $location, $localStorage, $sessionStorage, $interval, configBaseLayers, configLayers, leafletData, markerService, vesselPathService, emissionControlAreaService, vesselService, cargoService) {\n\n var vm = this;\n\n // build initial view and leaflet model\n var storage = $localStorage.$default({\n center: {\n lat: 50,\n lng: 10,\n zoom: 4\n },\n overlayDefaults: {\n seamarks: { visible: false },\n weather: { visible: false },\n clouds: { visible: false },\n precipitationForecasts: { visible: false },\n windSpeed: { visible: false },\n windStream: { visible: false },\n windBarb: { visible: false },\n surfacePressure: { visible: false },\n airTemperature: { visible: false },\n precipitation: { visible: false },\n significantWaveHeight: { visible: false },\n harbours: { visible: true },\n vessels: { visible: true },\n eca: { visible: false }\n },\n timeStep: 1,\n timeWaypoint: 3\n });\n\n angular.extend(vm, {\n error: '',\n clearLastError: function clearLastError() {\n vm.error = '';\n },\n localTime: \"local\",\n sidebarVisible: false,\n showBunkerAllowed: false,\n showBunker: false,\n showVesselSummary: true,\n showPositioning: true,\n lastVesselPath: '',\n vesselData: {},\n bunkerAis: {},\n bunkerCalculator: {},\n portCalls: {},\n cargo: {},\n cargoInformationActiveTab: 0,\n refreshInSeconds: 0,\n $storage: storage,\n defaults: {\n minZoom: 2,\n worldCopyJump: true\n },\n controls: {},\n layers: configBaseLayers(),\n paths: {},\n markers: {},\n events: { // http://leafletjs.com/reference-1.2.0.html#map-event\n map: {\n enable: ['overlayadd', 'overlayremove', 'moveend'],\n logic: \"emit\"\n },\n marker: {\n enable: ['mouseover'],\n logic: \"emit\"\n },\n path: {\n enable: ['mouseover'],\n logic: \"emit\"\n }\n },\n vesselInfoLoading: false,\n cargoDetailsLoading: false,\n timeStepActive: false,\n timeWaypointActive: false,\n searchArgs: $location.absUrl().indexOf('?') !== -1 ? _.chain($location.absUrl().split('?').pop()).split('&').map(_.ary(_.partial(_.split, _, '='), 1)).fromPairs().value() : ''\n });\n\n if (angular.isUndefined(vm.$storage.timeWaypoint)) {\n vm.$storage.timeWaypoint = 3;\n }\n\n emissionControlAreaService.getEmissionControlAreas().then(function (data) {\n var layers = configLayers($sessionStorage.environment.openWeatherMapApiKey, data);\n if ($sessionStorage.environment.removeLayers) {\n layers.overlays = _.pickBy(layers.overlays, function (overlay) {\n return !overlay.url || !_.some($sessionStorage.environment.removeLayers, function (url) {\n return _.includes(overlay.url, _.trim(url));\n });\n });\n }\n\n _.forEach(storage.overlayDefaults, function (value, key) {\n var overlay = layers.overlays[key];\n if (!overlay) return;\n overlay.visible = value.visible;\n });\n\n vm.layers.overlays = layers.overlays;\n }).catch(function (e) {\n vm.error = 'unable to config layers: ' + e;\n });\n\n // create event handlers\n // path point tooltip\n $scope.$on('leafletDirectivePath.mouseover', function (event, path) {\n if (path.leafletObject.options.tooltip) {\n path.leafletObject.bindTooltip(path.leafletObject.options.tooltip).openTooltip();\n path.leafletObject.options.tooltip = '';\n }\n });\n\n // harbour, vessel tooltip\n $scope.$on('leafletDirectiveMarker.mouseover', function (event, marker) {\n if (marker.leafletObject.options.tooltip) {\n marker.leafletObject.bindTooltip(marker.leafletObject.options.tooltip).openTooltip();\n marker.leafletObject.options.tooltip = '';\n }\n });\n\n // vessel icon / text click\n $scope.$on('leafletDirectiveMarker.click', function (event, marker) {\n if (marker.layerName === 'vessels' && marker.model.showPath) vm.vesselArrowClicked(event, marker);\n if (marker.layerName === 'vessels' && !marker.model.showPath) vm.vesselNameClicked(event, marker);\n });\n\n // to save / restore tile / overlay switch state\n $scope.$on(\"leafletDirectiveMap.overlayadd\", function (event, leafletOverlay) {\n var layerCode = _.findKey(vm.layers.overlays, { name: leafletOverlay.leafletEvent.name });\n if (vm.$storage.overlayDefaults[layerCode] === undefined) vm.$storage.overlayDefaults[layerCode] = { visible: true };else vm.$storage.overlayDefaults[layerCode].visible = true;\n });\n\n var removeListener = $scope.$on(\"leafletDirectiveMap.overlayremove\", function (event, leafletOverlay) {\n var layerCode = _.findKey(vm.layers.overlays, { name: leafletOverlay.leafletEvent.name });\n // doRefresh removes layout and adds it again, but this is not event from overlay control (we cannot know who triggered!), do nothing and do not save as default!\n if (vm.layers.overlays[layerCode].doRefresh) return;\n vm.$storage.overlayDefaults[layerCode].visible = false;\n // hide paths and side bar (vessel info) if vessel layer not shown\n vm.paths = {};\n vm.sidebarVisible = false;\n });\n\n // important, logout destroys model and listner would remove all overlay settings from storage above\n $scope.$on('$destroy', removeListener);\n\n $scope.$on('leafletDirectiveMap.moveend', function () {\n if (vm.layers.overlays && vm.layers.overlays.weather && vm.layers.overlays.weather.visible) {\n leafletData.getMap().then(function (map) {\n // on zoom change recreate weather icons\n // previously created vessel and harbour must be kept!)\n markerService.getMarkers(map.getBounds(), vm.$storage.center.zoom, vm.searchArgs.mmsi, $sessionStorage.environment.openWeatherMapApiKey, true).then(function (result) {\n vm.markers = _.assign({}, _.filter(vm.markers, function (m) {\n return m.layer !== 'weather';\n }), result.markers);\n }).catch(function (e) {\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to get weather markers: ' + message;\n });\n });\n }\n });\n\n vm.vesselArrowClicked = function (event, marker) {\n vm.vesselData = {};\n vm.portCalls = {};\n vm.sidebarVisible = false;\n vm.paths = {};\n if (marker.model.code === vm.lastVesselPath) {\n vm.lastVesselPath = '';\n return;\n }\n\n vm.showVesselPath(marker.model.code);\n };\n\n vm.showVesselPath = function (vesselCode) {\n if (!vesselCode) return;\n\n // load vessel (marker.modelName) path points using service\n var timeInHours;\n switch (vm.$storage.timeWaypoint) {\n case 1:\n timeInHours = 12;\n break;\n case 2:\n timeInHours = 24;\n break;\n case 3:\n timeInHours = 48;\n break;\n case 4:\n timeInHours = 120; // 5 days\n break;\n case 5:\n timeInHours = 240; // 10 days\n break;\n default:\n throw new RangeError('Wrong timeWaypoint: ' + vm.$storage.timeWaypoint);\n }\n\n vesselPathService.getPath(vesselCode, timeInHours).then(function (data) {\n vm.lastVesselPath = vesselCode;\n vm.paths = data;\n }).catch(function (e) {\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to get vessel path: ' + message;\n });\n };\n\n vm.vesselNameClicked = function (event, marker) {\n // click on any marker closes path\n vm.portCalls = {};\n vm.paths = {};\n vm.bunkerAis = {};\n vm.bunkerCalculator = {};\n vm.lastVesselPath = '';\n if (vm.vesselData && marker.model.code === vm.vesselData.VesselCode) {\n vm.vesselData = {};\n vm.sidebarVisible = false;\n return;\n }\n\n vm.sidebarVisible = true;\n vm.vesselInfoLoading = true;\n\n vesselService.getVesselDetails(marker.model.code, marker.model.lastReportDate).then(function (data) {\n var vesselInfo = data.d;\n vm.vesselInfoLoading = false;\n vm.vesselData = vesselInfo;\n\n // bunker values from reported AIS speed\n vm.calculateAisBunker();\n\n if (marker.model.nextPortId > 0) {\n vm.cargoDetailsLoading = true;\n\n cargoService.getCargoInfo(marker.model.code, marker.model.nextPortId).then(function (data) {\n vm.cargoDetailsLoading = false;\n if (data.d && data.d.portCalls) vm.portCalls = data.d.portCalls;\n if (vm.portCalls && vm.portCalls.length > 0) {\n\n var totalCargo = _.last(vm.portCalls);\n // activate tab page having the most cargo on board\n var orderCargoTypeByTons = _.reverse(_.sortBy([{ tabIndex: 0, tons: totalCargo.cargo.container.total.tons || -1 }, { tabIndex: 1, tons: totalCargo.cargo.breakBulk.tons || -2 }, { tabIndex: 2, tons: totalCargo.cargo.roro[0].tons || -3 }], \"tons\"));\n vm.cargoInformationActiveTab = orderCargoTypeByTons[0].tabIndex;\n vm.cargo.selectedPod = totalCargo;\n }\n }).catch(function (e) {\n vm.cargoDetailsLoading = false;\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to get cargo information: ' + message;\n });\n }\n }).catch(function (e) {\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to get vessel details: ' + message;\n });\n };\n\n // view contraller calls (modify view state)\n vm.calculateAisBunker = function () {\n vm.bunkerAis.speed = vm.vesselData.SpeedAis;\n vesselService.getBunkerConsumption(vm.vesselData.VesselCode, vm.vesselData.AisNextPort, vm.vesselData.SpeedAis).then(function (data) {\n vm.processBunkerResponse(vm.bunkerAis, data.d);\n }).catch(function (e) {\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to calculate bunker values: ' + message;\n });\n };\n\n // view contraller calls (modify view state)\n vm.calculateBunker = function () {\n vesselService.getBunkerConsumption(vm.vesselData.VesselCode, vm.vesselData.AisNextPort, vm.bunkerCalculator.speed).then(function (data) {\n vm.processBunkerResponse(vm.bunkerCalculator, data.d);\n }).catch(function (e) {\n var message = e;\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to calculate bunker values: ' + message;\n });\n };\n\n vm.processBunkerResponse = function (bunkerCalculator, bunker) {\n if (_.startsWith(bunker.BunkerCostCosp, 'ERR-')) {\n bunkerCalculator.bunkerCosts = \"Error\";\n switch (bunker.BunkerCostCosp) {\n case 'ERR-001':\n bunkerCalculator.bunkerCostsError = 'Remaining distance to EOSP missing';\n break;\n case 'ERR-002':\n bunkerCalculator.bunkerCostsError = 'Bunker consumption with speed range is missing in Masterdata';\n break;\n case 'ERR-003':\n bunkerCalculator.bunkerCostsError = 'Speed is not valid';\n break;\n case 'ERR-004':\n bunkerCalculator.bunkerCostsError = 'No price, bunker order is missing';\n break;\n }\n } else {\n bunkerCalculator.bunkerCostsError = '';\n bunkerCalculator.bunkerCosts = (bunker.BunkerCostCosp || '') + ' ' + (bunker.BunkerCostCospCurrency || '');\n }\n bunkerCalculator.consumptionIfo = bunker.ConsumptionIfo;\n bunkerCalculator.consumptionMgo = bunker.ConsumptionMgo;\n bunkerCalculator.calculatedETA = bunker.CalculatedEta;\n };\n\n vm.closeSidebar = function () {\n vm.sidebarVisible = false;\n delete vm.cargoInformationActiveTab;\n };\n\n vm.timeStepChanged = function () {\n vm.timeStepActive = false;\n // to modify all at once\n var overlays = _.assign({}, vm.layers.overlays);\n _.forEach(vm.$storage.overlayDefaults, function (value, key) {\n var overlay = overlays[key];\n overlay.visible = value.visible;\n if (angular.isDefined(overlay.layerOptions) && angular.isDefined(overlay.layerOptions.timeStep)) {\n overlay.layerOptions.timeStep = vm.getTimeStepHours(vm.$storage.timeStep);\n overlay.doRefresh = true;\n }\n });\n\n vm.layers.overlays = overlays;\n };\n\n vm.getTimeStepHours = function (index) {\n return (index - 1) * (index <= 3 ? 6 : 12) - (index > 3 ? 12 : 0);\n };\n\n vm.timeWaypointChanged = function () {\n vm.timeWaypointActive = false;\n vm.showVesselPath(vm.lastVesselPath);\n };\n\n vm.getTimeWaypointHours = function (index) {\n var result;\n switch (index) {\n case 1:\n result = \"12h\";\n break;\n case 2:\n result = \"24h\";\n break;\n case 3:\n result = \"48h\";\n break;\n case 4:\n result = \"5d\";\n break;\n case 5:\n result = \"10d\";\n break;\n default:\n throw new RangeError('Bad index: ' + index);\n }\n\n return result;\n };\n\n vm.getDate = function (date) {\n if (!date) return 'n/a';\n return vm.localTime === \"local\" ? date.Local : date.Utc;\n };\n // initial load / reload harbour and vessel markers every 60 seconds\n var refreshIntervalInSeconds = 60;\n vm.refreshInSeconds = refreshIntervalInSeconds;\n $interval(function () {\n if (vm.refreshInSeconds === refreshIntervalInSeconds) {\n vm.error = '';\n leafletData.getMap().then(function (map) {\n vm.markers = markerService.getMarkers(map.getBounds(), vm.$storage.center.zoom, vm.searchArgs.mmsi, vm.layers.overlays && vm.layers.overlays.weather && vm.layers.overlays.weather.visible ? $sessionStorage.environment.openWeatherMapApiKey : null, false).then(function (result) {\n vm.markers = result.markers;\n\n // add map ontrols if we got markers (only once), otherwise they are useless in any case\n if (!vm.controls.scale) {\n var controls = [markerService.createSummaryControl()({\n position: 'topright'\n }), markerService.createTimestepControl()({\n position: 'topleft'\n })];\n // waypoints control only for SeaMap Admin (1001)\n if ($sessionStorage.logonInfo.security.hasAdminRole) {\n\n controls.push(markerService.createTimeWaypointControl()({\n position: 'topleft'\n }));\n } else {\n // default 48 hours if control is not visible\n vm.$storage.timeWaypoint = 3;\n }\n if ($sessionStorage.logonInfo.security.hasAdminOrAgentRole) vm.cargoInformationEnabled = true;\n if ($sessionStorage.logonInfo.security.hasBunkerPlannerRole) vm.showBunkerAllowed = true;\n\n vm.controls = { scale: true, custom: controls };\n }\n }).catch(function (e) {\n var message = e;\n // openweathermap.org\n if (e.data && e.data.cod && e.data.message) {\n message = e.data.message;\n }\n // softship web services\n if (e.data && e.data.Message) {\n message = e.data.Message;\n }\n\n vm.error = 'unable to get markers: ' + message;\n });\n });\n vm.refreshInSeconds = 0;\n } else {\n vm.refreshInSeconds += 1;\n }\n }, 1000);\n }\n})();\n\n/***/ })\n\n/******/ });\n\n\n// WEBPACK FOOTER //\n// homeController_f61149ed4534c2438558.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"assets/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 44);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f61149ed4534c2438558","// var angular = require('angular');\r\n// var _ = require('lodash');\r\n\r\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .config([\r\n '$routeProvider', function($routeProvider) {\r\n $routeProvider\r\n .when('/home',\r\n {\r\n templateUrl: 'assets/home/home.html',\r\n controller: 'HomeController',\r\n controllerAs: 'vm',\r\n authorize: true\r\n })\r\n .otherwise({\r\n redirectTo: '/home'\r\n });\r\n }\r\n ])\r\n .controller('HomeController', homeController);\r\n\r\n homeController.$inject = [\r\n '$scope',\r\n '$location',\r\n '$localStorage',\r\n '$sessionStorage',\r\n '$interval',\r\n 'configBaseLayers',\r\n 'configLayers',\r\n 'leafletData',\r\n 'markerService',\r\n 'vesselPathService',\r\n 'emissionControlAreaService',\r\n 'vesselService',\r\n 'cargoService'\r\n ];\r\n\r\n function homeController($scope,\r\n $location,\r\n $localStorage,\r\n $sessionStorage,\r\n $interval,\r\n configBaseLayers,\r\n configLayers,\r\n leafletData,\r\n markerService,\r\n vesselPathService,\r\n emissionControlAreaService,\r\n vesselService,\r\n cargoService) {\r\n\r\n var vm = this;\r\n\r\n // build initial view and leaflet model\r\n var storage = $localStorage.$default({\r\n center: {\r\n lat: 50,\r\n lng: 10,\r\n zoom: 4\r\n },\r\n overlayDefaults: {\r\n seamarks: { visible: false },\r\n weather: { visible: false },\r\n clouds: { visible: false },\r\n precipitationForecasts: { visible: false },\r\n windSpeed: { visible: false },\r\n windStream: { visible: false },\r\n windBarb: { visible: false },\r\n surfacePressure: { visible: false },\r\n airTemperature: { visible: false },\r\n precipitation: { visible: false },\r\n significantWaveHeight: { visible: false },\r\n harbours: { visible: true },\r\n vessels: { visible: true },\r\n eca: { visible: false }\r\n },\r\n timeStep: 1,\r\n timeWaypoint: 3\r\n });\r\n\r\n angular.extend(vm, {\r\n error: '',\r\n clearLastError: function () {\r\n vm.error = '';\r\n },\r\n localTime: \"local\",\r\n sidebarVisible: false,\r\n showBunkerAllowed: false,\r\n showBunker: false,\r\n showVesselSummary: true,\r\n showPositioning: true,\r\n lastVesselPath: '',\r\n vesselData: {},\r\n bunkerAis: {},\r\n bunkerCalculator: {},\r\n portCalls: {},\r\n cargo: {},\r\n cargoInformationActiveTab: 0,\r\n refreshInSeconds: 0,\r\n $storage: storage,\r\n defaults: {\r\n minZoom: 2,\r\n worldCopyJump: true\r\n },\r\n controls: {\r\n },\r\n layers: configBaseLayers(),\r\n paths: {},\r\n markers: {},\r\n events: { // http://leafletjs.com/reference-1.2.0.html#map-event\r\n map: {\r\n enable: ['overlayadd', 'overlayremove', 'moveend'],\r\n logic: \"emit\"\r\n },\r\n marker: {\r\n enable: ['mouseover'],\r\n logic: \"emit\"\r\n },\r\n path: {\r\n enable: ['mouseover'],\r\n logic: \"emit\"\r\n }\r\n },\r\n vesselInfoLoading: false,\r\n cargoDetailsLoading: false,\r\n timeStepActive: false,\r\n timeWaypointActive: false,\r\n searchArgs: $location.absUrl().indexOf('?') !== -1\r\n ? _.chain($location.absUrl().split('?').pop())\r\n .split('&')\r\n .map(_.ary(_.partial(_.split, _, '='), 1))\r\n .fromPairs()\r\n .value()\r\n : ''\r\n });\r\n\r\n if (angular.isUndefined(vm.$storage.timeWaypoint)) {\r\n vm.$storage.timeWaypoint = 3;\r\n }\r\n \r\n emissionControlAreaService.getEmissionControlAreas()\r\n .then(function (data) {\r\n var layers = configLayers($sessionStorage.environment.openWeatherMapApiKey, data);\r\n if ($sessionStorage.environment.removeLayers) {\r\n layers.overlays = _.pickBy(layers.overlays, function (overlay) {\r\n return !overlay.url || !_.some($sessionStorage.environment.removeLayers, function (url) {\r\n return _.includes(overlay.url, _.trim(url));\r\n }); \r\n });\r\n }\r\n\r\n _.forEach(storage.overlayDefaults, function (value, key) {\r\n var overlay = layers.overlays[key];\r\n if (!overlay) return;\r\n overlay.visible = value.visible;\r\n });\r\n\r\n vm.layers.overlays = layers.overlays;\r\n \r\n }).catch(function (e) {\r\n vm.error = 'unable to config layers: ' + e;\r\n });\r\n\r\n // create event handlers\r\n // path point tooltip\r\n $scope.$on('leafletDirectivePath.mouseover', function (event, path) {\r\n if (path.leafletObject.options.tooltip) {\r\n path.leafletObject.bindTooltip(\r\n path.leafletObject.options.tooltip).openTooltip();\r\n path.leafletObject.options.tooltip = '';\r\n }\r\n });\r\n\r\n // harbour, vessel tooltip\r\n $scope.$on('leafletDirectiveMarker.mouseover', function (event, marker) {\r\n if (marker.leafletObject.options.tooltip) {\r\n marker.leafletObject.bindTooltip(\r\n marker.leafletObject.options.tooltip).openTooltip();\r\n marker.leafletObject.options.tooltip = '';\r\n }\r\n });\r\n\r\n // vessel icon / text click\r\n $scope.$on('leafletDirectiveMarker.click',\r\n function(event, marker) {\r\n if (marker.layerName === 'vessels' && marker.model.showPath) vm.vesselArrowClicked(event, marker);\r\n if (marker.layerName === 'vessels' && !marker.model.showPath) vm.vesselNameClicked(event, marker);\r\n });\r\n\r\n // to save / restore tile / overlay switch state\r\n $scope.$on(\"leafletDirectiveMap.overlayadd\", function (event, leafletOverlay) {\r\n var layerCode = _.findKey(vm.layers.overlays, { name: leafletOverlay.leafletEvent.name });\r\n if (vm.$storage.overlayDefaults[layerCode] === undefined)\r\n vm.$storage.overlayDefaults[layerCode] = { visible: true };\r\n else\r\n vm.$storage.overlayDefaults[layerCode].visible = true;\r\n });\r\n\r\n var removeListener = $scope.$on(\"leafletDirectiveMap.overlayremove\", function (event, leafletOverlay) {\r\n var layerCode = _.findKey(vm.layers.overlays, { name: leafletOverlay.leafletEvent.name });\r\n // doRefresh removes layout and adds it again, but this is not event from overlay control (we cannot know who triggered!), do nothing and do not save as default!\r\n if (vm.layers.overlays[layerCode].doRefresh) return;\r\n vm.$storage.overlayDefaults[layerCode].visible = false;\r\n // hide paths and side bar (vessel info) if vessel layer not shown\r\n vm.paths = {};\r\n vm.sidebarVisible = false;\r\n });\r\n\r\n // important, logout destroys model and listner would remove all overlay settings from storage above\r\n $scope.$on('$destroy', removeListener);\r\n\r\n $scope.$on('leafletDirectiveMap.moveend', function () {\r\n if (vm.layers.overlays\r\n && vm.layers.overlays.weather\r\n && vm.layers.overlays.weather.visible) {\r\n leafletData.getMap().then(function (map) {\r\n // on zoom change recreate weather icons\r\n // previously created vessel and harbour must be kept!)\r\n markerService.getMarkers(\r\n map.getBounds(),\r\n vm.$storage.center.zoom,\r\n vm.searchArgs.mmsi,\r\n $sessionStorage.environment.openWeatherMapApiKey,\r\n true)\r\n .then(function (result) {\r\n vm.markers = _.assign(\r\n {},\r\n _.filter(vm.markers, function (m) { return m.layer !== 'weather'; }),\r\n result.markers);\r\n }).catch(function (e) {\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to get weather markers: ' + message;\r\n });\r\n });\r\n }\r\n });\r\n\r\n vm.vesselArrowClicked = function (event, marker) {\r\n vm.vesselData = {};\r\n vm.portCalls = {};\r\n vm.sidebarVisible = false;\r\n vm.paths = {};\r\n if (marker.model.code === vm.lastVesselPath) {\r\n vm.lastVesselPath = '';\r\n return;\r\n }\r\n\r\n vm.showVesselPath(marker.model.code);\r\n };\r\n\r\n vm.showVesselPath = function (vesselCode) {\r\n if (!vesselCode) return;\r\n\r\n // load vessel (marker.modelName) path points using service\r\n var timeInHours;\r\n switch (vm.$storage.timeWaypoint) {\r\n case 1:\r\n timeInHours = 12;\r\n break;\r\n case 2:\r\n timeInHours = 24;\r\n break;\r\n case 3:\r\n timeInHours = 48;\r\n break;\r\n case 4:\r\n timeInHours = 120; // 5 days\r\n break;\r\n case 5:\r\n timeInHours = 240; // 10 days\r\n break;\r\n default:\r\n throw new RangeError('Wrong timeWaypoint: ' + vm.$storage.timeWaypoint);\r\n }\r\n\r\n vesselPathService.getPath(vesselCode, timeInHours)\r\n .then(function (data) {\r\n vm.lastVesselPath = vesselCode;\r\n vm.paths = data;\r\n }).catch(function (e) {\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to get vessel path: ' + message;\r\n });\r\n };\r\n\r\n vm.vesselNameClicked = function (event, marker) {\r\n // click on any marker closes path\r\n vm.portCalls = {};\r\n vm.paths = {};\r\n vm.bunkerAis = {};\r\n vm.bunkerCalculator = {};\r\n vm.lastVesselPath = '';\r\n if (vm.vesselData && marker.model.code === vm.vesselData.VesselCode) {\r\n vm.vesselData = {};\r\n vm.sidebarVisible = false;\r\n return;\r\n }\r\n\r\n vm.sidebarVisible = true;\r\n vm.vesselInfoLoading = true;\r\n\r\n vesselService.getVesselDetails(marker.model.code, marker.model.lastReportDate)\r\n .then(function (data) {\r\n var vesselInfo = data.d;\r\n vm.vesselInfoLoading = false;\r\n vm.vesselData = vesselInfo;\r\n\r\n // bunker values from reported AIS speed\r\n vm.calculateAisBunker();\r\n\r\n if (marker.model.nextPortId > 0) {\r\n vm.cargoDetailsLoading = true;\r\n\r\n cargoService.getCargoInfo(marker.model.code, marker.model.nextPortId)\r\n .then(function (data) {\r\n vm.cargoDetailsLoading = false;\r\n if (data.d && data.d.portCalls) vm.portCalls = data.d.portCalls;\r\n if (vm.portCalls && vm.portCalls.length > 0) {\r\n\r\n var totalCargo = _.last(vm.portCalls);\r\n // activate tab page having the most cargo on board\r\n var orderCargoTypeByTons = _.reverse(_.sortBy([\r\n { tabIndex: 0, tons: totalCargo.cargo.container.total.tons || -1 },\r\n { tabIndex: 1, tons: totalCargo.cargo.breakBulk.tons || -2 },\r\n { tabIndex: 2, tons: totalCargo.cargo.roro[0].tons || -3 }\r\n ],\r\n \"tons\"));\r\n vm.cargoInformationActiveTab = orderCargoTypeByTons[0].tabIndex;\r\n vm.cargo.selectedPod = totalCargo;\r\n\r\n }\r\n })\r\n .catch(function (e) {\r\n vm.cargoDetailsLoading = false;\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to get cargo information: ' + message;\r\n });\r\n }\r\n }).catch(function (e) {\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to get vessel details: ' + message;\r\n });\r\n };\r\n\r\n // view contraller calls (modify view state)\r\n vm.calculateAisBunker = function () {\r\n vm.bunkerAis.speed = vm.vesselData.SpeedAis;\r\n vesselService.getBunkerConsumption(\r\n vm.vesselData.VesselCode,\r\n vm.vesselData.AisNextPort,\r\n vm.vesselData.SpeedAis)\r\n .then(function (data) {\r\n vm.processBunkerResponse(vm.bunkerAis, data.d);\r\n }).catch(function (e) {\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to calculate bunker values: ' + message;\r\n });\r\n };\r\n\r\n // view contraller calls (modify view state)\r\n vm.calculateBunker = function() {\r\n vesselService.getBunkerConsumption(\r\n vm.vesselData.VesselCode,\r\n vm.vesselData.AisNextPort,\r\n vm.bunkerCalculator.speed)\r\n .then(function (data) {\r\n vm.processBunkerResponse(vm.bunkerCalculator, data.d);\r\n }).catch(function (e) {\r\n var message = e;\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to calculate bunker values: ' + message;\r\n });\r\n };\r\n\r\n vm.processBunkerResponse = function (bunkerCalculator, bunker) {\r\n if (_.startsWith(bunker.BunkerCostCosp, 'ERR-')) {\r\n bunkerCalculator.bunkerCosts = \"Error\";\r\n switch (bunker.BunkerCostCosp) {\r\n case 'ERR-001':\r\n bunkerCalculator.bunkerCostsError = 'Remaining distance to EOSP missing';\r\n break;\r\n case 'ERR-002':\r\n bunkerCalculator.bunkerCostsError = 'Bunker consumption with speed range is missing in Masterdata';\r\n break;\r\n case 'ERR-003':\r\n bunkerCalculator.bunkerCostsError = 'Speed is not valid';\r\n break;\r\n case 'ERR-004':\r\n bunkerCalculator.bunkerCostsError = 'No price, bunker order is missing';\r\n break;\r\n }\r\n }\r\n else {\r\n bunkerCalculator.bunkerCostsError = '';\r\n bunkerCalculator.bunkerCosts = (bunker.BunkerCostCosp || '') + ' ' + (bunker.BunkerCostCospCurrency || '');\r\n }\r\n bunkerCalculator.consumptionIfo = bunker.ConsumptionIfo;\r\n bunkerCalculator.consumptionMgo = bunker.ConsumptionMgo;\r\n bunkerCalculator.calculatedETA = bunker.CalculatedEta;\r\n };\r\n\r\n vm.closeSidebar = function() {\r\n vm.sidebarVisible = false;\r\n delete vm.cargoInformationActiveTab;\r\n };\r\n\r\n vm.timeStepChanged = function () {\r\n vm.timeStepActive = false;\r\n // to modify all at once\r\n var overlays = _.assign({}, vm.layers.overlays);\r\n _.forEach(vm.$storage.overlayDefaults, function (value, key) {\r\n var overlay = overlays[key];\r\n overlay.visible = value.visible;\r\n if (angular.isDefined(overlay.layerOptions)\r\n && angular.isDefined(overlay.layerOptions.timeStep)) {\r\n overlay.layerOptions.timeStep = vm.getTimeStepHours(vm.$storage.timeStep);\r\n overlay.doRefresh = true;\r\n }\r\n });\r\n\r\n vm.layers.overlays = overlays;\r\n };\r\n\r\n vm.getTimeStepHours = function (index) {\r\n return (index - 1) * (index <= 3 ? 6 : 12) - (index > 3 ? 12 : 0);\r\n };\r\n\r\n vm.timeWaypointChanged = function () {\r\n vm.timeWaypointActive = false;\r\n vm.showVesselPath(vm.lastVesselPath);\r\n };\r\n\r\n vm.getTimeWaypointHours = function (index) {\r\n var result;\r\n switch (index) {\r\n case 1:\r\n result = \"12h\";\r\n break;\r\n case 2:\r\n result = \"24h\";\r\n break;\r\n case 3:\r\n result = \"48h\";\r\n break;\r\n case 4:\r\n result = \"5d\";\r\n break;\r\n case 5:\r\n result = \"10d\";\r\n break;\r\n default:\r\n throw new RangeError('Bad index: ' + index);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n vm.getDate = function (date) {\r\n if (!date) return 'n/a';\r\n return vm.localTime === \"local\" ? date.Local : date.Utc;\r\n };\r\n // initial load / reload harbour and vessel markers every 60 seconds\r\n var refreshIntervalInSeconds = 60;\r\n vm.refreshInSeconds = refreshIntervalInSeconds;\r\n $interval(function () {\r\n if (vm.refreshInSeconds === refreshIntervalInSeconds) {\r\n vm.error = '';\r\n leafletData.getMap().then(function(map) {\r\n vm.markers = markerService.getMarkers(\r\n map.getBounds(),\r\n vm.$storage.center.zoom,\r\n vm.searchArgs.mmsi,\r\n vm.layers.overlays\r\n && vm.layers.overlays.weather\r\n && vm.layers.overlays.weather.visible\r\n ? $sessionStorage.environment.openWeatherMapApiKey : null,\r\n false)\r\n .then(function(result) {\r\n vm.markers = result.markers;\r\n \r\n // add map ontrols if we got markers (only once), otherwise they are useless in any case\r\n if (!vm.controls.scale) {\r\n var controls = [\r\n markerService.createSummaryControl()({\r\n position: 'topright'\r\n }),\r\n markerService.createTimestepControl()({\r\n position: 'topleft'\r\n })];\r\n // waypoints control only for SeaMap Admin (1001)\r\n if ($sessionStorage.logonInfo.security.hasAdminRole) {\r\n\r\n controls.push(\r\n markerService.createTimeWaypointControl()({\r\n position: 'topleft'\r\n }));\r\n }\r\n else {\r\n // default 48 hours if control is not visible\r\n vm.$storage.timeWaypoint = 3;\r\n }\r\n if ($sessionStorage.logonInfo.security.hasAdminOrAgentRole) vm.cargoInformationEnabled = true;\r\n if ($sessionStorage.logonInfo.security.hasBunkerPlannerRole) vm.showBunkerAllowed = true;\r\n\r\n vm.controls = { scale: true, custom: controls };\r\n }\r\n }).catch(function(e) {\r\n var message = e;\r\n // openweathermap.org\r\n if (e.data && e.data.cod && e.data.message) {\r\n message = e.data.message;\r\n }\r\n // softship web services\r\n if (e.data && e.data.Message) {\r\n message = e.data.Message;\r\n }\r\n\r\n vm.error = 'unable to get markers: ' + message;\r\n });\r\n });\r\n vm.refreshInSeconds = 0;\r\n } else {\r\n vm.refreshInSeconds += 1;\r\n }\r\n }, 1000);\t\t\r\n }\r\n})();\n\n\n// WEBPACK FOOTER //\n// ./src/home/home.controller.js"],"sourceRoot":""}