metadataTree.js 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. /********************************************************************************************************************************
  2. * Licensed Materials - Property of IBM *
  3. * *
  4. * IBM Cognos Products: AGS *
  5. * *
  6. * (C) Copyright IBM Corp. 2005, 2021 *
  7. * *
  8. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
  9. *********************************************************************************************************************************/
  10. var metadataTree = null;
  11. var memberTree = null;
  12. var activeNodeFetches = new Array();
  13. var metadataErrors = new Array();
  14. var METADATA_REPLY = "metadata";
  15. // this is the name of the frame that we're dropping into
  16. var dropFrame = null;
  17. // an array of nodes that are to be loaded. we need the array
  18. // as the passport might have expired
  19. var loadingmdtNodes = new Array();
  20. function initMetadataTree()
  21. {
  22. var cmLastModel = cfgGet("cmLastModel");
  23. if (cmLastModel != null && cfgGet("queryLoaded"))
  24. {
  25. if (metadataTree == null)
  26. {
  27. if (browserCheck.isNav6Up())
  28. {
  29. document.getElementById("metadataTreeContainer").addEventListener("mouseup", function(e) {if(e.target.toString().indexOf("XULElement") > -1){e.cancelBubble = true;return false;}}, true);
  30. document.getElementById("metadataTreeContainer").addEventListener("dragover", function(e) {cancelBub(e);}, true);
  31. document.getElementById("metadataTreeContainer").addEventListener("dragdrop", function(e) {cancelBub(e);}, true);
  32. }
  33. var metadataTreeNode = document.getElementById("metadataTreeContainer");
  34. // at this point - this is the only node with this id
  35. metadataTreeNode.setAttribute("container", "true");
  36. metadataTreeNode.setAttribute("tabindex", "-1");
  37. // now create and render the tree
  38. metadataTree = new CTree (metadataTreeNode, "" , false, true, "metadataTree");
  39. metadataTree.setLoadOnTheFlyFunction(pushAndLoadmdtNode);
  40. metadataTree.setSelectionMode(CONTIGUOUS_TREE_SELECTION);
  41. metadataTree.setSelectTreeUI(NORMAL_TREE);
  42. metadataTree.setAllowDragDrop(true);
  43. metadataTree.setOnDragStart(onDragStartF);
  44. metadataTree.setOnDrag(onDragF);
  45. metadataTree.setOnDragEnd(onDragEndF);
  46. metadataTree.setContextMenu(showContextMenu);
  47. metadataTree.setTrackSelectionOrder(true);
  48. metadataTree.setDoubleClickFunc(addSelectedDblClick);
  49. metadataTree.setSingleClickFunc(metadataClicked);
  50. metadataTree.setHideOuterTable(true);
  51. metadataTree.drawAll();
  52. metadataTree.checkData();
  53. }
  54. }
  55. else
  56. setTimeout(initMetadataTree, 250);
  57. }
  58. function initMemberSearch()
  59. {
  60. if (memberTree == null)
  61. {
  62. if (browserCheck.isNav6Up())
  63. {
  64. document.getElementById("memberTreeContainer").addEventListener("mouseup", function(e) {if(e.target.toString().indexOf("XULElement") > -1){e.cancelBubble = true;return false;}}, true);
  65. document.getElementById("memberTreeContainer").addEventListener("dragover", function(e) {cancelBub(e);}, true);
  66. document.getElementById("memberTreeContainer").addEventListener("dragdrop", function(e) {cancelBub(e);}, true);
  67. }
  68. var memberTreeNode = document.getElementById("memberTreeContainer");
  69. // at this point - this is the only node with this id
  70. memberTreeNode.setAttribute("container", "true");
  71. memberTreeNode.setAttribute("tabindex", "-1");
  72. // now create and render the tree
  73. memberTree = new CTree (memberTreeNode, "" , false, true, "memberTree");
  74. memberTree.setSelectionMode(CONTIGUOUS_TREE_SELECTION);
  75. memberTree.setSelectTreeUI(NORMAL_TREE);
  76. memberTree.setAllowDragDrop(true);
  77. memberTree.setOnDragStart(onDragStartF);
  78. memberTree.setOnDrag(onDragF);
  79. memberTree.setOnDragEnd(onDragEndF);
  80. memberTree.setContextMenu(showContextMenu);
  81. memberTree.setTrackSelectionOrder(true);
  82. memberTree.setDoubleClickFunc(addSelectedDblClick);
  83. memberTree.setSingleClickFunc(metadataClicked);
  84. memberTree.setHideOuterTable(true);
  85. memberTree.drawAll();
  86. memberTree.checkData();
  87. // set the loading on the fly function last - we don't want to promp a call
  88. memberTree.setLoadOnTheFlyFunction(pushAndLoadmdtNode);
  89. }
  90. }
  91. /*
  92. * Lose the focus from any textual input controls in the message frame
  93. */
  94. function loseFocus() {
  95. var msgDoc = getMessageIFrame().document;
  96. var bodyTags;
  97. bodyTags=msgDoc.getElementsByTagName('BODY');
  98. //activate the page, this will have the effect of removing focus from any input controls
  99. if (bodyTags.length > 0) {
  100. if(bodyTags[0].setActive)bodyTags[0].setActive();
  101. }
  102. }
  103. function metadataClicked(event) {
  104. //get UI Node
  105. var uiNode = getUINode(event);
  106. loseFocus();
  107. uiNodeTreeRef = uiNode.getAttribute('treeRef').toString();
  108. //get the tree object
  109. var tree = uiNode.getAttribute('tree').toString();
  110. //get tree Node
  111. var node = getTreeNode(tree, uiNodeTreeRef);
  112. var visibleTree = cfgGet("lastMenu");
  113. if ((visibleTree == TAB_MODEL || visibleTree == TAB_MEMBERS) && node && node.isSelected) {
  114. var nodeTypeObject = node.getNodeTypeObject();
  115. var menuItem = menuItemMap['asDataItem'];
  116. if (node.getValue() instanceof mdSearch) {
  117. // have to launch the selectMembers dialog
  118. selectMember(node.getValue().path, node.getValue().type);
  119. }
  120. else if (nodeTypeObject.m_oProps.isAgentItemsInsertable()) {
  121. menuItem.enable();
  122. cfgSet("asDataItemState", true);
  123. } else {
  124. menuItem.disable();
  125. cfgSet("asDataItemState", false);
  126. }
  127. }
  128. }
  129. function reloadMetadataTree(force)
  130. {
  131. if (cfgGet("reloadMetadataTree") != null || force) {
  132. resetMetadataTree();
  133. // load it up again
  134. initMetadataTree();
  135. } else {
  136. // pop the command stack
  137. setTimeout("getCommandStackManager().processCommandStack()", 100);
  138. }
  139. // clear out the flag
  140. cfgRemove("reloadMetadataTree");
  141. }
  142. function refreshMetaDataTree() {
  143. removeTreeRendering('metadataTreeContainer');
  144. initMetadataTree();
  145. }
  146. function resetMetadataTree()
  147. {
  148. if (metadataTree != null) {
  149. // we have to remove the tree
  150. metadataTree = null;
  151. // remove the rendering of the tree
  152. removeTreeRendering("metadataTreeContainer");
  153. // rebuild the arrays
  154. activeNodeFetches = new Array();
  155. metadataErrors = new Array();
  156. // say that we've not loaded the tree
  157. cfgSet("META_TreeLoadedFirstTime",null);
  158. }
  159. }
  160. function removeTreeRendering(treeId)
  161. {
  162. // remove the display of the tree.
  163. var treeNodes = document.getElementsByName(treeId);
  164. // for IE - this will return multiple elements - for NS we should only get one
  165. // but check them all for the contain attribute
  166. var treeNode = null;
  167. // find the correct node
  168. for (var i = 0; i < treeNodes.length && treeNode==null; i++) {
  169. // get the container attribute
  170. var containerAtt = treeNodes[i].getAttribute("container");
  171. if (containerAtt!=null && containerAtt=="true") {
  172. // we've found the outer container
  173. treeNode = treeNodes[i];
  174. }
  175. }
  176. // now have to remove all the children of the container
  177. for (var j = treeNode.childNodes.length-1; j >= 0 ; --j) {
  178. // remove the node
  179. treeNode.removeChild(treeNode.childNodes[j]);
  180. }
  181. }
  182. function getMetadataRequestString(model, startAtPath, depth, context)
  183. {
  184. var clk = "cl";
  185. var plk = "pl";
  186. var locales = getLocales(clk, plk);
  187. var sURL = "";
  188. sURL += URIEncode("model", model);
  189. sURL += URIEncode(clk, locales[clk]);
  190. sURL += URIEncode(plk, locales[plk]);
  191. sURL += URIEncode("el",getExpressionLocale());
  192. sURL += URIEncode("depth",depth);
  193. sURL += URIEncode("startAtPath", startAtPath);
  194. sURL += URIEncode("context", context);
  195. sURL += URIEncode("parameterValues",getConnectionParameterValues());
  196. sURL += URIEncode("inlineSpecType", "reportServiceMetadataSpecification");
  197. sURL += URIEncode("method", "runSpecification");
  198. sURL += URIEncode("prompt", "false");
  199. return sURL;
  200. }
  201. function doMemberSearch(startAtPath, filter, filter_type, case_sensitive, search_descendants)
  202. {
  203. // show the correct tab
  204. showAgsMenu(TAB_MEMBERS);
  205. // remove anything from before
  206. tidyMemberTree();
  207. // restart the member tree
  208. initMemberSearch();
  209. // display the loading for the tree
  210. var v_oRootNode = memberTree.getRootNode();
  211. v_oRootNode.setLoading(true);
  212. v_oRootNode.getTree().setLoading(true);
  213. if (v_oRootNode.getShowUI())
  214. {
  215. v_oRootNode.setOpen(true);
  216. v_oRootNode.getTree().redrawNodeToggle(v_oRootNode, v_oRootNode.getTree().getName() + v_oRootNode.getTreeRef());
  217. v_oRootNode.getTree().drawLoading(v_oRootNode, v_oRootNode.getTree().getName() + v_oRootNode.getTreeRef());
  218. }
  219. // prime the tree ready for the search - when using root node we have to associate the startAtPath
  220. // with the tree's root node
  221. activeNodeFetches[startAtPath] = memberTree.getRootNode();
  222. // get the right request
  223. var v_sRequest= getMemberRequestString(cfgGet("cmLastModel"), startAtPath, startAtPath, filter, filter_type, case_sensitive, search_descendants);
  224. // send the request
  225. doMemberRequest(v_sRequest);
  226. }
  227. function getMemberRequestString(sModel, sStartAtPath, sContext, sFilter, sFilterType, sCaseSensitive, sSearchDescendants)
  228. {
  229. var v_sClk = "cl";
  230. var v_sPlk = "pl";
  231. var locales = getLocales(v_sClk, v_sPlk);
  232. var v_sURL = "";
  233. v_sURL += URIEncode("model", sModel);
  234. v_sURL += URIEncode(v_sClk, locales[v_sClk]);
  235. v_sURL += URIEncode(v_sPlk, locales[v_sPlk]);
  236. v_sURL += URIEncode("el",getExpressionLocale());
  237. // depth is dependant upon whether we're searching descendants or not - if not depth="2"
  238. // if we are - then depth="" - see MQP member queries document
  239. if (sSearchDescendants == true) {
  240. v_sURL += URIEncode("depth","");
  241. } else {
  242. v_sURL += URIEncode("depth","2");
  243. }
  244. v_sURL += URIEncode("startAtPath", sStartAtPath);
  245. v_sURL += URIEncode("context", sContext);
  246. v_sURL += URIEncode("parameterValues",getConnectionParameterValues());
  247. v_sURL += URIEncode("inlineSpecType", "reportServiceMetadataSpecification");
  248. v_sURL += URIEncode("method", "runSpecification");
  249. v_sURL += URIEncode("prompt", "false");
  250. // add the extra ones for searching
  251. v_sURL += URIEncode("filter",sFilter);
  252. v_sURL += URIEncode("filter_type", sFilterType);
  253. v_sURL += URIEncode("case_sensitive", sCaseSensitive);
  254. v_sURL += URIEncode("search_descendants", sSearchDescendants);
  255. return v_sURL;
  256. }
  257. function doMemberRequest(request)
  258. {
  259. var url = "b_action=xts.run";
  260. url += URIEncode("m", "/ags/async/asyncConv.xts");
  261. url += URIEncode("buildRequestXTS","/ags/async/metadataRequest.xts");
  262. url += URIEncode("buildResponseXTS","/ags/async/metadataResponse.xts");
  263. // force SOAPFault for passport expire instead of getting a logon page
  264. url += URIEncode("forceSOAPFault","false");
  265. // have to always give the limits for members from package configuration
  266. url += URIEncode("memberDisplayCountDefault",""+cfgGet("memberDisplayCountDefault"));
  267. url += URIEncode("memberDisplayCountLimit",""+cfgGet("memberDisplayCountLimit"));
  268. url += URIEncode("memberRequest","true");
  269. url += request;
  270. if (cafContextId != "") {
  271. url += URIEncode("cafcontextid",cafContextId);
  272. }
  273. try{
  274. // send off the resquest
  275. sendDispatcherRequestWithXMLTextResponse(url, memberXMLTextResponse);
  276. }catch(ex){
  277. applicationActionManager.httpStop();
  278. }
  279. }
  280. function doMetadataRequest(request)
  281. {
  282. var url = "b_action=xts.run";
  283. url += URIEncode("m", "/ags/async/asyncConv.xts");
  284. url += URIEncode("buildRequestXTS","/ags/async/metadataRequest.xts");
  285. url += URIEncode("buildResponseXTS","/ags/async/metadataResponse.xts");
  286. // force off SOAPFault for passport expire so we get an xml logon page.
  287. url += URIEncode("forceSOAPFault","false");
  288. url += request;
  289. if (cafContextId != "") {
  290. url += URIEncode("cafcontextid",cafContextId);
  291. }
  292. try{
  293. // send off the resquest
  294. sendDispatcherRequestWithXMLTextResponse(url, metadataXMLTextResponse);
  295. }catch(ex){
  296. applicationActionManager.httpStop();
  297. }
  298. }
  299. function promptMetadataResponse(parameters, response, conversation, clientContext, tracking)
  300. {
  301. if (response == "Cancel" || response == "Error")
  302. {
  303. // this is reasonable in this instance - we wouldn't be able to load the metadata tree
  304. // if we cancel out.
  305. closeAGS();
  306. }
  307. else
  308. {
  309. //re write any parameterValues saved
  310. saveParameterValues(parameters);
  311. // send the context and the final response from prompts back
  312. var request = getMetadataRequestString()
  313. request += URIEncode("context", clientContext);
  314. request += URIEncode("promptResponse", response);
  315. request += URIEncode("disp_trackingInfo", tracking);
  316. // hide the dialog frame
  317. showDialogFrame(0);
  318. doSetPopUpClosureFlag();
  319. // resubmit the request
  320. setTimeout("doMetadataRequest('" + request + "');", 100);
  321. }
  322. }
  323. function promptMemberResponse(parameters, response, conversation, clientContext, tracking)
  324. {
  325. if (response == "Cancel" || response == "Error")
  326. {
  327. // this is reasonable in this instance - we wouldn't be able to load the metadata tree
  328. // if we cancel out.
  329. closeAGS();
  330. }
  331. else
  332. {
  333. //re write any parameterValues saved
  334. saveParameterValues(parameters);
  335. // send the context and the final response from prompts back
  336. var request = getMemberRequestString()
  337. request += URIEncode("context", clientContext);
  338. request += URIEncode("promptResponse", response);
  339. request += URIEncode("disp_trackingInfo", tracking);
  340. // hide the dialog frame
  341. showDialogFrame(0);
  342. doSetPopUpClosureFlag();
  343. // resubmit the request
  344. setTimeout("doMemberRequest('" + request + "');", 100);
  345. }
  346. }
  347. // add the command to load the nodes to the stack
  348. function addTomdtStack()
  349. {
  350. var treeCommand = getCommandStackManager().createCommandStack("checkmdtPassportStatus()");
  351. var currentStack = getCommandStackManager().getCommandStack();
  352. var newStack = currentStack.concat(treeCommand);
  353. getCommandStackManager().setCommandStack(newStack);
  354. }
  355. function memberXMLTextResponse(responseArray)
  356. {
  357. metadataTreeXMLTextResponse(responseArray, true);
  358. }
  359. function metadataXMLTextResponse(responseArray)
  360. {
  361. metadataTreeXMLTextResponse(responseArray, false);
  362. }
  363. function metadataTreeXMLTextResponse(responseArray, bMemberRequest)
  364. {
  365. // get the values returned
  366. var responseXML = responseArray[0];
  367. var responseText = responseArray[1];
  368. var workingRoot = responseXML.getElementsByTagName(ASYNC_WORKING);
  369. var promptingRoot = responseXML.getElementsByTagName(ASYNC_PROMPTING);
  370. var metadataReply = responseXML.getElementsByTagName(METADATA_REPLY);
  371. var httpStop = true;
  372. // the loading nodes should be remembered only if passport has expired
  373. var keeploadingmdtNodes = false;
  374. var parsedResponse = parseResponse(responseXML,responseText);
  375. // decide what we're going to do
  376. //This is a case when getContent in asyncConv faults with either session expiry or
  377. //external logon to a different name space fault.
  378. if (parsedResponse.isLogonFault()) {
  379. getCommandStackManager().getCommandStack().push("reloadMetadataTree(true)");
  380. doPassportExpire(responseXML,null,parsedResponse);
  381. // load the nodes after login succeeds
  382. keeploadingmdtNodes = true;
  383. } else if (parsedResponse.isSoapFault()) {
  384. if (parsedResponse.isCancelledWait()) {
  385. //This was a server cancelled wait. We need to resubmit. This could happen
  386. //if we have a SSO on and we hit an password protected external datasource,
  387. //The dispacther will fire the same request again, in this wait fired twice
  388. //Will cancel conversation if first wait fails. WO1903, WO2338
  389. getCommandStackManager().getCommandStack().push("reloadMetadataTree(true)");
  390. setTimeout("getCommandStackManager().processCommandStack()", 100);
  391. } else {
  392. // we have a fault which is a genuine fault fault
  393. if (bMemberRequest) {
  394. doSOAPFault(responseXML,tidyMemberTree,parsedResponse);
  395. } else {
  396. doSOAPFault(responseXML,tidyMetaDataTree,parsedResponse);
  397. }
  398. }
  399. }
  400. else if (workingRoot.length == 1) {
  401. httpStop = false;
  402. // we have a working response
  403. if (bMemberRequest) {
  404. doWorking(workingRoot[0], "doMemberRequest");
  405. } else {
  406. doWorking(workingRoot[0], "doMetadataRequest");
  407. }
  408. }
  409. else if (promptingRoot.length == 1) {
  410. if (bMemberRequest) {
  411. // are we prompting - promptMemberResponse
  412. doPrompting(promptingRoot[0], 5);
  413. } else {
  414. // are we prompting - promptMetadataResponse
  415. doPrompting(promptingRoot[0], 6);
  416. }
  417. }
  418. else if (metadataReply.length == 1) {
  419. // we have the actually information
  420. // clear the response
  421. response = "";
  422. buildMetadata(metadataReply[0]);
  423. }
  424. else {
  425. tidyMetaDataTree();
  426. if (parsedResponse.isHTML() && !parsedResponse.isEmptyBody()) {
  427. // check the text response to see if we got a html page back in the response
  428. doHTMLResponse(responseText);
  429. } else {
  430. // none of the above - we really don't know what happened.
  431. alert(asyncMetadataError_string);
  432. }
  433. }
  434. if(httpStop){
  435. applicationActionManager.httpStop();
  436. }
  437. if (keeploadingmdtNodes == false) {
  438. //empty the array
  439. loadingmdtNodes.splice(0, loadingmdtNodes.length);
  440. }
  441. }
  442. function buildMetadata(response)
  443. {
  444. var metadataObjects = response.childNodes;
  445. var activeNodeName;
  446. var isStartUp = false;
  447. try {
  448. for (var i = 0; i < metadataObjects.length; i++)
  449. {
  450. if (metadataObjects[i].childNodes.length > 0)
  451. {
  452. if (i == 0)
  453. {
  454. var metaObj = metadataObjects[0].childNodes;
  455. activeNodeName = getTextNodeValue(metaObj[0]);
  456. var decimalSeparator = getTextNodeValue(metaObj[1]);
  457. var listSeparator = getTextNodeValue(metaObj[2]);
  458. // want to maintain the decimal and list separator
  459. cfgSet("decimalSeparator", decimalSeparator);
  460. cfgSet("listSeparator", listSeparator);
  461. }
  462. else if (i == 1)
  463. {
  464. if (cfgGet("META_TreeLoadedFirstTime") == "loading")
  465. {
  466. var metaObj = metadataObjects[i].childNodes;
  467. var metadataModelName = getTextNodeValue(metaObj[0]);
  468. var metadataModelScreentip = getTextNodeValue(metaObj[1]);
  469. metadataTree.getRootNode().setName(metadataModelName);
  470. metadataTree.setRootNodeType(tntModelRoot);
  471. metadataTree.setRootNodeShowing(true);
  472. if (metadataModelScreentip != "")
  473. metadataTree.getRootNode().setTooltip(metadataModelScreentip);
  474. metadataTree.drawAll();
  475. isStartUp = true;
  476. }
  477. else
  478. continue;
  479. }
  480. else
  481. createNewMetaObject(metadataObjects[i], activeNodeName);
  482. }
  483. }
  484. var thisNode = activeNodeFetches[activeNodeName];
  485. thisNode.getTree().childrenReadyForNode(thisNode);
  486. delete activeNodeFetches[activeNodeName];
  487. cfgSet("META_TreeLoadedFirstTime", true);
  488. }
  489. catch (ex) {
  490. console.error(ex);
  491. applicationActionManager.httpStop();
  492. }
  493. if(isStartUp){
  494. setTimeout("getCommandStackManager().processCommandStack()", 100);
  495. }
  496. return true;
  497. }
  498. function getTextNodeValue(obj)
  499. {
  500. var text_data = "";
  501. if(obj && obj.childNodes){
  502. for(var i = 0; i < obj.childNodes.length; i++){
  503. text_data += obj.childNodes[i].data;
  504. }
  505. }
  506. return text_data;
  507. }
  508. function URIEncode(name, value)
  509. {
  510. return (value) ? "&" + encodeURIComponent(name) + "=" + encodeURIComponent(value) : "";
  511. }
  512. function createNewMetaObject(metaStr, activeNodeName)
  513. {
  514. var newNode;
  515. var newObj;
  516. // convert all the items out of XML mode
  517. var metaObj = new Array();
  518. for (var i = 0; i < metaStr.childNodes.length; i++) {
  519. metaObj[i] = getTextNodeValue(metaStr.childNodes[i]);
  520. }
  521. var path = metaObj[3];
  522. switch (metaObj[0])
  523. {
  524. case K_sQUERYSUBJECT:
  525. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  526. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntQuerySubject, false, metaObj[1], newObj, false);
  527. break;
  528. case K_sHIERARCHY:
  529. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  530. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntHeirarchy, false, metaObj[1], newObj, false);
  531. break;
  532. case K_sDIMENSION:
  533. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  534. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntDimension, false, metaObj[1], newObj, false);
  535. break;
  536. case K_sFILTER:
  537. newObj = new mdFilter(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  538. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntFilter, false, metaObj[1], newObj, false);
  539. break;
  540. case K_sMEASUREDIMENSION:
  541. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  542. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntMeasureDimension, false, metaObj[1], newObj, false);
  543. break;
  544. case K_sMEASURE_FOLDER:
  545. case K_sHIERARCHY_FOLDER:
  546. case K_sQUERYITEMFOLDER:
  547. case K_sFOLDER:
  548. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  549. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntFolder, false, metaObj[1], newObj, false);
  550. break;
  551. case K_sNAMESPACE:
  552. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  553. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntNamespace, false, metaObj[1], newObj, false);
  554. break;
  555. case K_sCALCULATION:
  556. newObj = new mdCalculation(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  557. if (metaObj[6] == 'fact')
  558. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntCalculationFact, false, metaObj[1], newObj, false);
  559. else if(metaObj[6] == 'identifier')
  560. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntCalculationDimension, false, metaObj[1], newObj, false);
  561. else
  562. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntCalculationAttribute, false, metaObj[1], newObj, false);
  563. break;
  564. case K_sCALCULATIONCONSTANT:
  565. newObj = new mdCalculation(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  566. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntCalculationConstant, false, metaObj[1], newObj, false);
  567. cfgSetAt("calcConstants", cfgSize("calcConstants"), new Array(metaObj[1], path, metaObj[5]));
  568. break;
  569. case K_sMEASURE:
  570. newObj = new mdQueryItem(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  571. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntMeasure, false, metaObj[1], newObj, false);
  572. break;
  573. case K_sROLLUPMEASURE:
  574. newObj = new mdQueryItem(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  575. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntRollupMeasure, false, metaObj[1], newObj, false);
  576. break;
  577. case K_sNAMEDSET:
  578. newObj = new mdQueryItem(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  579. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntNamedSet, false, metaObj[1], newObj, false);
  580. break;
  581. case K_sLEVEL:
  582. newObj = new mdQueryItem(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  583. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntLevel, false, metaObj[1], newObj, false);
  584. break;
  585. case K_sQUERYITEM:
  586. newObj = new mdQueryItem(metaObj[1], path, metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[9], metaObj[10], metaObj[11], metaObj[12], metaObj[13], metaObj[14], metaObj[0]);
  587. if (metaObj[6] == 'fact')
  588. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntQueryItemFact, false, metaObj[1], newObj, false);
  589. else if (metaObj[6] == 'identifier')
  590. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntQueryItemIdentifier, false, metaObj[1], newObj, false);
  591. else
  592. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntQueryItem, false, metaObj[1], newObj, false);
  593. break;
  594. case K_sMEMBER:
  595. newObj = new mdMember(metaObj[1], metaObj[2], metaObj[3], metaObj[4], metaObj[5], metaObj[6], metaObj[7], metaObj[8], metaObj[0]);
  596. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntMember, false, metaObj[6], newObj, false);
  597. break;
  598. case K_sMEMBER_FOLDER:
  599. newObj = new mdFolder(metaObj[1], path, metaObj[4], metaObj[5], metaObj[0]);
  600. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntMemberFolder, false, metaObj[1], newObj, false);
  601. break;
  602. case K_sMEMBER_SEARCH:
  603. newObj = new mdSearch(path, metaObj[0]);
  604. newNode = new CTreeNode(activeNodeFetches[activeNodeName], tntMemberSearch, false, metaObj[1], newObj, false);
  605. break;
  606. default:
  607. //alert("I don't know what this is: " + metaObj[0]);
  608. return false;
  609. }
  610. newNode.setTooltip(metaObj[2]);
  611. }
  612. function metadataFault(metaFaultObjects)
  613. {
  614. if ((typeof metaFaultObjects == "string") && (metaFaultObjects.indexOf("<HTML>") > -1) && (metaFaultObjects.indexOf("<ERROR_COMPONENT>") > -1) && (metaFaultObjects.indexOf("<ERROR_CODE>") > -1))
  615. {
  616. document.getElementById("metadataTree").innerHTML = metaFaultObjects;
  617. return;
  618. }
  619. metadataErrors = new Array();
  620. for (var i = 0; i < metaFaultObjects.length; i++)
  621. {
  622. metadataErrors[metadataErrors.length] = metaFaultObjects[i].replace(/&apos;/g,"'");
  623. }
  624. setTimeout("MAErrorPage()", 100);
  625. }
  626. // push the loading node into the array of loading nodes
  627. function pushAndLoadmdtNode(loadingNode)
  628. {
  629. loadingmdtNodes.push(loadingNode);
  630. loadFunc(loadingNode);
  631. }
  632. function loadFunc(loadingNode)
  633. {
  634. var startAtPath = "";
  635. var context = loadingNode.getValue();
  636. var v_bMemberRequest = false;
  637. if (loadingNode.getValue() != "root") {
  638. // we have a folder type
  639. startAtPath = loadingNode.getValue().path;
  640. context = loadingNode.getValue().path;
  641. }
  642. v_bMemberRequest = loadingNode.getNodeTypeObject().m_oProps.getMemberRequestFlag();
  643. // only want to explode levels to another depth - in order to get the role fields.
  644. var depth = 2;
  645. if (loadingNode.getValue().type == "level") {
  646. depth = 3;
  647. }
  648. if (cfgGet("META_TreeLoadedFirstTime") == null)
  649. {
  650. cfgSet("META_TreeLoadedFirstTime", "loading");
  651. activeNodeFetches[loadingNode.getValue()] = loadingNode;
  652. if (v_bMemberRequest) {
  653. // we're doing a member request
  654. var req = getMemberRequestString(cfgGet("cmLastModel"), startAtPath, context);
  655. applicationActionManager.httpStart();
  656. doMemberRequest(req);
  657. } else {
  658. var req = getMetadataRequestString(cfgGet("cmLastModel"), startAtPath, depth, context);
  659. applicationActionManager.httpStart();
  660. doMetadataRequest(req);
  661. }
  662. }
  663. else if (cfgGet("META_TreeLoadedFirstTime") != "loading" )
  664. {
  665. activeNodeFetches[loadingNode.getValue().path] = loadingNode;
  666. if (v_bMemberRequest) {
  667. // we're doing a member request
  668. var req = getMemberRequestString(cfgGet("cmLastModel"), startAtPath, context);
  669. applicationActionManager.httpStart();
  670. doMemberRequest(req);
  671. } else {
  672. var req = getMetadataRequestString(cfgGet("cmLastModel"), startAtPath, depth, context);
  673. applicationActionManager.httpStart();
  674. doMetadataRequest(req);
  675. }
  676. }
  677. }
  678. // if no node is to be loaded, tidyup the tree otherwise load the nodes
  679. function checkmdtPassportStatus() {
  680. // no node is in the load mode
  681. if (loadingmdtNodes.length < 1 ) {
  682. tidyMetaDataTree();
  683. } else {
  684. // load all the nodes waiting to be loaded
  685. while (loadingmdtNodes.length > 0) {
  686. var theLoadingNode = loadingmdtNodes.pop();
  687. loadFunc(theLoadingNode);
  688. }
  689. }
  690. }
  691. function tidyMemberTree()
  692. {
  693. removeTreeRendering('memberTreeContainer');
  694. // remove the member tree
  695. memberTree = null;
  696. }
  697. function tidyMetaDataTree() {
  698. //Go through all nodes that are active
  699. //and set loading to false and then colapse tree.
  700. for (i in activeNodeFetches) {
  701. var theNode = activeNodeFetches[i];
  702. if (theNode.getNodeType() == TREE_ROOT) {
  703. //Resets the tree so when tabs change it will
  704. //attempt a reload.
  705. resetMetadataTree();
  706. var treeContainer = document.getElementById("metadataTreeContainer");
  707. if (treeContainer) {
  708. var html = '<a href="#" class="menuItem_normal" onclick="refreshMetaDataTree()">' + refresh_string + '</a>';
  709. treeContainer.innerHTML = html;
  710. }
  711. } else {
  712. var theNodeRef = theNode.getTree().getName() + theNode.getTreeRef();
  713. theNode.setLoading(false);
  714. theNode.getTree().setLoading(false);
  715. if (theNode.getShowUI())
  716. theNode.getTree().removeLoading(theNode);
  717. theNode.setCanHaveChildren(true);
  718. theNode.setOpen(false);
  719. delete activeNodeFetches[i];
  720. theNode.getTree().redrawNodeToggle(theNode, theNodeRef);
  721. theNode.getTree().redraw();
  722. }
  723. }
  724. }
  725. function onDragStartF(evt)
  726. {
  727. //get the event in a cross-browser fashion
  728. evt = (evt) ? evt : ((event) ? event : null);
  729. // clear out the dataTransfer text - which is added in by
  730. // PRMT - with text which defines which items are being dragged.
  731. // We have a different method - and the text get's dragging into
  732. // non-drop zones which is very annoying.
  733. evt.dataTransfer.setData("Text","");
  734. // build all the selected nodes
  735. var nodesHolder = new SelectedNodesHolder();
  736. // This is to prevent dragging items table in the selection
  737. if (nodesHolder.selectedNodes.droppable.length > 0) {
  738. showDragToolTip(nodesHolder.toolTip, evt);
  739. cfgSet("selectedTreeNodes",nodesHolder);
  740. }
  741. }
  742. function onDragF(evt)
  743. {
  744. var dtt = document.getElementById('dragToolTip');
  745. if (dtt && dtt.style)
  746. {
  747. dtt.style.left = (event.clientX + 20) + "px";
  748. dtt.style.top = event.clientY + "px";
  749. }
  750. }
  751. function onDragEndF(evt)
  752. {
  753. var dtt = document.getElementById('dragToolTip');
  754. if (dtt && dtt.style)
  755. {
  756. dtt.style.display = "none";
  757. }
  758. //flag that we have ended the drag.
  759. cfgRemove("selectedTreeNodes");
  760. }
  761. function showDragToolTip(arr, event)
  762. {
  763. var htmlOUT = "";
  764. for (var i in arr) {
  765. var iconArr = arr[i];
  766. htmlOUT += "<div class=\"clsTooltipTable\">";
  767. htmlOUT += "<nobr>";
  768. htmlOUT += "<span>";
  769. htmlOUT += "<img src=\"" + iconArr[0] + "\" align=\"middle\"/>";
  770. if (iconArr[1] != null) {
  771. htmlOUT += "<span style=\"padding-left: 3px\">";
  772. htmlOUT += "<img src=\"" + iconArr[1] + "\" align=\"middle\"/>";
  773. htmlOUT += "</span>";
  774. }
  775. htmlOUT += "<span style=\"vertical-align:middle;padding-left:3px;\">" + i + "</span>";
  776. htmlOUT += "</span>";
  777. htmlOUT += "</nobr>";
  778. htmlOUT += "</div>";
  779. }
  780. var dtt = document.getElementById("dragToolTip");
  781. if (dtt && dtt.style)
  782. {
  783. dtt.innerHTML = htmlOUT;
  784. dtt.style.zIndex = 100;
  785. dtt.style.position = "absolute";
  786. dtt.style.left = (event.clientX + 20) + "px";
  787. dtt.style.top = event.clientY + "px";
  788. dtt.style.display = "inline";
  789. }
  790. }
  791. function MAErrorPage()
  792. {
  793. dlgReset();
  794. //this is in cmd
  795. initialiseDialog();
  796. dlgSetParm("m", "/ags/maError.xts");
  797. dlgSubmit("popUpFrame");
  798. }
  799. function addSelectedDblClick(evt)
  800. {
  801. insertStartMC(undefined, evt);
  802. }
  803. function getTreeNodeObjectIcon(leafNode)
  804. {
  805. return leafNode.m_sIconSrc;
  806. }
  807. function getTreeNodeIndicatorIcon(leafNode)
  808. {
  809. var ret_value = null;
  810. if (leafNode.getIndicator) {
  811. ret_value = leafNode.getIndicator();
  812. }
  813. return ret_value;
  814. }
  815. function insertStartMC(id, evt)
  816. {
  817. var frame = getFrame(dropFrame);
  818. if(!frame)return;
  819. var uiNode = null;
  820. //Build the object holding list of selected tree nodes.
  821. var nodesHolder = new SelectedNodesHolder();
  822. // need to save the id of the item we're dropping into and also need to prevent inserting
  823. // items floder into the selection
  824. if (frame && (frame.droppy != null && frame.droppy != 'undefined') && (nodesHolder.selectedNodes.insertable.length > 0 || nodesHolder.selectedNodes.droppable.length > 0)) {
  825. //Set it.
  826. cfgSet("selectedTreeNodes",nodesHolder);
  827. frame.droppy.handleInsert(id);
  828. //We are done remove it.
  829. cfgRemove("selectedTreeNodes");
  830. }
  831. // useless code
  832. /*
  833. else if (evt != null){
  834. var uiNode = getUINode(evt);
  835. var uiNodeTreeRef = uiNode.getAttribute('treeRef').toString();
  836. var treeRef = uiNode.getAttribute('tree').toString();
  837. var newToggleIcon = document.getElementById(treeRef + uiNodeTreeRef + "toggle");
  838. toggle(null,newToggleIcon);
  839. }
  840. */
  841. }
  842. function getSelectedTree()
  843. {
  844. // check to see if we have a selectedTree
  845. var selectedTreeObj = null;
  846. // determine the tree from which tree is visible
  847. var visibleTree = cfgGet("lastMenu");
  848. // pick the tree
  849. if (visibleTree == TAB_MODEL) {
  850. selectedTreeObj = metadataTree;
  851. } else if (visibleTree == TAB_FUNCTIONS) {
  852. selectedTreeObj = functionsTree;
  853. } else if (visibleTree == TAB_DATAITEMS) {
  854. selectedTreeObj = agentItemsTree;
  855. } else if (visibleTree == TAB_PARAMETERS) {
  856. selectedTreeObj = agentParameterTree;
  857. } else if (visibleTree == TAB_HISTORY) {
  858. selectedTreeObj = historyTree;
  859. } else if (visibleTree == TAB_MEMBERS) {
  860. selectedTreeObj = memberTree;
  861. }
  862. return selectedTreeObj;
  863. }
  864. function dataItemSingleSelection()
  865. {
  866. result = false;
  867. var holder = new SelectedNodesHolder();
  868. if (!holder.containsFunctions && !holder.containsParams) {
  869. result = holder.droppableNodes.length == 1;
  870. }
  871. return result;
  872. }
  873. function metadataSelectedQueryItems() {
  874. var selectedNodes = new SelectedNodesHolder().droppableNodes;
  875. var result = new Array();
  876. for (var i=0;i < selectedNodes.length;i++) {
  877. result.push(selectedNodes[i].getValue());
  878. }
  879. return result;
  880. }
  881. function getSelectedTreeNodes()
  882. {
  883. var items = new Object();
  884. var toolTipArray = new Array();
  885. //Those are just like accessor arrays
  886. //to make life a bit simpler.
  887. //You can always use the all and
  888. //check for properties yourself.
  889. items["all"] = new Array();
  890. items["insertable"] = new Array();
  891. items["droppable"] = new Array();
  892. items["toolTip"] = new Object();
  893. items["containsFunctions"] = false;
  894. items["containsParams"] = false;
  895. items["containsHistory"] = false;
  896. var tree = getSelectedTree();
  897. var visibleTree = cfgGet("lastMenu");
  898. var canUseNodes = true;
  899. // pick the tree
  900. if (visibleTree == TAB_MODEL || visibleTree == TAB_DATAITEMS) {
  901. canUseNodes = !cfgGet("isCurrentFailureTask") || isDialogFrameShowing();
  902. }
  903. // pick the tree
  904. if (visibleTree == TAB_FUNCTIONS) {
  905. items["containsFunctions"] = true;
  906. canUseNodes = !cfgGet("isCurrentFailureTask") || isDialogFrameShowing();;
  907. }
  908. // pick the tree
  909. if (visibleTree == TAB_PARAMETERS) {
  910. items["containsParams"] = true;
  911. canUseNodes = !cfgGet("isCurrentFailureTask") || isDialogFrameShowing();;
  912. }
  913. // pick the tree
  914. if (visibleTree == TAB_HISTORY) {
  915. items["containsHistory"] = true;
  916. canUseNodes = cfgGet("isCurrentFailureTask") && !isDialogFrameShowing();
  917. }
  918. if (tree && tree != 'undefined' && canUseNodes ) {
  919. var allSelectedLeafNodes = tree.getSelectionOrder();
  920. for (var i = 0; i < allSelectedLeafNodes.length; i++)
  921. {
  922. var nodeObj = allSelectedLeafNodes[i];
  923. var nodeType = nodeObj.getNodeType();
  924. var nodeTypeObject = nodeObj.getNodeTypeObject();
  925. //Filter the nodes.
  926. if (nodeTypeObject.m_oProps.isDroppable() && nodeTypeObject.m_oProps.isAgentItemsInsertable()) {
  927. items["insertable"].push(nodeObj);
  928. }
  929. //Filter the droppable
  930. if (nodeTypeObject.m_oProps.isDroppable()) {
  931. items["droppable"].push(nodeObj);
  932. //Set the tool tip aray now.
  933. items["toolTip"][nodeObj.getName()] = new Array(getTreeNodeObjectIcon(nodeTypeObject), getTreeNodeIndicatorIcon(nodeObj));
  934. }
  935. items["all"].push(nodeObj);
  936. }
  937. }
  938. // return all the items
  939. return items;
  940. }
  941. function SelectedNodesHolder() {
  942. this.selectedNodes = getSelectedTreeNodes();
  943. this.toolTip = this.selectedNodes["toolTip"];
  944. this.insertableNodes = this.selectedNodes["insertable"];
  945. this.droppableNodes = this.selectedNodes["droppable"];
  946. this.allNodes = this.selectedNodes["all"];
  947. this.containsFunctions = this.selectedNodes["containsFunctions"];
  948. this.containsParams = this.selectedNodes["containsParams"];
  949. this.containsHistory = this.selectedNodes["containsHistory"];
  950. }