util.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. **
  4. ** BI and PM: qs
  5. **
  6. ** (C) Copyright IBM Corp. 2001, 2015
  7. **
  8. ** US Government Users Restricted Rights - Use, duplication or
  9. ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *****************************************************************/
  11. // Copyright (C) 2008 Cognos ULC, an IBM Company. All Rights Reserved.
  12. // Cognos and the Cognos logo are trademarks of Cognos ULC (formerly Cognos Incorporated) in the United States and/or other countries. IBM and the IBM logo are trademarks of International Business Machines Corporation in the United States, or other countries, or both. Other company, product, or service names may be trademarks or service marks of others.
  13. var gsUTIL_EMPTY = "";
  14. var gsUTIL_string = "string";
  15. var gsUTIL_undefined = "undefined";
  16. var gsUTIL_APOS = "'";
  17. var gsUTIL_BACKSLASH = "\\";
  18. var gsUTIL_GREATERTHAN = ">";
  19. var gsUTIL_LESSTHAN = "<";
  20. var gsUTIL_QUOTE = '"';
  21. var greUTIL_APOS_ESCAPE = /\\'/g;
  22. var greUTIL_BACKSLASH_ESCAPE = /\\\\/g;
  23. var greUTIL_GREATERTHAN_ESCAPE = /\\>/g;
  24. var greUTIL_LESSTHAN_ESCAPE = /\\</g;
  25. var greUTIL_QUOTE_ESCAPE = /\\"/g;
  26. var DATA_TYPE_NUMERIC = 0;
  27. var DATA_TYPE_DATE = 1;
  28. var DATA_TYPE_TIME = 2;
  29. var DATA_TYPE_DATETIME = 3;
  30. var DATA_TYPE_INTERVAL = 4;
  31. var DATA_TYPE_STRING = 5;
  32. var DATA_TYPE_BLOB = 6;
  33. var DATA_TYPE_YMINTERVAL = 7;
  34. var DATA_TYPE_REPORT_EXPRESSION = 8;
  35. var USAGE_VALUE_MEASURE = 3;
  36. function isNumeric(idx)
  37. {
  38. return (getDataType(idx) === 0);
  39. };
  40. function isOldTypeNumeric(idx)
  41. {
  42. if (goApplicationManager.getMiniQueryManager().isFakeMeasure(idx) === false)
  43. {
  44. return false;
  45. }
  46. return (getDataTypeFromArray(idx, "oldType") === 0);
  47. };
  48. function isString(idx)
  49. {
  50. return (getDataType(idx) === 5);
  51. };
  52. function isDateTime(idx)
  53. {
  54. var type = getDataType(idx);
  55. return (type > 0 && type < 5);
  56. };
  57. function isOldTypeDateTime(idx)
  58. {
  59. if (goApplicationManager.getMiniQueryManager().isFakeMeasure(idx) === false)
  60. {
  61. return false;
  62. }
  63. var type = getDataTypeFromArray(idx, "oldType");
  64. return (type > 0 && type < 5);
  65. };
  66. function isDate(idx)
  67. {
  68. var type = getDataType(idx);
  69. return (type === 1);
  70. };
  71. function isTime(idx)
  72. {
  73. var type = getDataType(idx);
  74. return (type === 2);
  75. };
  76. function isInterval(idx)
  77. {
  78. var type = getDataType(idx);
  79. return (type === 4);
  80. };
  81. function isOldTypeInterval(idx)
  82. {
  83. if (goApplicationManager.getMiniQueryManager().isFakeMeasure(idx) === false)
  84. {
  85. return false;
  86. }
  87. var type = getDataTypeFromArray(idx, "oldType");
  88. return (type === 4);
  89. };
  90. function getCalcType(idx)
  91. {
  92. var calcOp = goApplicationManager.getMiniQueryManager().getCalcOp(idx);
  93. if (calcOp !== MINI_QUERY_ATTRIBUTE_NOT_FOUND)
  94. {
  95. switch (calcOp)
  96. {
  97. case "sum":
  98. case "difference":
  99. case "division":
  100. case "product":
  101. case "average":
  102. case "maximum":
  103. case "minimum":
  104. case "percent":
  105. case "percentDifference":
  106. case "percentTotal":
  107. case "percentile":
  108. case "rank":
  109. case "quartile":
  110. case "quantile":
  111. case "number":
  112. case "round":
  113. case "round down":
  114. case "absolute":
  115. case "sqrt":
  116. case "power":
  117. case "yearDateTime":
  118. case "monthYearDateTime":
  119. case "hourDateTime":
  120. case "minuteDateTime":
  121. case "secondDateTime":
  122. case "dayWeekDateTime":
  123. case "dayMonthDateTime":
  124. case "dayYearDateTime":
  125. case "weekDateTime":
  126. case "hourTime":
  127. case "minuteTime":
  128. case "secondTime":
  129. case "yearDate":
  130. case "monthYearDate":
  131. case "dayWeekDate":
  132. case "dayMonthDate":
  133. case "dayYearDate":
  134. case "rankInterval":
  135. case "daysInterval":
  136. case "daysBetweenDate":
  137. case "monthsBetweenDate":
  138. case "yearsBetweenDate":
  139. case "daysBetweenDateTime":
  140. case "monthsBetweenDateTime":
  141. case "yearsBetweenDateTime":
  142. case "weekDate":
  143. return "number";
  144. case "rangeString":
  145. case "rangeNumber":
  146. case "rangeDate":
  147. case "rangeTime":
  148. case "rangeInterval":
  149. case "rangeDateTime":
  150. return "range";
  151. case "groupString":
  152. case "groupNumber":
  153. return "group";
  154. case "left":
  155. case "right":
  156. case "trim":
  157. case "monthNameDate":
  158. case "dayNameDate":
  159. case "monthNameDateTime":
  160. case "dayNameDateTime":
  161. case "concatString":
  162. case "concatNumber":
  163. case "concatInterval":
  164. case "concatDatetime":
  165. case "concatDefault":
  166. return "string";
  167. case "dayFirstDate":
  168. case "dayLastDate":
  169. case "adddaysDate":
  170. case "addmonthsDate":
  171. case "addyearsDate":
  172. case "maxDate":
  173. case "minDate":
  174. return "date";
  175. case "maxTime":
  176. case "minTime":
  177. return "time";
  178. case "dayFirstDateTime":
  179. case "dayLastDateTime":
  180. case "adddaysDateTime":
  181. case "addmonthsDateTime":
  182. case "addyearsDateTime":
  183. case "maxDateTime":
  184. case "minDateTime":
  185. return "datetime";
  186. case "sumInterval":
  187. case "differenceDate":
  188. case "differenceTime":
  189. case "differenceDateTime":
  190. case "differenceInterval":
  191. case "minInterval":
  192. case "maxInterval":
  193. return "interval";
  194. case "model":
  195. return "model";
  196. }
  197. }
  198. return "unknown";
  199. };
  200. function getDataType(idx)
  201. {
  202. return getDataTypeFromArray(idx, "type");
  203. };
  204. function getDataTypeFromArray(iIdx, sAttrName)
  205. {
  206. var nDatatype = goApplicationManager.getMiniQueryManager().getAttributeOnColumn(iIdx, sAttrName, "string");
  207. if (nDatatype == "reportExpression")
  208. {
  209. return 7;
  210. }
  211. else
  212. {
  213. return determineDataType(parseInt(nDatatype));
  214. }
  215. };
  216. function determineDataType(nDatatype)
  217. {
  218. switch (nDatatype)
  219. {
  220. case 2:
  221. case 3:
  222. case 10:
  223. case 11:
  224. case 12:
  225. case 20:
  226. case 21:
  227. case 30:
  228. case 31:
  229. case 32:
  230. case 40:
  231. case 41:
  232. case "number":
  233. return 0;
  234. case 50:
  235. case "date":
  236. return 1;
  237. case 51:
  238. case "time":
  239. return 2;
  240. case 52:
  241. case 94:
  242. case "datetime":
  243. return 3;
  244. case 53:
  245. case "interval":
  246. return 4;
  247. case 60:
  248. case 61:
  249. case 62:
  250. case 80:
  251. case 95:
  252. case 96:
  253. case "string":
  254. return 5;
  255. case 70:
  256. case 71:
  257. case 72:
  258. return 6;
  259. case 92:
  260. case "yminterval":
  261. return 7;
  262. case "reportExpression":
  263. return 8;
  264. default:
  265. return -1;
  266. }
  267. };
  268. function getDataTypeFromString(sDatatype)
  269. {
  270. switch (sDatatype)
  271. {
  272. case "boolean":
  273. return 4;
  274. case "int16":
  275. return 10;
  276. case "int32":
  277. return 11;
  278. case "int64":
  279. return 12;
  280. case "decimal":
  281. return 20;
  282. case "numeric":
  283. return 21;
  284. case "float":
  285. return 30;
  286. case "float32":
  287. return 31;
  288. case "float64":
  289. return 32;
  290. case "binary":
  291. return 40;
  292. case "binarylength":
  293. return 41;
  294. case "date":
  295. case "date2":
  296. return 50;
  297. case "time":
  298. case "time2":
  299. return 51;
  300. case "dateTime":
  301. case "datetime":
  302. case "datetime2":
  303. return 52;
  304. case "interval":
  305. case "interval2":
  306. return 53;
  307. case "character":
  308. return 60;
  309. case "characterlength16":
  310. return 61;
  311. case "characterlength32":
  312. return 62;
  313. case "blob":
  314. return 70;
  315. case "textblob":
  316. return 71;
  317. case "array":
  318. return 72;
  319. case "key":
  320. return 80;
  321. case "bit":
  322. return 90;
  323. case "varbit":
  324. return 91;
  325. case "intervalYM":
  326. return 92;
  327. case "timeTZ":
  328. return 93;
  329. case "timeStampTZ":
  330. return 94;
  331. case "nationalchar":
  332. return 95;
  333. case "nationalcharvarying":
  334. return 96;
  335. case "munliteral":
  336. return 101;
  337. case "memberUniqueName":
  338. return -1;
  339. default:
  340. return -1;
  341. }
  342. };
  343. function getStringFromDataType(iDatatype)
  344. {
  345. switch (iDatatype)
  346. {
  347. case 1: return dataTypeMsgStrings["unsupported"];
  348. case 3: return dataTypeMsgStrings["null"];
  349. case 4: return dataTypeMsgStrings["boolean"];
  350. case 10: return dataTypeMsgStrings["int16"];
  351. case 11: return dataTypeMsgStrings["int32"];
  352. case 12: return dataTypeMsgStrings["int64"];
  353. case 20: return dataTypeMsgStrings["decimal"];
  354. case 21: return dataTypeMsgStrings["numeric"];
  355. case 30: return dataTypeMsgStrings["float"];
  356. case 31: return dataTypeMsgStrings["float32"];
  357. case 32: return dataTypeMsgStrings["float64"];
  358. case 40: return dataTypeMsgStrings["binary"];
  359. case 41: return dataTypeMsgStrings["binarylength"];
  360. case 50: return dataTypeMsgStrings["date"];
  361. case 51: return dataTypeMsgStrings["time"];
  362. case 52: return dataTypeMsgStrings["datetime"];
  363. case 53: return dataTypeMsgStrings["interval"];
  364. case 60: return dataTypeMsgStrings["character"];
  365. case 61: return dataTypeMsgStrings["characterlength16"];
  366. case 62: return dataTypeMsgStrings["characterlength32"];
  367. case 70: return dataTypeMsgStrings["blob"];
  368. case 71: return dataTypeMsgStrings["textblob"];
  369. case 72: return dataTypeMsgStrings["array"];
  370. case 80: return dataTypeMsgStrings["key"];
  371. case 90: return dataTypeMsgStrings["bit"];
  372. case 91: return dataTypeMsgStrings["varbit"];
  373. case 92: return dataTypeMsgStrings["intervalYM"];
  374. case 93: return dataTypeMsgStrings["timeTZ"];
  375. case 94: return dataTypeMsgStrings["timeStampTZ"];
  376. case 95: return dataTypeMsgStrings["nationalchar"];
  377. case 96: return dataTypeMsgStrings["nationalcharvarying"];
  378. case 101: return dataTypeMsgStrings["munliteral"];
  379. default:
  380. return dataTypeMsgStrings["unknown"];
  381. }
  382. };
  383. function getDisplayValueForOption(o)
  384. {
  385. var text = '';
  386. if (typeof o == "object")
  387. {
  388. if (o.text != null)
  389. {
  390. text = o.text;
  391. }
  392. else if (o.firstChild != null)
  393. {
  394. text = o.firstChild.nodeValue;
  395. }
  396. else if (o.nextSibling != null)
  397. {
  398. text = o.nextSibling.nodeValue;
  399. }
  400. else if (o.value != null)
  401. {
  402. text = o.value;
  403. }
  404. }
  405. if ( typeof text == "string" )
  406. {
  407. text = text.replace( /\xA0/gi, ' ' );
  408. }
  409. return text;
  410. };
  411. function getSelectionsDataType()
  412. {
  413. var numSel = cfgSize("SelColumns");
  414. if (numSel < 1)
  415. {
  416. return -1;
  417. }
  418. var dataType = getDataType(cfgGetAt("SelColumns", 0));
  419. for (var i = 1; i < numSel; i++)
  420. {
  421. if (dataType != getDataType(cfgGetAt("SelColumns", i)))
  422. {
  423. return -1;
  424. }
  425. }
  426. return dataType;
  427. };
  428. function determineRegAggType(regAggVal, isDate)
  429. {
  430. if (typeof regAggVal == "number")
  431. {
  432. switch (parseInt(regAggVal))
  433. {
  434. case 2:
  435. return summaryMsgStrings["SUMMARY_TOTAL"];
  436. case 3:
  437. if (typeof isDate == "boolean" && isDate === true)
  438. {
  439. return summaryMsgStrings["SUMMARY_EARLIEST"];
  440. }
  441. return summaryMsgStrings["SUMMARY_MINIMUM"];
  442. case 4:
  443. if (typeof isDate == "boolean" && isDate === true)
  444. {
  445. return summaryMsgStrings["SUMMARY_LATEST"];
  446. }
  447. return summaryMsgStrings["SUMMARY_MAXIMUM"];
  448. case 5:
  449. return summaryMsgStrings["SUMMARY_AVERAGE"];
  450. case 6:
  451. return summaryMsgStrings["SUMMARY_COUNT"];
  452. case 13:
  453. return summaryMsgStrings["SUMMARY_COUNT_DISTINCT"];
  454. case 15:
  455. return summaryMsgStrings["SUMMARY_STANDARD_DEVIATION"];
  456. case 16:
  457. return summaryMsgStrings["SUMMARY_VARIANCE"];
  458. case 17:
  459. return summaryMsgStrings["SUMMARY_MEDIAN"];
  460. case 1:
  461. case 10:
  462. case 11:
  463. case 12:
  464. case 14:
  465. case 18:
  466. return summaryMsgStrings["SUMMARY_AUTOMATIC"];
  467. }
  468. }
  469. return summaryMsgStrings["SUMMARY_NOSUMMARY"];
  470. };
  471. function isHierarchy(c)
  472. {
  473. return (c !== null && c instanceof XMLElement && c.getAttribute("hierarchy") == "true");
  474. };
  475. function isLevel(c)
  476. {
  477. return (c !== null && c instanceof XMLElement && (c.getAttribute("metadataType") == "level" || c.getAttribute("metadataType") == "namedSet" || (c.getAttribute("metadataType") === "" && c.getAttribute("levelNumber") !== "")));
  478. };
  479. function isMember(c)
  480. {
  481. return (c !== null && c instanceof XMLElement && c.getAttribute("metadataType") == "member");
  482. };
  483. function isMUN(c)
  484. {
  485. return (isLevel(c) || isHierarchy(c) || isMember(c));
  486. };
  487. function isMUNFromMetadata(oNode)
  488. {
  489. if (!oNode || typeof oNode == "undefined" || !oNode.nodeMetaType || oNode.nodeMetaType == "undefined")
  490. {
  491. return false;
  492. }
  493. var oColumn = new XMLElement("Column", null);
  494. oColumn.setAttribute("metadataType", getMetaType(oNode));
  495. return isMUN(oColumn);
  496. };
  497. function getMetaType(oNode)
  498. {
  499. var metaType = oNode.nodeMetaType ? oNode.nodeMetaType : "none";
  500. var nodeMetaType = null;
  501. if (metaType == "queryItem")
  502. {
  503. var parentNode = oNode.getParent();
  504. if (parentNode)
  505. {
  506. while (parentNode.nodeMetaType == "queryFolder")
  507. {
  508. parentNode = parentNode.getParent();
  509. }
  510. nodeMetaType = parentNode.nodeMetaType;
  511. if (nodeMetaType == "level" || nodeMetaType == "dimension" || nodeMetaType == "hierarchy")
  512. {
  513. metaType = "attribute";
  514. }
  515. }
  516. }
  517. return metaType;
  518. };
  519. function jsdecode(str)
  520. {
  521. if (typeof str == gsUTIL_undefined || str === gsUTIL_EMPTY)
  522. {
  523. return gsUTIL_EMPTY;
  524. }
  525. if (typeof str != gsUTIL_string)
  526. {
  527. return str;
  528. }
  529. return str.replace(greUTIL_APOS_ESCAPE, gsUTIL_APOS).replace(greUTIL_QUOTE_ESCAPE, gsUTIL_QUOTE).replace(greUTIL_GREATERTHAN_ESCAPE, gsUTIL_GREATERTHAN).replace(greUTIL_LESSTHAN_ESCAPE, gsUTIL_LESSTHAN).replace(greUTIL_BACKSLASH_ESCAPE, gsUTIL_BACKSLASH);
  530. };
  531. function htmlencode(str)
  532. {
  533. if (typeof str == gsUTIL_undefined || str === gsUTIL_EMPTY)
  534. {
  535. return gsUTIL_EMPTY;
  536. }
  537. if (typeof str != gsUTIL_string)
  538. {
  539. return str;
  540. }
  541. return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
  542. };
  543. function deleteArrayEntry(aArray, sValue)
  544. {
  545. var aNewArray = new Array();
  546. for (var idxArr in aArray)
  547. {
  548. if (idxArr != sValue)
  549. {
  550. aNewArray[aNewArray.length] = aArray[idxArr];
  551. }
  552. }
  553. return aNewArray;
  554. };
  555. function isDataTypeMatch(sDataType, iTypeConst)
  556. {
  557. if (typeof sDataType != gsUTIL_string)
  558. {
  559. return false;
  560. }
  561. var iDataType = parseInt(sDataType, 10);
  562. if (isNaN(iDataType))
  563. {
  564. return false;
  565. }
  566. var iDeterminedDataType = determineDataType(iDataType);
  567. if (iDeterminedDataType === iTypeConst)
  568. {
  569. return true;
  570. }
  571. else
  572. {
  573. return false;
  574. }
  575. };
  576. function stripSignature(sSpecification)
  577. {
  578. if (typeof sSpecification == "string")
  579. {
  580. var sHoofAndMouth = "00001111C4MCRYP7000001111";
  581. var iPosition = sSpecification.lastIndexOf(sHoofAndMouth);
  582. if (iPosition == -1 || iPosition == 0)
  583. {
  584. return sSpecification;
  585. }
  586. iPosition = sSpecification.lastIndexOf(sHoofAndMouth, (iPosition - 1));
  587. if (iPosition == -1)
  588. {
  589. return sSpecification;
  590. }
  591. return sSpecification.substr(0, iPosition);
  592. }
  593. else
  594. {
  595. return sSpecification;
  596. }
  597. };
  598. function createCommand(sOpCode1, sOpCode2, aParams)
  599. {
  600. if (typeof sOpCode1 == "undefined" || typeof sOpCode2 == "undefined")
  601. {
  602. return "";
  603. }
  604. var sCommand = sOpCode1 + sOpCode2 + ":";
  605. if (aParams instanceof Array)
  606. {
  607. sCommand += aParams.join(",");
  608. }
  609. return sCommand;
  610. };
  611. function getArrayLength(aArray)
  612. {
  613. if (typeof aArray == "object" && aArray instanceof Array)
  614. {
  615. var length = 0;
  616. for (var idxArr in aArray)
  617. {
  618. length++;
  619. }
  620. return length;
  621. }
  622. return 0;
  623. };
  624. function getOrCreateMiniQueryDocument()
  625. {
  626. var oMQMgr = goApplicationManager.getMiniQueryManager();
  627. var oDoc = oMQMgr.getDoc();
  628. if (!oDoc)
  629. {
  630. oDoc = XMLBuilderCreateXMLDocument("CRQReport");
  631. }
  632. return oDoc;
  633. };
  634. function createHiddenInput(oFrame, oForm, sName, sValue)
  635. {
  636. if (!oForm)
  637. {
  638. return false;
  639. }
  640. if (!oFrame)
  641. {
  642. oFrame = self;
  643. }
  644. var oInput = oFrame.document.createElement("INPUT");
  645. oInput.type = "hidden";
  646. oInput.id = sName;
  647. oInput.name = sName;
  648. oInput.value = sValue;
  649. oForm.appendChild(oInput);
  650. return true;
  651. };
  652. function concatAssociativeArrays(aAssArray1, aAssArray2)
  653. {
  654. var aNewArr = [];
  655. var idxArr = null;
  656. if (typeof aAssArray1 == "object" && aAssArray1 !== null)
  657. {
  658. for (idxArr in aAssArray1)
  659. {
  660. aNewArr[idxArr] = aAssArray1[idxArr];
  661. }
  662. }
  663. if (typeof aAssArray2 == "object" && aAssArray2 !== null)
  664. {
  665. for (idxArr in aAssArray2)
  666. {
  667. aNewArr[idxArr] = aAssArray2[idxArr];
  668. }
  669. }
  670. return aNewArr;
  671. };
  672. function stripPFromParam(sParam)
  673. {
  674. var sKeyNoP = sParam;
  675. if (sKeyNoP.indexOf("p_") === 0)
  676. {
  677. sKeyNoP = sKeyNoP.substr(2);
  678. }
  679. return sKeyNoP;
  680. };
  681. function getPromptPageParameterValues()
  682. {
  683. var aPV = [];
  684. var aPPP = goApplicationManager.getReportManager().getParameterManager().getPromptPageParameters();
  685. for (var idxPPP in aPPP)
  686. {
  687. var sName = idxPPP;
  688. if (sName.charAt(0) != "_")
  689. {
  690. sName = "p_" + sName;
  691. }
  692. var sValue = aPPP[idxPPP];
  693. aPV[aPV.length] = [sName, sValue];
  694. }
  695. return aPV;
  696. };