angular.module("mapApp", ["ui.bootstrap", "ui.utils", "nagiosDecorations", "nagiosTime"]) .constant("nagiosProcessName", "Nagios Process") // Layout options .constant("layouts", { UserSupplied: { index: 0, textAlignment: "below", padding: { top: 25, right: 25, bottom: 25, left: 25, }, textPadding: { above: 4, right: 4, left: 4, below: 11 }, dimensionType: "fixed" }, DepthLayers: { index: 1, topPadding: 100, bottomPadding: 100, dyText: 4 }, CollapsedTree: { index: 2, topPadding: 100, bottomPadding: 100, dyText: 4 }, BalancedTree: { index: 3, topPadding: 100, bottomPadding: 100, dyText: 4 }, Circular: { index: 4 }, CircularMarkup: { index: 5, radialExponent: 1.2, padding: 20, textPadding: 4 }, CircularBalloon: { index: 6, outsidePadding: 60, rotation: -90, textPadding: 4, dyText: ".31em" }, BalancedTreeVertical: { index: 7, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, CollapsedTreeVertical: { index: 8, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, DepthLayersVertical: { index: 9, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, Force: { index: 10, outsidePadding: 60, textPadding: 4 } }) .config(function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }) .controller("mapCtrl", function($scope, $location, $modal, $http, nagiosTimeService, nagiosProcessName, layouts, $window) { $scope.search = $location.search(); // URL parameters $scope.params = { cgiurl: $scope.search.cgiurl ? $scope.search.cgiurl : $location.absUrl().replace(/map\.php.*$/, "cgi-bin/"), layout: map_layout, dimensions: $scope.search.dimensions ? $scope.search.dimensions : "", ulx: $scope.search.ulx ? parseInt($scope.search.ulx) : 0, uly: $scope.search.uly ? parseInt($scope.search.uly) : 0, lrx: $scope.search.lrx ? parseInt($scope.search.lrx) : 0, lry: $scope.search.lry ? parseInt($scope.search.lry) : 0, root: $scope.search.root ? $scope.search.root : nagiosProcessName, maxzoom: $scope.search.maxzoom ? parseInt($scope.search.maxzoom) : 10, nolinks: $scope.search.nolinks ? true : false, notext: $scope.search.notext ? true : false, nopopups: $scope.search.nopopups ? true : false, nomenu: $scope.search.nomenu ? true : false, noresize: $scope.search.noresize ? true : false, noicons: $scope.search.noicons ? true : false, iconurl: $scope.search.iconurl ? $scope.search.iconurl : $location.absUrl().replace(/map\.php.*$/, "images/logos/"), }; var rightPadding = 1; var bottomPadding = 4; $scope.svgWidth = $window.innerWidth - rightPadding; $scope.svgHeight = $window.innerHeight - bottomPadding; // Application state variables $scope.formDisplayed = false; $scope.reload = 0; // Decoration-related variables $scope.lastUpdate = "none"; // Determine whether we believe we have sufficient information to // build the map. If we don't have a valid URL for the JSON CGIs // we won't know that until we try to fetch the list of hosts, so // we can't know that now. $scope.canBuildMap = function() { document.body.className = ""; if ($scope.params.layout == layouts.UserSupplied.index) { switch ($scope.params.dimensions) { case "fixed": case "auto": document.body.className = "hasBgImage"; return true; break; case "user": if ($scope.params.ulx >= $scope.params.lrx || $scope.params.uly >= $scope.params.lry) { return false; } else { document.body.className = "hasBgImage"; return true; } break; default: return false; break; } } else { return true; } }; angular.element($window).bind("resize", function() { $scope.svgWidth = $window.innerWidth - rightPadding; $scope.svgHeight = $window.innerHeight - bottomPadding; $scope.$apply("svgWidth"); $scope.$apply("svgHeight"); }); $scope.displayForm = function(size) { $scope.formDisplayed = true; var modalInstance = $modal.open({ templateUrl: 'map-form.html', controller: 'mapFormCtrl', size: size, resolve: { params: function () { return $scope.params; } } }); modalInstance.result.then(function(params) { $scope.formDisplayed = false; $scope.params = params; $scope.reload++; }, function(reason) { $scope.formDisplayed = false; }); } // Style the menu button $scope.menuButtonStyle = function() { return { left: ($scope.svgWidth - 30) + "px", top: "5px" }; }; $scope.infoBoxTitle = function() { if ($scope.params.root == nagiosProcessName) { return "Network Map for All Hosts"; } else { return "Network Map for Host " + $scope.params.root; } }; if (!$scope.canBuildMap()) { $scope.displayForm(); } })