toolbar.js 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. // Licensed Materials - Property of IBM
  2. //
  3. // IBM Cognos Products: pps
  4. //
  5. // (C) Copyright IBM Corp. 2005, 2019
  6. //
  7. // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. // This forms the javascript functions used for PowerPlay Studio Toolbar
  9. // The functions handle any minor browser differences.
  10. // Variables and constants
  11. var ext = ".gif";
  12. var BTN_HIDDEN = -1;
  13. var BTN_NORMAL = 0;
  14. var BTN_RAISED = 1;
  15. var BTN_PRESSED = 2;
  16. var BTN_ROLL_PRESSED = 3;
  17. var BTN_DISABLED = 4;
  18. var STATUS_HIDDEN = -1;
  19. var STATUS_NORMAL = 0;
  20. var STATUS_PRESSED = 1;
  21. var STATUS_DISABLED = 2;
  22. var IDX_DEFAULT = 0;
  23. var IDX_DISABLED = 1;
  24. var ACT_PANE_GROUP = 0;
  25. var xtabButtonItem;
  26. var chartButtonItem;
  27. var displayOptionsButtonItem;
  28. var zeroSuppressionButtonItem;
  29. var helpButtonItem;
  30. var getDataAltImg = "data_now";
  31. var toolBarImages = new Array();
  32. var toggleGroups = new Array();
  33. var ZS_PRESSED = 0;
  34. var ETS_PRESSED = 0;
  35. var ZS_ICON = "";
  36. var ETS_ICON = "";
  37. var hourglass = new Image();
  38. // Used to keep track of original (set by server) enabled/disabled values for toolbarbuttons
  39. // since we may dynamically disbale buttons.
  40. var originalButtonStates = new Array();
  41. var intialized = false;
  42. // ButtonName FileName Mod1 Mod2
  43. var buttonRules =[
  44. [ "xtab", "xtab", [ "" ] ],
  45. [ "ftab", "ftab", [ "", "_no" ] ],
  46. [ "menu", "arrow", [ "" ] ],
  47. [ "bar", "bar", [ "", "_no" ] ],
  48. [ "pie", "pie", [ "", "_no" ] ],
  49. [ "cluster", "cluster", [ "", "_no" ] ],
  50. [ "stack", "stack", [ "", "_no" ] ],
  51. [ "line", "line", [ "", "_no" ] ],
  52. [ "3d", "3d", [ "", "_no" ] ],
  53. [ "sline", "sline", [ "", "_no" ] ],
  54. [ "scatter", "scatter", [ "", "_no" ] ],
  55. [ "correlation", "correlation", [ "", "_no" ] ],
  56. [ "displayoption", "display_options", [ "", "_no" ] ],
  57. [ "chartoption", "options", [ "", "_no" ] ],
  58. [ "xtaboption", "options", [ "", "_no" ] ],
  59. [ "displayoptionmenu","display_options_menu", [ "" ] ],
  60. [ "splitview", "split_view", [ "", "_no" ] ],
  61. [ "edittitle", "edit_title", [ "", "_no" ] ],
  62. [ "calculation", "calculation", [ "", "_no" ] ],
  63. [ "rank", "rank", [ "", "_no" ] ],
  64. [ "hideshow", "hide_show", [ "", "_no" ] ],
  65. [ "customsubset", "custom_subset", [ "", "_no" ] ],
  66. [ "swap", "swap", [ "" ] ],
  67. [ "zero", "zero", [ "" ] ],
  68. [ "rows_only", "zero_rows", [ "" ] ],
  69. [ "columns_only", "zero_cols", [ "" ] ],
  70. [ "f8020", "f8020", [ "", "_no" ] ],
  71. [ "except", "except", [ "" ] ],
  72. [ "customexception", "customex", [ "" ] ],
  73. [ "bookmark", "bookmark", [ "", "_no" ] ],
  74. [ "explain", "explain", [ "" ] ],
  75. [ "find", "find", [ "", "_no" ] ],
  76. [ "drillthrough", "drillthru", [ "", "_no" ] ],
  77. [ "help", "help", [ "" ] ],
  78. [ "file", "file", [ "", "_no" ] ],
  79. [ "save", "save", [ "", "_no" ] ],
  80. [ "saveas", "saveas", [ "", "_no" ] ],
  81. [ "custom1", "custom1", [ "" ] ],
  82. [ "custom2", "custom2", [ "" ] ],
  83. [ "custom3", "custom3", [ "" ] ],
  84. [ "custom4", "custom4", [ "" ] ],
  85. [ "custom5", "custom5", [ "" ] ],
  86. [ "custom6", "custom6", [ "" ] ],
  87. [ "custom7", "custom7", [ "" ] ],
  88. [ "custom8", "custom8", [ "" ] ] ];
  89. function winFocus(w){
  90. if( w != null && w.focus != null ) {
  91. w.focus();
  92. }
  93. }
  94. //In order to add a new button or change an image, modify this function.
  95. function InitializeToolbar(forceBestEffort) {
  96. if (!forceBestEffort && !checkAllButtonPropertiesLoaded()) {
  97. topparent.notifyFrameNotYetLoaded();
  98. return;
  99. }
  100. addButtonToPreloadArray();
  101. //Initialize the menus
  102. intializeToolbarMenus();
  103. xtabButtonItem = getActiveMenuIndex("xtab");
  104. chartButtonItem = getActiveMenuIndex("chart");
  105. zeroSuppressionButtonItem = getActiveMenuIndex("zero");
  106. helpButtonItem = getFirstMenuIndex("help");
  107. //Set each button to its correct image
  108. setAllButtons();
  109. setHelpButtonStatusMsg();
  110. //Set up the toggle groups
  111. addToToggleGroup("calculation", ACT_PANE_GROUP);
  112. addToToggleGroup("rank", ACT_PANE_GROUP);
  113. addToToggleGroup("hideshow", ACT_PANE_GROUP);
  114. addToToggleGroup("customexception", ACT_PANE_GROUP);
  115. //addToToggleGroup("explain", ACT_PANE_GROUP);
  116. //addToToggleGroup("find", ACT_PANE_GROUP);
  117. addToToggleGroup("customsubset", ACT_PANE_GROUP);
  118. initialized = true;
  119. }
  120. //Modify this function to add/remove or modify toolbar menus
  121. function intializeToolbarMenus() {
  122. //Initialize menu images
  123. addMenuItem("xtab", "xtab", "xtab", "setXtabButton('xtab');doit('OY:0');");
  124. addMenuItem("xtab", "ftab", "ftab", "setXtabButton('ftab');doit('OY:9');");
  125. addMenuItem("xtab", "xtaboption", "options", "doit('MB')");
  126. addMenuItem("chart", "bar", "bar", "setChartButton('bar');doit('OY:2')");
  127. addMenuItem("chart", "pie", "pie", "setChartButton('pie');doit('OY:1')");
  128. addMenuItem("chart", "cluster", "cluster", "setChartButton('cluster');doit('OY:3')");
  129. addMenuItem("chart", "stack", "stack", "setChartButton('stack');doit('OY:5')");
  130. addMenuItem("chart", "line", "line", "setChartButton('line');doit('OY:4')");
  131. addMenuItem("chart", "3d", "3d", "setChartButton('3d');doit('OY:6')");
  132. addMenuItem("chart", "sline", "sline", "setChartButton('sline');doit('OY:10')");
  133. addMenuItem("chart", "scatter", "scatter", "setChartButton('scatter');doit('OY:11')");
  134. addMenuItem("chart", "correlation", "correlation", "setChartButton('correlation');doit('OY:12')");
  135. addMenuItem("chart", "chartoption", "options", "doit('MY')");
  136. addMenuItem("displayoptionmenu", "displayoption","display_options", "doit('MT')");
  137. addMenuItem("displayoptionmenu", "splitview", "split_view", "doit('OSD')");
  138. addMenuItem("displayoptionmenu", "edittitle", "edit_title", "doit('MI')");
  139. addMenuItem("displayoptionmenu", "getdata", "data_later", "doit('OGD')");
  140. addMenuItem("displayoptionmenu", "reset", "reset", "doReset()");
  141. addMenuItem("zero", "zero", "zero", "setZeroButton('zero');doit('UX:1')");
  142. addMenuItem("zero", "rows_only", "zero_rows", "setZeroButton('rows_only');doit('UX:2')");
  143. addMenuItem("zero", "columns_only", "zero_cols", "setZeroButton('columns_only');doit('UX:3')");
  144. addMenuItem("zero", "options", "options", "doit('MD')");
  145. addMenuItem("file", "pdf_options", "pdf_options", "doit('MP')");
  146. addMenuItem("file", "savepdf", "savepdf", "ra(12)");
  147. addMenuItem("file", "savecsv", "savecsv", "ra(1)");
  148. addMenuItem("file", "savexls", "save_xls", "ra(11)");
  149. addMenuItem("file", "savexlsx", "save_xlsx", "ra(13)");
  150. addMenuItem("file", "bookmark", "bookmark", "ra(7)");
  151. addMenuItem("file", "openas", "openas", "launchStudio('as')");
  152. addMenuItem("file", "openrs", "openrs", "launchStudio('rs')");
  153. addMenuItem("file", "openbua", "openbua", "launchStudio('bua')");
  154. addMenuItem("file", "extractppx", "extractppx", "ra(98)");
  155. addMenuItem("help", "help", "help", "doMenuHelp();");
  156. addMenuItem("help", "find", "find", "doit('MF')");
  157. addMenuItem("help", "explain", "explain", "doit('ME')");
  158. }
  159. //In order to modify or add button actions, modify this function
  160. function doButtonAction(event, button) {
  161. if (typeof initialized == "undefined" || !initialized) {
  162. return false;
  163. }
  164. if (!isDisabled(button)) {
  165. switch (button.id) {
  166. case "xtab": doXtab(); break;
  167. case "chart": doChart(); break;
  168. case "displayoptionmenu": doMenuButtonAction(event, button); break;
  169. case "hideshow": toggleButton(button, true); doit('MQ'); break;
  170. case "calculation": toggleButton(button, true); doit('MC'); break;
  171. case "rank":toggleButton(button, true); doit('MO'); break;
  172. case "customsubset": toggleButton(button, true); doit('MZI'); break;
  173. case "swap": doit('EX'); break;
  174. case "zero": if (ZS_PRESSED == 1) { break; } toggleButton(button, true); doZeroSuppression();DisableZS(); break;
  175. case "f8020": if (ETS_PRESSED == 1) { break; } toggleButton(button, true); doit('OETS:1');DisableETS(); break;
  176. case "except": toggleButton(button, true); doit('OEX'); break;
  177. case "customexception": toggleButton(button, true); doit('MX'); break;
  178. case "drillthrough": ra(4); break;
  179. case "help": doHelp(); break;
  180. case "file": doMenuButtonAction(event, button); break;
  181. case "save": doit('RU:1'); fh.CO.value = ""; break;
  182. case "saveas": doParent('RU:0'); break;
  183. case "custom1": custom1(); break;
  184. case "custom2": custom2(); break;
  185. case "custom3": custom3(); break;
  186. case "custom4": custom4(); break;
  187. case "custom5": custom5(); break;
  188. case "custom6": custom6(); break;
  189. case "custom7": custom7(); break;
  190. case "custom8": custom8(); break;
  191. }
  192. }
  193. setStatusBar(button);
  194. }
  195. //Used to handle Buttons that change according to selected menu item.
  196. function getButtonId(button) {
  197. if (button.id == "xtab" && (xtabButtonItem != -1)) {
  198. return toolbarMenus["xtab"][xtabButtonItem]._name;
  199. } else if (button.id == "chart" && (chartButtonItem != -1)){
  200. return toolbarMenus["chart"][chartButtonItem]._name;
  201. } else if (button.id == "zero" && (zeroSuppressionButtonItem != -1)) {
  202. return toolbarMenus["zero"][zeroSuppressionButtonItem]._name;
  203. } else if (button.id == "help" && (helpButtonItem != -1)) {
  204. return toolbarMenus["help"][helpButtonItem]._name;
  205. } else {
  206. return button.id;
  207. }
  208. }
  209. function doChart() {
  210. //Get the present menu item's action and perform it.
  211. eval(toolbarMenus["chart"][chartButtonItem]._action);
  212. }
  213. function doXtab() {
  214. //Get the present menu item's action and perform it.
  215. eval(toolbarMenus["xtab"][xtabButtonItem]._action);
  216. }
  217. function doHelp() {
  218. if (toolbarMenus["help"][helpButtonItem]._name == "help") {
  219. help(topparent.getXtabFrame().document.fhidden.LA.value);
  220. } else {
  221. eval(toolbarMenus["help"][helpButtonItem]._action);
  222. }
  223. }
  224. function doMenuHelp() {
  225. //In order to ensure the correct relative URL when the CCL help function
  226. //is called, invoke the onclick of the toolbar button directly.
  227. var button = document.getElementById("help");
  228. if (button.fireEvent) {
  229. button.fireEvent('onclick');
  230. } else {
  231. var eventObject = document.createEvent('MouseEvents');
  232. eventObject.initMouseEvent('click',true,true,window,0,0,0,0,0,false,false,false,false,0,null);
  233. button.dispatchEvent(eventObject);
  234. }
  235. }
  236. function doZeroSuppression() {
  237. //Get the present menu item's action and perform it.
  238. eval(toolbarMenus["zero"][zeroSuppressionButtonItem]._action);
  239. }
  240. function doMenuOrButton(event, button) {
  241. //If we have only 1 menu item, then execute it. Otherwise display the menu.
  242. if (getNumMenuItems(button.id) == 1) {
  243. eval(toolbarMenus[button.id][getFirstMenuIndex(button.id)]._action);
  244. } else {
  245. doMenuButtonAction(event, button.nextSibling);
  246. }
  247. }
  248. function setChartButton(menuName) {
  249. var chartMenu = toolbarMenus["chart"];
  250. if (menuName) {
  251. for (var i = 0; i < chartMenu.length; i++) {
  252. if (chartMenu[i]._name == menuName) {
  253. chartButtonItem = i;
  254. }
  255. }
  256. }
  257. var button = document.getElementById("chart");
  258. if (chartButtonItem >= 0) {
  259. button.setAttribute("help",chartMenu[chartButtonItem]._help);
  260. }
  261. setButton(button,getButtonState(button));
  262. }
  263. function setXtabButton(menuName) {
  264. var xtabMenu = toolbarMenus["xtab"];
  265. if (menuName) {
  266. for (var i = 0; i < xtabMenu.length; i++) {
  267. if (xtabMenu[i]._name == menuName) {
  268. xtabButtonItem = i;
  269. }
  270. }
  271. }
  272. var button = document.getElementById("xtab");
  273. if (xtabButtonItem >= 0) {
  274. button.setAttribute("help",xtabMenu[xtabButtonItem]._help);
  275. }
  276. setButton(button,getButtonState(button));
  277. }
  278. function setZeroButton(menuName) {
  279. var zeroMenu = toolbarMenus["zero"];
  280. if (menuName) {
  281. for (var i = 0; i < zeroMenu.length; i++) {
  282. if (zeroMenu[i]._name == menuName) {
  283. zeroSuppressionButtonItem = i;
  284. }
  285. }
  286. }
  287. var button = document.getElementById("zero");
  288. if (zeroSuppressionButtonItem >= 0) {
  289. button.setAttribute("help",zeroMenu[zeroSuppressionButtonItem]._help);
  290. }
  291. if (isToggled(button)) {
  292. setButton(button,getButtonState(button));
  293. } else if (menuName) {
  294. toggleButton(button,true);
  295. }
  296. }
  297. function setHelpButtonStatusMsg() {
  298. var helpMenu = toolbarMenus["help"];
  299. var button = document.getElementById("help");
  300. if (helpButtonItem >= 0) {
  301. button.setAttribute("help", helpMenu[helpButtonItem]._help);
  302. button.setAttribute("title", helpMenu[helpButtonItem]._label);
  303. }
  304. }
  305. function isToggled(button) {
  306. return (button.getAttribute("isToggled") == "true");
  307. }
  308. function setToggled(button, toggled) {
  309. if (toggled) {
  310. button.setAttribute("isToggled", "true");
  311. } else {
  312. button.setAttribute("isToggled", "false");
  313. }
  314. }
  315. function toggleButton(button, untoggleable) {
  316. if (topparent.getXtabFrame()) {
  317. if (!isToggled(button)) {
  318. setToggled(button, true);
  319. setButton(button, getButtonState(button));
  320. var buttonsInGroup = toggleGroups[parseInt(button.getAttribute("toggleGroup"))];
  321. if (buttonsInGroup != null) {
  322. for (var i = 0; i < buttonsInGroup.length; i++) {
  323. if (buttonsInGroup[i] != button.id)
  324. unToggleButton(document.getElementById(buttonsInGroup[i]));
  325. }
  326. }
  327. } else if (untoggleable) {
  328. unToggleButton(button);
  329. }
  330. }
  331. }
  332. function unToggleButton(button) {
  333. if (isToggled(button)) {
  334. setToggled(button, false);
  335. setButton(button, getButtonState(button));
  336. }
  337. }
  338. function addToToggleGroup(name, group) {
  339. if (toggleGroups[group] == null) {
  340. toggleGroups[group] = new Array();
  341. }
  342. toggleGroups[group][toggleGroups[group].length] = name;
  343. document.getElementById(name).setAttribute("toggleGroup",group);
  344. }
  345. function addMenuItem(menuName, menuItemName, icon, action, checked) {
  346. var menuArray = toolbarMenus[menuName];
  347. var menuItem;
  348. for (var i = 0; i < menuArray.length; i++) {
  349. if (menuArray[i]._name == menuItemName) {
  350. menuArray[i]._img = icon + ext;
  351. menuArray[i]._action = action;
  352. return;
  353. }
  354. }
  355. }
  356. function getFirstMenuIndex(menuName) {
  357. var menuArray = toolbarMenus[menuName];
  358. for (var i = 0; i < menuArray.length; i++) {
  359. if (menuArray[i]._state != STATUS_HIDDEN) {
  360. return i;
  361. }
  362. }
  363. return -1;
  364. }
  365. function getActiveMenuIndex(menuName) {
  366. var menuArray = toolbarMenus[menuName];
  367. for (var i = 0; i < menuArray.length; i++) {
  368. if (menuArray[i]._state == STATUS_PRESSED) {
  369. return i;
  370. }
  371. }
  372. //If we get here the currently active one is not available, so
  373. //return the first visible button.
  374. for (var i = 0; i < menuArray.length; i++) {
  375. if (menuArray[i]._state == STATUS_NORMAL)
  376. return i;
  377. }
  378. //None visible, so return -1.
  379. return -1;
  380. }
  381. function getNumMenuItems(menuName) {
  382. var ctr = 0;
  383. var menuArray = toolbarMenus[menuName];
  384. if (!menuArray)
  385. return 0;
  386. for (var i = 0; i < menuArray.length; i++) {
  387. if (menuArray[i]._state != STATUS_HIDDEN)
  388. ctr++;
  389. }
  390. return ctr;
  391. }
  392. function doMenuButtonAction(event, button) {
  393. if (topparent.getXtabFrame() && !topparent.isXtabStillLoading()) {
  394. if (typeof initialized == "undefined" || !initialized)
  395. return false;
  396. var ownerButton = getOwnerButton(button);
  397. if (!isDisabled(ownerButton)) {
  398. var menuArray = toolbarMenus[ownerButton.id];
  399. var contextItems = new Array();
  400. for (var i = 0; i < menuArray.length; i++) {
  401. if (menuArray[i]._state != STATUS_HIDDEN) {
  402. var funcBody = menuArray[i]._action;
  403. var func = new Function(funcBody);
  404. contextItems[contextItems.length] = new ContextItem(menuArray[i]._img, menuArray[i]._label, func, (menuArray[i]._state == STATUS_DISABLED), menuArray[i]._checked);
  405. }
  406. }
  407. ContextMenu.display(event, contextItems);
  408. }
  409. }
  410. }
  411. function toolbarMenuRecord(name,state,label,help) {
  412. this._name = name;
  413. this._state = state;
  414. this._label = label;
  415. this._help = help;
  416. this._img = null;
  417. this._action = null;
  418. }
  419. function getOwnerButton(menuButton) {
  420. if (menuButton.id == "file" || menuButton.id == "displayoptionmenu")
  421. return menuButton;
  422. else
  423. return document.getElementById(menuButton.id.substr(5,menuButton.id.length));
  424. }
  425. function validState(state) {
  426. return (state == STATUS_HIDDEN || state == STATUS_NORMAL || state == STATUS_PRESSED || state == STATUS_DISABLED);
  427. }
  428. function checkAllButtonPropertiesLoaded() {
  429. var buttons = document.getElementById("toolbarButtons").childNodes;
  430. for (var i = 0; i < buttons.length; i++) {
  431. if (!buttons[i].id)
  432. return false;
  433. if (buttons[i].id != "sep" && buttons[i].id.indexOf("menu") != 0 && !validState(parseInt(buttons[i].getAttribute("state"))))
  434. return false;
  435. }
  436. return true;
  437. }
  438. function isMenuButton(button) {
  439. return button.id.substr(0,5) == "menu_";
  440. }
  441. function setAllButtons() {
  442. var buttons = document.getElementById("toolbarButtons").childNodes;
  443. var sepGif = "sep.gif"
  444. var sepPath = buttonPath + sepGif;
  445. var arrowGif = "arrow.gif"
  446. var arrowPath = buttonPath + arrowGif;
  447. for (var i = 0; i < buttons.length; i++) {
  448. if (buttons[i].id == 'sep') {
  449. if (!buttons[i].src || buttons[i].src.indexOf("/" + sepGif) < 0) {
  450. buttons[i].src = sepPath;
  451. }
  452. }
  453. else if (isMenuButton(buttons[i])) {
  454. if (!buttons[i].src || buttons[i].src.indexOf("/" + arrowGif) < 0) {
  455. buttons[i].src = arrowPath;
  456. }
  457. var ownerButton = getOwnerButton(buttons[i]);
  458. if (getNumMenuItems(ownerButton.id) > 1) {
  459. if (parseInt(ownerButton.getAttribute("state")) == STATUS_PRESSED) {
  460. setButton(buttons[i],BTN_NORMAL);
  461. } else {
  462. setButton(buttons[i],getImgType(ownerButton));
  463. }
  464. } else {
  465. setButton(buttons[i],BTN_HIDDEN);
  466. }
  467. } else {
  468. setButton(buttons[i],getImgType(buttons[i]));
  469. if (buttons[i].getAttribute("state") != STATUS_PRESSED) {
  470. unToggleButton(buttons[i]);
  471. } else if (!isToggled(buttons[i])) {
  472. toggleButton(buttons[i], true);
  473. }
  474. // Store the original state of all toolbar buttons.
  475. originalButtonStates[buttons[i].id] = parseInt(buttons[i].getAttribute("state"))
  476. }
  477. }
  478. var buttons = document.getElementById("custom_toolbarButtons").childNodes;
  479. for (var i = 0; i < buttons.length; i++) {
  480. setButton(buttons[i],getImgType(buttons[i]));
  481. }
  482. var buttons = document.getElementById("right_toolbarButtons").childNodes;
  483. for (var i = 0; i < buttons.length; i++) {
  484. if (buttons[i].id == 'sep') {
  485. buttons[i].src = buttonPath + "/sep.gif";
  486. } else {
  487. setButton(buttons[i],getImgType(buttons[i]));
  488. }
  489. }
  490. hourglass.src = buttonPath + "/hourglass.gif";
  491. }
  492. function getImgType(button) {
  493. switch (parseInt(button.getAttribute("state"))) {
  494. case STATUS_HIDDEN: return BTN_HIDDEN;
  495. case STATUS_NORMAL: return BTN_NORMAL;
  496. case STATUS_PRESSED: return BTN_PRESSED;
  497. case STATUS_DISABLED: return BTN_DISABLED;
  498. }
  499. }
  500. function addButtonToPreloadArray() {
  501. for (var i = 0; i < buttonRules.length; i++) {
  502. toolBarImages[i] = new Array();
  503. for ( var j = 0; j < buttonRules[i][2].length; j++ ) {
  504. var btnImage = new Image();
  505. btnImage.src = buttonPath + buttonRules[i][1] + buttonRules[i][2][j] + ext;
  506. toolBarImages[j][buttonRules[i][0]] = btnImage;
  507. }
  508. }
  509. }
  510. function setButton(button, type) {
  511. var id = getButtonId(button);
  512. if (type != BTN_HIDDEN) {
  513. var arrayIdx = IDX_DEFAULT;
  514. if (type == BTN_DISABLED)
  515. arrayIdx = IDX_DISABLED;
  516. if (button.id.substr(0,5) != "menu_") {
  517. //check if the button has been loaded
  518. if (toolBarImages[arrayIdx][id]) {
  519. if (button.src != toolBarImages[arrayIdx][id].src) {
  520. button.src = toolBarImages[arrayIdx][id].src;
  521. }
  522. button.width = buttonSize;
  523. if (button.getAttribute("menu_integrated") == "true") {
  524. button.width += 10;
  525. }
  526. }
  527. } else {
  528. //check if the button has been loaded
  529. if (toolBarImages[arrayIdx]["menu"]) {
  530. if (button.src != toolBarImages[arrayIdx]["menu"].src) {
  531. button.src = toolBarImages[arrayIdx]["menu"].src;
  532. }
  533. button.width = "10";
  534. }
  535. }
  536. button.className = getButtonClass(type);
  537. button.style.visibility = "visible";
  538. } else {
  539. button.width = "0";
  540. button.style.visibility = "hidden";
  541. }
  542. }
  543. function getButtonClass(type) {
  544. switch (type) {
  545. case BTN_RAISED: return "toolbarButtonRollOver";
  546. case BTN_PRESSED: return "toolbarButtonPressed";
  547. case BTN_ROLL_PRESSED: return "toolbarButtonRollOverPressed";
  548. case BTN_DISABLED: return "toolbarButtonDisabled";
  549. }
  550. return "toolbarButtonNormal";
  551. }
  552. function isDisabled(button) {
  553. return (button.getAttribute("state") == STATUS_DISABLED);
  554. }
  555. // Sets the button state. state is one of STATUS_*
  556. function setButtonState(button, state) {
  557. button.setAttribute("state",state);
  558. setButton(button,getImgType(button));
  559. }
  560. function isHidden(button) {
  561. return (button.getAttribute("state") == STATUS_HIDDEN);
  562. }
  563. function setRollOver(button, rollover) {
  564. if (rollover) {
  565. button.setAttribute("rollover","true");
  566. } else {
  567. button.setAttribute("rollover","false");
  568. }
  569. }
  570. function isRollOver(button) {
  571. return (button.getAttribute("rollover") == "true");
  572. }
  573. function getButtonState(button) {
  574. if (isHidden(button))
  575. return BTN_HIDDEN;
  576. if (isDisabled(button))
  577. return BTN_DISABLED;
  578. if (isToggled(button)) {
  579. if (isRollOver(button)) {
  580. return BTN_ROLL_PRESSED;
  581. } else {
  582. return BTN_PRESSED;
  583. }
  584. } else {
  585. if (isRollOver(button)) {
  586. return BTN_RAISED;
  587. } else {
  588. return BTN_NORMAL;
  589. }
  590. }
  591. }
  592. function setStatusBar(button) {
  593. if (getButtonState(button) == BTN_ROLL_PRESSED && button.getAttribute("pressedHelp"))
  594. window.status = CEncodingUtil.ForceUnescape(button.getAttribute("pressedHelp"));
  595. else
  596. window.status = CEncodingUtil.ForceUnescape(button.getAttribute("help"));
  597. }
  598. function buttonMouseOver(event, button) {
  599. if (typeof initialized == "undefined" || !initialized)
  600. return false;
  601. if (!isDisabled(button)) {
  602. setRollOver(button, true);
  603. setButton(button, getButtonState(button));
  604. }
  605. setStatusBar(button); //BF 530075 - allow status bar messages for disabled buttons
  606. return true;
  607. }
  608. function buttonMouseOut(event, button) {
  609. if (typeof initialized == "undefined" || !initialized)
  610. return false;
  611. if (!isDisabled(button)) {
  612. setRollOver(button, false)
  613. setButton(button, getButtonState(button));
  614. window.status = "";
  615. }
  616. return true;
  617. }
  618. function buttonMouseOverMenu(event, button) {
  619. if (typeof initialized == "undefined" || !initialized)
  620. return false;
  621. var ownerButton = getOwnerButton(button);
  622. //Check the owner button
  623. var ownerButton = getOwnerButton(button);
  624. if (!isDisabled(ownerButton)) {
  625. setButton(ownerButton, getButtonState(ownerButton));
  626. setButton(button, BTN_RAISED);
  627. }
  628. }
  629. function buttonMouseOutMenu(event, button) {
  630. if (typeof initialized == "undefined" || !initialized)
  631. return false;
  632. var ownerButton = getOwnerButton(button);
  633. //Check the owner button
  634. var ownerButton = getOwnerButton(button);
  635. if (!isDisabled(ownerButton)) {
  636. setButton(ownerButton, getButtonState(ownerButton));
  637. setButton(button, BTN_NORMAL);
  638. }
  639. }
  640. function sync_menu(menu, syncArray) {
  641. for (var i = 0; i < menu.length; i++) {
  642. menu[i]._state = parseInt(syncArray[i]);
  643. }
  644. }
  645. function sync(){
  646. var menuMax = 13;
  647. var xtabFrame = topparent.getXtabFrame();
  648. var arrayIconState = topparent.getGlobal("gIconState");
  649. var i = 0;
  650. var buttons = document.getElementById("toolbarButtons").childNodes;
  651. for (var j = 0; j < buttons.length; j++) {
  652. if (buttons[j].id != 'sep' && !isMenuButton(buttons[j])) {
  653. buttons[j].setAttribute("state",arrayIconState[i++]);
  654. }
  655. }
  656. buttons = document.getElementById("right_toolbarButtons").childNodes;
  657. for (var j = 0; j < buttons.length; j++) {
  658. if (buttons[j].id != 'sep' && !isMenuButton(buttons[j])) {
  659. buttons[j].setAttribute("state",arrayIconState[i++]);
  660. }
  661. }
  662. buttons = document.getElementById("custom_toolbarButtons").childNodes;
  663. for (var j = 0; j < buttons.length; j++) {
  664. if (buttons[j].id != 'sep' && !isMenuButton(buttons[j])) {
  665. buttons[j].setAttribute("state",arrayIconState[i++]);
  666. }
  667. }
  668. sync_menu(toolbarMenus["xtab"],topparent.getGlobal("gMenuState[0]"));
  669. sync_menu(toolbarMenus["chart"],topparent.getGlobal("gMenuState[1]"));
  670. sync_menu(toolbarMenus["displayoptionmenu"],topparent.getGlobal("gMenuState[2]"));
  671. sync_menu(toolbarMenus["zero"],topparent.getGlobal("gMenuState[3]"));
  672. sync_menu(toolbarMenus["file"],topparent.getGlobal("gMenuState[4]"));
  673. sync_menu(toolbarMenus["help"],topparent.getGlobal("gMenuState[5]"));
  674. xtabButtonItem = getActiveMenuIndex("xtab");
  675. chartButtonItem = getActiveMenuIndex("chart");
  676. zeroSuppressionButtonItem = getActiveMenuIndex("zero");
  677. helpButtonItem = getFirstMenuIndex("help");
  678. setAllButtons();
  679. setXtabButton();
  680. setChartButton();
  681. setZeroButton();
  682. setHelpButtonStatusMsg();
  683. fh=xtabFrame.fhidden;
  684. winFocus(xtabFrame);
  685. }
  686. /********* Action Pane Handling routines **************/
  687. function clearToggleButton() {
  688. //Clear the action pane buttons
  689. var buttonsInGroup = toggleGroups[ACT_PANE_GROUP];
  690. if (buttonsInGroup != null) {
  691. for (var i = 0; i < buttonsInGroup.length; i++) {
  692. unToggleButton(document.getElementById(buttonsInGroup[i]));
  693. }
  694. }
  695. }
  696. function updateToggleButton(actionPaneIndex) {
  697. //Clears all except button corresponding to the acion pane given
  698. var ACT_PANE_FIND = "1";
  699. var ACT_PANE_HIDESHOW = "2";
  700. var ACT_PANE_EXPLAIN = "4";
  701. var ACT_PANE_CALCULATION = "7";
  702. switch (actionPaneIndex) {
  703. case ACT_PANE_FIND: toggleButton(document.getElementById("find"), false); break;
  704. case ACT_PANE_HIDESHOW: toggleButton(document.getElementById("hideshow"), false); break;
  705. case ACT_PANE_EXPLAIN: toggleButton(document.getElementById("explain"), false); break;
  706. case ACT_PANE_CALCULATION: toggleButton(document.getElementById("calculation"), false); break;
  707. }
  708. }
  709. //******* Functions called from buttons or menu items *******
  710. function doit(s){
  711. if (topparent.getXtabFrame() && topparent.getXtabFrame().doit)
  712. topparent.getXtabFrame().doit(s);
  713. }
  714. // Gets a XTab element by its position (row, col)
  715. function GetElement( row, col )
  716. {
  717. var elem = null;
  718. if ( topparent.getXtabFrame().xtabCache.exists(row,col) ) {
  719. elem = topparent.getXtabFrame().xtabCache.getXtabCell(row,col);
  720. }
  721. return elem;
  722. }
  723. // Get parent row of an element.
  724. // If there is no parent, returns null.
  725. function GetParentRow( element )
  726. {
  727. var parent = null;
  728. var row = topparent.getXtabFrame().parseRowId(element.id);
  729. var col = topparent.getXtabFrame().parseColId(element.id);
  730. // Get parent
  731. if ( col > 0 )
  732. {
  733. // Get element @ row, column - 1
  734. col--;
  735. parent = GetElement( row, col );
  736. // Due to spanning the parent may not be at the same row number, move up the
  737. // row numbers till we get an element at the column we want.
  738. while ( !parent && ( row > 0 ) )
  739. {
  740. row--;
  741. parent = GetElement( row, col );
  742. }
  743. }
  744. return parent;
  745. }
  746. // Get parent column of an element.
  747. // If there is no parent, returns null.
  748. function GetParentCol( element )
  749. {
  750. var parent = null;
  751. var row = topparent.getXtabFrame().parseRowId(element.id);
  752. var col = topparent.getXtabFrame().parseColId(element.id);
  753. // Get parent
  754. if ( row > 0 )
  755. {
  756. // Get element @ row - 1, column
  757. row--;
  758. parent = GetElement( row, col );
  759. // Due to spanning the parent may not be at the same column number, move left
  760. // till we get an element at the column we want.
  761. while ( !parent && ( col > 0 ) )
  762. {
  763. col--;
  764. parent = GetElement( row, col );
  765. }
  766. }
  767. return parent;
  768. }
  769. // Get entire nested path i.e. parents of an element in the nested crosstab hierarchy
  770. // Returns in format (ppdsID,dimIdx/ppdsID,dimIdx/...) path
  771. // Walks up the nested rows/columns.
  772. // 1st param is element, 2nd is set to "row" walk up rows
  773. function getNestedPath( pathLeaf, rowOrCol, useSummary )
  774. {
  775. var result = "";
  776. var element = pathLeaf;
  777. while( element )
  778. {
  779. if( useSummary || !element.getAttribute("summary") ) // ignore summary
  780. {
  781. // Get parent path.
  782. var curPath = "";
  783. curPath += element.getAttribute("ppdsId");
  784. curPath += "," + element.getAttribute("dimIdx");
  785. // Prepend parent path.
  786. if ( result != "" )
  787. curPath += "/";
  788. curPath += result;
  789. // Thats our new result.
  790. result = curPath;
  791. }
  792. if ( rowOrCol == "row" )
  793. element = GetParentRow( element );
  794. else
  795. element = GetParentCol( element );
  796. }
  797. return result;
  798. }
  799. // Validate current selection to see if it is consistent with Drill Through.
  800. // All elemnts in row selection & col selection should have the same parent.
  801. function ValidateSelectionForDrillThru( rowSelections, colSelections )
  802. {
  803. var bValid = true; // be optimistic !
  804. // All row selections must have same parent
  805. if ( rowSelections.length > 1 )
  806. {
  807. var parentRow = GetParentRow( rowSelections[0] );
  808. for( var i = 1; bValid && i < rowSelections.length; ++i)
  809. bValid = ( GetParentRow( rowSelections[i] ) == parentRow );
  810. }
  811. // All column selections must have same parent
  812. if ( bValid && ( colSelections.length > 1 ) )
  813. {
  814. var parentCol = GetParentCol( colSelections[0] );
  815. for( var i = 1; bValid && i < colSelections.length; ++i)
  816. bValid = ( GetParentCol( colSelections[i] ) == parentCol);
  817. }
  818. // If we have both row and column slections, they must not share any dimensions
  819. // in all their nested ancestor path
  820. if ( bValid && ( rowSelections.length > 0 ) && ( colSelections.length > 0 ) )
  821. {
  822. // Get all dimensions used by row nesting.
  823. var rowDimensions = new Array();
  824. var curElem = rowSelections[0];
  825. while ( curElem )
  826. {
  827. rowDimensions[curElem.getAttribute("dimIdx")] = true;
  828. curElem = GetParentRow( curElem );
  829. }
  830. // We should not encounter any of the row Dimensions in the column ancestor path.
  831. curElem = colSelections[0];
  832. while ( bValid && curElem )
  833. {
  834. if ( rowDimensions[curElem.getAttribute("dimIdx")] )
  835. bValid = false;
  836. curElem = GetParentCol( curElem );
  837. }
  838. }
  839. return bValid;
  840. }
  841. function OnXTabSelectionChange()
  842. {
  843. // XTab Selection has changed, Do any toolbar button updates that depend on selection here.
  844. // ---- DRILL THROUGH BUTTON >>>>
  845. // Find Original State of Drill Through button.
  846. drillThruButton = document.getElementById("drillthrough")
  847. var origState = originalButtonStates[drillThruButton.id];
  848. switch ( origState )
  849. {
  850. case STATUS_HIDDEN :
  851. case STATUS_DISABLED :
  852. // Cannot enable drill though button that was disabled by the server
  853. break;
  854. case STATUS_NORMAL :
  855. case STATUS_PRESSED :
  856. {
  857. // see if we need to disable/enable the button
  858. var rowSelections = topparent.getXtabFrame().getSelected("r");
  859. var colSelections = topparent.getXtabFrame().getSelected("c");
  860. var bOkToDrillThru = ValidateSelectionForDrillThru( rowSelections, colSelections );
  861. if ( bOkToDrillThru ) {
  862. setButtonState( drillThruButton, origState );
  863. topparent.enableDrill();
  864. }
  865. else {
  866. setButtonState( drillThruButton, STATUS_DISABLED );
  867. topparent.disableDrill();
  868. }
  869. break;
  870. }
  871. }
  872. // ---- DRILL THROUGH BUTTON <<<<
  873. }
  874. // Borrowed and modified from Custom Exceptions (custexcept.js -> buildSelectionString).
  875. // Returns current selection in as a list of tab separated (ppdsID,dimIdx/ppdsID,dimIdx/...) path pairs.
  876. function encodeSelectionForDrillThru() {
  877. var result = "";
  878. var rowSelections = topparent.getXtabFrame().getSelected("r");
  879. var colSelections = topparent.getXtabFrame().getSelected("c");
  880. //result = "ROWS --> ";
  881. for(var i = 0; i < rowSelections.length; ++i)
  882. {
  883. // Add nested path.
  884. result += getNestedPath( rowSelections[i], "row", false) + "\t";
  885. }
  886. //result += "COLS --> ";
  887. for(var i = 0; i < colSelections.length; ++i)
  888. {
  889. // Add nested path.
  890. result += getNestedPath( colSelections[i], "col", false) + "\t";
  891. }
  892. //make sure we return a space as the value, or the parameter will get stripped
  893. //by the XSL transform the next time through
  894. if (result == "")
  895. return " ";
  896. return result;
  897. }
  898. function ra(as){
  899. var fh = topparent.getXtabFrame().document.fhidden;
  900. if ( !topparent.getXtabFrame()._fhchanged ) {
  901. topparent.getXtabFrame()._fhchanged = true;
  902. topparent.getXtabFrame()._fhtarget = fh.target;
  903. topparent.getXtabFrame()._fhaction = fh.action;
  904. topparent.getXtabFrame()._fhRA = fh.RA.value;
  905. }
  906. var RA_CSV = 1,
  907. RA_XLS = 11,
  908. RA_PDF = 12,
  909. RA_DRILLTHRU = 4,
  910. RA_BOOKMARK = 7,
  911. RA_SPECS = 98,
  912. RA_XLSX=13;
  913. if( as == RA_CSV || as == RA_PDF || as == RA_DRILLTHRU || as == RA_BOOKMARK || as == RA_XLS ||as==RA_XLSX || RA_SPECS) {
  914. FTok = false;
  915. fh.RA.value = as;
  916. var targetWindow = topparent;
  917. if( ! targetWindow.name || targetWindow.length == 0 )
  918. targetWindow.name = "PPESTarget";
  919. fh.target = targetWindow.name;
  920. if( as == RA_BOOKMARK ) {
  921. if( parent.parent != parent ) {
  922. fh.target = "_blank"; // open a new window because bookmarks set the location
  923. }
  924. fh.HTTPSBM.value = location.protocol.toLowerCase();
  925. } else if( as == RA_CSV ) {
  926. resetExportVars(fh);
  927. fh.action += "?MIME=.CSV";
  928. } else if( as == RA_SPECS ) { /* Show Specs (PPX & CFX) */
  929. fh.target = "_blank";
  930. } else if( as == RA_XLS ) {
  931. resetExportVars(fh);
  932. fh.action += "?MIME=.XLS";
  933. fh.CNCT.value = 24;
  934. } else if( as == RA_XLSX ) {
  935. resetExportVars(fh);
  936. fh.action += "?MIME=.XLSX";
  937. fh.CNCT.value = 24;
  938. } else if( as == RA_PDF ) {
  939. resetExportVars(fh);
  940. fh.action += "?MIME=.PDF";
  941. } else if ( as == RA_DRILLTHRU )
  942. {
  943. var selStr = encodeSelectionForDrillThru();
  944. fh.DTSEL.value = selStr;
  945. fh.target = "_blank";
  946. }
  947. if( as == RA_PDF && document.cookie.length != 0 && getCookie("PageOrientation") ) {
  948. submitExportIcon( topparent.getXtabFrame() );
  949. } else {
  950. topparent.getXtabFrame().parseAndSubmit(fh);
  951. }
  952. } else {
  953. // We're not expecting it -- eat it
  954. }
  955. }
  956. // It will clear the MiME type and CO value
  957. function resetExportVars(fh) {
  958. fh.action = fh.action.replace(/\?MIME=.CSV|\?MIME=.XLSX|\?MIME=.XLS|\?MIME=.PDF/gi, '');
  959. fh.CO.value = "";
  960. }
  961. function launchStudio(studio) {
  962. var fh = topparent.getXtabFrame().document.fhidden;
  963. switch (studio) {
  964. case 'as': doParent('RU:4', '_blank'); break;
  965. case 'rs': doParent('RU:3', '_blank'); break;
  966. case 'bua': doParent('RU:7', '_blank'); break;
  967. default: break;
  968. }
  969. fh.CO.value = ""; // Cleanup
  970. }
  971. function doParent(action, target){
  972. if (topparent.getXtabFrame()) {
  973. topparent.getXtabFrame().doParent(action, target);
  974. }
  975. }
  976. function ret() {
  977. if( document.pqr != null ) {
  978. document.pqr.submit();
  979. }
  980. }
  981. function doReset() {
  982. if(topparent.getXtabFrame() && document.reset != null ) {
  983. topparent.getXtabFrame().parseAndSubmit(document.reset);
  984. }
  985. }
  986. function ButtonEnable() {
  987. if (ZS_PRESSED == 1) {
  988. restoreZSButton();
  989. }
  990. if (ETS_PRESSED == 1) {
  991. restoreETSButton();
  992. }
  993. }
  994. function restoreZSButton() {
  995. ZS_PRESSED = 0;
  996. if (ZS_ICON != "") {
  997. document.getElementById("zero").src = ZS_ICON;
  998. ZS_ICON = "";
  999. }
  1000. }
  1001. function restoreETSButton() {
  1002. ETS_PRESSED = 0;
  1003. if ( ETS_ICON != "" ) {
  1004. document.getElementById("f8020").src = ETS_ICON;
  1005. ETS_ICON = "";
  1006. }
  1007. }
  1008. function DisableZS() {
  1009. ZS_PRESSED = 1;
  1010. setTimeout( "setWorking('zs');", 1000 );
  1011. }
  1012. function DisableETS() {
  1013. ETS_PRESSED = 1;
  1014. setTimeout( "setWorking('ets');", 1000 );
  1015. }
  1016. function setWorking(button) {
  1017. switch(button) {
  1018. case 'zs': {
  1019. if (ZS_PRESSED == 1) {
  1020. var button = document.getElementById("zero");
  1021. ZS_ICON = button.src;
  1022. button.src = hourglass.src;
  1023. }
  1024. break;
  1025. }
  1026. case 'ets': {
  1027. if (ETS_PRESSED == 1) {
  1028. var button = document.getElementById("f8020");
  1029. ETS_ICON = button.src;
  1030. button.src = hourglass.src;
  1031. }
  1032. break;
  1033. }
  1034. }
  1035. }