CCognosViewerInfoBar.js 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| IBM Cognos Products: Viewer
  5. *| (C) Copyright IBM Corp. 2001, 2013
  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. dojo.provide("InfoBarBase");
  13. // InfoBar Base class
  14. dojo.declare("InfoBarBase", null, {
  15. constructor : function(cognosViewer) {
  16. this.m_cognosViewer = cognosViewer;
  17. this.m_parameterValues = new CParameterValues();
  18. var documentNode = XMLBuilderLoadXMLFromString(this.m_cognosViewer.getExecutionParameters());
  19. if (documentNode.childNodes.length == 1) {
  20. this.m_parameterValues.loadWithOptions(documentNode.childNodes[0], /*credentials*/false);
  21. }
  22. this.m_parameterStringOperators = new CParameterValueStringOperators(
  23. RV_RES.IDS_JS_FILTER_BETWEEN,
  24. RV_RES.IDS_JS_FILTER_NOT_BETWEEN,
  25. RV_RES.IDS_JS_FILTER_LESS_THAN,
  26. RV_RES.IDS_JS_FILTER_GREATER_THAN,
  27. RV_RES.IDS_JS_INFOBAR_AND_TEXT,
  28. RV_RES.IDS_JS_FILTER_EXCLUDE
  29. );
  30. this.c_SliderCheckboxParameterPrefix = "BusinessInsight."; //non-nls string constant
  31. this.m_containerInfo = null;
  32. this.m_editableFilters = null;
  33. this.m_editableSorts = null;
  34. this.m_editableSliders=null;
  35. this.m_id = null;
  36. this.m_layoutIndex = null;
  37. this.m_timingDetails = null;
  38. },
  39. setContainerInfo: function(containerInfo) {
  40. this.m_containerInfo = containerInfo;
  41. },
  42. setTimingDetails: function(timingDetails) {
  43. this.m_timingDetails = timingDetails;
  44. },
  45. setEditableFilters: function(editableFilters) {
  46. this.m_editableFilters = editableFilters;
  47. },
  48. setId: function(theId) {
  49. this.m_id = theId;
  50. },
  51. getId: function() {
  52. return this.m_id;
  53. },
  54. hasPrompts : function() {
  55. var numberOfParameters = this.m_parameterValues.length();
  56. for (var index = 0; index < numberOfParameters; ++index) {
  57. var parameter = this.m_parameterValues.getAt(index);
  58. if (parameter !== null && parameter.length() > 0 &&
  59. parameter.name().indexOf(this.c_SliderCheckboxParameterPrefix) !== 0) {
  60. return true;
  61. }
  62. }
  63. return false;
  64. },
  65. addPromptDetails : function(viewOnlyMode) {
  66. var promptDetails = "";
  67. var showControl = (viewOnlyMode !== true); // showControl is true unless the viewOnlyMode is passed with value of "true"
  68. if (this.hasPrompts()) {
  69. var staticLabelledBy = this.m_id + "instructions " + this.m_id + "_promptString " + this.m_id + "_lockedString ";
  70. for (var index = 0, numberOfParameters = this.m_parameterValues.length(); index < numberOfParameters; ++index) {
  71. var labelledBy = staticLabelledBy + this.m_id + index + "_promptDetail";
  72. var parameter = this.m_parameterValues.getAt(index);
  73. var numberOfPromptValueItems = parameter.length();
  74. if (parameter !== null && numberOfPromptValueItems > 0 &&
  75. parameter.name().indexOf(this.c_SliderCheckboxParameterPrefix) !== 0) {
  76. promptDetails += "<div class=\"infoBarDetailRow\" aria-labelledby=\"" + labelledBy + "\" role=\"listitem\"" + (!showControl?">":" tabindex=\"-1\">");
  77. promptDetails += "<table role=\"presentation\"><tr>";
  78. promptDetails += this.addInfoBarIcon("infobar_filter.gif", true);
  79. promptDetails += "<td class=\"infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_promptDetail\">";
  80. promptDetails += "<span class=\"bibi\">";
  81. promptDetails += html_encode(parameter.name());
  82. promptDetails += "</span>";
  83. promptDetails += " : ";
  84. promptDetails += parameter.toString(this.m_parameterStringOperators);
  85. promptDetails += "</td>";
  86. promptDetails += (showControl ? this.addInfoBarIcon("infobar_locked.gif", false) :"");
  87. promptDetails += "</tr></table></div>";
  88. }
  89. }
  90. }
  91. return promptDetails;
  92. },
  93. getPromptDetailsInJSON : function() {
  94. var promptList = [];
  95. if (this.hasPrompts()) {
  96. for (var index = 0, numberOfParameters = this.m_parameterValues.length(); index < numberOfParameters; ++index) {
  97. var parameter = this.m_parameterValues.getAt(index);
  98. var numberOfPromptValueItems = parameter.length();
  99. if (parameter !== null && numberOfPromptValueItems > 0 &&
  100. parameter.name().indexOf(this.c_SliderCheckboxParameterPrefix) !== 0) {
  101. promptList.push(
  102. {
  103. 'type': 'prompt',
  104. 'label': parameter.name(),
  105. 'description': parameter.toString(this.m_parameterStringOperators)
  106. }
  107. );
  108. }
  109. }
  110. }
  111. return promptList;
  112. },
  113. addSliderDetails : function(viewOnlyMode) {
  114. var sliderDetails = "";
  115. var showControl = (viewOnlyMode !== true); // showControl is true unless the viewOnlyMode is passed with value of "true"
  116. if (this.m_containerInfo !== null && this.m_editableSliders) {
  117. var staticLabelledBy = this.m_id + "instructions " + this.m_id + "_sliderString ";
  118. var numberOfSliders = this.m_editableSliders.length;
  119. for (var index=0; index<numberOfSliders; ++index) {
  120. var labelledBy = staticLabelledBy + this.m_id + index + "_sliderDetail";
  121. var slider = this.m_editableSliders[index];
  122. if (slider && slider.name) {
  123. sliderDetails += "<div class=\"infoBarDetailRow\" type=\"slider\" aria-labelledby=\"" + labelledBy + "\" role=\"listitem\"" + (!showControl ? ">" : " tabindex=\"-1\">");
  124. sliderDetails += "<table role=\"presentation\"><tr>";
  125. if (typeof slider.controlType != "undefined" && slider.controlType == "checkbox") {
  126. sliderDetails += this.addInfoBarIcon("infobar_select.gif", true);
  127. }
  128. else {
  129. sliderDetails += this.addInfoBarIcon("infobar_slider.gif", true);
  130. }
  131. sliderDetails += "<td class=\"infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_sliderDetail\">";
  132. sliderDetails += "<span class=\"bibi\">";
  133. sliderDetails += (slider.label ? slider.label : slider.name);
  134. sliderDetails += (slider.attributeName) ? (" - " + slider.attributeName) : "";
  135. sliderDetails += "</span>";
  136. sliderDetails += " : ";
  137. if (typeof slider.values != "undefined") {
  138. sliderDetails += this.processFilterOperatorItems(slider.values);
  139. }
  140. else {
  141. if (slider.min == slider.max) {
  142. sliderDetails += slider.min;
  143. }
  144. else {
  145. sliderDetails += this.processFilterOperatorRange(RV_RES.IDS_JS_INFOBAR_BETWEEN_TEXT, slider.min, slider.max);
  146. }
  147. }
  148. sliderDetails += "</td>";
  149. sliderDetails += (showControl ? this.addRemoveSliderButton(slider.clientId) : "");
  150. sliderDetails += "</tr></table></div>";
  151. }
  152. }
  153. }
  154. return sliderDetails;
  155. },
  156. getSliderDetailsInJSON : function() {
  157. var sliderList = [];
  158. if (this.m_containerInfo !== null && this.m_editableSliders) {
  159. var staticLabelledBy = this.m_id + "instructions " + this.m_id + "_sliderString ";
  160. var numberOfSliders = this.m_editableSliders.length;
  161. for (var index=0; index<numberOfSliders; ++index) {
  162. var slider = this.m_editableSliders[index];
  163. if (slider && slider.name) {
  164. var label = (slider.label ? slider.label : slider.name);
  165. if (slider.attributeName) {
  166. label += (" " + slider.attributeName);
  167. }
  168. var description = "";
  169. if (typeof slider.values != "undefined") {
  170. description += this.processFilterOperatorItems(slider.values);
  171. }
  172. else {
  173. if (slider.min == slider.max) {
  174. description += slider.min;
  175. }
  176. else {
  177. description += this.processFilterOperatorRange(RV_RES.IDS_JS_INFOBAR_BETWEEN_TEXT, slider.min, slider.max);
  178. }
  179. }
  180. sliderList.push(
  181. {
  182. 'type': 'slider',
  183. 'label': label,
  184. 'description': description
  185. }
  186. );
  187. }
  188. }
  189. }
  190. return sliderList;
  191. },
  192. hasLockedFilters : function() {
  193. var result = false;
  194. if (this.m_containerInfo !== null && typeof this.m_containerInfo.lockedFilters !== "undefined") {
  195. var numberOfLockedFilters = this.m_containerInfo.lockedFilters.length;
  196. for (var index=0; index<numberOfLockedFilters; ++index) {
  197. var lockedFilter = this.m_containerInfo.lockedFilters[index];
  198. if (typeof lockedFilter.staticText != "undefined" && lockedFilter.staticText.charAt(0) !== ' ') {
  199. result = true;
  200. }
  201. }
  202. }
  203. return result;
  204. },
  205. addLockedFilterDetails : function(viewOnlyMode) {
  206. var lockedFilterDetails = "";
  207. var showControl = (viewOnlyMode !== true); // showControl is true unless the viewOnlyMode is passed with value of "true"
  208. if (this.m_containerInfo !== null && typeof this.m_containerInfo.lockedFilters !== "undefined") {
  209. var staticLabelledBy = this.m_id + "instructions " + this.m_id + "_filterString " + this.m_id + "_lockedString ";
  210. var numberOfLockedFilters = this.m_containerInfo.lockedFilters.length;
  211. for (var index=0; index<numberOfLockedFilters; ++index) {
  212. var labelledBy = staticLabelledBy + this.m_id + index + "_lockedFilterDetail";
  213. var lockedFilter = this.m_containerInfo.lockedFilters[index];
  214. if (typeof lockedFilter.staticText != "undefined" && lockedFilter.staticText.charAt(0) !== ' ') {
  215. lockedFilterDetails += "<div class=\"infoBarDetailRow\" aria-labelledby=\"" + labelledBy + "\" role=\"listitem\"" + (!showControl?">":" tabindex=\"-1\">");
  216. lockedFilterDetails += "<table role=\"presentation\"><tr>";
  217. lockedFilterDetails += this.addInfoBarIcon("infobar_filter.gif", true);
  218. lockedFilterDetails += "</td>";
  219. lockedFilterDetails += "<td class=\"infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_lockedFilterDetail\">";
  220. lockedFilterDetails += "<span class=\"bibi\">";
  221. lockedFilterDetails += html_encode(lockedFilter.staticText);
  222. lockedFilterDetails += "</span>";
  223. lockedFilterDetails += "</td>";
  224. lockedFilterDetails += (showControl ? this.addInfoBarIcon("infobar_locked.gif", false) : "");
  225. lockedFilterDetails += "</tr></table></div>";
  226. }
  227. }
  228. }
  229. return lockedFilterDetails;
  230. },
  231. addFilteredItemsDetails : function(viewOnlyMode) {
  232. var filteredItemsDetails = "";
  233. var showControl = (viewOnlyMode !== true); // showControl is true unless the viewOnlyMode is passed with value of "true"
  234. if (this.m_editableFilters) {
  235. for (var index = 0, filterLength = this.m_editableFilters.length; index < filterLength; ++index) {
  236. var filterItem = this.m_editableFilters[index];
  237. var labelledBy = this.m_id + "instructions " + this.m_id + "_filterString " + this.m_id + index + "_filterDetail";
  238. var labelText = (typeof filterItem.itemLabel == "string") ? filterItem.itemLabel : filterItem.item;
  239. filteredItemsDetails += "<div class=\"infoBarDetailRow\" type=\"filter\" aria-labelledby=\"" + labelledBy + "\" role=\"listitem\"" + (!showControl?">":" tabindex=\"-1\">");
  240. filteredItemsDetails += "<table role=\"presentation\"><tr>";
  241. filteredItemsDetails += this.addInfoBarIcon("infobar_filter.gif", true);
  242. filteredItemsDetails += "<td class=\"bibi infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_filterDetail\">";
  243. filteredItemsDetails += this.createHiddenSpan(this.m_id + index + "_filterPosition", getCurrentPosistionString(this.m_cognosViewer, index + 1, filterLength));
  244. filteredItemsDetails += html_encode(enforceTextDir(labelText));
  245. filteredItemsDetails += this.processFilterOperator(filterItem);
  246. filteredItemsDetails += "</td>";
  247. filteredItemsDetails += (showControl ? this.addRemoveFilterButton(filterItem.item, this.processFilterDetails(filterItem)) : "");
  248. filteredItemsDetails += "</tr></table></div>";
  249. }
  250. }
  251. return filteredItemsDetails;
  252. },
  253. getFilteredItemsDetailsInJSON : function() {
  254. var filterList = [];
  255. if (this.m_editableFilters) {
  256. for (var index = 0, filterLength = this.m_editableFilters.length; index < filterLength; ++index) {
  257. var filterItem = this.m_editableFilters[index];
  258. var labelText = (typeof filterItem.itemLabel == "string") ? filterItem.itemLabel : filterItem.item;
  259. filterList.push(
  260. {
  261. 'type': 'filter',
  262. 'label': enforceTextDir(labelText) + this.processFilterOperator(filterItem),
  263. 'description': ""
  264. }
  265. );
  266. }
  267. }
  268. return filterList;
  269. },
  270. addSortDetails : function(viewOnlyMode) {
  271. var sortDetails = "";
  272. var showControl = (viewOnlyMode !== true); // showControl is true unless the viewOnlyMode is passed with value of "true"
  273. if (this.m_editableSorts) {
  274. for (var index = 0, sortLength = this.m_editableSorts.length; index < sortLength; ++index) {
  275. var sortInfo = this.m_editableSorts[index];
  276. var labelledBy = this.m_id + "instructions " + this.m_id + "_sortString " + this.m_id + index + "_sortDetail";
  277. sortDetails += "<div class=\"infoBarDetailRow\" type=\"sort\" aria-labelledby=\"" + labelledBy + "\" role=\"listitem\"" + (!showControl?">":" tabindex=\"-1\">");
  278. sortDetails += "<table role=\"presentation\"><tr>";
  279. sortDetails += this.addInfoBarIcon("infobar_sort.gif", true);
  280. var itemLabel;
  281. if (typeof sortInfo.labels == "string" || typeof sortInfo.valuesOf == "string") {
  282. var itemName = (typeof sortInfo.labels == "string") ? sortInfo.labels : sortInfo.valuesOf;
  283. itemLabel = (typeof sortInfo.itemLabel == "string") ? sortInfo.itemLabel : itemName;
  284. sortDetails += "<td class=\"bibi infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_sortDetail\">";
  285. sortDetails += this.createHiddenSpan(this.m_id + index + "_sortPosition", getCurrentPosistionString(this.m_cognosViewer, index+1, sortLength));
  286. sortDetails += html_encode(itemLabel);
  287. sortDetails += " : ";
  288. if (sortInfo.byItems instanceof Array) {
  289. //TODO: Leave out string "Sorted by" until rp1 (see infoBarAdornment)
  290. //sortDetails += this.m_sortStrings["byItems"];
  291. for (var byItemsIdx = 0; byItemsIdx < sortInfo.byItems.length; ++byItemsIdx) {
  292. sortDetails += (byItemsIdx>0) ? " - " : "";
  293. sortDetails += sortInfo.byItems[byItemsIdx].item;
  294. sortDetails += ", ";
  295. sortDetails += this.m_sortStrings[sortInfo.byItems[byItemsIdx].order];
  296. }
  297. } else {
  298. if (typeof sortInfo.valuesOf == "string") {
  299. sortDetails += this.m_sortStrings["byValue"];
  300. } else {
  301. sortDetails += this.m_sortStrings["byLabel"];
  302. }
  303. sortDetails += ", ";
  304. sortDetails += this.m_sortStrings[sortInfo.order];
  305. }
  306. sortDetails += "</td>";
  307. sortDetails += (showControl ? this.addRemoveSortButton(itemName, "true") : "");
  308. } else if (sortInfo.valuesOf instanceof Array) {
  309. if (sortInfo.valuesOf.length > 0 && typeof sortInfo.valuesOf[0].item == "string") {
  310. sortDetails += "<td class=\"bibi infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_sortDetail\">";
  311. sortDetails += this.createHiddenSpan(this.m_id + index + "_sortPosition", getCurrentPosistionString(this.m_cognosViewer, index+1, sortLength));
  312. itemLabel = "";
  313. if (typeof sortInfo.itemLabel == "string") {
  314. itemLabel = sortInfo.itemLabel;
  315. } else {
  316. for (var valueSortIdx = 0; valueSortIdx < sortInfo.valuesOf.length; ++valueSortIdx) {
  317. itemLabel += " - ";
  318. itemLabel += sortInfo.valuesOf[valueSortIdx].item;
  319. }
  320. itemLabel = itemLabel.substring(3);
  321. }
  322. sortDetails += itemLabel;
  323. sortDetails += " : ";
  324. sortDetails += this.m_sortStrings["byValue"];
  325. sortDetails += ", ";
  326. sortDetails += this.m_sortStrings[sortInfo.order];
  327. sortDetails += "</td>";
  328. sortDetails += (showControl ? this.addRemoveSortButton(sortInfo.valuesOf[0].item, "false") : "");
  329. }
  330. }
  331. sortDetails += "</tr></table></div>";
  332. }
  333. }
  334. return sortDetails;
  335. },
  336. addInfoBarIcon : function(imageName, isLeft) {
  337. return "<td class=\"infoBar" + (isLeft?"Left":"Right") + "Icon\">" +
  338. "<img alt=\"\" src=\"" + this.m_cognosViewer.getWebContentRoot() + "/rv/images/" + imageName + "\"/>" +
  339. "</td>";
  340. },
  341. createHiddenSpan : function(id, text) {
  342. return "<span style=\"display:none\" id=\"" + id + "\"> " + text + " </span>";
  343. },
  344. addRemoveFilterButton : function(item, txtDetails) {
  345. var result = "";
  346. var oWidget = this.m_cognosViewer.getViewerWidget();
  347. if(!this.m_cognosViewer.isLimitedInteractiveMode() && !oWidget.isConsumeUser()) {
  348. var buttonTitle = RV_RES.IDS_JS_DELETE;
  349. var labelledBy = this.m_id + "_delete";
  350. result = "<td class=\"infoBarRightIcon\" filterItem=\"" + item + "\"" + (txtDetails ? " details=\""+ txtDetails + "\"" :"") + ">" +
  351. "<button class=\"dijitStretch infoBarDeleteButton BUXNoPrint\" onclick=\"InfoBarHelper.infoBarRemoveFilter('" + this.m_cognosViewer.getId() + "'," + this.m_layoutIndex + ",'" + item + "'" + (txtDetails ? ",'" + txtDetails + "'" : "") + ");\" aria-labelledby=\"" + labelledBy + "\" type=\"button\" role=\"button\" tabindex=\"0\" value=\"\" title=\"" + buttonTitle + "\">" +
  352. "<span class=\"dijitInline infoBarIconDelete\" title=\"" + buttonTitle + "\"></span>" +
  353. "<span class=\"dijitInline dijitDisplayNone infoBarDeleteButtonText\">x</span>" +
  354. "</button>" +
  355. "</td>";
  356. }
  357. return result;
  358. },
  359. addRemoveSliderButton : function(sliderId) {
  360. var result = "";
  361. var oWidget = this.m_cognosViewer.getViewerWidget();
  362. if (!this.m_cognosViewer.isLimitedInteractiveMode() && !oWidget.isConsumeUser()) {
  363. var buttonTitle = RV_RES.IDS_JS_DELETE;
  364. var labelledBy = this.m_id + "_delete";
  365. result = "<td class=\"infoBarRightIcon\" slider=\"" + sliderId + "\">" +
  366. "<button class=\"dijitStretch infoBarDeleteButton BUXNoPrint\" onclick=\"InfoBarHelper.infoBarRemoveSlider('" + this.m_cognosViewer.getId() + "','" + sliderId + "');\" aria-labelledby=\"" + labelledBy + "\" type=\"button\" role=\"button\" tabindex=\"0\" value=\"\" title=\"" + buttonTitle + "\">" +
  367. "<span class=\"dijitInline infoBarIconDelete\" title=\"" + buttonTitle + "\"></span>" +
  368. "<span class=\"dijitInline dijitDisplayNone infoBarDeleteButtonText\">x</span>" +
  369. "</button>" +
  370. "</td>";
  371. }
  372. return result;
  373. },
  374. addRemoveSortButton : function(item, byLabel) {
  375. var result = "";
  376. var oWidget = this.m_cognosViewer.getViewerWidget();
  377. if (!this.m_cognosViewer.isLimitedInteractiveMode() && !this.m_cognosViewer.isBlacklisted("Sort")) {
  378. var buttonTitle = RV_RES.IDS_JS_DELETE;
  379. var labelledBy = this.m_id + "_delete";
  380. result = "<td class=\"infoBarRightIcon\" sortItem=\"" + item + "\" byLabel=\"" + byLabel + "\">" +
  381. "<button class=\"dijitStretch infoBarDeleteButton BUXNoPrint\" onclick=\"InfoBarHelper.infoBarRemoveSort('" + this.m_cognosViewer.getId() + "'," + this.m_layoutIndex + ",'" + item + "','" + byLabel + "');\" aria-labelledby=\"" + labelledBy + "\" type=\"button\" role=\"button\" tabindex=\"0\" value=\"\" title=\"" + buttonTitle + "\">" +
  382. "<span class=\"dijitInline infoBarIconDelete\" title=\"" + buttonTitle + "\"></span>" +
  383. "<span class=\"dijitInline dijitDisplayNone infoBarDeleteButtonText\">x</span>" +
  384. "</button>" +
  385. "</td>";
  386. }
  387. return result;
  388. },
  389. processFilterOperator : function(filterItem) {
  390. var filterOperatorText = "";
  391. if (typeof filterItem["in"] != "undefined") {
  392. filterOperatorText += " " + CViewerCommon.getMessage(RV_RES.IDS_JS_INFOBAR_INCLUDE_TEXT, this.processFilterOperatorItems(filterItem["in"]));
  393. } else if (typeof filterItem["notIn"] != "undefined") {
  394. filterOperatorText += " " + CViewerCommon.getMessage(RV_RES.IDS_JS_INFOBAR_EXCLUDE_TEXT, this.processFilterOperatorItems(filterItem["notIn"]));
  395. } else if (typeof filterItem["range"] != "undefined" || typeof filterItem["notRange"] != "undefined") {
  396. var operatorText = typeof filterItem["range"] != "undefined" ? RV_RES.IDS_JS_INFOBAR_BETWEEN_TEXT : RV_RES.IDS_JS_INFOBAR_NOT_BETWEEN_TEXT;
  397. var rangeArray = typeof filterItem["range"] != "undefined" ? filterItem["range"] : filterItem["notRange"];
  398. for (var index = 0; index < rangeArray.length; ++index) {
  399. var range = rangeArray[index];
  400. filterOperatorText += " " + CViewerCommon.getMessage(operatorText, [range.from, range.to]);
  401. }
  402. } else if (typeof filterItem["lessThan"] != "undefined") {
  403. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_LESS_THAN + " " + filterItem["lessThan"];
  404. } else if (typeof filterItem["lessThanEqual"] != "undefined") {
  405. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_LESS_THAN_EQUAL + " " + filterItem["lessThanEqual"];
  406. } else if (typeof filterItem["greaterThan"] != "undefined") {
  407. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_GREATER_THAN + " " + filterItem["greaterThan"];
  408. } else if (typeof filterItem["greaterThanEqual"] != "undefined") {
  409. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_GREATER_THAN_EQUAL + " " + filterItem["greaterThanEqual"];
  410. } else {
  411. if( typeof filterItem[ "not" ] != "undefined" && filterItem[ 'not' ] == 'true') {
  412. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_IS_NOT;
  413. }
  414. if( typeof filterItem[ "endsWith"] != "undefined" ) {
  415. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_ENDS_WITH + " " + filterItem["endsWith"];
  416. } else if( typeof filterItem[ "beginsWith"] != "undefined" ) {
  417. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_BEGINS_WITH + " " + filterItem["beginsWith"];
  418. }else if( typeof filterItem[ "contains"] != "undefined" ) {
  419. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_CONTAINS + " " + filterItem["contains"];
  420. }else if( typeof filterItem[ "isMatchesSQLPatternFilter"] != "undefined" ) {
  421. filterOperatorText += " " + RV_RES.IDS_JS_FILTER_IS_MATCHES_SQLPATTERNFILTER + " " + filterItem["isMatchesSQLPatternFilter"];
  422. }
  423. }
  424. return filterOperatorText;
  425. },
  426. processFilterDetails : function(filterItem) {
  427. return html_encode('[' + dojo.toJson(filterItem) + ']');
  428. },
  429. processFilterOperatorItems : function(filterOperatorItems) {
  430. var filterOperatorItemsText = "";
  431. for (var index = 0; index < filterOperatorItems.length; ++index) {
  432. if (index !== 0) {
  433. filterOperatorItemsText += (RV_RES.IDS_JS_LIST_SEPARATOR + " ");
  434. }
  435. filterOperatorItemsText += enforceTextDir(filterOperatorItems[index]);
  436. }
  437. return filterOperatorItemsText;
  438. },
  439. processFilterOperatorRange : function(rangeTypeText, minRange, maxRange) {
  440. if (typeof minRange == "undefined") {
  441. minRange =' ';
  442. }
  443. if (typeof maxRange == "undefined") {
  444. maxRange = ' ';
  445. }
  446. return CViewerCommon.getMessage(rangeTypeText, [minRange, maxRange]);
  447. }
  448. });
  449. // Info Bar
  450. dojo.declare("InfoBar", InfoBarBase, {
  451. constructor : function(cognosViewer, layoutElement, containerInfo, childContainers, layoutIndex) {
  452. this.m_layoutElement = layoutElement;
  453. this.m_containerInfo = containerInfo;
  454. this.m_bRendered = false;
  455. this.initializeEditableSorts(childContainers);
  456. this.initializeEditableFilters(childContainers);
  457. this.initializeEditableSliders(childContainers);
  458. this.m_id = layoutIndex + cognosViewer.getId();
  459. this.m_layoutIndex = layoutIndex;
  460. this.m_sortStrings = {
  461. byLabel: RV_RES.IDS_JS_SORTED_BY_LABEL,
  462. byValue: RV_RES.IDS_JS_SORTED_BY_VALUE,
  463. descending: RV_RES.IDS_JS_SORT_DESCENDING_ORDER,
  464. ascending: RV_RES.IDS_JS_SORT_ASCENDING_ORDER
  465. };
  466. this.connections = [];
  467. },
  468. getLayoutElement : function() {
  469. var layoutElement = this.m_layoutElement;
  470. var layoutId = layoutElement.getAttribute("lid");
  471. if (layoutId == null) {
  472. layoutId = layoutElement.getAttribute("pflid");
  473. }
  474. if (layoutId !== null) {
  475. if (layoutElement.tagName.toUpperCase() == "MAP") {
  476. var allSiblings = layoutElement.parentNode.childNodes;
  477. for (var index = 0; index < allSiblings.length; ++index) {
  478. var useMapValue = allSiblings[index].getAttribute("usemap");
  479. if (useMapValue !== null && useMapValue == ("#" + this.m_cognosViewer.getId() + layoutId)) {
  480. return allSiblings[index];
  481. }
  482. }
  483. }
  484. else if (layoutElement.parentNode.getAttribute("chartcontainer") == "true") {
  485. return layoutElement.parentNode;
  486. }
  487. return layoutElement;
  488. }
  489. return null;
  490. },
  491. initializeEditableSorts : function(childContainers) {
  492. if (this.m_containerInfo !== null) {
  493. if (typeof this.m_containerInfo.sort !== "undefined") {
  494. this.m_editableSorts = this.m_containerInfo.sort;
  495. }
  496. if (typeof childContainers !== "undefined") {
  497. for (var i=0; i<childContainers.length; ++i) {
  498. this.m_editableSorts = this.mergeChildInfo(this.m_editableSorts, childContainers[i].sort, 'labels');
  499. this.m_editableSorts = this.mergeChildInfo(this.m_editableSorts, childContainers[i].sort, 'valuesOf');
  500. }
  501. }
  502. }
  503. },
  504. initializeEditableFilters : function(childContainers) {
  505. if (typeof this.m_containerInfo !== "undefined" && this.m_containerInfo !== null) {
  506. if (typeof this.m_containerInfo.filter !== "undefined") {
  507. this.m_editableFilters = this.m_containerInfo.filter;
  508. }
  509. if (typeof childContainers!== "undefined") {
  510. for (var i=0; i<childContainers.length; ++i) {
  511. this.m_editableFilters = this.mergeChildInfo(this.m_editableFilters, childContainers[i].filter, 'item');
  512. }
  513. }
  514. }
  515. },
  516. initializeEditableSliders : function(childContainers) {
  517. if (typeof this.m_containerInfo !== "undefined" && this.m_containerInfo !== null) {
  518. if (typeof this.m_containerInfo.sliders !== "undefined") {
  519. this.m_editableSliders = this.m_containerInfo.sliders;
  520. }
  521. if (typeof childContainers!== "undefined") {
  522. for (var i=0; i<childContainers.length; ++i) {
  523. this.m_editableSliders = this.mergeChildInfo(this.m_editableSliders, childContainers[i].sliders, 'name');
  524. }
  525. }
  526. }
  527. },
  528. mergeChildInfo : function(parentList, childList, key) {
  529. if (typeof childList != "undefined") {
  530. if (typeof parentList === "undefined" || parentList === null) {
  531. parentList = childList;
  532. } else {
  533. //remove duplicates....(eg shared filters)
  534. var duplicateChecker = [];
  535. for (var i = 0; i<parentList.length; ++i) {
  536. duplicateChecker[parentList[i][key]] = parentList[i];
  537. }
  538. for (var j = 0; j<childList.length; ++j) {
  539. var childEntry = childList[j];
  540. if (typeof duplicateChecker[childEntry[key]] == "undefined") {
  541. parentList.push(childEntry);
  542. duplicateChecker[childEntry.item] = childEntry;
  543. }
  544. }
  545. }
  546. }
  547. return parentList;
  548. },
  549. hasSomethingRendered: function () {
  550. return this.m_bRendered;
  551. },
  552. render : function() {
  553. var divElement = document.getElementById("infoBar" + this.m_id);
  554. if(divElement === null) {
  555. var isSingleton = (this.m_containerInfo && this.m_containerInfo.displayTypeId === "singleton") ? true : false;
  556. if( isSingleton && !this.m_editableFilters && !this.m_editableSliders ) {
  557. return;
  558. }
  559. if(this.m_timingDetails || this.m_editableSorts || this.m_editableFilters || this.m_editableSliders || this.hasPrompts() || this.hasLockedFilters())
  560. {
  561. var layoutElement = this.getLayoutElement();
  562. var parentDiv = document.createElement("div");
  563. parentDiv.setAttribute("dir", this.m_cognosViewer.getDirection() === "rtl" ? "rtl" : "ltr");
  564. divElement = document.createElement("div");
  565. divElement.className = "infoBar";
  566. divElement.setAttribute("id", "infoBar" + this.m_id);
  567. divElement.setAttribute("cvid", this.m_cognosViewer.getId());
  568. divElement.setAttribute("layoutid", this.m_id);
  569. divElement.setAttribute("containerid", this.m_layoutIndex);
  570. divElement.setAttribute("role", "region");
  571. divElement.setAttribute("aria-label", RV_RES.IDS_JS_REPORT_INFO_TITLE);
  572. if( isSingleton ) {
  573. dojo.style(divElement, {opacity: "0.6"});
  574. }
  575. divElement.appendChild(this.renderHeader());
  576. divElement.appendChild(this.renderDetails());
  577. parentDiv.appendChild(divElement);
  578. layoutElement.parentNode.insertBefore(parentDiv, layoutElement);
  579. this.connections.push( dojo.connect(divElement, 'onkeydown', this, this.onKeyDown) );
  580. this.connections.push( dojo.query('.infoBarHeader', divElement).connect('onmousedown', this, this.toggle) );
  581. this.connections.push( dojo.query('.infoBarLeftIcon', divElement).connect('onmousedown', this, this.ignoreEvent) );
  582. this.connections.push( dojo.query('.infoBarDetailsText', divElement).connect('onmousedown', this, this.ignoreEvent) );
  583. this.connections.push( dojo.query('.infoBarLockedItems', divElement).connect('onmousedown', this, this.ignoreEvent) );
  584. this.m_bRendered = true;
  585. if (this.wasInfoBarExpanded(this.m_id)) {
  586. this.show();
  587. }
  588. }
  589. }
  590. },
  591. renderHeader : function() {
  592. var isFiltered = this.isFilterApplied();
  593. var isSorted = this.isSortApplied();
  594. var headerDiv = document.createElement("div");
  595. headerDiv.id = "infoBarHeader" + this.m_id;
  596. headerDiv.className="infoBarHeaderDiv";
  597. var header =
  598. '<div role="presentation" class="infoBarHeader BUXNoPrint" style="width:100%">' +
  599. this.addHeaderCloseButton() +
  600. this.addHeaderNavigationButton(isFiltered, isSorted) +
  601. this.addHeaderText(isFiltered, isSorted) +
  602. '</div>';
  603. headerDiv.innerHTML = header;
  604. return headerDiv;
  605. },
  606. addHeaderNavigationButton : function(isFiltered, isSorted) {
  607. var buttonTitle = RV_RES.IDS_JS_INFOBAR_EXPAND;
  608. var buttonClass = "infoBarIcon" + (isFiltered?"Filter":"") + (isSorted?"Sort":"") + "Applied";
  609. var labelledBy = "infoBarHeaderButton" + this.m_id + " infoBarHeaderText" + this.m_id;
  610. return '<button class="dijitStretch infoBarHeaderButton" id="infoBarHeaderButton' + this.m_id + '" aria-labelledby="' + labelledBy + '" type="button" role="button" tabindex="0" value="" title="' + buttonTitle + '">' +
  611. '<span class="dijitInline ' + buttonClass + '" title="' + buttonTitle + '"></span>' +
  612. '<span class="dijitInline dijitDisplayNone infoBarHeaderButtonText">!</span>' +
  613. '</button>';
  614. },
  615. addHeaderText : function(isFiltered, isSorted) {
  616. var headerText = [];
  617. if (isFiltered) {headerText.push(RV_RES.IDS_JS_FILTER_APPLIED);}
  618. if (isSorted) {headerText.push(RV_RES.IDS_JS_SORT_APPLIED);}
  619. return '<span class="infoBarHeaderText" id="infoBarHeaderText' + this.m_id + '">' +
  620. headerText.join(', ') +
  621. '</span>';
  622. },
  623. addHeaderCloseButton : function() {
  624. var buttonTitle = RV_RES.IDS_JS_INFOBAR_COLLAPSE;
  625. var labelledBy = this.m_id + "_collapse";
  626. return '<button class="dijitStretch infoBarHeaderCloseButton" id="infoBarHeaderCloseButton' + this.m_id + '" aria-labelledby="' + labelledBy + '" type="button" role="button" tabindex="0" value="" title="' + buttonTitle + '">' +
  627. '<span class="dijitInline infoBarIconClose BUXNoPrint" title="' + buttonTitle + '"></span>' +
  628. '<span class="dijitInline dijitDisplayNone infoBarCloseButtonText">x</span>' +
  629. '</button>';
  630. },
  631. isFilterApplied : function() {
  632. if (this.m_editableFilters || this.m_editableSliders || typeof this.m_containerInfo.lockedFilters !== "undefined" || this.hasPrompts()) {
  633. return true;
  634. }
  635. return false;
  636. },
  637. isSortApplied : function() {
  638. if (this.m_editableSorts) {
  639. return true;
  640. }
  641. return false;
  642. },
  643. renderDetails : function() {
  644. var divElement = document.getElementById("infoBarFlyout" + this.m_id);
  645. var instructions = document.getElementById(this.m_id + "instructions");
  646. if (divElement === null) {
  647. this.getLayoutElement();
  648. divElement = document.createElement("div");
  649. divElement.setAttribute("id", "infoBarFlyout" + this.m_id);
  650. divElement.setAttribute("cvid", this.m_cognosViewer.getId());
  651. divElement.setAttribute("layoutid", this.m_id);
  652. divElement.setAttribute("containerid", this.m_layoutIndex);
  653. divElement.className = "infoBarFlyout";
  654. divElement.style.display = "none";
  655. divElement.innerHTML = "<div class=\"infoBarFlyoutContent\" id=\"infoBarFlyoutContent" + this.m_id + "\" role=\"list\">" +
  656. this.addLockedInfoBarDetails() +
  657. this.addEditableInfoBarDetails() +
  658. this.addRAPTimingDetails() +
  659. "</div>" +
  660. this.createHiddenSpan(this.m_id + "_filterString", RV_RES.IDS_JS_FILTER) +
  661. this.createHiddenSpan(this.m_id + "_sortString", RV_RES.IDS_JS_SORT) +
  662. this.createHiddenSpan(this.m_id + "_promptString", RV_RES.IDS_JS_INFOBAR_PROMPT) +
  663. this.createHiddenSpan(this.m_id + "_sliderString", RV_RES.IDS_JS_INFOBAR_SLIDER) +
  664. this.createHiddenSpan(this.m_id + "_lockedString", RV_RES.IDS_JS_INFOBAR_LOCKED) +
  665. this.createHiddenSpan(this.m_id + "_collapse", RV_RES.IDS_JS_INFOBAR_COLLAPSE) +
  666. this.createHiddenSpan(this.m_id + "_delete", RV_RES.IDS_JS_DELETE);
  667. this.connections.push( dojo.connect(divElement, 'onkeydown', this, this.onKeyDown));
  668. this.connections.push(
  669. dojo.query('.infoBarDetailRow', divElement)
  670. .forEach(function (item, index, array) {
  671. dojo.attr(item, {
  672. "aria-setsize" : array.length,
  673. "aria-posinset" : index+1
  674. });
  675. })
  676. .connect('onfocus', function(e) {
  677. dojo.query(e.currentTarget).addClass('infoBarDetailRowHover');
  678. })
  679. .connect('onblur', function(e) {
  680. var el = typeof e.explicitOriginalTarget !== "undefined" ? e.explicitOriginalTarget : document.activeElement;
  681. if (dojo.hasClass(el, 'infoBarDeleteButton')) {
  682. return true;
  683. }
  684. dojo.query(e.currentTarget).removeClass('infoBarDetailRowHover');
  685. })
  686. .connect('onmouseover', this, function(e) {
  687. this.focusDetailRow(e.currentTarget);
  688. })
  689. );
  690. }
  691. // used for JAWS to let the user know how to navigate the info bar
  692. if (instructions === null) {
  693. instructions = document.createElement("span");
  694. instructions.id = this.m_id + "instructions";
  695. instructions.setAttribute("role", "presentation");
  696. instructions.style.visibility = "hidden";
  697. instructions.style.display = "none";
  698. document.body.appendChild(instructions);
  699. instructions.innerHTML = RV_RES.IDS_JS_INFOBAR_EXPLANATION;
  700. }
  701. return divElement;
  702. },
  703. addRAPTimingDetails : function() {
  704. if (this.m_timingDetails) {
  705. var lastDetail=this.m_timingDetails.length - 1;
  706. var totalTime=this.m_timingDetails[lastDetail].time - this.m_timingDetails[0].time;
  707. return '<div><table role="presentation" class="infoBarLockedItems">' +
  708. '<tr>' +
  709. this.addTimingIcon(totalTime, 250, 500) +
  710. '<td colspan="2" class="bibi inforBarDetailsText" role="presentation" id=\"' + this.m_id + '_timingDetail\" style=\"background-color:LightGray\"><b>RAP Total Time: (' + totalTime + ")</b></td>" +
  711. '</tr>' +
  712. this.addRAPTimingItemDetails() +
  713. '</table></div>';
  714. }
  715. return "";
  716. },
  717. addRAPTimingItemDetails : function() {
  718. var timingItemDetails = "";
  719. if (this.m_timingDetails) {
  720. for (var index = 0; index <= this.m_timingDetails.length - 1; ++index) {
  721. var timingItem = this.m_timingDetails[index];
  722. var timeDiff = this.getTimeDiff(index);
  723. timingItemDetails += "<tr class=\"infoBarDetailRow\" type=\"filter\" tabindex=\"-1\">";
  724. if (timingItem.level) {
  725. timingItemDetails += "<td colspan=3><font size=\"1\">" + timeDiff + ':' + html_encode(timingItem.event) + "</font></td></tr>";
  726. } else {
  727. timingItemDetails += this.addTimingIcon(timeDiff, 100,500);
  728. timingItemDetails += "<td class=\"bibi infoBarDetailsText\" role=\"presentation\" id=\"" + this.m_id + index + "_timingDetail\">";
  729. timingItemDetails += html_encode(timingItem.event);
  730. timingItemDetails += '</td><td align="right">' + timeDiff + '</td>';
  731. }
  732. timingItemDetails += "</tr>";
  733. }
  734. }
  735. return timingItemDetails;
  736. },
  737. getTimeDiff: function(index) {
  738. var nextTimeIdx=index+1;
  739. if (nextTimeIdx>=this.m_timingDetails.length) {
  740. return 0;
  741. }
  742. var thisLevel=this.m_timingDetails[index].level;
  743. if (!(thisLevel==this.m_timingDetails[nextTimeIdx].level)) {
  744. while(nextTimeIdx < this.m_timingDetails.length &&
  745. this.m_timingDetails[nextTimeIdx].level != thisLevel &&
  746. typeof this.m_timingDetails[nextTimeIdx].level != "undefined") {
  747. nextTimeIdx++;
  748. }
  749. }
  750. return (this.m_timingDetails[nextTimeIdx].time - this.m_timingDetails[index].time);
  751. },
  752. addTimingIcon: function(timeDiff, yellow, red) {
  753. var theIcon="icon_excellent_traffic.gif";
  754. if (timeDiff > red) {
  755. theIcon="icon_poor_traffic.gif";
  756. } else if (timeDiff > yellow) {
  757. theIcon="icon_average_traffic.gif";
  758. }
  759. return this.addInfoBarIcon(theIcon, true);
  760. },
  761. addLockedInfoBarDetails : function() {
  762. if (this.hasPrompts() || typeof this.m_containerInfo.lockedFilters !== "undefined") {
  763. return "<div role=\"presentation\" class=\"infoBarLockedItems\">" +
  764. this.addPromptDetails() +
  765. this.addLockedFilterDetails() +
  766. "</div>";
  767. }
  768. return "";
  769. },
  770. addEditableInfoBarDetails : function() {
  771. if (this.m_editableFilters || this.m_editableSorts || this.m_editableSliders) {
  772. return "<div role=\"presentation\" class=\"infoBarEditableItems\">" +
  773. this.addFilteredItemsDetails() +
  774. this.addSliderDetails() +
  775. this.addSortDetails() +
  776. "</div>";
  777. }
  778. return "";
  779. },
  780. onKeyDown : function(evt) {
  781. var srcNode = evt.target;
  782. var cvId = this.m_cognosViewer.getId();
  783. var infoBarHeaderButton = document.getElementById("infoBarHeaderButton" + this.m_id);
  784. var instructions = document.getElementById(this.m_id + "instructions");
  785. var node;
  786. if (evt.keyCode == "13") { // enter
  787. instructions.innerHTML = RV_RES.IDS_JS_INFOBAR_EXPLANATION;
  788. if (srcNode === infoBarHeaderButton) {
  789. this.toggle();
  790. return stopEventBubble(evt);
  791. }
  792. } else if (evt.keyCode == "27") { // esc
  793. var a11yHelper = this.m_cognosViewer.getA11YHelper();
  794. if (this.m_cognosViewer.getCurrentNodeFocus()) {
  795. node = this.m_cognosViewer.getCurrentNodeFocus();
  796. if (node.nodeName.toLowerCase() != "span") {
  797. var spans = node.getElementsByTagName("span");
  798. for (var index=0; index < spans.length; index++) {
  799. if (spans[index].style.display != "hidden") {
  800. node = spans[index];
  801. break;
  802. }
  803. }
  804. }
  805. this.hide(false);
  806. a11yHelper.setFocusToNode(node);
  807. } else {
  808. this.hide();
  809. }
  810. return stopEventBubble(evt);
  811. } else if (evt.keyCode == "46") { // del
  812. if (dojo.hasClass(srcNode, "infoBarDetailRow")) {
  813. node = dojo.query("td.infoBarRightIcon", srcNode)[0];
  814. if (typeof node !== "undefined") {
  815. if (srcNode.getAttribute("type") == "filter") {
  816. InfoBarHelper.infoBarRemoveFilter(cvId, this.m_layoutIndex, node.getAttribute("filterItem"), node.getAttribute("details"));
  817. } else if (srcNode.getAttribute("type") == "sort") {
  818. InfoBarHelper.infoBarRemoveSort(cvId, this.m_layoutIndex, node.getAttribute("sortItem"), node.getAttribute("byLabel"));
  819. } else if (srcNode.getAttribute("type") == "slider") {
  820. InfoBarHelper.infoBarRemoveSlider(cvId, node.getAttribute("slider"));
  821. }
  822. }
  823. }
  824. } else if (evt.keyCode == "38") { // up arrow
  825. if (dojo.hasClass(srcNode, "infoBarDetailRow")) {
  826. this.focusDetailRow(srcNode, "prev");
  827. } else {
  828. this.focusDetailRow();
  829. }
  830. instructions.innerHTML = "";
  831. return stopEventBubble(evt);
  832. } else if (evt.keyCode == "40") { // down arrow
  833. if (dojo.hasClass(srcNode, "infoBarDetailRow")) {
  834. this.focusDetailRow(srcNode, "next");
  835. } else {
  836. this.focusDetailRow();
  837. }
  838. instructions.innerHTML = "";
  839. return stopEventBubble(evt);
  840. } else if (evt.keyCode == "9") { // tab
  841. // if the info bar is expanded either set the focus to the info or the close button
  842. var infoBar = document.getElementById("infoBar" + this.m_id);
  843. if (dojo.hasClass(infoBar, "infoBarExpanded")) {
  844. if (dojo.hasClass(srcNode, "infoBarDetailRow")) {
  845. dojo.byId("infoBarHeaderCloseButton" + this.m_id).focus();
  846. } else {
  847. this.focusDetailRow();
  848. }
  849. return stopEventBubble(evt);
  850. }
  851. }
  852. },
  853. focusDetailRow : function(detailRow, dir) {
  854. var infoBarFlyout = document.getElementById("infoBarFlyout" + this.m_id);
  855. var infoBar = document.getElementById("infoBar" + this.m_id);
  856. if (!dojo.hasClass(infoBar, "infoBarExpanded")) {
  857. return;
  858. }
  859. if (typeof detailRow == "undefined" || detailRow === null) {
  860. var firstDetailRows = dojo.query(".infoBarLockedItems .infoBarDetailRow, .infoBarEditableItems .infoBarDetailRow", infoBarFlyout);
  861. detailRow = firstDetailRows[0];
  862. }
  863. if (detailRow && dojo.hasClass(detailRow, "infoBarDetailRow")) {
  864. var newRow, rows, len, i;
  865. if (dir === "prev") {
  866. if (detailRow.parentNode.previousSibling) { // faster
  867. newRow = detailRow.parentNode.previousSibling.childNodes[1];
  868. } else {
  869. rows = dojo.query(".infoBarDetailRow", infoBarFlyout);
  870. len = rows.length;
  871. if (detailRow === rows[0]) {
  872. newRow = rows[len-1];
  873. } else {
  874. for (i = 1; i < len; i++) {
  875. if (detailRow === rows[i]) {
  876. newRow = rows[i-1];
  877. break;
  878. }
  879. }
  880. }
  881. }
  882. } else if (dir === "next") {
  883. if (detailRow.parentNode.nextSibling) { // faster
  884. newRow = detailRow.parentNode.nextSibling.childNodes[1];
  885. } else {
  886. rows = dojo.query(".infoBarDetailRow", infoBarFlyout);
  887. len = rows.length;
  888. if (detailRow === rows[len-1]) {
  889. newRow = rows[0];
  890. } else {
  891. for (i = 0; i < len-1; i++) {
  892. if (detailRow === rows[i]) {
  893. newRow = rows[i+1];
  894. break;
  895. }
  896. }
  897. }
  898. }
  899. } else {
  900. newRow = detailRow;
  901. }
  902. newRow.focus();
  903. }
  904. },
  905. toggle : function(evt) {
  906. var infoBar = document.getElementById("infoBar" + this.m_id);
  907. if (dojo.hasClass(infoBar, "infoBarExpanded")) {
  908. this.hide();
  909. } else {
  910. this.show();
  911. }
  912. stopEventBubble(evt);
  913. },
  914. ignoreEvent : function(evt) {
  915. stopEventBubble(evt);
  916. },
  917. show : function() {
  918. var infoBar = document.getElementById("infoBar" + this.m_id);
  919. if (!dojo.hasClass(infoBar, "infoBarExpanded")) {
  920. var infoBarHeader = document.getElementById("infoBarHeader" + this.m_id);
  921. var infoBarFlyout = document.getElementById("infoBarFlyout" + this.m_id);
  922. var infoBarHeaderButton = document.getElementById("infoBarHeaderButton" + this.m_id);
  923. var flyoutCoords, canvasCoords, newWidth;
  924. var wipeIn = dojo.fx.wipeIn({
  925. node: infoBarFlyout,
  926. duration: 300,
  927. onEnd: dojo.hitch(this, function() {
  928. this.focusDetailRow();
  929. infoBarHeaderButton.setAttribute('title', RV_RES.IDS_JS_INFOBAR_COLLAPSE);
  930. infoBarHeaderButton.childNodes[0].setAttribute('title', RV_RES.IDS_JS_INFOBAR_COLLAPSE);
  931. })
  932. });
  933. this.updateInfoBarRenderedState(this.m_id, "true");
  934. dojo.addClass(infoBar, "infoBarExpanded");
  935. if(this.m_containerInfo && this.m_containerInfo.displayTypeId === "singleton") {
  936. dojo.style(infoBar, {opacity: '1'});
  937. }
  938. dojo.style(infoBar, "width", 'auto');
  939. wipeIn.play();
  940. var infoBarHeaderText = document.getElementById("infoBarHeaderText" + this.m_id).innerHTML;
  941. var infoBarHeaderWidth = this._getTextWidth(infoBarHeaderText) + 40; // the 40 is for the icons to the left and right of the text
  942. // 500 is the min the infobar should be
  943. if (infoBarHeaderWidth < 500) {
  944. infoBarHeaderWidth = 500;
  945. }
  946. var oWidget = this.m_cognosViewer.getViewerWidget();
  947. var maxWidth = oWidget.findContainerDiv().clientWidth;
  948. if (infoBarHeaderWidth > maxWidth) {
  949. infoBarHeaderWidth = maxWidth - 5; // -5 to make sure the info bar doesn't casuse scroll bars to show up
  950. }
  951. //dojo.style(infoBar, "width", infoBarHeaderWidth + "px");
  952. infoBar.style.width = infoBarHeaderWidth + "px";
  953. dojo.removeClass(infoBarHeader, "BUXNoPrint");
  954. }
  955. },
  956. _getTextWidth : function(text) {
  957. var div = document.createElement("div");
  958. div.className = "infoBar infoBarHeader";
  959. div.style.fontWeight = "bold";
  960. div.style.position = "absolute";
  961. div.style.visibility = "hidden";
  962. div.style.height = "auto";
  963. div.style.width = "auto";
  964. document.body.appendChild(div);
  965. div.innerHTML = text;
  966. var result = div.clientWidth;
  967. document.body.removeChild(div);
  968. return result;
  969. },
  970. hide : function(focus) {
  971. var infoBar = document.getElementById("infoBar" + this.m_id);
  972. if (dojo.hasClass(infoBar, "infoBarExpanded")) {
  973. this.updateInfoBarRenderedState(this.m_id, "false");
  974. var infoBarHeader = document.getElementById("infoBarHeader" + this.m_id);
  975. var infoBarFlyout = document.getElementById("infoBarFlyout" + this.m_id);
  976. var infoBarHeaderButton = document.getElementById("infoBarHeaderButton" + this.m_id);
  977. dojo.addClass(infoBarHeader, "BUXNoPrint");
  978. dojo.fx.wipeOut({
  979. node: infoBarFlyout,
  980. duration: 300,
  981. onEnd: dojo.hitch(this, function() {
  982. dojo.removeClass(infoBar, "infoBarExpanded");
  983. dojo.style(infoBar, "width", 'auto');
  984. if(this.m_containerInfo && this.m_containerInfo.displayTypeId === "singleton")
  985. {
  986. dojo.style(infoBar, {opacity: '0.6'});
  987. }
  988. infoBarHeaderButton.setAttribute('title', RV_RES.IDS_JS_INFOBAR_EXPAND);
  989. infoBarHeaderButton.childNodes[0].setAttribute('title', RV_RES.IDS_JS_INFOBAR_EXPAND);
  990. if (!focus) {
  991. infoBarHeaderButton.focus();
  992. }
  993. })
  994. }).play();
  995. }
  996. },
  997. updateInfoBarRenderedState: function(uniqueId, sExpanded) {
  998. var oWidget = this.m_cognosViewer.getViewerWidget();
  999. if (oWidget) {
  1000. var object = oWidget.getInfoBarRenderedState();
  1001. object[uniqueId] = sExpanded;
  1002. }
  1003. },
  1004. wasInfoBarExpanded: function(uniqueId) {
  1005. var oWidget = this.m_cognosViewer.getViewerWidget();
  1006. if (oWidget) {
  1007. var object = oWidget.getInfoBarRenderedState();
  1008. if (object) {
  1009. if (object[uniqueId]) {
  1010. if ("true" === object[uniqueId]) {
  1011. return true;
  1012. }
  1013. }
  1014. }
  1015. }
  1016. return false;
  1017. },
  1018. destroy: function() {
  1019. for(var i=0; i<this.connections.length; i++) {
  1020. var handle = this.connections[i];
  1021. if (handle && handle.remove) {//skip hmtl mode and make sure it is a handle object with remove function
  1022. dojo.disconnect(handle);
  1023. }
  1024. }
  1025. var divElement = document.getElementById("infoBar" + this.m_id);
  1026. if (divElement) {
  1027. var parentNode = divElement.parentNode;
  1028. if (parentNode) {
  1029. parentNode.removeChild(divElement);
  1030. }
  1031. }
  1032. divElement = document.getElementById(this.m_id + "instructions");
  1033. if (divElement) {
  1034. divElement.parentNode.removeChild(divElement);
  1035. }
  1036. delete this.m_layoutElement;
  1037. delete this.m_containerInfo;
  1038. }
  1039. });
  1040. // ///////////////////////////////////////////////////////////
  1041. // AnnotationFilterContext class
  1042. dojo.declare("AnnotationFilterContext", null, {
  1043. m_parameterValuesString: null,
  1044. m_parameterValuesSpec: null,
  1045. m_slidersJSON: null,
  1046. m_filterJSON: null,
  1047. constructor : function(paramValuesString, paramValuesSpec, slidersJSON, filterJSON){
  1048. this.m_parameterValuesString = paramValuesString;
  1049. this.m_parameterValuesSpec = paramValuesSpec;
  1050. this.m_slidersJSON = slidersJSON;
  1051. this.m_filterJSON = filterJSON;
  1052. },
  1053. setParameterValuesString: function(param) {
  1054. this.m_parameterValuesString = param;
  1055. },
  1056. setParameterValuesSpec: function(param){
  1057. this.m_parameterValuesSpec = param;
  1058. },
  1059. setSlidersJSON: function(param) {
  1060. this.m_slidersJSON = param;
  1061. },
  1062. setFilterJSON: function(param){
  1063. this.m_filterJSON = param;
  1064. },
  1065. getParameterValuesString: function(){
  1066. return this.m_parameterValuesString || null; // if null or undefined, return null;
  1067. },
  1068. getParameterValuesSpec: function(){
  1069. return this.m_parameterValuesSpec || null; // if null or undefined, return null;
  1070. },
  1071. getPromptsJSON: function(){
  1072. var promptObject = null;
  1073. if (this.m_parameterValuesString) {
  1074. promptObject = {};
  1075. promptObject.parameterValuesString = this.m_parameterValuesString;
  1076. }
  1077. if (this.m_parameterValuesString) {
  1078. promptObject = promptObject || {};
  1079. promptObject.parameterValuesSpec = this.m_parameterValuesSpec;
  1080. }
  1081. return promptObject;
  1082. },
  1083. getSlidersJSON: function(){
  1084. return this.m_slidersJSON || null; // if null or undefined, return null;
  1085. },
  1086. getFilterJSON: function(){
  1087. return this.m_filterJSON || null; // if null or undefined, return null;
  1088. },
  1089. isEmpty: function(){
  1090. if (this.m_parameterValuesString || this.m_parameterValuesSpec || this.m_slidersJSON || this.m_filterJSON ) {
  1091. return false;
  1092. }
  1093. return true;
  1094. }
  1095. });
  1096. // ///////////////////////////////////////////////////////////
  1097. // AnnotationInfoBar class
  1098. dojo.declare("AnnotationInfoBar", InfoBarBase, {
  1099. constructor : function(cognosViewer, lid) {
  1100. this.m_id = "annoInfoBar_" + lid;
  1101. this.m_layoutElementId = lid;
  1102. },
  1103. /*
  1104. * returns AnnotationFilterContext object if parameterValuesString, filter, or sliders exists
  1105. */
  1106. createFilterContext : function() {
  1107. var filter = null;
  1108. var slider = null;
  1109. var paramSpec = null;
  1110. var paramString = null;
  1111. if (this.m_cognosViewer.getRAPReportInfo()) {
  1112. var oRapReportInfo = this.m_cognosViewer.getRAPReportInfo();
  1113. if (oRapReportInfo.getContainers()) {
  1114. var oContainers = oRapReportInfo.getContainers();
  1115. if (oContainers[this.m_layoutElementId]) {
  1116. var oContainer = oContainers[this.m_layoutElementId];
  1117. if(typeof oContainer.filter !== "undefined") {
  1118. filter = oContainer.filter;
  1119. }
  1120. if(typeof oContainer.sliders !== "undefined") {
  1121. slider = oContainer.sliders;
  1122. }
  1123. }
  1124. }
  1125. }
  1126. if (this.hasPrompts()) {
  1127. paramSpec = CViewerCommon.buildParameterValuesSpec(this.m_cognosViewer);
  1128. paramString = this.m_cognosViewer.getExecutionParameters();
  1129. }
  1130. if (filter || slider || paramSpec || paramString) {
  1131. return new AnnotationFilterContext(paramString, paramSpec, slider, filter);
  1132. }
  1133. return null;
  1134. }
  1135. });
  1136. // ///////////////////////////////////////////////////////////
  1137. // AnnotationInfoBar class
  1138. dojo.declare("AnnotationInfoBarRenderer", null, {
  1139. m_AnnotationInfoBar: null,
  1140. m_id: null,
  1141. m_labelledByHideButton: "",
  1142. miniCognosViewer: null,
  1143. m_editableSliders: null,
  1144. constructor : function(cognosViewer, lid, filterContext, annoId) {
  1145. this.m_AnnotationInfoBar = null;
  1146. this.miniCognosViewer = {};
  1147. this.miniCognosViewer.m_sId = cognosViewer.id;
  1148. this.miniCognosViewer.getId = cognosViewer.getId;
  1149. this.miniCognosViewer.m_sParameters = (filterContext === null || filterContext.getParameterValuesString() === null)? "" :filterContext.getParameterValuesString();
  1150. this.miniCognosViewer.getExecutionParameters = cognosViewer.getExecutionParameters;
  1151. this.miniCognosViewer.getWebContentRoot = cognosViewer.getWebContentRoot;
  1152. this.m_AnnotationInfoBar = new AnnotationInfoBar(this.miniCognosViewer, lid);
  1153. this.m_AnnotationInfoBar.setId( "annoInfoBar_" + annoId + lid );
  1154. this.m_id = "annoInfoBar_" + annoId + lid + "_renderer";
  1155. if (filterContext) {
  1156. if (filterContext.getSlidersJSON()) {
  1157. this.m_AnnotationInfoBar.setContainerInfo( {"sliders": filterContext.getSlidersJSON() } );
  1158. this.m_AnnotationInfoBar.m_editableSliders = filterContext.getSlidersJSON();
  1159. }
  1160. if (filterContext.getFilterJSON()) {
  1161. this.m_AnnotationInfoBar.setEditableFilters( filterContext.getFilterJSON() );
  1162. }
  1163. }
  1164. },
  1165. render: function() {
  1166. var renderHidden =
  1167. "<div class=\"infoBar infoBarCollapsed\" id=\"infoBarHeaderCollapsed" + this.m_id +"\" >" +
  1168. this.renderHeader(false) +
  1169. "</div>";
  1170. var renderShown =
  1171. "<div class=\"infoBar infoBarExpanded\" id=\"infoBarHeaderExpanded" + this.m_id +"\" style=\"display:none;\" >" +
  1172. this.renderHeader(true) +
  1173. this.renderDetails() +
  1174. "</div>";
  1175. renderShown = this.updateHideButtonLabelledBy(renderShown);
  1176. var instructions = document.getElementById("annotationInfoBarInstructions");
  1177. if (instructions === null) {
  1178. instructions = document.createElement("span");
  1179. instructions.id = "annotationInfoBarInstructions";
  1180. instructions.setAttribute("role", "presentation");
  1181. instructions.style.visibility = "hidden";
  1182. instructions.style.display = "none";
  1183. var details =
  1184. this.m_AnnotationInfoBar.createHiddenSpan("annoInfoBarButtonInstruction", RV_RES.IDS_JS_ANNO_INFOBAR_BUTTON_EXPLANATION) +
  1185. this.m_AnnotationInfoBar.createHiddenSpan("annoInfoBar_filterString", RV_RES.IDS_JS_FILTER) +
  1186. this.m_AnnotationInfoBar.createHiddenSpan("annoInfoBar_promptString", RV_RES.IDS_JS_INFOBAR_PROMPT) +
  1187. this.m_AnnotationInfoBar.createHiddenSpan("annoInfoBar_sliderString", RV_RES.IDS_JS_INFOBAR_SLIDER);
  1188. document.body.appendChild(instructions);
  1189. instructions.innerHTML = details;
  1190. }
  1191. return renderHidden + renderShown;
  1192. },
  1193. renderInJSON: function() {
  1194. var filters = [];
  1195. return filters.concat(
  1196. this.m_AnnotationInfoBar.getPromptDetailsInJSON(),
  1197. this.m_AnnotationInfoBar.getFilteredItemsDetailsInJSON(),
  1198. this.m_AnnotationInfoBar.getSliderDetailsInJSON()
  1199. );
  1200. },
  1201. renderHeader: function(shown) {
  1202. var mode = (shown)?"Hide":"Show";
  1203. var buttonText = (shown)? RV_RES.IDS_JS_ANNO_INFOBAR_HIDE :RV_RES.IDS_JS_ANNO_INFOBAR_SHOW;
  1204. var labelledBy = (shown)? ("XXREPLACEXX") : " annoInfoBarHeaderControlButtonText" + mode + this.m_id;
  1205. var header =
  1206. "<table class=\"annoInfoBarHeader\" id=\"annoInfoBarHeader" + mode + this.m_id + "\" role=\"presentation\">" +
  1207. "<tr>" +
  1208. "<td class=\"annoInfoBarHeaderText\" id=\"infoBarHeaderText" + this.m_id + "\" >" +
  1209. RV_RES.IDS_JS_FILTER_APPLIED +
  1210. "</td>" +
  1211. "<td class=\"annoInfoBarHeaderControl\" id=\"infoBarHeader"+ mode + this.m_id + "\" >" +
  1212. "<button id=\"annoInfoBarHeaderControl" + mode + this.m_id + "\" aria-labelledby=\"" + labelledBy + "\" type=\"button\" role=\"button\" tabindex=\"0\" value=\"\" title=\"" + buttonText + "\"" +
  1213. " onmousedown=\"annotationInfoBarToggle('" + this.m_id + "', '"+ mode+"');\">" +
  1214. "<span id=\"annoInfoBarHeaderControlButtonText" + mode + this.m_id + "\"class=\"dijitInline annoInfoBarHeaderControlText\" title=\"" + buttonText + "\" >"+ buttonText+ "</span>" +
  1215. "</button>" +
  1216. "</td>"+
  1217. "</tr>" +
  1218. "</table>";
  1219. return header;
  1220. },
  1221. renderDetails: function() {
  1222. var promptDetail = this.m_AnnotationInfoBar.addPromptDetails(true);
  1223. var filterDetail = this.m_AnnotationInfoBar.addFilteredItemsDetails(true);
  1224. var sliderDetail = this.m_AnnotationInfoBar.addSliderDetails(true);
  1225. var renderDetails =
  1226. "<div class=\"annoInfoBarDetails\" id=\"annoInfoBarDetails" + this.m_id + "\" role=\"presentation\">"+
  1227. promptDetail + filterDetail + sliderDetail +
  1228. "</div>";
  1229. this.m_labelledByHideButton = (promptDetail.length === 0)? "":(" annoInfoBar_promptString " + this.m_AnnotationInfoBar.getId() + "0_promptDetail ");
  1230. this.m_labelledByHideButton += (filterDetail.length === 0)? "":(" annoInfoBar_filterString " + this.m_AnnotationInfoBar.getId() + "0_filterDetail ");
  1231. this.m_labelledByHideButton += (sliderDetail.length === 0)? "":(" annoInfoBar_sliderString " + this.m_AnnotationInfoBar.getId() + "0_sliderDetail annoInfoBar_sliderString " + this.m_AnnotationInfoBar.getId() + "1_sliderDetail " );
  1232. this.m_labelledByHideButton += " annoInfoBarHeaderControlButtonTextHide" + this.m_id;
  1233. return renderDetails;
  1234. },
  1235. updateHideButtonLabelledBy: function(headerString) {
  1236. return headerString.replace("XXREPLACEXX", this.m_labelledByHideButton);
  1237. }
  1238. });
  1239. //==============================================
  1240. // Global function for annotation InfoBar Toggle
  1241. function annotationInfoBarToggle(mId, changeTo)
  1242. {
  1243. var expanded = document.getElementById("infoBarHeaderExpanded" + mId);
  1244. var collapsed = document.getElementById("infoBarHeaderCollapsed" + mId);
  1245. var control = null;
  1246. if ("Show" === changeTo) {
  1247. dojo.style(expanded, {display: ""});
  1248. dojo.style(collapsed, {display: "none"});
  1249. control = document.getElementById("annoInfoBarHeaderControlHide" + mId);
  1250. } else {
  1251. dojo.style(collapsed, {display: ""});
  1252. dojo.style(expanded, {display: "none"});
  1253. control = document.getElementById("annoInfoBarHeaderControlShow" + mId);
  1254. }
  1255. if (control) {
  1256. control.focus();
  1257. }
  1258. }