// Licensed Materials - Property of IBM // // IBM Cognos Products: cogadmin // // (C) Copyright IBM Corp. 2005, 2014 // // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // // Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved. // Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated). /******************************************************************************* * Cognos Generic Threshold Manager Library Description: A library to facilitate * the creation of a Cognos standard threshold editor with customizable editors ******************************************************************************/ var TYPE_HIGH_POSITIVE = "high"; var TYPE_MIDDLE_POSITIVE = "middle"; var TYPE_LOW_POSITIVE = "low"; var TYPE_NONE = "none"; var THRESHOLD_EXCEED_MAX = -2; var THRESHOLD_NO_MATCH = -3; var THRESHOLD_NOT_A_NUMBER = -4; var HEALTHS = ["Good","Average","Poor"]; /* * The data for a particular editor */ function ThresholdModel(value, exclusive, attrName, exAttrName, upperSide) { var orig = "" + value + exclusive; this.value = value; this.exclusive = exclusive; this.attrName = attrName; // the name of the "value" attribute used to // post to the server (eg. "UpperSidePoor") this.exAttrName = exAttrName; // the name of the "exclusive" attribute // used to post to the server (eg. // "UpperPoorEx") this.upperSide = upperSide; // boolean to store whether the threshold lies // on the upper or lower side of the scale this.errorCode = 0; this.setErrorCode = function(value) { this.errorCode = parseFloat(value); } this.getErrorCode = function() { return this.errorCode; } this.clearErrorCode = function() { this.errorCode = 0; } this.setValue = function(value) { this.value = value; } this.setExclusive = function(isExclusive) { this.exclusive = isExclusive; } this.hasChanged = function() { return ("" + this.value + this.exclusive) != orig; } this.getValue = function() { return this.value; } this.isExclusive = function() { return this.exclusive; } this.isUpperSide = function() { return this.upperSide; } } /* * The view for an editor consisting of 2 editors. 1 editor for the top and 1 * for the bottom. The view is designed to allow an editor to "jump" into a * higher or lower view when the "up" or "down" icons are respectively. */ function ThresholdView(dialog, health, label, topEditor, botEditor, imagesURL) { var tr = document.createElement("tr"); var td = document.createElement("td"); tr.appendChild(td); td.style.cssText = "border:0pt none;margin:0pt;padding:0pt;white-space:nowrap;"; td.align = "right"; var imgTop = document.createElement("input"); imgTop.setAttribute("type", "image"); imgTop.setAttribute("src", imagesURL + "rangestyle_up_normal.gif"); imgTop.setAttribute("alt", ""); var editorParentTop = document.createElement("span"); td.appendChild(editorParentTop); if (topEditor) { editorParentTop.appendChild(topEditor.isUpperSide ? topEditor.exclusive : topEditor.inclusive); if (topEditor.isUpperSide) { topEditor.imgExclusive = imgTop; } else { topEditor.imgInclusive = imgTop; } } imgTop.style.visibility = "hidden"; imgTop.disabled = true; td.appendChild(imgTop); td.appendChild(document.createElement("div")); if (topEditor && topEditor.model) { imgTop.onclick = function() { topEditor.update(true, false); initTabStops(dialog,true); }; imgTop.alt = ""; imgTop.onmouseover = function() { this.src = imagesURL + 'rangestyle_up_rollover.gif' }; imgTop.onmouseout = function() { this.src = imagesURL + 'rangestyle_up_normal.gif' }; } var imgBot = document.createElement("input"); imgBot.setAttribute("type", "image"); var editorParentBot = document.createElement("span"); td.appendChild(editorParentBot); if (botEditor) { editorParentBot.appendChild(botEditor.isUpperSide ? botEditor.inclusive : botEditor.exclusive); if (botEditor.isUpperSide) { botEditor.imgInclusive = imgBot; } else { botEditor.imgExclusive = imgBot; } } imgBot.style.visibility = "hidden"; imgBot.disabled = true; imgBot.setAttribute("src", imagesURL + "rangestyle_down_normal.gif"); imgBot.setAttribute("alt", ""); imgBot.style.verticalAlign = "bottom"; td.appendChild(imgBot); if (botEditor && botEditor.model) { imgBot.onclick = function() { botEditor.update(true, false); initTabStops(dialog, true); }; imgBot.onmouseover = function() { this.src = imagesURL + "rangestyle_down_rollover.gif" }; imgBot.onmouseout = function() { this.src = imagesURL + "rangestyle_down_normal.gif" }; } var tdScale = document.createElement("td"); tr.appendChild(tdScale); tdScale.innerHTML += ''; tdScale.innerHTML += ''; tdScale.innerHTML += ''; tdScale.innerHTML += ''; tdScale.innerHTML += ''; var tdHealth = document.createElement("td"); tr.appendChild(tdHealth); tdHealth.innerHTML += '' + label
			+ ''; if (botEditor) { botEditor.update(); } if (topEditor) { topEditor.update(); } return tr; } ThresholdView.getEditorLabel = function(model, i18n, units, range) { var labelTemplate = i18n.labelTemplate; var coreLabel = ThresholdView.getLabel(model, i18n, false); return labelTemplate.replace('#LABEL#',coreLabel).replace('#UNITS#',units).replace('#RANGE#',range); } ThresholdView.getEditorToggleLabel = function(model, i18n) { return ThresholdView.getLabel(model, i18n, true); } ThresholdView.getLabel = function(model, i18n, isToggleButton) { var tokens = model.exAttrName.split(/(?=[A-Z])/); //Each upper case letter var upperLower = tokens[0] var health = tokens[1]; if ((isToggleButton && !model.exclusive) || (!isToggleButton && model.exclusive)) { health = HEALTHS[HEALTHS.indexOf(health)-1]; } else { upperLower = upperLower == "Lower" ? "Upper" : "Lower"; } var labelKey = upperLower+health+"Label"; var label = i18n[labelKey]; return label; } /* * A 'controller' object for an editor which renders the supplied editor based * on the state of it's supplied model */ function EditorManager(model, editor, isUpperSide, inputModel) { this.model = model; this.isUpperSide = isUpperSide; this.editor = editor; this.inputModel = inputModel; if (model && model.isExclusive()) { this.exclusive = editor.element; this.inclusive = editor.element.cloneNode(true); // placeholder } else { this.inclusive = editor.element; this.exclusive = editor.element.cloneNode(true); // placeholder } this.imgInclusive = null; this.imgExclusive = null; this.updateElement = function(element, hide) { element.style.visibility = hide ? "hidden" : "visible"; element.disabled = hide; var inputs = element.getElementsByTagName('input'); for ( var i = 0; i < inputs.length; i++) { inputs[i].disabled = hide; } } this.updateElements = function() { var isExclusive = this.model ? this.model.isExclusive() : true; this.updateElement(this.inclusive, isExclusive); this.updateElement(this.exclusive, !isExclusive); editor.update(); } this.update = function(switchEx, needUpdate) { if (needUpdate == undefined) needUpdate = true; if (model) { if (switchEx) { model.setExclusive(!model.exclusive); var exclusiveParent = this.exclusive.parentNode; var inclusiveParent = this.inclusive.parentNode; var i = null var e = null; if (exclusiveParent) { e = exclusiveParent.removeChild(exclusiveParent.lastChild); } if (inclusiveParent) { i = inclusiveParent.removeChild(inclusiveParent.lastChild); } if (exclusiveParent && i) { exclusiveParent.appendChild(i); this.exclusive = i; } if (inclusiveParent && e) { inclusiveParent.appendChild(e); this.inclusive = e; } } this.updateElements(); if (this.imgExclusive) { this.imgExclusive.style.visibility = model.isExclusive() ? "visible" : "hidden"; this.imgExclusive.disabled = !model.isExclusive(); setToggleLabel(model, this.imgExclusive, this.inputModel); } if (this.imgInclusive) { this.imgInclusive.style.visibility = model.isExclusive() ? "hidden" : "visible"; this.imgInclusive.disabled = model.isExclusive(); setToggleLabel(model, this.imgInclusive, this.inputModel); } if (model.value >= 0 && needUpdate) this.editor.update(); } else { this.updateElements(); if (this.imgExclusive) { this.imgExclusive.style.visibility = "visible"; this.imgExclusive.disabled = false; } if (this.imgInclusive) { this.imgInclusive.style.visibility = "hidden"; this.imgInclusive.disabled = true; } } } setToggleLabel = function(model, toggleButton, inputModel) { var toggleLabel = inputModel.i18n.toggleLabel; toggleLabel = toggleLabel.replace('#TARGET#',ThresholdView.getEditorToggleLabel(model, inputModel.i18n)); toggleButton.setAttribute('title', toggleLabel); toggleButton.setAttribute('alt', toggleLabel); } } /* * Encapsulates the Threshold Manager Widget */ function ThresholdsManager(parentElt, inputModel) { var lowerSeparator = null; this.models = new Array(); this.createSeparator = function(label, valign) { var tr = document.createElement("tr"); var td = document.createElement("td"); tr.appendChild(td); td.align = "right"; td.style.cssText = "border: 0pt none ; margin: 0pt; padding: 0pt; display: block;"; if (label != null) { td.innerHTML += '' + label + ''; } var td2 = document.createElement("td"); td2.style.cssText = "border:0pt none;margin:0pt;padding:0pt"; td2.innerHTML += ''; if (valign) { td2.setAttribute("valign", valign); } tr.appendChild(td2); return tr; } this.addView = function(view, model) { if (tbody.childNodes.length > 2) { tbody.insertBefore(this.createSeparator(), lowerSeparator); } tbody.insertBefore(view, lowerSeparator); if (model) { this.models[this.models.length] = model; } } this.getModels = function() { return this.models; } var table = document.createElement("table"); table.className = "cctable" table.setAttribute("width", "100%"); table.setAttribute("role", "presentation"); while (parentElt.childNodes.length > 0) { parentElt.removeChild(parentElt.firstChild); } var theader = document.createElement("thead"); theader.className = "cogstyle-table-header"; var tbody = document.createElement("tbody"); if (inputModel.type == "none") { table.style["filter"] = "alpha(opacity=50)"; table.style["-moz-opacity"] = .5; table.style["opacity"] = .5; } table.appendChild(theader); table.appendChild(tbody); var trHeader = document.createElement("tr"); trHeader.className = "cogstyle-form-label"; theader.appendChild(trHeader); var tdValuesHeader = document.createElement("td"); tdValuesHeader.align = "left"; tdValuesHeader.innerHTML += inputModel.i18n.valuesHeaderLabel; tdValuesHeader.colSpan = 2; var parentWidth = parseInt(parentElt.style.width); trHeader.appendChild(tdValuesHeader); var tdScoreHeader = document.createElement("td"); tdScoreHeader.align = "left"; tdScoreHeader.innerHTML += inputModel.i18n.scoreHeaderLabel; trHeader.appendChild(tdScoreHeader); tbody.appendChild(this.createSeparator(inputModel.i18n.maxLabel, 'bottom')); lowerSeparator = this.createSeparator(inputModel.i18n.minLabel, 'top'); tbody.appendChild(lowerSeparator); parentElt.appendChild(table); } /* * Default Threshold Editor consisting of 1 HTML textual input element. */ function DefaultEditor(model, inputModel) { var patternRegExp = /^\d{0,14}$/; this.input = document.createElement("input"); this.input.className = "cogstyle-threshold-default-input"; var range = "1 - 99999999999999"; var self = this.input; xAddEventListener(self, "keypress", thresholdNoLetters, false); xAddEventListener(self, "keyup", function(event) { thresholdCheck(model, self, inputModel.maxValue, patternRegExp); }, false); xAddEventListener(self, "blur", function(event) { var dValue = thresholdCheck(model, self, inputModel.maxValue, patternRegExp); if (dValue !== null) { model.setValue(dValue); } }, false); this.input.setAttribute("autocomplete", "OFF"); this.input.setAttribute("maxlength", inputModel.maxValue.toString().length); this.input.maxLength = inputModel.maxValue.toString().length; this.input.disabled = inputModel.type == TYPE_NONE; // Editor interface "this.update" implementation this.update = function() { this.input.value = model.getValue(); var label = ThresholdView.getEditorLabel(model, inputModel.i18n, '', range); this.input.setAttribute("alt", label); this.input.setAttribute("title", label); } this.element = this.input; } /* * Percentage Threshold Editor consisting of 1 HTML textual input element. */ function PercentageEditor(model, inputModel) { var container = document.createElement("span"); var patternRegExp = /^\d{0,2}(\.)?\d{0,2}$/; this.input = document.createElement("input"); this.input.className = "cogstyle-threshold-duration-input"; var range = "0.01 - 99.99"; var self = this.input; xAddEventListener(self, "keypress", thresholdNoLetters, false); xAddEventListener(self, "keyup", function(event) { thresholdCheck(model, self, inputModel.maxValue, patternRegExp); }, false); xAddEventListener(self, "blur", function(event) { var dValue = thresholdCheck(model, self, inputModel.maxValue, patternRegExp); if (dValue !== null) { model.setValue(floatMath(dValue, 0.01, "*")); } }, false); this.input.setAttribute("autocomplete", "OFF"); this.input.setAttribute("maxlength", inputModel.maxValue.toString().length); this.input.maxLength = inputModel.maxValue.toString().length; this.input.disabled = inputModel.type == TYPE_NONE; // Editor interface "this.update" implementation this.update = function() { var value = model.getValue(); if (value) { this.input.value = parseFloat(100 * value).toFixed(2); } var label = ThresholdView.getEditorLabel(model, inputModel.i18n,'',range); this.input.setAttribute("title", label); this.input.setAttribute("alt", label); } container.appendChild(this.input); var labelContainer = document.createElement("span"); labelContainer.className = "cogstyle-form-label"; labelContainer.style.cssText = "padding:2px"; labelContainer.innerHTML += "%"; container.appendChild(labelContainer); this.element = container; } /* * Duration utility class */ function Duration(milliseconds) { var mSeconds = milliseconds; this.hours = Math.floor(milliseconds / 1000 / 60 / 60); milliseconds = milliseconds - this.hours * 1000 * 60 * 60 this.minutes = Math.floor(milliseconds / 1000 / 60); milliseconds = milliseconds - this.minutes * 1000 * 60 this.seconds = (milliseconds % 1000 == 0) ? Math.round(milliseconds / 1000) : milliseconds / 1000; this.toString = function(inputModel) { if (inputModel && inputModel.i18n) { var s = ""; if (this.hours > 0) { s += this.hours + inputModel.i18n.hoursLabelAbbr; } if (this.minutes > 0) { s += " " + this.minutes + inputModel.i18n.minutesLabelAbbr; } s += " " + this.seconds + inputModel.i18n.secondsLabelAbbr; return s; } else { return "" + mSeconds; } } } /* * mask of the input value of threshold, garantee the input is an integer and * less then upperBound @para obj: target object to be checked @para uBound: the * maxValue (include) allowed */ thresholdCheck = function(model, obj, uBound, pattern) { function styleSwitcher(obj, withError) { if (withError) { if (obj.className.search(/-error$/i) == -1) { obj.className = obj.className + "-error"; } } else { obj.className = obj.className.replace(/-error$/i, ""); } } var retValue = obj.value; // get rid of the leading or tail space, try to avoid flashing at the same // time. if (trim(retValue).length < retValue.length) { retValue = trim(retValue); } if (isNaN(retValue) || retValue < 0) { obj.setAttribute("cogErrorType", THRESHOLD_NOT_A_NUMBER); styleSwitcher(obj, true); model.setErrorCode(THRESHOLD_NOT_A_NUMBER); return null; } if (parseFloat(retValue) > parseFloat(uBound)) { obj.setAttribute("cogErrorType", THRESHOLD_EXCEED_MAX); styleSwitcher(obj, true); model.setErrorCode(THRESHOLD_EXCEED_MAX); return null; } if (!retValue.match(pattern)) { obj.setAttribute("cogErrorType", THRESHOLD_NO_MATCH); styleSwitcher(obj, true); model.setErrorCode(THRESHOLD_NO_MATCH); return null; } styleSwitcher(obj, false); obj.setAttribute("cogErrorType", 0); model.clearErrorCode(); return retValue ? parseFloat(retValue) : 0; } // event handler for threshold onkeypress, prevent the letter and space from // input thresholdNoLetters = function(event) { // Get the event object and character code in a portable way var e = event || window.event; // Key event object var code = e.charCode || e.keyCode; // What key was pressed // If this keystroke is a function key of any kind, do not filter it if (e.charCode == 0) return true; // Function key (Firefox only) if (e.ctrlKey || e.altKey) return true; // Ctrl or Alt held down if (code < 32) return true; // ASCII control character // Convert the character code to a character var c = String.fromCharCode(code); var pattern = /\d|[\.]/; if (pattern.test(c)) { return true; } else { // And reject this keypress event if (e.preventDefault) e.preventDefault(); if (e.returnValue) e.returnValue = false; return false; } } /* * Duration Threshold editor consisting of 3 HTML textual input elements for * "Hours","Minutes","Seconds" */ function DurationEditor(model, inputModel) { var container = document.createElement("span"); var hours = createInput(inputModel.i18n.hoursLabelAbbr, 999, /^\d{0,3}$/); var mins = createInput(inputModel.i18n.minutesLabelAbbr, 59, /^\d{0,2}$/); var secs = createInput(inputModel.i18n.secondsLabelAbbr, 59.999, /^\d{0,2}(\.)?\d{0,3}$/, 0.001); var self = this; function createInput(label, upperBound, pattern, lowerBound) { this.lowerBound = lowerBound; this.upperBound = upperBound; var lb = lowerBound || 0; var input = document.createElement("input"); input.className = "cogstyle-threshold-duration-input"; xAddEventListener(input, "keypress", thresholdNoLetters, false); xAddEventListener(input, "keyup", function(event) { thresholdCheck(model, input, upperBound, pattern); }, false); xAddEventListener(input, "blur", function(event) { var dValue = thresholdCheck(model, input, upperBound, pattern); input.setAttribute("retValue", dValue); var finalValue = self.getValue(); if (finalValue !== null) { model.setValue(finalValue); } }, false); input.setAttribute("autocomplete", "OFF"); input.setAttribute("maxlength", upperBound.toString().length); input.maxLength = upperBound.toString().length; input.upperBound = upperBound; input.disabled = inputModel.type == TYPE_NONE; container.appendChild(input); var labelContainer = document.createElement("span"); labelContainer.className = "cogstyle-form-label"; labelContainer.style.cssText = "padding:2px"; labelContainer.innerHTML += label; container.appendChild(labelContainer); return input; } this.getValue = function() { var ihours = hours.getAttribute("retValue") || 0; var imins = mins.getAttribute("retValue") || 0; var isecs = secs.getAttribute("retValue") || 0; if (hours.getAttribute("cogErrorType") && hours.getAttribute("cogErrorType") < 0) { model.setErrorCode(hours.getAttribute("cogErrorType")); return; } else if (mins.getAttribute("cogErrorType") && mins.getAttribute("cogErrorType") < 0) { model.setErrorCode(mins.getAttribute("cogErrorType")); return; } else if (secs.getAttribute("cogErrorType") && secs.getAttribute("cogErrorType") < 0) { model.setErrorCode(secs.getAttribute("cogErrorType")); return; } else if (!ihours && !imins && !isecs) { model.setErrorCode(THRESHOLD_NOT_A_NUMBER); return; } else { return (ihours * 1000 * 60 * 60) + (imins * 1000 * 60) + (isecs * 1000); } } // Editor interface "this.update" implementation this.update = function() { var duration = new Duration(model.getValue()); if (duration > 0) { hours.value = duration.hours; hours.setAttribute("retValue", duration.hours); mins.value = duration.minutes; mins.setAttribute("retValue", duration.minutes); secs.value = duration.seconds; secs.setAttribute("retValue", duration.seconds); } var hoursLabel = ThresholdView.getEditorLabel(model, inputModel.i18n, inputModel.i18n.hoursLabel, hours.upperBound); hours.setAttribute("alt", hoursLabel); hours.setAttribute("title", hoursLabel); var minsLabel = ThresholdView.getEditorLabel(model, inputModel.i18n, inputModel.i18n.minutesLabel, mins.upperBound); mins.setAttribute("alt", minsLabel); mins.setAttribute("title", minsLabel); var secsLabel = ThresholdView.getEditorLabel(model, inputModel.i18n, inputModel.i18n.secondsLabel, secs.upperBound); secs.setAttribute("alt", secsLabel); secs.setAttribute("title", secsLabel); } this.element = container; } /* * Encapsulates the Threshold Tooltip Widget */ function ThresholdsTooltip(inputModel) { var container = document.getElementById(inputModel.container); while (container.childNodes && (container.childNodes.length > 0)) { container.removeChild(container.firstChild); } var table = document.createElement("table"); table.setAttribute("role", "presentation"); container.appendChild(table); var tbody = document.createElement("tbody"); table.appendChild(tbody); container.appendChild(table); var upperSideAvgModel = null; var lowerSideAvgModel = null; if (inputModel.type != TYPE_HIGH_POSITIVE) { var upperSidePoorModel = new ThresholdModel( inputModel.upperSidePoorValue, inputModel.upperSidePoorEx, "UpperSidePoor", "UpperPoorEx", true, inputModel.i18n); addView(upperSidePoorModel, null, "poor", inputModel.i18n.poorLabel); upperSideAvgModel = new ThresholdModel(inputModel.upperSideAvgValue, inputModel.upperSideAvgEx, "UpperSideAverage", "UpperAverageEx", true, inputModel.i18n); addView(upperSidePoorModel, upperSideAvgModel, "average", inputModel.i18n.avgLabel); } if (inputModel.type != TYPE_LOW_POSITIVE) { lowerSideAvgModel = new ThresholdModel(inputModel.lowerSideAvgValue, inputModel.lowerSideAvgEx, "LowerSideAverage", "LowerAverageEx", false, inputModel.i18n); } if (inputModel.type == TYPE_LOW_POSITIVE) { addView(null, upperSideAvgModel, "good", inputModel.i18n.goodLabel); } else if (inputModel.type == TYPE_HIGH_POSITIVE) { addView(lowerSideAvgModel, null, "good", inputModel.i18n.goodLabel); } else { addView(upperSideAvgModel, lowerSideAvgModel, "good", inputModel.i18n.goodLabel); } if (inputModel.type != TYPE_LOW_POSITIVE) { var lowerSidePoorModel = new ThresholdModel( inputModel.lowerSidePoorValue, inputModel.lowerSidePoorEx, "LowerSidePoor", "LowerPoorEx", false, inputModel.i18n); addView(lowerSideAvgModel, lowerSidePoorModel, "average", inputModel.i18n.avgLabel); addView(null, lowerSidePoorModel, "poor", inputModel.i18n.poorLabel); } function addView(topModel, botModel, health, healthLabel) { var tr = document.createElement("tr"); tbody.appendChild(tr); var tdHealth = document.createElement("td"); tr.appendChild(tdHealth); tdHealth.setAttribute("valign", "middle"); tdHealth.innerHTML += '' + healthLabel + ''; tdRange = document.createElement("td"); tr.appendChild(tdRange); if (topModel && botModel) { var base = inputModel.valueBase || 1; var botValue = parseFloat(botModel.value); var topValue = parseFloat(topModel.value); var offSetTop = 0; var offSetBot = 0; var isConsecutive = floatMath(topValue, -botValue) == base; var arrConsecutive = []; var botText = ""; var topText = ""; if (botModel.isUpperSide() && topModel.isUpperSide()) { if (!topModel.isExclusive()) { offSetTop = -base; } if (botModel.isExclusive()) { offSetBot = base; } } else if ((!botModel.isUpperSide()) && (!topModel.isUpperSide())) { if (topModel.isExclusive()) { offSetTop = -base; } if (!botModel.isExclusive()) { offSetBot = base; } } else if (topModel.isUpperSide) { if (!topModel.isExclusive()) { offSetTop = -base; } if (!botModel.isExclusive()) { offSetBot = base; } } if (botText = getToolTipText(botValue, offSetBot, isConsecutive)) arrConsecutive.push(botText); if (topText = getToolTipText(topValue, offSetTop, isConsecutive)) // to avoid the duplicated value if (botText != topText) arrConsecutive.push(topText); tdRange.innerHTML = "= " + arrConsecutive.join(" - "); } else if (topModel) { tdRange.innerHTML = ">" + ((!topModel.isExclusive() && topModel.isUpperSide()) || (topModel.isExclusive() && !topModel .isUpperSide()) ? "= " : " ") + getToolTipText(parseFloat(topModel.value)); } else if (botModel) { tdRange.innerHTML = "<" + ((!botModel.isExclusive() && !botModel.isUpperSide()) || (botModel.isExclusive() && botModel .isUpperSide()) ? "= " : " ") + getToolTipText(parseFloat(botModel.value)); } tbody.appendChild(tr); } function getToolTipText(value, offSet, isConsecutive) { var isConsecutive = isConsecutive || false; var tOffSet = offSet ? offSet : 0; if (isConsecutive && offSet != 0) return ""; if (inputModel.propertyType == "xs:duration") { var duration = new Duration(value + tOffSet); return duration.toString(inputModel); } else if (inputModel.propertyType == "cdm:percentage") { return (100 * floatMath(value, tOffSet)).toFixed(2) + "%"; } else { return value + tOffSet; } } } /******************************************************************************* * End of Cognos Generic Threshold Manager Library ******************************************************************************/ /******************************************************************************* * CogAdmin specific implementation of Cognos Threshold Manager ******************************************************************************/ function CogAdminThresholdManager(inputModel, targetDiv, dialog) { var targetDiv = $(targetDiv); var initialType = inputModel.type; var manager = null; var self = this; this.thresholdContainer = document.getElementById('thresholdsContainer'); this.dialog = dialog; /* for the change of nextGen *****************begin******************* */ this.addPatternItem = function(type, lbl) { var patternItem = xCreateElement("div"); var itemId = "pattern_" + type; var isChecked = false; if (inputModel.type == type) isChecked = true; if (document.all && !window.opera && document.createElement) { // MSIE 6 for browser does not support DOM-insertion of radio // buttons. The following code works around that lack of support. var patternInput = document .createElement(""); } else if (document.createElement && document.createTextNode) { // other DOM compilable browsers var patternInput = xCreateElement("input"); patternInput.id = itemId; patternInput.type = "radio"; patternInput.name = "pattern" patternInput.value = type patternInput.checked = isChecked; } else { return; } var patternLabel = xCreateElement("label"); patternLabel.htmlFor = itemId; patternLabel.appendChild(document.createTextNode(lbl)); xAddEventListener(patternInput, "click", function(event) { self.update(type) }, false); patternItem.appendChild(patternInput); patternItem.appendChild(patternLabel); return patternItem; } if (targetDiv) { while (targetDiv.childNodes.length > 0) { targetDiv.removeChild(targetDiv.firstChild); } var Desc = xCreateElement("div"); Desc.style.marginBottom = "5px"; Desc.className = "dialogHeaderText"; Desc.appendChild(document .createTextNode(ADM.THR.IDS_ADMNEW_THR_DIALOG_TIP)); var fieldSet = xCreateElement("fieldset"); fieldSet.style.border = "none"; fieldSet.style.padding = "0"; var legend = xCreateElement("legend"); legend.className = "cogstyle-form-label"; legend.appendChild(document .createTextNode(ADM.THR.IDS_ADMNEW_THR_PERF_PATTERN)); var thresholdTitle = xCreateElement("div"); thresholdTitle.style.marginTop = "5px"; thresholdTitle.style.marginBottom = "5px"; thresholdTitle.className = "cogstyle-form-label"; thresholdTitle.appendChild(document .createTextNode(ADM.THR.IDS_ADMNEW_THR_SCORE_CALC)); var patternDiv = xCreateElement("div"); patternDiv.appendChild(Desc); patternDiv.appendChild(fieldSet); fieldSet.appendChild(legend); fieldSet.appendChild(this.addPatternItem("none", ADM.THR.IDS_ADMNEW_THR_NONE)); fieldSet.appendChild(this.addPatternItem("high", ADM.THR.IDS_ADMNEW_THR_HIGH_VALUE)); fieldSet.appendChild(this.addPatternItem("middle", ADM.THR.IDS_ADMNEW_THR_MIDDLE_VALUE)); fieldSet.appendChild(this.addPatternItem("low", ADM.THR.IDS_ADMNEW_THR_LOW_VALUE)); patternDiv.appendChild(thresholdTitle); targetDiv.appendChild(patternDiv); this.thresholdContainer = xCreateElement("div"); this.thresholdContainer.id = "thresholdsContainer"; this.thresholdContainer.style.cssText = "border:1px solid;overflow:auto;height:235px;width:400px;margin-bottom:10px;"; targetDiv.appendChild(this.thresholdContainer); } /* for the change of nextGen *****************end******************* */ this.update = function(type) { if (type) { inputModel.type = type; } manager = new ThresholdsManager(this.thresholdContainer, inputModel); var upperSidePoorModel = new ThresholdModel( inputModel.upperSidePoorValue, inputModel.upperSidePoorEx, "UpperSidePoor", "UpperPoorEx", false, inputModel.i18n); var upperSidePoorEditor = new EditorManager( inputModel.type != TYPE_NONE ? upperSidePoorModel : null, new inputModel.editorClass(upperSidePoorModel, inputModel), true, inputModel); var upperSideAvgModel = new ThresholdModel( inputModel.upperSideAvgValue, inputModel.upperSideAvgEx, "UpperSideAverage", "UpperAverageEx", false, inputModel.i18n); var upperSideAvgEditor = new EditorManager( inputModel.type != TYPE_NONE ? upperSideAvgModel : null, new inputModel.editorClass(upperSideAvgModel, inputModel), true, inputModel); var lowerSideAvgModel = new ThresholdModel( inputModel.lowerSideAvgValue, inputModel.lowerSideAvgEx, "LowerSideAverage", "LowerAverageEx",false, inputModel.i18n); var lowerSideAvgEditor = new EditorManager(lowerSideAvgModel, new inputModel.editorClass(lowerSideAvgModel, inputModel), false, inputModel); var lowerSidePoorModel = new ThresholdModel( inputModel.lowerSidePoorValue, inputModel.lowerSidePoorEx, "LowerSidePoor", "LowerPoorEx",false, inputModel.i18n); var lowerSidePoorEditor = new EditorManager(lowerSidePoorModel, new inputModel.editorClass(lowerSidePoorModel, inputModel), false, inputModel); var thresholds = new Array(); if (inputModel.type != TYPE_HIGH_POSITIVE) { var upperSidePoorView = new ThresholdView(dialog, "poor", inputModel.i18n.poorLabel, null, upperSidePoorEditor, inputModel.imagesURL); manager.addView(upperSidePoorView, upperSidePoorModel); var upperSideAvgView = new ThresholdView(dialog, "average", inputModel.i18n.avgLabel, upperSidePoorEditor, upperSideAvgEditor, inputModel.imagesURL); manager.addView(upperSideAvgView, upperSideAvgModel); } var goodView = new ThresholdView( dialog, "good", inputModel.i18n.goodLabel, (inputModel.type == TYPE_LOW_POSITIVE || inputModel.type == TYPE_MIDDLE_POSITIVE) ? upperSideAvgEditor : null, (inputModel.type == TYPE_HIGH_POSITIVE || inputModel.type == TYPE_MIDDLE_POSITIVE) ? lowerSideAvgEditor : null, inputModel.imagesURL); manager.addView(goodView); if (inputModel.type == TYPE_HIGH_POSITIVE || inputModel.type == TYPE_MIDDLE_POSITIVE) { var lowerSideAvgView = new ThresholdView(dialog, "average", inputModel.i18n.avgLabel, lowerSideAvgEditor, lowerSidePoorEditor, inputModel.imagesURL); manager.addView(lowerSideAvgView, lowerSideAvgModel); var lowerSidePoorView = new ThresholdView(dialog, "poor", inputModel.i18n.poorLabel, lowerSidePoorEditor, null, inputModel.imagesURL); manager.addView(lowerSidePoorView, lowerSidePoorModel); } initTabStops(dialog,true); } this.hasChanged = function() { var thresholds = manager.getModels(); for ( var i = 0; i < thresholds.length; i++) { if (thresholds[i].hasChanged()) { return true; } } return initialType != inputModel.type; } this.getSubmitString = function() { var queryString = "processRequest=true&thresholdPropertyName=" + inputModel.thresholdPropertyName + "&thresholdResourceID=" + inputModel.thresholdResourceID; if (inputModel.type != TYPE_NONE) { var thresholds = manager.getModels(); for ( var i = 0; i < thresholds.length; i++) { queryString += "&" + (thresholds[i].attrName + "=" + thresholds[i].getValue() + "&" + thresholds[i].exAttrName + "=" + thresholds[i] .isExclusive()); } } queryString += "&deleteThreshold=" + (inputModel.type == TYPE_NONE); return queryString; } this.validate = function(maxValue) { if (!maxValue) maxValue = inputModel.maxValue; if (inputModel.type != TYPE_NONE) { var models = manager.getModels(); for ( var i = 0; i < models.length; i++) { // if have a error code, validate it first, since the value // might be empty. switch (models[i].getErrorCode()) { case THRESHOLD_EXCEED_MAX: alert(inputModel.i18n.validateMsgExceedMax); return false; break; case THRESHOLD_NO_MATCH: alert(inputModel.i18n.validateMsgBadFormat); return false; break; case THRESHOLD_NOT_A_NUMBER: alert(inputModel.i18n.validateMsgNotNumeric); return false; break; default: } // editor's default value is "", in case of clicking "ok" button // without touching the input. if (models[i].value == 0 || models[i].value == "" || isNaN(models[i].value)) { alert(inputModel.i18n.validateMsgNotNumeric); return false; } // range logic if ((i > 0) && (parseFloat(models[i].value) >= parseFloat(models[i - 1].value))) { alert(inputModel.i18n.validateMsgInvalidRange); return false; } models[i].value = Math.abs(models[i].value); } } return true; } this.update(); } editThreshold = function(thresholdFragId, grpCaption, objCaption, name, type, resourceID) { var thresholdFrag = createFragment(thresholdFragId, null, '/cogadmin/controls/threshold.xts'); var params = 'thresholdGroupName=' + grpCaption + '&thresholdPropertyCaption=' + objCaption + '&thresholdPropertyName=' + name + '&thresholdResourceID=' + resourceID + '&propertyType=' + type + '&style=dialog'; thresholdFrag.retrieve(params); } initTabStops = function(dialog, skipFocus) { var dialogEle = document.getElementById(dialog.id); var inputs = dialogEle.getElementsByTagName('input'); for (var i=0; i < inputs.length; i++) { inputs[i].tabIndex = "1"; } dialog.initTabStops(skipFocus); }