/** * Represents an event. * @param time {Time} * @param incident {Incident} * @param properties {Properties} * @param properties {Evaluations} */ function Event(time, incident, properties, evaluations) { //========== private static members ==========// Event.invalidID = -1; //========== private static members ==========// Event.id = (typeof Event.id == 'undefined') ? 0 : ++Event.id; //========== public constants ==========// this.id = Event.id; this.expandOptionID = "eventExpandOption" + this.id; this.dataID = "eventData" + this.id; this.eventHeaderID = "eventHeader" + this.id; //========== public read-only members ==========// this.expanded = true; this.highlighted = false; this.time = time; this.incident = incident; this.evaluations = evaluations; this.properties = properties; //========== public methods ==========// this.html = html; this.expandAction = expandAction; this.highlight = highlight; this.unhighlight = unhighlight; this.normalize = normalize; this.focus = focus; //========== private methods ==========// this.expandOptionSymbol = expandOptionSymbol; this.headerHTML = headerHTML; this.expandOptionHTML = expandOptionHTML; this.refresh = refresh; this.dataHTML = dataHTML; this.expandAction = expandAction; this.html = html; // Color constants (TODO: assign incident numbers dynamically) /* var incidentColor = { 187: "#d8f0f3", // PowderBlue 188: "#dfecdf", // DarkSeaGreen 189: "#fff5cc", // CornSilk 190: "#ffe8e6", // MistyRose 191: "#ffffcc", // Dark Orange 181: "#d8f0f3" } */ //========== function definitions ===========// /** * Returns the symbol for the expand/collapse option. * @return "+" or "-" depending on whether this event is collapsed or expanded. */ function expandOptionSymbol() { return this.expanded ? "–" : "+"; } /** * @return The rectangle containing the expand/collapse symbol, * incident time, incident number and * incident title that this event belongs to. */ function headerHTML() { if (this.incident == undefined) { console.log(this.time.format()); } return "" + "" + "" + "" + "" + "" + "" + "
" + this.expandOptionHTML() + "Time: " + this.time.format() + "" + this.incident.number + "" + this.incident.title + "
"; } /** * @return The html of the expand/collapse symbol. */ function expandOptionHTML() { return " " /* In 2019 we don't think we want expand option any longer return ""; */ } /** * Updates the expand option symbol and the visibility of the event data depending on * whether this event is collapsed or expanded. */ function refresh() { events.doc.getElementById(this.dataID).innerHTML = this.expanded ? this.dataHTML() : ""; // IF the event is highlighted THEN if (this.highlighted) { this.highlight(); } else { this.unhighlight(); } events.doc.getElementById(this.expandOptionID).innerHTML = this.expandOptionSymbol(); } /** * @return The html for the properties and the evaluations. */ function dataHTML() { return properties.html() + evaluations.html(); } /** * Expands or collapses this event depending on whether this event is * already expanded or collapsed. */ function expandAction() { this.expanded = !this.expanded; this.refresh(); } /** * @return The html representation of this event. */ function html() { return "" + "" + "" + "" + "" + "" + "" + "
" + this.headerHTML() + "
" + (this.expanded ? this.dataHTML() : "") + "
"; } /** * Scrolls the window to this Event. * @param window The window to scroll. */ function focus() { /* This method was discarded because it moved the scroll bar of the parent of * the given window in addition to the scroll bar of the given window.. var positionOfPound = window.location.indexOf("#"); var rootLocation = window.location.substring(0, positionOfPound); window.location = rootLocation + "#" + eventAnchorName; */ events.win.scrollTo(0, absoluteTop(events.doc.getElementById(this.eventHeaderID))); } /** * Highlights this Event. */ function highlight() { this.highlighted = true; events.doc.getElementById(this.eventHeaderID).style.borderColor = "blue"; events.doc.getElementById(this.eventHeaderID).style.backgroundColor = "yellow"; events.doc.getElementById(this.eventHeaderID).style.color = "black"; events.doc.getElementById(this.dataID).style.color = "black"; events.doc.getElementById(this.dataID).style.backgroundColor = this.incident.color; // IF this event is expanded THEN if (this.expanded) { events.doc.getElementById(this.dataID).style.border = "2px solid blue"; } else { events.doc.getElementById(this.dataID).style.border = "none"; } } /** * Unhighlights this event. * @return */ function unhighlight() { this.highlighted = false; events.doc.getElementById(this.eventHeaderID).style.backgroundColor = "white"; events.doc.getElementById(this.eventHeaderID).style.borderColor = "gainsboro"; events.doc.getElementById(this.eventHeaderID).style.color = "gray"; events.doc.getElementById(this.dataID).style.border = "0px solid red"; events.doc.getElementById(this.dataID).style.backgroundColor = "white"; events.doc.getElementById(this.dataID).style.color = "gray"; } /** * Normalize this Event: provide normal background and text colors. */ function normalize() { var myColor = this.incident.color; events.doc.getElementById(this.eventHeaderID).style.backgroundColor = "white"; events.doc.getElementById(this.eventHeaderID).style.borderColor = "black"; events.doc.getElementById(this.eventHeaderID).style.color = "black"; events.doc.getElementById(this.dataID).style.color = "black"; events.doc.getElementById(this.dataID).style.backgroundColor = myColor; events.doc.getElementById(this.eventHeaderID).style.backgroundColor = myColor; } /** * Returns the number of pixels from the top of the given element to the top * of the body element. * @param elem The element whose y-coordinate will be found. * @return The y-coordinate of the given element. */ function absoluteTop(elem) { var offset = elem.offsetTop; var parent = elem.offsetParent; if (parent.tagName == "BODY") { return offset; } else { return offset + absoluteTop(parent); } } }