1angular.module("trendsApp", ["ui.bootstrap", "ui.utils",
2		"nagiosDecorations", "nagiosTime"])
3
4	// Spinner options
5	.constant("spinnerOpts", {
6		lines: 11, // The number of lines to draw
7		length: 11, // The length of each line
8		width: 6, // The line thickness
9		radius: 11, // The radius of the inner circle
10		corners: 1, // Corner roundness (0..1)
11		rotate: 0, // The rotation offset
12		direction: 1, // 1: clockwise, -1: counterclockwise
13		color: '#000', // #rgb or #rrggbb or array of colors
14		speed: 1, // Rounds per second
15		trail: 58, // Afterglow percentage
16		shadow: false, // Whether to render a shadow
17		hwaccel: false, // Whether to use hardware acceleration
18		className: 'spinner', // The CSS class to assign to the spinner
19		zIndex: 2e9, // The z-index (defaults to 2000000000)
20		top: '50%', // Top position relative to parent
21		left: '50%' // Left position relative to parent
22	})
23
24	.config(function($locationProvider) {
25		$locationProvider.html5Mode({
26			enabled: true,
27			requireBase: false
28		})
29	})
30
31	.controller("trendsCtrl", function($scope, $location, $modal, $http,
32			nagiosTimeService) {
33		$scope.search = $location.search();
34
35		// URL parameters
36		$scope.params = {
37			cgiurl: '@cgiurl@/',
38			reporttype: $scope.search.reporttype ?
39					$scope.search.reporttype : "",
40			host: $scope.search.host ? $scope.search.host : "",
41			service: $scope.search.service ?
42					$scope.search.service : "",
43			timeperiod: $scope.search.timeperiod ?
44					$scope.search.timeperiod : "",
45			t1: $scope.search.t1 ? $scope.search.t1 : 0,
46			t2: $scope.search.t2 ? $scope.search.t2 : 0,
47			assumeinitialstates: $scope.search.assumeinitialstates ?
48					true : false,
49			assumestateretention: $scope.search.assumestateretention ?
50					true : false,
51			assumestatesduringnotrunning:
52					$scope.search.assumestatesduringnotrunning ?
53					true : false,
54			includesoftstates: $scope.search.includesoftstates ?
55					$scope.search.includesoftstates : false,
56			initialassumedhoststate:
57					$scope.search.initialassumedhoststate ?
58					$scope.search.initialassumedhoststate : "",
59			initialassumedservicestate:
60					$scope.search.initialassumedservicestate ?
61					$scope.search.initialassumedservicestate : "",
62			backtrack: $scope.search.backtrack ?
63					parseInt($scope.search.backtrack) : 4,
64			nopopups: $scope.search.nopopups ? true : false,
65			nomap: $scope.search.nomap ? true : false
66		};
67
68		// Decoration-related variables
69		$scope.lastUpdate = "none";
70
71		var notBlank = function(value) {
72			return value != undefined && value != "";
73		};
74
75		// Determine the report type if not specified
76		if ($scope.params.reporttype == "") {
77			if (notBlank($scope.params.host) &&
78					notBlank($scope.params.service)) {
79				$scope.params.reporttype = "services";
80			}
81			else if (notBlank($scope.params.host)) {
82				$scope.params.reporttype = "hosts";
83			}
84		}
85
86		// Calculate start and end times based on report timeperiod
87		if (nagiosTimeService.isCannedTimeperiod($scope.params.timeperiod)) {
88				var times = nagiosTimeService.calculateReportTimes(new Date(),
89						$scope.params.timeperiod);
90				$scope.params.t1 = times.start.getTime() / 1000;
91				$scope.params.t2 = times.end.getTime() / 1000;
92		}
93		else if ($scope.params.t1 == 0 && $scope.params.t2 == 0) {
94			// or s* and e* variables, if specified
95			var now = new Date();
96			if ($scope.search.syear || $scope.search.smon ||
97					$scope.search.sday || $scope.search.shour ||
98					$scope.search.smin || $scope.search.ssec) {
99				var year = $scope.search.syear ?
100						parseInt($scope.search.syear) : now.getFullYear();
101				var month = $scope.search.smon ?
102						parseInt($scope.search.smon) - 1 : now.getMonth();
103				var day = $scope.search.sday ?
104						parseInt($scope.search.sday) : now.getDate();
105				var hour = $scope.search.shour ?
106						parseInt($scope.search.shour) : 0;
107				var min = $scope.search.smin ?
108						parseInt($scope.search.smin) : 0;
109				var sec = $scope.search.ssec ?
110						parseInt($scope.search.ssec) : 0;
111				var start = new Date(year, month, day, hour, min, sec);
112				$scope.params.t1 = start.getTime() / 1000;
113			}
114			if ($scope.search.eyear || $scope.search.emon ||
115					$scope.search.eday || $scope.search.ehour ||
116					$scope.search.emin || $scope.search.esec) {
117				var year = $scope.search.eyear ?
118						parseInt($scope.search.eyear) : now.getFullYear();
119				var month = $scope.search.emon ?
120						parseInt($scope.search.emon) - 1 : now.getMonth();
121				var day = $scope.search.eday ?
122						parseInt($scope.search.eday) : now.getDate();
123				var hour = $scope.search.ehour ?
124						parseInt($scope.search.ehour) : 0;
125				var min = $scope.search.emin ?
126						parseInt($scope.search.emin) : 0;
127				var sec = $scope.search.esec ?
128						parseInt($scope.search.esec) : 0;
129				var end = new Date(year, month, day, hour, min, sec);
130				$scope.params.t2 = end.getTime() / 1000;
131			}
132		}
133
134		// Application state variables
135		$scope.reload = 0;
136
137		// Do we have everything necessary to build a trend?
138		$scope.canBuildTrend = function() {
139			switch ($scope.params.reporttype) {
140			case "services":
141				if ((($scope.params.timeperiod != "") ||
142						(($scope.params.t1 != 0) &&
143						($scope.params.t2 != 0)))) {
144					return true;
145				}
146				return false;
147				break;
148			case "hosts":
149				if ((($scope.params.timeperiod != "") ||
150						(($scope.params.t1 != 0) &&
151						($scope.params.t2 != 0)))) {
152					$scope.params.reporttype = "hosts";
153					return true;
154				}
155				return false;
156				break;
157			default:
158				return false;
159				break;
160			}
161		};
162
163		$scope.displayForm = function(size) {
164			$scope.formDisplayed = true;
165			var modalInstance = $modal.open({
166				templateUrl: 'trends-form.html',
167				controller: 'trendsFormCtrl',
168				size: size,
169				resolve: {
170					params: function () {
171						return $scope.params;
172					}
173				}
174			});
175
176			modalInstance.result.then(function(params) {
177				$scope.formDisplayed = false;
178				$scope.params = params;
179				$scope.reload++;
180			},
181			function(reason) {
182				$scope.formDisplayed = false;
183			});
184		};
185
186		if(!$scope.canBuildTrend()) {
187			$scope.displayForm();
188		};
189
190		$scope.infoBoxTitle = function() {
191			switch ($scope.params.reporttype) {
192			case "hosts":
193				return "Host State Trends";
194				break;
195			case "services":
196				return "Service State Trends";
197				break;
198			default:
199				return "Host and Service State Trends";
200				break;
201			}
202		};
203
204	});
205