watchman 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/watchman/call.rb +61 -5
- data/lib/watchman/version.rb +1 -1
- data/spec/support/istatus_mocker.rb +77 -837
- data/spec/watchman/call_watcher_spec.rb +37 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/lib/watchman/call.rb
CHANGED
@@ -4,9 +4,6 @@ module Watchman
|
|
4
4
|
@page = page
|
5
5
|
end
|
6
6
|
|
7
|
-
def incident_number
|
8
|
-
end
|
9
|
-
|
10
7
|
def raw_notes
|
11
8
|
notes.map{|n| "#{n[:time]} #{n[:text]}"}.join("|")
|
12
9
|
end
|
@@ -26,7 +23,19 @@ module Watchman
|
|
26
23
|
end
|
27
24
|
|
28
25
|
def nature
|
29
|
-
|
26
|
+
nature_cell_text.split("-").last
|
27
|
+
end
|
28
|
+
|
29
|
+
ResponseLevelMap = {"A"=>"Alpha",
|
30
|
+
"B"=>"Bravo",
|
31
|
+
"C"=>"Charlie",
|
32
|
+
"D"=>"Delta",
|
33
|
+
"E"=>"Echo",
|
34
|
+
"O"=>"Omega"}
|
35
|
+
|
36
|
+
def response_level
|
37
|
+
match = nature_cell_text.split("-").first.scan(/^\d+([A-O])/).first.first
|
38
|
+
ResponseLevelMap[match]
|
30
39
|
end
|
31
40
|
|
32
41
|
def apparatus
|
@@ -57,7 +66,54 @@ module Watchman
|
|
57
66
|
s_notes
|
58
67
|
end
|
59
68
|
|
60
|
-
|
69
|
+
def cross_streets
|
70
|
+
[cross_street_1,cross_street_2]
|
71
|
+
end
|
72
|
+
|
73
|
+
def cross_street_1
|
74
|
+
xpath_text("#{main_table_path}/tr[7]/td")
|
75
|
+
end
|
76
|
+
|
77
|
+
def cross_street_2
|
78
|
+
xpath_text("#{main_table_path}/tr[8]/td")
|
79
|
+
end
|
80
|
+
|
81
|
+
def priority
|
82
|
+
xpath_text("#{main_table_path}/tr[4]/td[1]").to_i
|
83
|
+
end
|
84
|
+
|
85
|
+
def dispatch_code
|
86
|
+
xpath_text("#{main_table_path}/tr[4]/td[2]")
|
87
|
+
end
|
88
|
+
|
89
|
+
def grid
|
90
|
+
xpath_text("#{main_table_path}/tr[5]/td[1]")
|
91
|
+
end
|
92
|
+
|
93
|
+
def fire_area
|
94
|
+
xpath_text("#{main_table_path}/tr[6]/td")
|
95
|
+
end
|
96
|
+
|
97
|
+
def time_of_alarm
|
98
|
+
Time.parse(xpath_text("#{main_table_path}/tr[16]/td"))
|
99
|
+
end
|
100
|
+
|
101
|
+
def time_of_first_unit_on_scene
|
102
|
+
Time.parse(xpath_text("#{main_table_path}/tr[17]/td"))
|
103
|
+
end
|
104
|
+
private
|
105
|
+
def nature_cell_text
|
106
|
+
xpath_text("#{main_table_path}/tr[3]/td")
|
107
|
+
end
|
108
|
+
|
109
|
+
def main_table_path
|
110
|
+
"/html/body/table/tr[1]/td[1]/table"
|
111
|
+
end
|
112
|
+
|
113
|
+
def xpath_text(path)
|
114
|
+
xpath(path).text.strip
|
115
|
+
end
|
116
|
+
|
61
117
|
def xpath(path)
|
62
118
|
@page.parser.xpath(path)
|
63
119
|
end
|
data/lib/watchman/version.rb
CHANGED
@@ -225,647 +225,11 @@ class IstatusMocker
|
|
225
225
|
</frame>
|
226
226
|
<frame scrolling="no" allowtransparency="true" name="Top" noresize="" marginheight="0" marginwidth="0" frameborder="0" src="Dispatch_center.php">
|
227
227
|
<html><head><!-- Included file for dropdown menu -->
|
228
|
-
<script type="text/javascript"
|
229
|
-
//----------------------------------------------------------------------------
|
230
|
-
// Code to determine the browser and version.
|
231
|
-
//----------------------------------------------------------------------------
|
228
|
+
<script type="text/javascript">
|
232
229
|
|
233
|
-
function Browser() {
|
234
|
-
var ua, s, i;
|
235
|
-
this.isIE = false; // Internet Explorer
|
236
|
-
this.isOP = false; // Opera
|
237
|
-
this.isNS = false; // Netscape
|
238
|
-
this.version = null;
|
239
|
-
ua = navigator.userAgent;
|
240
|
-
s = "Opera";
|
241
|
-
if ((i = ua.indexOf(s)) >= 0) {
|
242
|
-
this.isOP = true;
|
243
|
-
this.version = parseFloat(ua.substr(i + s.length));
|
244
|
-
return;
|
245
|
-
}
|
246
|
-
s = "Netscape6/";
|
247
|
-
if ((i = ua.indexOf(s)) >= 0) {
|
248
|
-
this.isNS = true;
|
249
|
-
this.version = parseFloat(ua.substr(i + s.length));
|
250
|
-
return;
|
251
|
-
}
|
252
|
-
|
253
|
-
// Treat any other "Gecko" browser as Netscape 6.1.
|
254
|
-
s = "Gecko";
|
255
|
-
if ((i = ua.indexOf(s)) >= 0) {
|
256
|
-
this.isNS = true;
|
257
|
-
this.version = 6.1;
|
258
|
-
return;
|
259
|
-
}
|
260
|
-
|
261
|
-
s = "MSIE";
|
262
|
-
if ((i = ua.indexOf(s))) {
|
263
|
-
this.isIE = true;
|
264
|
-
this.version = parseFloat(ua.substr(i + s.length));
|
265
|
-
return;
|
266
|
-
}
|
267
|
-
}
|
268
|
-
|
269
|
-
var browser = new Browser();
|
270
|
-
|
271
|
-
//----------------------------------------------------------------------------
|
272
|
-
// Code for handling the menu bar and active button.
|
273
|
-
//----------------------------------------------------------------------------
|
274
|
-
var activeButton = null;
|
275
|
-
|
276
|
-
// Capture mouse clicks on the page so any active button can be
|
277
|
-
// deactivated.
|
278
|
-
if (browser.isIE)
|
279
|
-
document.onmousedown = pageMousedown;
|
280
|
-
else
|
281
|
-
document.addEventListener("mousedown", pageMousedown, true);
|
282
|
-
|
283
|
-
function pageMousedown(event) {
|
284
|
-
var el;
|
285
|
-
|
286
|
-
// If there is no active button, exit.
|
287
|
-
if (activeButton == null)
|
288
|
-
return;
|
289
|
-
|
290
|
-
// Find the element that was clicked on.
|
291
|
-
if (browser.isIE)
|
292
|
-
el = window.event.srcElement;
|
293
|
-
else
|
294
|
-
el = (event.target.tagName ? event.target : event.target.parentNode);
|
295
|
-
|
296
|
-
// If the active button was clicked on, exit.
|
297
|
-
if (el == activeButton)
|
298
|
-
return;
|
299
|
-
|
300
|
-
// If the element is not part of a menu, reset and clear the active
|
301
|
-
// button.
|
302
|
-
if (getContainerWith(el, "DIV", "menu") == null) {
|
303
|
-
resetButton(activeButton);
|
304
|
-
activeButton = null;
|
305
|
-
}
|
306
|
-
}
|
307
|
-
|
308
|
-
|
309
|
-
function buttonClick(event, menuId) {
|
310
|
-
var button;
|
311
|
-
|
312
|
-
// Get the target button element.
|
313
|
-
if (browser.isIE)
|
314
|
-
button = window.event.srcElement;
|
315
|
-
else
|
316
|
-
button = event.currentTarget;
|
317
|
-
|
318
|
-
// Blur focus from the link to remove that annoying outline.
|
319
|
-
button.blur();
|
320
|
-
|
321
|
-
// Associate the named menu to this button if not already done.
|
322
|
-
// Additionally, initialize menu display.
|
323
|
-
if (button.menu == null) {
|
324
|
-
button.menu = document.getElementById(menuId);
|
325
|
-
if (button.menu.isInitialized == null)
|
326
|
-
menuInit(button.menu);
|
327
|
-
}
|
328
|
-
|
329
|
-
// Set mouseout event handler for the button, if not already done.
|
330
|
-
if (button.onmouseout == null)
|
331
|
-
button.onmouseout = buttonOrMenuMouseout;
|
332
|
-
|
333
|
-
// Exit if this button is the currently active one.
|
334
|
-
if (button == activeButton)
|
335
|
-
return false;
|
336
|
-
|
337
|
-
// Reset the currently active button, if any.
|
338
|
-
if (activeButton != null)
|
339
|
-
resetButton(activeButton);
|
340
|
-
|
341
|
-
// Activate this button, unless it was the currently active one.
|
342
|
-
if (button != activeButton) {
|
343
|
-
depressButton(button);
|
344
|
-
activeButton = button;
|
345
|
-
}
|
346
|
-
else
|
347
|
-
activeButton = null;
|
348
|
-
|
349
|
-
return false;
|
350
|
-
}
|
351
|
-
|
352
|
-
function buttonMouseover(event, menuId) {
|
353
|
-
|
354
|
-
var button;
|
355
|
-
|
356
|
-
if (activeButton == null) {
|
357
|
-
buttonClick(event, menuId);
|
358
|
-
return;
|
359
|
-
}
|
360
|
-
|
361
|
-
// Find the target button element.
|
362
|
-
if (browser.isIE)
|
363
|
-
button = window.event.srcElement;
|
364
|
-
else
|
365
|
-
button = event.currentTarget;
|
366
|
-
|
367
|
-
// If any other button menu is active, make this one active instead.
|
368
|
-
if (activeButton != null && activeButton != button)
|
369
|
-
buttonClick(event, menuId);
|
370
|
-
}
|
371
|
-
|
372
|
-
function depressButton(button) {
|
373
|
-
var x, y;
|
374
|
-
|
375
|
-
// Update the button's style class to make it look like it's
|
376
|
-
// depressed.
|
377
|
-
button.className += " menuButtonActive";
|
378
|
-
|
379
|
-
// Set mouseout event handler for the button, if not already done.
|
380
|
-
if (button.onmouseout == null)
|
381
|
-
button.onmouseout = buttonOrMenuMouseout;
|
382
|
-
if (button.menu.onmouseout == null)
|
383
|
-
button.menu.onmouseout = buttonOrMenuMouseout;
|
384
|
-
|
385
|
-
// Position the associated drop down menu under the button and
|
386
|
-
// show it.
|
387
|
-
x = getPageOffsetLeft(button);
|
388
|
-
y = getPageOffsetTop(button) + button.offsetHeight;
|
389
|
-
|
390
|
-
// For IE, adjust position.
|
391
|
-
if (browser.isIE) {
|
392
|
-
x += button.offsetParent.clientLeft-5;
|
393
|
-
y += button.offsetParent.clientTop+3;
|
394
|
-
}
|
395
|
-
|
396
|
-
button.menu.style.left = x + "px";
|
397
|
-
button.menu.style.top = y + "px";
|
398
|
-
button.menu.style.visibility = "visible";
|
399
|
-
|
400
|
-
// For IE; size, position and show the menu's IFRAME as well.
|
401
|
-
if (button.menu.iframeEl != null)
|
402
|
-
{
|
403
|
-
button.menu.iframeEl.style.left = button.menu.style.left;
|
404
|
-
button.menu.iframeEl.style.top = button.menu.style.top;
|
405
|
-
button.menu.iframeEl.style.width = button.menu.offsetWidth + "px";
|
406
|
-
button.menu.iframeEl.style.height = button.menu.offsetHeight + "px";
|
407
|
-
button.menu.iframeEl.style.display = "";
|
408
|
-
}
|
409
|
-
}
|
410
|
-
|
411
|
-
function resetButton(button) {
|
412
|
-
|
413
|
-
// Restore the button's style class.
|
414
|
-
removeClassName(button, "menuButtonActive");
|
415
|
-
|
416
|
-
// Hide the button's menu, first closing any sub menus.
|
417
|
-
if (button.menu != null) {
|
418
|
-
closeSubMenu(button.menu);
|
419
|
-
button.menu.style.visibility = "hidden";
|
420
|
-
|
421
|
-
// For IE, hide menu's IFRAME as well.
|
422
|
-
if (button.menu.iframeEl != null)
|
423
|
-
button.menu.iframeEl.style.display = "none";
|
424
|
-
}
|
425
|
-
}
|
426
|
-
|
427
|
-
//----------------------------------------------------------------------------
|
428
|
-
// Code to handle the menus and sub menus.
|
429
|
-
//----------------------------------------------------------------------------
|
430
|
-
|
431
|
-
function menuMouseover(event) {
|
432
|
-
|
433
|
-
var menu;
|
434
|
-
|
435
|
-
// Find the target menu element.
|
436
|
-
|
437
|
-
if (browser.isIE)
|
438
|
-
menu = getContainerWith(window.event.srcElement, "DIV", "menu");
|
439
|
-
else
|
440
|
-
menu = event.currentTarget;
|
441
|
-
|
442
|
-
// Close any active sub menu.
|
443
|
-
|
444
|
-
if (menu.activeItem != null)
|
445
|
-
closeSubMenu(menu);
|
446
|
-
}
|
447
|
-
|
448
|
-
function menuItemMouseover(event, menuId) {
|
449
|
-
var item, menu, x, y;
|
450
|
-
|
451
|
-
// Find the target item element and its parent menu element.
|
452
|
-
if (browser.isIE)
|
453
|
-
item = getContainerWith(window.event.srcElement, "A", "menuItem");
|
454
|
-
else
|
455
|
-
item = event.currentTarget;
|
456
|
-
menu = getContainerWith(item, "DIV", "menu");
|
457
|
-
|
458
|
-
// Close any active sub menu and mark this one as active.
|
459
|
-
if (menu.activeItem != null)
|
460
|
-
closeSubMenu(menu);
|
461
|
-
menu.activeItem = item;
|
462
|
-
|
463
|
-
// Highlight the item element.
|
464
|
-
item.className += " menuItemHighlight";
|
465
|
-
|
466
|
-
// Initialize the sub menu, if not already done.
|
467
|
-
if (item.subMenu == null) {
|
468
|
-
item.subMenu = document.getElementById(menuId);
|
469
|
-
if (item.subMenu.isInitialized == null)
|
470
|
-
menuInit(item.subMenu);
|
471
|
-
}
|
472
|
-
|
473
|
-
// Set mouseout event handler for the sub menu, if not already done.
|
474
|
-
if (item.subMenu.onmouseout == null)
|
475
|
-
item.subMenu.onmouseout = buttonOrMenuMouseout;
|
476
|
-
|
477
|
-
// Get position for submenu based on the menu item.
|
478
|
-
x = getPageOffsetLeft(item) + item.offsetWidth;
|
479
|
-
y = getPageOffsetTop(item);
|
480
|
-
|
481
|
-
// Adjust position to fit in view.
|
482
|
-
var maxX, maxY;
|
483
|
-
if (browser.isIE) {
|
484
|
-
maxX = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) +
|
485
|
-
(document.documentElement.clientWidth != 0 ? document.documentElement.clientWidth : document.body.clientWidth);
|
486
|
-
maxY = Math.max(document.documentElement.scrollTop, document.body.scrollTop) +
|
487
|
-
(document.documentElement.clientHeight != 0 ? document.documentElement.clientHeight : document.body.clientHeight);
|
488
|
-
}
|
489
|
-
if (browser.isOP) {
|
490
|
-
maxX = document.documentElement.scrollLeft + window.innerWidth;
|
491
|
-
maxY = document.documentElement.scrollTop + window.innerHeight;
|
492
|
-
}
|
493
|
-
if (browser.isNS) {
|
494
|
-
maxX = window.scrollX + window.innerWidth;
|
495
|
-
maxY = window.scrollY + window.innerHeight;
|
496
|
-
}
|
497
|
-
maxX -= item.subMenu.offsetWidth;
|
498
|
-
maxY -= item.subMenu.offsetHeight;
|
499
|
-
|
500
|
-
if (x > maxX)
|
501
|
-
x = Math.max(0, x - item.offsetWidth - item.subMenu.offsetWidth
|
502
|
-
+ (menu.offsetWidth - item.offsetWidth));
|
503
|
-
y = Math.max(0, Math.min(y, maxY));
|
504
|
-
|
505
|
-
// Position and show the sub menu.
|
506
|
-
item.subMenu.style.left = x + "px";
|
507
|
-
item.subMenu.style.top = y + "px";
|
508
|
-
item.subMenu.style.visibility = "visible";
|
509
|
-
|
510
|
-
// For IE; size, position and display the menu's IFRAME as well.
|
511
|
-
if (item.subMenu.iframeEl != null)
|
512
|
-
{
|
513
|
-
item.subMenu.iframeEl.style.left = item.subMenu.style.left;
|
514
|
-
item.subMenu.iframeEl.style.top = item.subMenu.style.top;
|
515
|
-
item.subMenu.iframeEl.style.width = item.subMenu.offsetWidth + "px";
|
516
|
-
item.subMenu.iframeEl.style.height = item.subMenu.offsetHeight + "px";
|
517
|
-
item.subMenu.iframeEl.style.display = "";
|
518
|
-
}
|
519
|
-
|
520
|
-
// Stop the event from bubbling.
|
521
|
-
if (browser.isIE)
|
522
|
-
window.event.cancelBubble = true;
|
523
|
-
else
|
524
|
-
event.stopPropagation();
|
525
|
-
}
|
526
|
-
|
527
|
-
function closeSubMenu(menu) {
|
528
|
-
if (menu == null || menu.activeItem == null)
|
529
|
-
return;
|
530
|
-
|
531
|
-
// Recursively close any sub menus.
|
532
|
-
if (menu.activeItem.subMenu != null) {
|
533
|
-
closeSubMenu(menu.activeItem.subMenu);
|
534
|
-
menu.activeItem.subMenu.style.visibility = "hidden";
|
535
|
-
|
536
|
-
// For IE, hide the sub menu's IFRAME as well.
|
537
|
-
if (menu.activeItem.subMenu.iframeEl != null)
|
538
|
-
menu.activeItem.subMenu.iframeEl.style.display = "none";
|
539
|
-
|
540
|
-
menu.activeItem.subMenu = null;
|
541
|
-
}
|
542
|
-
|
543
|
-
// Deactivate the active menu item.
|
544
|
-
removeClassName(menu.activeItem, "menuItemHighlight");
|
545
|
-
menu.activeItem = null;
|
546
|
-
}
|
547
|
-
|
548
|
-
// event on buttons and menus.
|
549
|
-
function buttonOrMenuMouseout(event) {
|
550
|
-
var el;
|
551
|
-
|
552
|
-
// If there is no active button, exit.
|
553
|
-
if (activeButton == null)
|
554
|
-
return;
|
555
|
-
|
556
|
-
// Find the element the mouse is moving to.
|
557
|
-
if (browser.isIE)
|
558
|
-
el = window.event.toElement;
|
559
|
-
else if (event.relatedTarget != null)
|
560
|
-
el = (event.relatedTarget.tagName ? event.relatedTarget : event.relatedTarget.parentNode);
|
561
|
-
|
562
|
-
// If the element is not part of a menu, reset the active button.
|
563
|
-
if (getContainerWith(el, "DIV", "menu") == null) {
|
564
|
-
resetButton(activeButton);
|
565
|
-
activeButton = null;
|
566
|
-
}
|
567
|
-
}
|
568
|
-
|
569
|
-
//----------------------------------------------------------------------------
|
570
|
-
// Code to initialize menus.
|
571
|
-
//----------------------------------------------------------------------------
|
572
|
-
function menuInit(menu) {
|
573
|
-
var itemList, spanList;
|
574
|
-
var textEl, arrowEl;
|
575
|
-
var itemWidth;
|
576
|
-
var w, dw;
|
577
|
-
var i, j;
|
578
|
-
|
579
|
-
// For IE, replace arrow characters.
|
580
|
-
if (browser.isIE) {
|
581
|
-
menu.style.lineHeight = "2.5ex";
|
582
|
-
spanList = menu.getElementsByTagName("SPAN");
|
583
|
-
for (i = 0; i < spanList.length; i++)
|
584
|
-
if (hasClassName(spanList[i], "menuItemArrow")) {
|
585
|
-
spanList[i].style.fontFamily = "Webdings";
|
586
|
-
spanList[i].firstChild.nodeValue = "4";
|
587
|
-
}
|
588
|
-
}
|
589
|
-
|
590
|
-
// Find the width of a menu item.
|
591
|
-
itemList = menu.getElementsByTagName("A");
|
592
|
-
if (itemList.length > 0)
|
593
|
-
itemWidth = itemList[0].offsetWidth;
|
594
|
-
else
|
595
|
-
return;
|
596
|
-
|
597
|
-
// For items with arrows, add padding to item text to make the
|
598
|
-
// arrows flush right.
|
599
|
-
for (i = 0; i < itemList.length; i++) {
|
600
|
-
spanList = itemList[i].getElementsByTagName("SPAN");
|
601
|
-
textEl = null;
|
602
|
-
arrowEl = null;
|
603
|
-
for (j = 0; j < spanList.length; j++) {
|
604
|
-
if (hasClassName(spanList[j], "menuItemText"))
|
605
|
-
textEl = spanList[j];
|
606
|
-
if (hasClassName(spanList[j], "menuItemArrow"))
|
607
|
-
arrowEl = spanList[j];
|
608
|
-
}
|
609
|
-
if (textEl != null && arrowEl != null) {
|
610
|
-
textEl.style.paddingRight = (itemWidth
|
611
|
-
- (textEl.offsetWidth + arrowEl.offsetWidth)) + "px";
|
612
|
-
// For Opera, remove the negative right margin to fix a display bug.
|
613
|
-
if (browser.isOP)
|
614
|
-
arrowEl.style.marginRight = "0px";
|
615
|
-
}
|
616
|
-
}
|
617
|
-
|
618
|
-
// Fix IE hover problem by setting an explicit width on first item of
|
619
|
-
// the menu.
|
620
|
-
if (browser.isIE) {
|
621
|
-
w = itemList[0].offsetWidth;
|
622
|
-
itemList[0].style.width = w + "px";
|
623
|
-
dw = itemList[0].offsetWidth - w;
|
624
|
-
w -= dw;
|
625
|
-
itemList[0].style.width = w + "px";
|
626
|
-
}
|
627
|
-
|
628
|
-
// Fix the IE display problem (SELECT elements and other windowed controls
|
629
|
-
// overlaying the menu) by adding an IFRAME under the menu.
|
630
|
-
if (browser.isIE) {
|
631
|
-
var iframeEl = document.createElement("IFRAME");
|
632
|
-
iframeEl.frameBorder = 0;
|
633
|
-
iframeEl.src = "javascript:;";
|
634
|
-
iframeEl.style.display = "none";
|
635
|
-
iframeEl.style.position = "absolute";
|
636
|
-
//iframeEl.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
|
637
|
-
menu.iframeEl = menu.parentNode.insertBefore(iframeEl, menu);
|
638
|
-
}
|
639
|
-
|
640
|
-
// Mark menu as initialized.
|
641
|
-
menu.isInitialized = true;
|
642
|
-
}
|
643
|
-
|
644
|
-
//----------------------------------------------------------------------------
|
645
|
-
// General utility functions.
|
646
|
-
//----------------------------------------------------------------------------
|
647
|
-
function getContainerWith(node, tagName, className) {
|
648
|
-
// Starting with the given node, find the nearest containing element
|
649
|
-
// with the specified tag name and style class.
|
650
|
-
while (node != null) {
|
651
|
-
if (node.tagName != null && node.tagName == tagName &&
|
652
|
-
hasClassName(node, className))
|
653
|
-
return node;
|
654
|
-
node = node.parentNode;
|
655
|
-
}
|
656
|
-
return node;
|
657
|
-
}
|
658
|
-
|
659
|
-
function hasClassName(el, name) {
|
660
|
-
var i, list;
|
661
|
-
// Return true if the given element currently has the given class
|
662
|
-
// name.
|
663
|
-
list = el.className.split(" ");
|
664
|
-
for (i = 0; i < list.length; i++)
|
665
|
-
if (list[i] == name)
|
666
|
-
return true;
|
667
|
-
return false;
|
668
|
-
}
|
669
|
-
|
670
|
-
function removeClassName(el, name) {
|
671
|
-
var i, curList, newList;
|
672
|
-
if (el.className == null)
|
673
|
-
return;
|
674
|
-
|
675
|
-
// Remove the given class name from the element's className property.
|
676
|
-
newList = new Array();
|
677
|
-
curList = el.className.split(" ");
|
678
|
-
for (i = 0; i < curList.length; i++)
|
679
|
-
if (curList[i] != name)
|
680
|
-
newList.push(curList[i]);
|
681
|
-
el.className = newList.join(" ");
|
682
|
-
}
|
683
|
-
|
684
|
-
function getPageOffsetLeft(el) {
|
685
|
-
var x;
|
686
|
-
// Return the x coordinate of an element relative to the page.
|
687
|
-
x = el.offsetLeft;
|
688
|
-
if (el.offsetParent != null)
|
689
|
-
x += getPageOffsetLeft(el.offsetParent);
|
690
|
-
return x;
|
691
|
-
}
|
692
|
-
|
693
|
-
function getPageOffsetTop(el) {
|
694
|
-
var y;
|
695
|
-
// Return the x coordinate of an element relative to the page.
|
696
|
-
y = el.offsetTop;
|
697
|
-
if (el.offsetParent != null)
|
698
|
-
y += getPageOffsetTop(el.offsetParent);
|
699
|
-
return y;
|
700
|
-
}
|
701
|
-
//]]></script>
|
702
|
-
<style type="text/css">
|
703
|
-
|
704
|
-
div.menuBar,
|
705
|
-
div.menuBar a.menuButton,
|
706
|
-
div.menu,
|
707
|
-
div.menu a.menuItem {
|
708
|
-
font-family: Arial, "MS Sans Serif", sans-serif;
|
709
|
-
font-size: 10pt;
|
710
|
-
font-style: normal;
|
711
|
-
font-weight: normal;
|
712
|
-
color: #0066cc;
|
713
|
-
text-align: left;
|
714
|
-
}
|
715
|
-
|
716
|
-
div.menuBar {
|
717
|
-
background-color: #0066cc;
|
718
|
-
/*border: 2px outset #e0e0e0;*/
|
719
|
-
border: 0px;
|
720
|
-
border: 2px solid;
|
721
|
-
border-color: #0066cc #0066cc #0066cc #0066cc;
|
722
|
-
padding: 4px 2px 4px 2px;
|
723
|
-
text-align: left;
|
724
|
-
top: 0px;
|
725
|
-
left: 0px;
|
726
|
-
}
|
727
|
-
|
728
|
-
div.menuBar a.menuButton {
|
729
|
-
background-color: transparent;
|
730
|
-
border: 1px solid #0066cc;
|
731
|
-
color: #ffffff;
|
732
|
-
cursor: default;
|
733
|
-
left: 0px;
|
734
|
-
margin: 1px;
|
735
|
-
padding: 2px 6px 2px 6px;
|
736
|
-
position: relative;
|
737
|
-
text-decoration: none;
|
738
|
-
text-align: left;
|
739
|
-
top: 0px;
|
740
|
-
z-index: 100;
|
741
|
-
}
|
742
|
-
div.menuBar a.menuLink {
|
743
|
-
background-color: transparent;
|
744
|
-
font-family: Arial, "MS Sans Serif", sans-serif;
|
745
|
-
font-size: 10pt;
|
746
|
-
font-style: normal;
|
747
|
-
font-weight: normal;
|
748
|
-
color: #ffffff;
|
749
|
-
text-align: right;
|
750
|
-
text-decoration: none;
|
751
|
-
margin: 1px;
|
752
|
-
padding: 2px 6px 2px 6px;
|
753
|
-
/*width: 150px;*/
|
754
|
-
}
|
755
|
-
|
756
|
-
div.menuBar a.menuLink:hover {
|
757
|
-
background-color: 000080;
|
758
|
-
border: 1px outset #e0e0e0;
|
759
|
-
text-align:left;
|
760
|
-
color: #ffffff;
|
761
|
-
cursor: default;
|
762
|
-
}
|
763
|
-
|
764
|
-
div.menuBar a.menuButton:hover {
|
765
|
-
background-color: 000080;
|
766
|
-
border: 1px outset #e0e0e0;
|
767
|
-
text-align:left;
|
768
|
-
color: #ffffff;
|
769
|
-
}
|
770
|
-
|
771
|
-
div.menuBar a.menuButtonActive,
|
772
|
-
div.menuBar a.menuButtonActive:hover {
|
773
|
-
background-color: #0066cc;
|
774
|
-
/*border: 1px inset #e0e0e0;*/
|
775
|
-
color: #ffffff;
|
776
|
-
/*left: 1px;*/
|
777
|
-
/*top: 1px;*/
|
778
|
-
text-align: left;
|
779
|
-
}
|
780
|
-
|
781
|
-
div.menu {
|
782
|
-
background-color: #0066cc;
|
783
|
-
/*border: 2px outset #e0e0e0;*/
|
784
|
-
left: 0px;
|
785
|
-
padding: 0px 1px 1px 0px;
|
786
|
-
position: absolute;
|
787
|
-
top: 28px;
|
788
|
-
visibility: hidden;
|
789
|
-
z-index: 101;
|
790
|
-
text-align: left;
|
791
|
-
}
|
792
|
-
|
793
|
-
div.menu a.menuItem {
|
794
|
-
color: #ffffff;
|
795
|
-
cursor: default;
|
796
|
-
display: block;
|
797
|
-
padding: 3px 1em;
|
798
|
-
text-decoration: none;
|
799
|
-
text-align: left;
|
800
|
-
white-space: nowrap;
|
801
|
-
}
|
802
|
-
|
803
|
-
div.menu a.menuItem:hover, div.menu a.menuItemHighlight {
|
804
|
-
background-color: #000080;
|
805
|
-
color: #ffffff;
|
806
|
-
text-align: left;
|
807
|
-
}
|
808
|
-
|
809
|
-
div.menu a.menuItem span.menuItemText {}
|
810
|
-
|
811
|
-
div.menu a.menuItem span.menuItemArrow {
|
812
|
-
margin-right: -.75em;
|
813
|
-
}
|
814
|
-
|
815
|
-
div.menu div.menuItemSep {
|
816
|
-
border: 1px inset #e0e0e0;
|
817
|
-
margin: 4px 2px;
|
818
|
-
}
|
819
|
-
</style>
|
820
|
-
|
821
|
-
<meta content="text/html; charset=windows-1252" http-equiv="Content-Type"><meta content="NO-CACHE" http-equiv="PRAGMA"><meta content="0" http-equiv="EXPIRES"><title>EnRoute I-STATUS</title></head><body onload="ClearSortCookie(); SendRequest();" onunload="ClearTimer()"><div style="position: relative;" class="menuBar"><a onmouseover="buttonMouseover(event, 'FireMenu');" class="menuButton">Fire</a><a onmouseover="buttonMouseover(event, 'AdminMenu');" class="menuButton">Admin</a><a target="_top" href="UserLogin.php" onclick="LogOffClicked("UserKey")" class="menuButton">Logoff</a><span style="width: 150px;"> </span><a href="#" onclick="ToggleMode()" onmouseover="" class="menuLink">Night Mode</a> "<img style="position: absolute; top: -3px;" src="I-STATUS1.gif"></div><div onmouseover="menuMouseover(event)" class="menu" id="AmbMenu"></div><div onmouseover="menuMouseover(event)" class="menu" id="FireMenu"><a target="Top" href="Dispatch_center.php" class="menuItem">Active Fire/EMS Calls</a> <a target="Top" href="TruckStatus.php" class="menuItem">Apparatus</a> <a target="Top" href="SearchDStats.php" class="menuItem">Fire/EMS History</a> <a target="Top" href="ChgQuarters.php" class="menuItem">Coverage/Quarters</a> <a target="Top" href="FireRestricts.php" class="menuItem">Restrictions</a> </div><div onmouseover="menuMouseover(event)" class="menu" id="PoliceMenu"></div><div onmouseover="menuMouseover(event)" class="menu" id="AdminMenu"><a target="Top" href="UserPasswordMaint.php" class="menuItem">Change Password</a></div><script language="javascript">
|
822
|
-
function popup(URL) {
|
823
|
-
opts="'toolbar=0, scrollbars=0, location=0, menubar=0, resizable=0, width=160,"
|
824
|
-
opts=opts + "height=200, top=60, left=60'"
|
825
|
-
mywindow=window.open(URL, "newwin",opts);
|
826
|
-
if (mywindow.opener == null)
|
827
|
-
mywindow.opener=self;
|
828
|
-
}
|
829
|
-
function LogOffClicked(CN)
|
830
|
-
{
|
831
|
-
var cookiename=CN;
|
832
|
-
/*alert("logoff clicked= " + cookiename);
|
833
|
-
if (isset($_COOKIE['cookiename'])){
|
834
|
-
alert("Cookie is set");
|
835
|
-
setcookie ("cookiename", "", time()-60*60*24*100);
|
836
|
-
}*/
|
837
|
-
DeleteCookie(cookiename);
|
838
|
-
}
|
839
|
-
function ToggleMode() {
|
840
|
-
var cname="NiteMode";
|
841
|
-
var mode=ReadCookie(cname);
|
842
|
-
if (mode == "") mode="Day";
|
843
|
-
if (mode == "Day") {
|
844
|
-
var newmode="Nite";
|
845
|
-
} else {
|
846
|
-
var newmode="Day";
|
847
|
-
}
|
848
|
-
WriteCookie(cname,newmode,1);
|
849
|
-
if (window.parent.frames.length == 0) {
|
850
|
-
window.self.location.href=window.self.location.href;
|
851
|
-
} else {
|
852
|
-
for (i=0; i<window.parent.frames.length; i++)
|
853
|
-
window.parent.frames(i).location.href=window.parent.frames(i).location.href;
|
854
|
-
}
|
855
|
-
}
|
856
230
|
</script>
|
857
231
|
<script src="JSFuncs.js" language="JavaScript"></script><script language="javascript">
|
858
|
-
|
859
|
-
function cookieVal(cookieName){
|
860
|
-
thisCookie=document.cookie.split("; ");
|
861
|
-
var rtnval="";
|
862
|
-
for (i=0; i<thisCookie.length; i++){
|
863
|
-
if (cookieName == thisCookie[i].split("=")[0]){
|
864
|
-
rtnval=thisCookie[i].split("=")[1];
|
865
|
-
}
|
866
|
-
}
|
867
|
-
return rtnval;
|
868
|
-
}
|
232
|
+
|
869
233
|
</script>
|
870
234
|
|
871
235
|
|
@@ -919,150 +283,7 @@ class IstatusMocker
|
|
919
283
|
</form>
|
920
284
|
<script src="Ajax.js" language="javascript"></script>
|
921
285
|
<script language="javascript">
|
922
|
-
|
923
|
-
var instr;
|
924
|
-
var fdtacs=cookieVal("FDTacs");
|
925
|
-
var fdids=cookieVal("FDIDs");
|
926
|
-
var fdgrids=cookieVal("FDGrids");
|
927
|
-
var fdnats=cookieVal("FDNats");
|
928
|
-
var fddsps=cookieVal("FDDsps");
|
929
|
-
|
930
|
-
function SetDivSize(){
|
931
|
-
//center Scrollable2
|
932
|
-
var obj=document.getElementById("Scrollable2");
|
933
|
-
obj.style.left=(document.body.clientWidth-540)/2;
|
934
|
-
|
935
|
-
ht=document.body.clientHeight-d.offsetTop;
|
936
|
-
d.style.height=ht-60;
|
937
|
-
}
|
938
|
-
|
939
|
-
function TruckScreen(scrn){
|
940
|
-
WriteCookie("TScreen",scrn,"1");
|
941
|
-
SendRequest()
|
942
|
-
}
|
943
|
-
// Create a request for data
|
944
|
-
function CreateRequest(){
|
945
|
-
try {
|
946
|
-
request=new XMLHttpRequest();
|
947
|
-
} catch (trymicrosoft) {
|
948
|
-
try {
|
949
|
-
request = new ActiveXObject("Msxml2.XMLHTTP");
|
950
|
-
} catch (othermicrosoft) {
|
951
|
-
try {
|
952
|
-
request=new ActiveXObject("Microsoft.XMLHTTP");
|
953
|
-
} catch (failed) {
|
954
|
-
request=null;
|
955
|
-
}
|
956
|
-
}
|
957
|
-
}
|
958
|
-
if (request == null) alert("Error creating request object!");
|
959
|
-
}
|
960
|
-
|
961
|
-
// Send request for data to server
|
962
|
-
function SendRequest(){
|
963
|
-
CreateRequest();
|
964
|
-
if (request != null){
|
965
|
-
var url="AjaxTS2.php";
|
966
|
-
request.open("GET",url,true);
|
967
|
-
request.setRequestHeader("Content-Type","text/xml");
|
968
|
-
request.onreadystatechange=UpdatePage;
|
969
|
-
request.send(null);
|
970
|
-
}
|
971
|
-
RefreshTimer();
|
972
|
-
}
|
973
|
-
|
974
|
-
// Update page with returned data
|
975
|
-
function UpdatePage(){
|
976
|
-
rrs=request.readyState;
|
977
|
-
if (rrs == 4){
|
978
|
-
instr=request.responseText;
|
979
|
-
// If the instr contains "UserLogin.php", which means
|
980
|
-
// the page has timed out (code is in Global.php).
|
981
|
-
if (instr.indexOf("UserLogin.php") != -1) {
|
982
|
-
top.location="UserLogin.php";
|
983
|
-
}
|
984
|
-
BuildTable();
|
985
|
-
}
|
986
|
-
}
|
987
|
-
|
988
|
-
function BuildTable(){
|
989
|
-
var lctr;
|
990
|
-
var outstr = new StringBuffer();
|
991
|
-
var usort;
|
992
|
-
var leftMargin;
|
993
|
-
usort=cookieVal("TScreen");
|
994
|
-
if (usort == "") usort=1;
|
995
|
-
|
996
|
-
// Calculate left margin in order to center Scrollable2
|
997
|
-
leftMargin=(document.body.clientWidth-540)/2;
|
998
|
-
outstr.append('<div id="Scrollable2" style="position:absolute; left:'+leftMargin+'px;">');
|
999
|
-
outstr.append(instr);
|
1000
|
-
outstr.append('</div>');
|
1001
|
-
h=document.getElementById("shead");
|
1002
|
-
h.innerHTML="Apparatus Status - Screen "+usort;
|
1003
|
-
d=document.getElementById("Scrollable");
|
1004
|
-
d.innerHTML=outstr;
|
1005
|
-
ht=document.body.clientHeight-d.offsetTop;
|
1006
|
-
d.style.height=ht-60;
|
1007
|
-
|
1008
|
-
}
|
1009
|
-
|
1010
|
-
function ClearSortCookie(){
|
1011
|
-
WriteCookie("SortFlg","xx","7");
|
1012
|
-
}
|
1013
|
-
// This function expand or collapse the unit legends
|
1014
|
-
function DisplayLegends(id){
|
1015
|
-
var ih="";
|
1016
|
-
var cname="";
|
1017
|
-
var ft="";
|
1018
|
-
var fd="";
|
1019
|
-
var fg="";
|
1020
|
-
var fn="";
|
1021
|
-
var dp="";
|
1022
|
-
|
1023
|
-
switch (id){
|
1024
|
-
case "legend":
|
1025
|
-
ih="<small>"+"<big>-</big> <font color=#0066cc>Primary</font> &nbsp; &nbsp; "
|
1026
|
-
+"<big>*</big> <font color=#0066cc>Two person</font> &nbsp; &nbsp; "
|
1027
|
-
+"+ <font color=#0066cc>Primary and Two person</font> &nbsp; &nbsp; "
|
1028
|
-
+"<b>m</b> <font color=#0066cc>MDT</font>"
|
1029
|
-
+"</small>";
|
1030
|
-
cname="UnitLegends";
|
1031
|
-
break;
|
1032
|
-
case "restricts":
|
1033
|
-
ih="<small><font color=#FF0000>";
|
1034
|
-
if (ft != ""){
|
1035
|
-
ih = ih + "Tacs: " + ft + "<BR>";
|
1036
|
-
}
|
1037
|
-
if (fd != ""){
|
1038
|
-
ih=ih + "FDIDs: "+fd + "<BR>";
|
1039
|
-
}
|
1040
|
-
if (fg != ""){
|
1041
|
-
ih=ih + "Grids: "+ fg + "<BR>";
|
1042
|
-
}
|
1043
|
-
if (fn != ""){
|
1044
|
-
ih=ih + "Natures: "+ fn + "<BR>";
|
1045
|
-
}
|
1046
|
-
if (dp != ""){
|
1047
|
-
ih=ih + "Dispatch: "+ dp + "<BR>";
|
1048
|
-
}
|
1049
|
-
ih=ih+"</font></small>";
|
1050
|
-
cname="FDRestrictions";
|
1051
|
-
break;
|
1052
|
-
default:
|
1053
|
-
ih="";
|
1054
|
-
cname="";
|
1055
|
-
}
|
1056
|
-
if (ih != ""){
|
1057
|
-
if (document.getElementById(id).innerHTML == "") {
|
1058
|
-
document.getElementById(id).innerHTML=ih;
|
1059
|
-
WriteCookie(cname,"1",1);
|
1060
|
-
} else {
|
1061
|
-
document.getElementById(id).innerHTML="";
|
1062
|
-
WriteCookie(cname,"0",1);
|
1063
|
-
}
|
1064
|
-
}
|
1065
|
-
}
|
286
|
+
|
1066
287
|
</script>
|
1067
288
|
<script src="JSFuncs.js" language="JavaScript"></script>
|
1068
289
|
</body></html>
|
@@ -1098,61 +319,80 @@ class IstatusMocker
|
|
1098
319
|
Building</TH>
|
1099
320
|
<TD CLASS='Detail' COLSPAN=3>
|
1100
321
|
</TD>
|
1101
|
-
</tr
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
</tr
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
</tr
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
</tr
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
<
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
<
|
1154
|
-
|
1155
|
-
|
322
|
+
</tr>
|
323
|
+
<tr>
|
324
|
+
<TH CLASS='Detail' align=left width=100px>Nature</TH>
|
325
|
+
<TD CLASS='Detail' COLSPAN=3>23C7V-SML NON DWEL STR FIRE</TD>
|
326
|
+
</tr>
|
327
|
+
<tr>
|
328
|
+
<TH CLASS='Detail' align=left width=100px>Priority</TH>
|
329
|
+
<TD CLASS='Detail' width=110px>2</TD>
|
330
|
+
<TH CLASS='Detail' align=left width=100px>Dispatch Code</TH>
|
331
|
+
<TD CLASS='Detail' > BOX </TD>
|
332
|
+
</tr>
|
333
|
+
<tr>
|
334
|
+
<TH CLASS='Detail' align=left> Grid</TH>
|
335
|
+
<TD CLASS='Detail' width=110px> 34123B </TD>
|
336
|
+
<TH CLASS='Detail' align=left width=100px> Map</TH>
|
337
|
+
<TD CLASS='Detail' > </TD>
|
338
|
+
</tr>
|
339
|
+
<tr>
|
340
|
+
<TH CLASS='Detail' align=left> Fire Area</TH>
|
341
|
+
<td class="Detail" COLSPAN="3">19-17B </td>
|
342
|
+
</tr>
|
343
|
+
<tr>
|
344
|
+
<TH CLASS='Detail' align=left> Cross1</TH>
|
345
|
+
<td class="Detail" COLSPAN="3">RANGELINE RD S</td>
|
346
|
+
</tr>
|
347
|
+
<tr>
|
348
|
+
<TH CLASS='Detail' align=left> Cross2</TH>
|
349
|
+
<td class="Detail" COLSPAN="3">HIGHWAY 63 S SB</td>
|
350
|
+
</tr>
|
351
|
+
<tr>
|
352
|
+
<th class="Detail" align="left">Hyd1</th>
|
353
|
+
<td class="Detail" width=$dw></td>
|
354
|
+
<th class="Detail" align="left" width=$cw>Hyd2</th>
|
355
|
+
<td class="Detail"></td>
|
356
|
+
</tr>
|
357
|
+
<tr>
|
358
|
+
<td colspan="4"><hr color=navy></td>
|
359
|
+
</tr>
|
360
|
+
<tr>
|
361
|
+
TH CLASS='Detail' align=left width=100px> Complainant</TH>
|
362
|
+
<TD CLASS='Detail' colspan=3> JEROME</TD>
|
363
|
+
</tr>
|
364
|
+
<tr>
|
365
|
+
<TH CLASS='Detail' align=left width=100px> Callback</TH>
|
366
|
+
<TD CLASS='Detail' colspan=3> 5734410736</TD>
|
367
|
+
</tr>
|
368
|
+
<tr>
|
369
|
+
<th class="Detail" align="left" width=$cw>Dispatcher</th>
|
370
|
+
<td class="Detail" width=$dw>AMS </td>
|
371
|
+
<th class="Detail" align="left" width=$cw>CallTaker</th>
|
372
|
+
<td class="Detail">ALL </td>
|
373
|
+
</tr>
|
374
|
+
<tr>
|
375
|
+
<TH CLASS='Detail' align=left width=100px> DispO</TH>
|
376
|
+
<TD CLASS='Detail' > ND</TD>
|
377
|
+
<TH CLASS='Detail' align=left width=100px> Meth. Alarm</TH>
|
378
|
+
<TD CLASS='Detail' > 2 </TD>
|
379
|
+
</tr>
|
380
|
+
<tr>
|
381
|
+
<td colspan="4"><hr color=navy></td>
|
382
|
+
</tr>
|
383
|
+
<tr>
|
384
|
+
<TH CLASS='Detail' align=left width=100px> Inc Date/Time</TH>
|
385
|
+
<TD CLASS='Detail' colspan=3> 12/19/2010 14:15:05</TD>
|
386
|
+
</tr>
|
387
|
+
<tr>
|
388
|
+
<TH CLASS='Detail' align=left width=100px> On Scene</TH>
|
389
|
+
<TD CLASS='Detail' colspan=3> 12/19/2010 14:27:09</TD>
|
390
|
+
</tr>
|
391
|
+
<tr>
|
392
|
+
<TH CLASS='Detail' align=left width=100px> Upgrade</TH>
|
393
|
+
<TD CLASS='Detail' colspan=3> 00:00:00</TD>
|
394
|
+
</tr>
|
395
|
+
<tr><TH CLASS='Detail' align=left width=100px>
|
1156
396
|
Pat Contact</TH>
|
1157
397
|
<TD CLASS='Detail' colspan=3>
|
1158
398
|
01/01/1970 00:00:00</TD>
|
@@ -24,10 +24,46 @@ describe "Watchman::CallWatcher" do
|
|
24
24
|
IstatusMocker.fake_call_path(Client.host,"201023687")
|
25
25
|
end
|
26
26
|
|
27
|
+
let(:call){ CallWatcher.new.info_for("201023687") }
|
28
|
+
|
27
29
|
it "can find the address" do
|
28
|
-
call = CallWatcher.new.info_for("201023687")
|
29
30
|
call.address.should == "7750 HIGHWAY AB E"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "can find the incident number" do
|
30
34
|
call.incident_number.should == "201023687"
|
31
35
|
end
|
36
|
+
|
37
|
+
it "can find the cross-streets" do
|
38
|
+
call.cross_streets.should == ["RANGELINE RD S","HIGHWAY 63 S SB"]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can extract the response level" do
|
42
|
+
call.response_level.should == "Charlie"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can harvest the priority level" do
|
46
|
+
call.priority.should == 2
|
47
|
+
end
|
48
|
+
|
49
|
+
it "extracts the dispatch_code" do
|
50
|
+
call.dispatch_code.should == "BOX"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "can get the grid" do
|
54
|
+
call.grid.should == "34123B"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can get the fire_area" do
|
58
|
+
call.fire_area.should == "19-17B"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "gets the time of alarm" do
|
62
|
+
call.time_of_alarm.should == Time.parse("12/19/2010 14:15:05")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "gets the on-scene time" do
|
66
|
+
call.time_of_first_unit_on_scene == Time.parse("12/19/2010 14:27:09")
|
67
|
+
end
|
32
68
|
end
|
33
69
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watchman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ethan Vizitei
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-25 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|