value.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| BI and PM: prmt
  5. *| (C) Copyright IBM Corp. 2002, 2014
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. /**
  13. @fileOverview Parameter Values (interface).
  14. */
  15. /**
  16. @name cognos.Value
  17. @class JSON structure to represent parameter values.
  18. <br/>Possible arributes for this object are <i>children</i>, <i>display</i>, <i>end</i>, <i>inclusive</i>, <i>start</i> and <i>use</i>.
  19. <br/><i>inclusive</i> is always optional, default is <tt>true</tt>.
  20. <br/>Examples:<ul>
  21. <li>For simple values: <tt>{ 'use': '[a].[b].[c]', 'display': 'Canada' }</tt></li>
  22. <li>For range values: <tt><br/>{
  23. <br/>&nbsp;&nbsp;&nbsp;'start': {'use': '2007-01-01', 'display': 'January 1, 2007'}
  24. <br/>&nbsp;&nbsp;&nbsp;'end': {'use': '2007-12-31', 'display': 'December 31, 2007'}
  25. <br/>}</tt></li>
  26. <li>For multiple values: <tt>
  27. <br/>[
  28. <br/>&nbsp;&nbsp;{ 'use': '12', 'display': 'Canada' },
  29. <br/>&nbsp;&nbsp;{ 'use': '41', 'display': 'Germany' },
  30. <br/>&nbsp;&nbsp;{ 'use': '76', 'display': 'Japan' }
  31. <br/>]</tt></li></ul>
  32. */
  33. cognos.Value = function( v_oProps )
  34. {
  35. if (v_oProps instanceof cognos.Value)
  36. {
  37. return v_oProps;
  38. }
  39. if (typeof v_oProps == "string")
  40. {
  41. return v_oProps;
  42. }
  43. if (v_oProps && v_oProps.length)
  44. {
  45. var a = [];
  46. for (var i = 0; i < v_oProps.length; i++)
  47. {
  48. var v_oVal = new cognos.Value(v_oProps[i]);
  49. if ( v_oVal instanceof cognos.Value )
  50. {
  51. a.push( v_oVal );
  52. }
  53. }
  54. return a;
  55. }
  56. if ( v_oProps && v_oProps.n )
  57. {
  58. if ( v_oProps.n == "selectChoices" && v_oProps.c && v_oProps.c.length > 0 )
  59. {
  60. this.f_initWithSelectOptions( v_oProps.c[0] );
  61. }
  62. else
  63. {
  64. this.f_initWithSelectOptions( v_oProps );
  65. }
  66. }
  67. else
  68. {
  69. Object.f_extend( this, v_oProps );
  70. }
  71. };
  72. /**
  73. @static
  74. @private
  75. @return {boolean}
  76. */
  77. cognos.Value.equals = function(v1, v2)
  78. {
  79. var v_bRetval = false;
  80. var v_oVa1 = cognos.Value.getValue(v1);
  81. if (v_oVa1)
  82. {
  83. var v_oVa2 = cognos.Value.getValue(v2);
  84. if (v_oVa2)
  85. {
  86. v_bRetval = v_oVa1.f_equals(v_oVa2);
  87. }
  88. }
  89. return v_bRetval;
  90. }
  91. /**
  92. Cast a {use:'',display:''} object to a cognos.Value object.
  93. @private
  94. @param {cognos.Value} v_oObj object to cast.
  95. @return {cognos.Value}
  96. */
  97. cognos.Value.getValue = function( v_oObj )
  98. {
  99. var v_oVal = null;
  100. if (v_oObj)
  101. {
  102. if ( v_oObj instanceof cognos.Value || typeof v_oObj == "string")
  103. {
  104. v_oVal = v_oObj;
  105. }
  106. else if (v_oObj && v_oObj.length)
  107. {
  108. v_oVal = [];
  109. for (var i = 0; i < v_oObj.length; i++)
  110. {
  111. var v_oTemp = cognos.Value.getValue(v_oObj[i]);
  112. if (v_oTemp) {
  113. v_oVal.push( v_oTemp );
  114. }
  115. }
  116. if (v_oVal.length == 0) {
  117. v_oVal = null;
  118. }
  119. else if (v_oVal.length == 1) {
  120. v_oVal = v_oVal[0];
  121. }
  122. }
  123. else
  124. {
  125. v_oVal = new cognos.Value(v_oObj);
  126. }
  127. }
  128. return v_oVal;
  129. }
  130. /**
  131. @private
  132. @return {void}
  133. */
  134. cognos.Value.prototype.f_initWithSelectOptions = function( v_oNode )
  135. {
  136. switch( v_oNode.n )
  137. {
  138. case "selectBoundRange":
  139. case "selectUnboundedEndRange":
  140. case "selectUnboundedStartRange":
  141. if ( v_oNode.c && v_oNode.c.length > 0 )
  142. {
  143. var v_bSelected = ( v_oNode["@selected"] ? true : false );
  144. for ( var v_idxChild = 0; v_idxChild < v_oNode.c.length; v_idxChild++)
  145. {
  146. var v_oChildNode = v_oNode.c[ v_idxChild ];
  147. var v_oPV = cognos.Value.getValue( v_oChildNode );
  148. v_oPV["use"] = sDecodeU003( v_oChildNode["@useValue"] );
  149. v_oPV["display"] = sDecodeU003( v_oChildNode["@displayValue"] );
  150. this[ v_oChildNode.n ] = v_oPV;
  151. }
  152. }
  153. break;
  154. default:
  155. Object.f_extend( this, v_oNode );
  156. this["use"] = sDecodeU003( v_oNode["@useValue"] );
  157. this["display"] = sDecodeU003( v_oNode["@displayValue"] );
  158. break;
  159. }
  160. };
  161. /**
  162. @private
  163. @return {boolean}
  164. */
  165. cognos.Value.prototype.f_equals = function(v_o)
  166. {
  167. return ( v_o ? (this.f_getXML() == v_o.f_getXML()) : false );
  168. };
  169. /**
  170. Used by range control with multiple choices, to format the values selected as "Between x and y."
  171. @private
  172. @return {String}
  173. */
  174. cognos.Value.prototype.f_formatDisplay = function( v_sKey, v_sValue1, v_sValue2 )
  175. {
  176. var v_sRetVal = null;
  177. var v_sBidiMarker = null;
  178. if ( typeof v_sKey == K_PRMT_sSTRING )
  179. {
  180. if ( v_sKey == "between" && (v_sValue1 === null || typeof v_sValue1 == K_PRMT_sUNDEFINED || v_sValue2 === null || typeof v_sValue2 == K_PRMT_sUNDEFINED) )
  181. {
  182. v_sValue1 = v_sValue2 = null;
  183. }
  184. if ( v_sValue1 !== null && typeof v_sValue1 !== K_PRMT_sUNDEFINED )
  185. {
  186. var v_re1 = new RegExp( "\\^1", K_PRMT_sG);
  187. var v_sValKey = this.f_getString( v_sKey );
  188. if (this.contentTextDir)
  189. {
  190. v_sValue1 = PRMT_BidiUtils.enforceBidiDirection(v_sValue1, this.contentTextDir);
  191. v_sBidiMarker = (PRMT_BidiUtils.containsRTLChar(v_sValKey) ? PRMT_BidiUtils.BIDI_CHAR_RLM : PRMT_BidiUtils.BIDI_CHAR_LRM);
  192. v_sValue1 = v_sBidiMarker + v_sValue1;
  193. }
  194. v_sRetVal = v_sValKey.replace( v_re1, v_sValue1 );
  195. }
  196. if ( v_sValue2 !== null && typeof v_sValue2 !== K_PRMT_sUNDEFINED && typeof v_sRetVal == K_PRMT_sSTRING )
  197. {
  198. var v_re2 = new RegExp( "\\^2", K_PRMT_sG);
  199. if (this.contentTextDir)
  200. {
  201. v_sValue2 = PRMT_BidiUtils.enforceBidiDirection(v_sValue2, this.contentTextDir);
  202. v_sValue2 = v_sBidiMarker + v_sValue2;
  203. }
  204. v_sRetVal = v_sRetVal.replace( v_re2, v_sValue2 );
  205. }
  206. if ( v_sRetVal && v_sBidiMarker )
  207. {
  208. v_sRetVal = (v_sBidiMarker == PRMT_BidiUtils.BIDI_CHAR_LRM ? PRMT_BidiUtils.BIDI_CHAR_LRE : PRMT_BidiUtils.BIDI_CHAR_RLE) + v_sRetVal + PRMT_BidiUtils.BIDI_CHAR_PDF;
  209. }
  210. }
  211. return v_sRetVal;
  212. };
  213. /**
  214. @private
  215. @return {String}
  216. */
  217. cognos.Value.prototype.getDisplayValue = function() {
  218. return (this.f_getDisplay());
  219. };
  220. /**
  221. @private
  222. @return {String}
  223. */
  224. cognos.Value.prototype.f_getDisplay = function( v_bReturnNullForMissingDisplayValues )
  225. {
  226. var v_sDisplay = null;
  227. if ( this.display || this.display == K_PRMT_sEMPTY )
  228. {
  229. v_sDisplay = this.display;
  230. }
  231. else
  232. {
  233. var v_pvStart = this.f_getStart();
  234. var v_pvEnd = this.f_getEnd();
  235. var v_sKey = null;
  236. var v_sValue1 = null;
  237. var v_sValue2 = null;
  238. if ( v_pvStart )
  239. {
  240. v_sValue1 = v_pvStart.f_getDisplay( v_bReturnNullForMissingDisplayValues );
  241. if ( v_pvEnd )
  242. {
  243. v_sKey = ( v_pvStart.f_equals( v_pvEnd ) ? "eq" : "between" );
  244. v_sValue2 = v_pvEnd.f_getDisplay( v_bReturnNullForMissingDisplayValues );
  245. }
  246. else
  247. {
  248. v_sKey = "gt";
  249. }
  250. }
  251. else if ( v_pvEnd )
  252. {
  253. v_sKey = "lt";
  254. v_sValue1 = v_pvEnd.f_getDisplay( v_bReturnNullForMissingDisplayValues );
  255. }
  256. v_sDisplay = this.f_formatDisplay( v_sKey, v_sValue1, v_sValue2 );
  257. }
  258. if ( v_sDisplay === null && !v_bReturnNullForMissingDisplayValues )
  259. {
  260. v_sDisplay = this.f_getUse();
  261. }
  262. return v_sDisplay;
  263. };
  264. /**
  265. @private
  266. @return {String}
  267. */
  268. cognos.Value.prototype.f_getString = function( v_sKey )
  269. {
  270. var v_s = v_sKey;
  271. switch( v_sKey )
  272. {
  273. case 'eq':
  274. v_s = PMT_RNG_FILTER_EQUAL_STRING; break;
  275. break;
  276. case 'between':
  277. switch (this.promptType)
  278. {
  279. case "cognos.Prompt.Control.Date":
  280. case "cognos.Prompt.Control.SelectHTML5Date":
  281. v_s = PMT_RNG_FILTER_BETWEEN_DATE; break;
  282. case "cognos.Prompt.Control.DateTime":
  283. case "cognos.Prompt.Control.SelectHTML5DateTime":
  284. v_s = PMT_RNG_FILTER_BETWEEN_DATETIME; break;
  285. case "cognos.Prompt.Control.Time":
  286. case "cognos.Prompt.Control.SelectHTML5Time":
  287. v_s = PMT_RNG_FILTER_BETWEEN_TIME; break;
  288. case "cognos.Prompt.Control.Interval":
  289. v_s = PMT_RNG_FILTER_BETWEEN_INTERVAL; break;
  290. default:
  291. v_s = PMT_RNG_FILTER_BETWEEN_STRING; break;
  292. };
  293. break;
  294. case 'lt':
  295. switch (this.promptType)
  296. {
  297. case "cognos.Prompt.Control.Date":
  298. case "cognos.Prompt.Control.SelectHTML5Date":
  299. v_s = PMT_RNG_FILTER_LESS_THAN_EQUAL_TO_DATE; break;
  300. case "cognos.Prompt.Control.DateTime":
  301. case "cognos.Prompt.Control.SelectHTML5DateTime":
  302. v_s = PMT_RNG_FILTER_LESS_THAN_EQUAL_TO_DATETIME; break;
  303. case "cognos.Prompt.Control.Time":
  304. case "cognos.Prompt.Control.SelectHTML5Time":
  305. v_s = PMT_RNG_FILTER_LESS_THAN_EQUAL_TO_TIME; break;
  306. case "cognos.Prompt.Control.Interval":
  307. v_s = PMT_RNG_FILTER_LESS_THAN_EQUAL_TO_INTERVAL; break;
  308. default:
  309. v_s = PMT_RNG_FILTER_LESS_THAN_EQUAL_TO_STRING; break;
  310. };
  311. break;
  312. case 'gt':
  313. switch (this.promptType)
  314. {
  315. case "cognos.Prompt.Control.Date":
  316. case "cognos.Prompt.Control.SelectHTML5Date":
  317. v_s = PMT_RNG_FILTER_GREATER_THAN_EQUAL_TO_DATE; break;
  318. case "cognos.Prompt.Control.DateTime":
  319. case "cognos.Prompt.Control.SelectHTML5DateTime":
  320. v_s = PMT_RNG_FILTER_GREATER_THAN_EQUAL_TO_DATETIME; break;
  321. case "cognos.Prompt.Control.Time":
  322. case "cognos.Prompt.Control.SelectHTML5Time":
  323. v_s = PMT_RNG_FILTER_GREATER_THAN_EQUAL_TO_TIME; break;
  324. case "cognos.Prompt.Control.Interval":
  325. v_s = PMT_RNG_FILTER_GREATER_THAN_EQUAL_TO_INTERVAL; break;
  326. default:
  327. v_s = PMT_RNG_FILTER_GREATER_THAN_EQUAL_TO_STRING; break;
  328. };
  329. break;
  330. };
  331. return v_s;
  332. };
  333. /**
  334. @private
  335. @return {String}
  336. */
  337. cognos.Value.prototype.f_getXML = function()
  338. {
  339. var v_sXML = K_PRMT_sEMPTY;
  340. if ( this.f_isRange() )
  341. {
  342. var v_pvStart = this.f_getStart();
  343. var v_pvEnd = this.f_getEnd();
  344. if ( v_pvStart && v_pvEnd )
  345. {
  346. if ( v_pvStart.f_equals(v_pvEnd) )
  347. {
  348. v_sXML = this.f_getAsXMLElement("selectOption");
  349. }
  350. else
  351. {
  352. v_sXML = '<selectBoundRange selected="true">' +
  353. v_pvStart.f_getAsXMLElement( "start" ) +
  354. v_pvEnd.f_getAsXMLElement( "end" ) +
  355. '</selectBoundRange>';
  356. }
  357. }
  358. else if ( v_pvStart )
  359. {
  360. v_sXML= '<selectUnboundedEndRange selected="true">' +
  361. v_pvStart.f_getAsXMLElement( "start" ) +
  362. '</selectUnboundedEndRange>';
  363. }
  364. else if ( v_pvEnd )
  365. {
  366. v_sXML= '<selectUnboundedStartRange selected="true">' +
  367. v_pvEnd.f_getAsXMLElement( "end" ) +
  368. '</selectUnboundedStartRange>';
  369. }
  370. }
  371. else
  372. {
  373. v_sXML = this.f_getAsXMLElement("selectOption");
  374. }
  375. return v_sXML;
  376. };
  377. /**
  378. @private
  379. @return {void}
  380. */
  381. cognos.Value.prototype.f_getAsXMLElement = function( v_sTag )
  382. {
  383. var v_sXML = K_PRMT_sEMPTY;
  384. // create element only if use & display are NOT both empty
  385. var v_sUse = this.f_getUse();
  386. var v_sDisplay = this.f_getDisplay( true );
  387. if ( this.f_isNull() )
  388. {
  389. v_sXML = ' nullUse="1"';
  390. if ( this.display )
  391. {
  392. v_sXML += ' displayValue="' + v_sDisplay.f_xmlSafe() + '"';
  393. }
  394. else {
  395. v_sXML += ' nullDisplay="1"';
  396. }
  397. }
  398. else
  399. {
  400. //Set the use value if it is not undefined
  401. if ( (typeof v_sUse) !== K_PRMT_sUNDEFINED )
  402. {
  403. if( v_sUse || v_sUse == K_PRMT_sEMPTY ) {
  404. v_sXML += ' useValue="' + v_sUse.f_xmlSafe() + '"';
  405. }
  406. }
  407. //Set the display value if it exists, or set it equal to the use value if it doesn't
  408. if ( v_sDisplay || v_sDisplay == K_PRMT_sEMPTY )
  409. {
  410. v_sXML += ' displayValue="' + v_sDisplay.f_xmlSafe() + '"';
  411. }
  412. }
  413. if ( v_sXML !== K_PRMT_sEMPTY )
  414. {
  415. v_sXML = K_PRMT_sLT + v_sTag + v_sXML + K_PRMT_sSL + K_PRMT_sGT;
  416. }
  417. return v_sXML;
  418. };
  419. /**
  420. @private
  421. @return {String}
  422. */
  423. cognos.Value.prototype.getUseValue = function()
  424. {
  425. return (this.f_getUse());
  426. };
  427. /**
  428. @private
  429. @return {String}
  430. */
  431. cognos.Value.prototype.f_getUse = function() {
  432. var v_sUse = null;
  433. if ( this['use'] || this['use'] == K_PRMT_sEMPTY)
  434. {
  435. v_sUse = (K_PRMT_sEMPTY + this['use']);
  436. }
  437. else
  438. {
  439. var v_pvStart = this.f_getStart();
  440. var v_pvEnd = this.f_getEnd();
  441. if ( v_pvStart || v_pvEnd )
  442. {
  443. if ( v_pvStart )
  444. {
  445. v_sUse = v_pvStart.f_getUse();
  446. }
  447. if ( !v_pvStart || !v_pvStart.f_equals(v_pvEnd))
  448. {
  449. v_sUse += K_PRMT_sCOLON;
  450. if ( v_pvEnd )
  451. {
  452. v_sUse += v_pvEnd.f_getUse();
  453. }
  454. }
  455. }
  456. }
  457. if ( v_sUse !== K_PRMT_sEMPTY )
  458. {
  459. this['use'] = v_sUse;
  460. }
  461. return v_sUse;
  462. };
  463. /**
  464. @private
  465. @return {cognos.Value}
  466. */
  467. cognos.Value.prototype.f_getEnd = function()
  468. {
  469. return cognos.Value.getValue( this['end'] );
  470. };
  471. /**
  472. @private
  473. @return {cognos.Value}
  474. */
  475. cognos.Value.prototype.f_getStart = function()
  476. {
  477. return cognos.Value.getValue( this['start'] );
  478. };
  479. /**
  480. @private
  481. @return {boolean}
  482. */
  483. cognos.Value.prototype.f_isNull = function()
  484. {
  485. return ( this['nil'] === true );
  486. };
  487. /**
  488. @private
  489. @return {boolean}
  490. */
  491. cognos.Value.prototype.f_isRange = function()
  492. {
  493. return ( this['start'] || this['end'] ? true : false);
  494. };
  495. /**
  496. Transform an object to a JSON string. Used by C_Choices to keep the original value as a string in <option>'s attributes.
  497. @private
  498. @param {Object} obj Object to return as JSON string.
  499. @return {String}
  500. */
  501. cognos.Value.toJSON = function(obj)
  502. {
  503. var v_sRetVal = K_PRMT_sEMPTY;
  504. var v_aTemp = [];
  505. var v_idx = 0;
  506. if ( (typeof obj).match(/boolean|string|number/) )
  507. {
  508. if ((typeof obj).match(/string/)) {
  509. return K_PRMT_sQU + jsEncodeStr(obj) + K_PRMT_sQU;
  510. }
  511. return K_PRMT_sEMPTY + obj;
  512. }
  513. if (obj instanceof Array) {
  514. for (v_idx = 0; v_idx < obj.length; v_idx++) {
  515. v_aTemp.push( cognos.Value.toJSON(obj[v_idx]) );
  516. }
  517. return "[" + v_aTemp.join(", ") + "]";
  518. }
  519. var v_aKeys = [];
  520. var v_reKeywords = new RegExp("^(use|display|start|end|nil)$");
  521. for (v_idx in obj)
  522. {
  523. if ( (K_PRMT_sEMPTY + v_idx).match(v_reKeywords) ) {
  524. v_aKeys.push(v_idx);
  525. }
  526. }
  527. v_aKeys.sort();
  528. var v_sJSON = K_PRMT_sEMPTY;
  529. if (v_aKeys.length)
  530. {
  531. for (v_idx = 0; v_idx < v_aKeys.length; v_idx++)
  532. {
  533. v_sJSON = cognos.Value.toJSON(obj[v_aKeys[v_idx]]);
  534. if (v_sJSON) {
  535. v_aTemp.push(v_aKeys[v_idx] + ": " + v_sJSON);
  536. }
  537. }
  538. v_sRetVal = "{" + v_aTemp.join(", ") + "}";
  539. }
  540. return v_sRetVal;
  541. }
  542. /**
  543. Transform an object to a XML string. Used by C_Choices to keep the original value as a string in <option>'s attributes.
  544. @private
  545. @param {Object} v Object to return as XML string.
  546. @return {String}
  547. */
  548. cognos.Value.toXML = function(v)
  549. {
  550. var v_oVal = cognos.Value.getValue(v);
  551. var v_sXML = K_PRMT_sEMPTY;
  552. if ((typeof v_oVal) == "string")
  553. {
  554. // from pvXML in C_Choices' <option>
  555. v_sXML = v_oVal;
  556. }
  557. else if ( v_oVal.length )
  558. {
  559. var v_aXML = [];
  560. for (var v_idxPV = 0; v_idxPV < v_oVal.length; v_idxPV++)
  561. {
  562. var v_oTemp = v_oVal[ v_idxPV ];
  563. var v_sTempXML = cognos.Value.toXML( v_oTemp );
  564. v_aXML.push( v_sTempXML );
  565. }
  566. v_sXML = v_aXML.join(K_PRMT_sEMPTY);
  567. }
  568. else if (v_oVal.length !== 0)
  569. {
  570. v_sXML = v_oVal.f_getXML();
  571. }
  572. return v_sXML;
  573. }
  574. var C_ParameterValue = cognos.Value; // Keep old reference for backward compatibility with custom scripts.