/* *+------------------------------------------------------------------------+ *| Licensed Materials - Property of IBM *| BI and PM: prmt *| (C) Copyright IBM Corp. 2002, 2017 *| *| US Government Users Restricted Rights - Use, duplication or *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *| *+------------------------------------------------------------------------+ */ /** This script is used to provide interactivity for the range versions of each of the prompt controls. @class @private */ cognos.Prompt.Control.Range = cognos.Prompt.Control.f_extend({ f_initialize: function( v_oProps, v_oPM ) { this.f_parent( v_oProps ); this.m_oProps = v_oProps; this.m_oPM = v_oPM; this.m_bSkipAdornments = true; this.f_draw(); }, checkData: function() { // We keep a reference to the parent function // Calling this.m_oFrom functions seems to have a side effect on this.f_parent(). var v_fnParent = this.f_parent; if (!this.isMulti()) { if (this.isRequired()) { if ((typeof this[K_PRMT_RANGE_FORCE_BOUNDRANGE] != K_PRMT_sUNDEFINED) && this[K_PRMT_RANGE_FORCE_BOUNDRANGE] === true) { this.m_bValid = this.m_oFrom.hasValue() && this.m_oTo.hasValue(); } else { this.m_bValid = this.m_oFrom.hasValue() || this.m_oTo.hasValue(); } var v_oFrom = this.m_oFrom; var v_oTo = this.m_oTo; if (v_oFrom._type_ == "cognos.Prompt.Control.Text") { setTimeout(function(){ // set From: as valid if there is a valid value in To: and From: is empty if (v_oFrom.m_bValid || (v_oTo.m_bValid && v_oFrom.getValue() === "")) v_oFrom.checkPass(); else v_oFrom.checkFail(); // set To: as valid if there is a valid value in From: and To: is empty if (v_oTo.m_bValid || (v_oFrom.m_bValid && v_oTo.getValue() === "")) v_oTo.checkPass(); else v_oTo.checkFail(); }, 1); } } else { var bFromValid = (this.m_rdFrom && this.m_rdFrom.checked ? this.m_oFrom.hasValue() : true); var bToValid = (this.m_rdTo && this.m_rdTo.checked ? this.m_oTo.hasValue() : true); this.m_bValid = bFromValid && bToValid; } } else { this.m_bValid = this.m_oChoices.f_getValid(); } this.f_parent = v_fnParent; // call parent's checkData using saved reference. this.f_parent(); // call parent's checkData using saved reference. return this.m_bValid; }, clearValues: function() { this.f_parent(); this.m_oFrom.clearValues(); this.m_oTo.clearValues(); }, f_drawCompleted: function() { // We keep a reference to the parent function // Calling this.m_oFrom.f_drawCompleted seems to have a side effect on this.f_parent(). var v_fnParent = this.f_parent; var v_oFrom = this.m_oFrom; var v_oTo = this.m_oTo; if ( this["n"] == "selectValue" ) { // replace/clone select boxes var v_elPrompt = $( this.f_getId(K_PRMT_sSV_PREFIX) ); if (v_elPrompt) { var v_sFromId = this.f_getId(K_PRMT_sRANGE_FROM_PREFIX); var v_sToId = this.f_getId(K_PRMT_sRANGE_TO_PREFIX); var v_elFrom = $( v_sFromId ); var v_elTo = $( v_sToId ); if ( v_elFrom ) { v_elPrompt.setAttribute( "id", v_oFrom.f_getId(K_PRMT_sSV_PREFIX) ); v_oFrom.f_moveInContainer( v_elFrom, v_elPrompt ); } if ( v_elTo ) { var v_elPromptClone = v_elPrompt.cloneNode(true); v_elPromptClone.setAttribute( "id", v_oTo.f_getId(K_PRMT_sSV_PREFIX) ); v_oTo.f_moveInContainer( v_elTo, v_elPromptClone ); } } } v_oFrom.f_drawCompleted(); v_oTo.f_drawCompleted(); // For DateTime controls, set the TO's time to latest value for the visible fields, for all: 23:59:59.999 if ( v_oTo && (v_oTo.m_oTime && v_oTo.m_oTime.f_setTime) || v_oTo.f_setTime ) { var v_defaultSeconds = ( this["@showSeconds"]? "59" : "00" ); var v_defaultMilliSeconds = ( this["@showMilliseconds"]? "999" : "000" ); var v_defaultToTime = "23:59:" + v_defaultSeconds + "." + v_defaultMilliSeconds; if ( v_oTo && v_oTo.m_oTime && v_oTo.m_oTime.f_setTime ) { v_oTo.m_oTime.f_setTime( v_defaultToTime ); } else if ( v_oTo && v_oTo.f_setTime ) { v_oTo.f_setTime( v_defaultToTime ); } } if ( !this[K_PRMT_sATTR_DISABLED] ) { var tmp = this.f_setRangeEvents( K_PRMT_sRANGE_FROM_PREFIX ); this.m_rdFrom = tmp[0]; this.m_rdFromDefault = tmp[1]; tmp = this.f_setRangeEvents( K_PRMT_sRANGE_TO_PREFIX ); this.m_rdTo = tmp[0]; this.m_rdToDefault = tmp[1]; } this.f_parent = v_fnParent; // call parent's f_drawCompleted using saved reference. this.f_parent(); // call parent's f_drawCompleted using saved reference. } }); /** See {@link cognos.Prompt.Control.addValues} for more info. @param {cognos.Value[]} @return {void} */ cognos.Prompt.Control.Range.prototype.addValues = function( v_aValues ) { for (var v_idx = 0; v_idx < v_aValues.length; v_idx++) { var v_oValue = v_aValues[v_idx]; if (v_oValue.start) { if (this.m_rdFrom) { this.m_rdFrom.checked = true; } this.m_oFrom.addValues( [v_oValue.start] ); } else { if (this.m_rdFrom) { this.m_rdFrom.checked = false; this.m_rdFromDefault.checked = true; } this.m_oFrom.clearValues(); } if (v_oValue.end) { if (this.m_rdTo) { this.m_rdTo.checked = true; } this.m_oTo.addValues( [v_oValue.end] ); } else { if (this.m_rdTo) { this.m_rdTo.checked = false; this.m_rdToDefault.checked = true; } this.m_oTo.clearValues(); } if ( this.m_oChoices ) { this.m_oChoices.F_Insert(); var v_oFrom = this.m_oFrom; var v_oTo = this.m_oTo; setTimeout(function() { v_oFrom.clearValues(); v_oTo.clearValues(); },0); } } PRMTUtils.f_updateRadioButtons(this.m_rdFrom); PRMTUtils.f_updateRadioButtons(this.m_rdTo); }; /** @private @return {void} */ cognos.Prompt.Control.Range.prototype.f_checkRadioCheckData = function() { this.m_radio.checked = true; this.m_oPrompt.checkData(); PRMTUtils.f_updateRadioButtons(this.m_radio); }; /** Sets the JavaScript references used by custom scripts based on generated code from Blaring and before. (Custom Scripts Workaround) @private */ cognos.Prompt.Control.Range.prototype.f_CSW_init = function() { var aRadios = document.getElementsByName( this.f_getId("pFrom_") ); this.f_CSW_createJSObject( "fromValue", aRadios ); aRadios = document.getElementsByName( this.f_getId("pTo_") ); this.f_CSW_createJSObject( "toValue", aRadios ); }; /** @private @param {C_PromptElement} v_el Container. @return {void} */ cognos.Prompt.Control.Range.prototype.f_drawInput = function( v_el ) { var oFrom = Object.f_extend( {}, this.m_oProps ); oFrom["@range"] = false; oFrom["@multiSelect"] = false; oFrom.m_oRangeControl = this; oFrom.m_bIsAComponent = true; var oTo = Object.f_extend( {}, oFrom ); oFrom._id_ = this.f_getId( K_PRMT_sRANGE_FROM_PREFIX ); oFrom.m_sCSW_rangeSuffix = "range_from"; oTo._id_ = this.f_getId( K_PRMT_sRANGE_TO_PREFIX ); oTo.m_sCSW_rangeSuffix = "range_to"; var v_oFrom = this.f_getPM().f_create( oFrom ); var v_oTo = this.f_getPM().f_create( oTo ); v_oTo.m_bIsRangeEndControl = true; v_oTo.m_elRangeContainer = v_oFrom.m_elRangeContainer = $( this.f_getId(this.m_sDivPrefix) ); var v_tdRange = v_el; v_tdRange["vAlign"] = "top"; var v_tbl = $CE( "table", { "border": K_PRMT_DEBUG_TABLEBORDER, "cellPadding": 0, "cellSpacing": 0, "role":K_PRMT_ARIA_ROLE_PRESENTATION }, v_tdRange ); var v_tbd = $CE( "tbody", {}, v_tbl ); this.f_drawRangeControl( v_oFrom, v_tbd, this[K_PRMT_LABEL_RANGE_FROM], v_oFrom[K_PRMT_LABEL_RANGE_LOWEST], "pFrom_" ); var v_trSpacer = $CE( "tr", {}, v_tbd ); var v_tdSpacer = $CE( "td", {"height": 10}, v_trSpacer ); $CE("img", {"src": this.m_sSkin + "/prompting/images/spacer.gif", "width": 1, "height": 1, "border": 0, "alt":""}, v_tdSpacer); this.f_drawRangeControl( v_oTo, v_tbd, this[K_PRMT_LABEL_RANGE_TO], v_oFrom[K_PRMT_LABEL_RANGE_HIGHEST], "pTo_" ); this.m_oFrom = v_oFrom; this.m_oTo = v_oTo; return this; }; /** Render input control for a range. @private @param {cognos.Prompt.Control} v_oPrompt. @param {C_PromptElement} v_el Container. @param {String} v_sLabel From/To label @param {String} v_sText From/To text @param {String} v_sPrefix Prefix for this control. @return {void} */ cognos.Prompt.Control.Range.prototype.f_drawRangeControl = function( v_oPrompt, v_el, v_sLabel, v_sText, v_sPrefix ) { var v_bUseRadioButtons = ( !this.isRequired() || this.isMulti() ); var v_tr = $CE( "tr", {}, v_el ); var v_inputId = this.f_getId( v_sPrefix ); var v_labelInputId = null; if (!v_bUseRadioButtons && v_oPrompt && v_oPrompt.f_getRangeInputId) { v_labelInputId = v_oPrompt.f_getRangeInputId(); } //v_oPrompt. // draw the label (From || To) var v_td = $CE( "td", {"class": "clsControlLabel pc", "noWrap": "nowrap"}, v_tr ); var v_labelId = this.f_getId( v_sPrefix + "label" ); var v_labelAttr = { "id": v_labelId }; if(!v_bUseRadioButtons && v_labelInputId) { v_labelAttr["for"] = v_labelInputId; } var v_captionLabel = $CE( "label", v_labelAttr, v_td ); v_captionLabel.f_appendText( v_sLabel ); v_tr = $CE( "tr", {}, v_el ); v_td = $CE( "td", {"vAlign": "top"}, v_tr ); // creating a table to hold the range Control (From || To ) var v_groupAttr = {"vAlign": "top", "border": "0","cellPadding": 0, "cellSpacing": 0}; if(v_bUseRadioButtons) { v_groupAttr["role"] = "radiogroup"; } else { v_groupAttr["role"] = "group"; } if (!v_labelInputId) { v_groupAttr["aria-labelledby"] = v_labelId; } v_table = $CE( "table", v_groupAttr, v_td ); v_tr = $CE( "tr", {"id": v_oPrompt.f_getId(K_PRMT_sRANGE_ROW_INPUT_PREFIX)}, v_table ); var v_radioCellWidth = (PRMTUtils.f_isHighContrast() && window.ie?"25px":"15:px"); // first column cell v_td = $CE( "td", {"vAlign": "middle", "width": v_radioCellWidth}, v_tr ); var v_sName = this.f_getId( v_sPrefix ); var radioButtonAttrib = { "type": "radio", "name": v_sName, "id": v_inputId, "class": "dijitCheckBoxInput", style: "margin:0", "onFocus": "PRMTUtils.f_RangeRadioOnFocus(this)", "onBlur": "PRMTUtils.f_RangeRadioOnBlur(this)" }; if ( v_bUseRadioButtons ) { var v_radioDiv = $CE( "div", {"class": K_PRMT_CSS_RADIOBUTTON}, v_td ); // associating the label ( From | To ) with the first radio button var v_input = $CE( "input", radioButtonAttrib, v_radioDiv ); if ( this[K_PRMT_sATTR_DISABLED] ) { v_input.f_setProperty( "disabled", "true" ); } v_oPrompt["@title"] = v_sLabel; } else{ $CE("img", {"src": this.m_sSkin + "/prompting/images/spacer.gif", "width": 10, "height": 1, "border": 0, "alt":""}, v_td); } if ( this.isMulti() ) { v_oPrompt["@required"] = false; } if ( v_oPrompt.n != "selectInterval" ) { v_oPrompt["@hideAdornments"] = true; } // draw input v_td = $CE( "td", {"id": v_oPrompt._id_}, v_tr ); if ( cssParser( this["@style"], "width" ) ) { v_td.f_setProperty( "width", "100%" ); } var v_oInput = v_oPrompt.f_drawInput( v_td ); // second radio button v_inputId = this.f_getId( v_sPrefix + "2_" ); if ( !this.isRequired() || this.isMulti() ) { v_tr = $CE( "tr", {"id": v_oPrompt.f_getId(K_PRMT_sRANGE_ROW_DEFAULT_PREFIX)}, v_table ); v_td = $CE( "td", {"vAlign": "middle", "width": v_radioCellWidth}, v_tr ); radioButtonAttrib.id = v_inputId; radioButtonAttrib.checked = true; var v_radioDiv = $CE( "div", {"class": K_PRMT_CSS_RADIOBUTTON_CHECKED}, v_td ); var v_input = $CE( "input", radioButtonAttrib, v_radioDiv ); if ( this[K_PRMT_sATTR_DISABLED] ) { v_input.f_setProperty( "disabled", "true" ); } var v_oLabelTDAttrib = { "vAlign": "middle", "height": "20px", "class": "clsReadOnlyText pe" }; if ( v_oPrompt.n == "selectInterval" ) { v_oLabelTDAttrib["style"] = "padding-left:12px;"; } v_td = $CE( "td", v_oLabelTDAttrib, v_tr ); v_captionLabel = $CE( "label", { "for": v_inputId }, v_td ); v_captionLabel.f_appendText( v_sText ) } return v_oInput; }; /** @private @return {void} */ cognos.Prompt.Control.Range.prototype.f_getPM = function() { return (this.m_oPM); }; /** Return all values for this control. @private @param {boolean} [bSkipType] Skip setting the promptType as part of the values returned. Used by Control.getValues(). @return {cognos.Value[]} */ cognos.Prompt.Control.Range.prototype.f_getPV = function(bSkipType) { var v_oStart = null; var v_oEnd = null; var v_oPV = null; if ( (!this.m_rdFrom || this.m_rdFrom.checked) && this.m_oFrom.hasValue() ) { var tmpSave = this.m_oFrom.m_bisGetValuesCall; if (this.m_bisGetValuesCall) { this.m_oFrom.m_bisGetValuesCall = true; } v_oStart = this.m_oFrom.f_getPV(); this.m_oFrom.m_bisGetValuesCall = tmpSave; } if ( (!this.m_rdTo || this.m_rdTo.checked) && this.m_oTo.hasValue() ) { var tmpSave = this.m_oTo.m_bisGetValuesCall; if (this.m_bisGetValuesCall) { this.m_oTo.m_bisGetValuesCall = true; } v_oEnd = this.m_oTo.f_getPV(); this.m_oTo.m_bisGetValuesCall = tmpSave; } if ( v_oStart && v_oEnd ) { var v_iCompare = this.m_oTo.f_compare(this.m_oFrom); if ( v_iCompare == -1 ) { // switch start and end var v_oTemp = v_oEnd; v_oEnd = v_oStart; v_oStart = v_oTemp; if (this.n == "selectDate" && this["@DateTime"]) { // need to fix the time values for date controls using dateTime format. v_oStart["use"] = v_oStart["use"].replace( K_PRMT_reTIMEPART, K_PRMT_sTIME_MIN ); v_oEnd["use"] = v_oEnd["use"].replace( K_PRMT_reTIMEPART, K_PRMT_sTIME_MAX ); } } else if ( v_iCompare == 0 && !(this.n == "selectDate" && this["@DateTime"]) ) { // start and end are the same, just use a plain value then v_oPV = this.m_oFrom.getValues()[0]; v_oStart = v_oEnd = null; } } if ( v_oStart || v_oEnd ) { v_oPV = {}; if ( v_oStart ) { v_oPV["start"] = (v_oStart.length && v_oStart.length == 1 ? v_oStart[0] : v_oStart); } if ( v_oEnd ) { v_oPV["end"] = (v_oEnd.length && v_oEnd.length == 1 ? v_oEnd[0] : v_oEnd); } } if (v_oPV && bSkipType !== true) { v_oPV.promptType = this.m_oFrom._type_; } return v_oPV; }; /** @private @param {event} evt @return {void} */ cognos.Prompt.Control.Range.prototype.f_keyDown = function(evt) { var evt = ( arguments && arguments.length ? arguments[arguments.length-1] : null ); var v_oEvt = (evt ? evt : (typeof event != K_PRMT_sUNDEFINED ? event : null )); if ( v_oEvt ) { switch( v_oEvt.which || v_oEvt.keyCode ) { case 9: //tab case 16: // shift case 17: // ctrl case 18: // alt // skip break; default: this.m_radio.checked = true; PRMTUtils.f_updateRadioButtons(this.m_radio); }; } this.m_oPrompt.checkData(); }; /** @private @param {cognos.Value} v_oPV @return {void} */ cognos.Prompt.Control.Range.prototype.f_setPV = function ( v_oPV ) { if ( v_oPV.start || v_oPV.end ) { if ( v_oPV.start ) { this.m_oFrom.f_setPV( v_oPV.start ); if (this.m_rdFrom) { this.m_rdFrom.checked = true; } } if ( v_oPV.end ) { this.m_oTo.f_setPV( v_oPV.end ); if (this.m_rdTo) { this.m_rdTo.checked = true; } } } else { this.m_oFrom.f_setPV( v_oPV ); if ( this.m_rdFrom && (v_oPV.use || v_oPV.display) ) { this.m_rdFrom.checked = true; } this.m_oTo.f_setPV( v_oPV ); if ( this.m_rdTo && (v_oPV.use || v_oPV.display) ) { this.m_rdTo.checked = true; } } PRMTUtils.f_updateRadioButtons(this.m_rdFrom); PRMTUtils.f_updateRadioButtons(this.m_rdTo); }; /** @private @param {String} v_sId @return {[DOMElement,DOMElement]} Array containing the two radio buttons. */ cognos.Prompt.Control.Range.prototype.f_setRangeEvents = function( v_sId ) { var v_result = [null, null]; var v_rd = null; // Lowest/Highest radio buttons var v_sTrId = this.f_getId( K_PRMT_sRANGE_ROW_DEFAULT_PREFIX + v_sId ); var v_tr = $( v_sTrId ); if ( v_tr ) { v_tr.m_oPrompt = this; // tr > td > div > input v_rd = v_tr.firstChild.firstChild.firstChild; if ( v_rd && (typeof v_rd.type == K_PRMT_sSTRING) && v_rd.type.match(/radio/i) ) { v_tr.m_radio = v_rd; v_tr.m_oPrompt = this; PRMTUtils.f_addEvent( v_tr, "click", this.f_checkRadioCheckData.bind(v_tr) ); } else { v_rd = null; } v_result[1] = v_rd; } // Radio button for input field v_sTrId = this.f_getId( K_PRMT_sRANGE_ROW_INPUT_PREFIX + v_sId ); v_tr = $( v_sTrId ); if ( v_tr ) { v_tr.m_oPrompt = this; // tr > td > div > input v_rd = v_tr.firstChild.firstChild.firstChild; if ( v_rd && (typeof v_rd.type == K_PRMT_sSTRING) && v_rd.type.match(/radio/i) ) { v_tr.m_radio = v_rd; v_tr.m_oPrompt = this; PRMTUtils.f_addEvent( v_tr, "click", this.f_checkRadioCheckData.bind(v_tr) ); PRMTUtils.f_addEvent( v_tr, "keydown", this.f_keyDown.bind(v_tr) ); } else { v_rd = null; } v_result[0] = v_rd; } return v_result; }; /** @private @return {boolean} */ cognos.Prompt.Control.Range.prototype.hasValue = function() { var v_bHasValue = false; if ( this.m_rdFrom && this.m_rdTo ) { v_bHasValue = ( (this.m_rdFrom.checked && this.m_oFrom.hasValue()) || (this.m_rdTo.checked && this.m_oTo.hasValue()) ? true : false ); } else { v_bHasValue = ( this.m_oFrom.hasValue() || this.m_oTo.hasValue() ? true : false ); } return v_bHasValue; }; /** * By default, returns true if the control does not return any value. * * @private * @return {boolean} */ cognos.Prompt.Control.Range.prototype.isEmpty = function() { var v_bResult = ( this.m_oFrom.isEmpty() && this.m_oTo.isEmpty() ? true : false ); return v_bResult; }; var C_Range = cognos.Prompt.Control.Range; // Keep old reference for backward compatibility with custom scripts.