Tree.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| BI and PM: prmt
  5. *| (C) Copyright IBM Corp. 2002, 2018
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. /**
  13. @private
  14. @class
  15. */
  16. cognos.Prompt.Control.Tree = cognos.Prompt.Control.f_extend({
  17. f_initialize: function( v_oProps ) {
  18. this._type_ = "cognos.Prompt.Control.Tree";
  19. this.f_parent( v_oProps ); // call parent's initialize()
  20. this.f_initCompleted();
  21. },
  22. checkData: function() {
  23. var v_oTree = this.f_getTree();
  24. if ( !v_oTree ) {
  25. this.m_bValid = ( this["@required"] ? false : true );
  26. } else {
  27. this.f_getPV();
  28. if (( (!this.isRequired() || v_oTree.getRootNode().hasSelectedChildren() ) && v_oTree.checkDefaultValid() ) || v_oTree.getPreviousSelections() !== null ) {
  29. this.m_bValid = true;
  30. }
  31. else {
  32. this.m_bValid = false;
  33. }
  34. }
  35. this.f_parent(); // call parent's checkData
  36. return this.m_bValid;
  37. },
  38. clearValues: function() {
  39. this.f_parent();
  40. this.f_getTree().deSelectAll();
  41. },
  42. f_drawCompleted: function()
  43. {
  44. var v_oTree = null;
  45. this.m_elPrompt = $( this.f_getId("treePane") );
  46. if (this.isRequired()) {
  47. this.setAriaRequired();
  48. }
  49. var b_iOS = ( navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false );
  50. if(!b_iOS){
  51. v_oTree = window[ this.f_getId("CTree_") ] = new CInnerTree (
  52. $( this.f_getId("PRMT_TREE_CONTAINER_") ),
  53. $( this.f_getId("_TreeSubmit") ) ,
  54. this.isRequired(),
  55. this.isMulti(),
  56. this.f_getId("CTree_"),
  57. null,
  58. null,
  59. this.f_getCVId(),
  60. this["@style"],
  61. this["@contentTextDirection"],
  62. this.getName(),
  63. this);
  64. } else
  65. {
  66. v_oTree = window[ this.f_getId("CTree_") ] = new CInnerTreeIOS (
  67. $( this.f_getId("PRMT_TREE_CONTAINER_") ),
  68. $( this.f_getId("_TreeSubmit") ) ,
  69. this.isRequired(),
  70. this.isMulti(),
  71. this.f_getId("CTree_"),
  72. null,
  73. null,
  74. this.f_getCVId(),
  75. this["@style"],
  76. this["@contentTextDirection"],
  77. this.getName(),
  78. this);
  79. }
  80. var v_aRO = this.f_getCV().repromptObserverArray;
  81. if (v_aRO) {
  82. v_aRO.push( v_oTree );
  83. }
  84. var v_oRootNode = v_oTree.getRootNode();
  85. v_oTree.setWrapper( this );
  86. v_oTree.setMustChangeDefaultValue( this["@mustChangeDefault"] );
  87. v_oTree.setHideAdornments( this["@hideAdornments"] );
  88. v_oTree.setHideOuterTable( true );
  89. v_oTree.setPromptingTree( this["@parameter"] );
  90. if ( this["@rowsPerPage"] )
  91. {
  92. v_oTree.setMaxValueCount( parseInt(this["@rowsPerPage"], 10) );
  93. }
  94. if ( this["@showPreviousValues"] )
  95. {
  96. v_oTree.setShowPreviousValues( this["@showPreviousValues"] );
  97. }
  98. var v_sWidth = cssParser( this["@style"], "width", true );
  99. if ( v_sWidth )
  100. {
  101. v_oTree.setContainerWidth( v_sWidth );
  102. }
  103. var v_sHeight = cssParser( this["@style"], "height", true );
  104. if ( v_sHeight )
  105. {
  106. v_oTree.setContainerHeight( v_sHeight );
  107. }
  108. if ( this[K_PRMT_sATTR_DISABLED] )
  109. {
  110. v_oTree.setDisabled( true );
  111. }
  112. if (typeof tntGeneric == K_PRMT_sUNDEFINED)
  113. {
  114. tntGeneric = new CTreeNodeType(TREE_FOLDER, true, this.m_sSkin + "/prompting/images/genericTreeNode.gif", this.m_sSkin + "/prompting/images/genericTreeNode.gif");
  115. }
  116. var v_oSO = null;
  117. var v_oSC = this.getSelectChoices();
  118. if ( v_oSC && v_oSC.c && v_oSC.c.length > 0)
  119. {
  120. for ( var v_idx = 0; v_idx < v_oSC.c.length; v_idx++ )
  121. {
  122. v_oSO = v_oSC.c[v_idx];
  123. v_oTree.addToPrevSelArray( v_oSO[K_PRMT_sATTR_USE_VALUE], v_oSO[K_PRMT_sATTR_DISPLAY_VALUE] );
  124. }
  125. }
  126. var v_oSA = {};
  127. var v_nSA = this.f_getChildByTagName( "selectChoicesAncestry" );
  128. if ( v_nSA && v_nSA.c && v_nSA.c.length)
  129. {
  130. for ( var v_idxSA = 0; v_idxSA < v_nSA.c.length; v_idxSA++ )
  131. {
  132. v_oSA[ sDecodeU003( v_nSA.c[v_idxSA][K_PRMT_sATTR_USE_VALUE] ) ] = true;
  133. }
  134. }
  135. v_oTree.m_oAncestry = v_oSA;
  136. var v_aSO = this.getSelectOptions();
  137. if (v_aSO )
  138. {
  139. for ( var v_idx = 0; v_idx < v_aSO.length; v_idx++ )
  140. {
  141. v_oSO = v_aSO[v_idx];
  142. if ( v_oSO.n == "selectTreeOption" )
  143. {
  144. this.f_addNode( v_oRootNode, v_oSO );
  145. }
  146. }
  147. }
  148. v_oSO = this.getChildByName("selectOptions");
  149. if (v_oSO)
  150. {
  151. var v_iSkip = parseInt( v_oSO["@skipValueCount"], 10 );
  152. if ( !isNaN(v_iSkip) && v_iSkip >= 0 )
  153. {
  154. v_oRootNode.setSkipValueCount( v_iSkip );
  155. }
  156. var v_iMVC= parseInt( v_oSO["@maximumValueCount"], 10 );
  157. if ( !isNaN(v_iMVC) && v_iMVC >= 0 )
  158. {
  159. v_oTree.setMaxValueCount( v_iMVC );
  160. }
  161. if ( v_oSO["@moreData"] )
  162. {
  163. v_oRootNode.setMoreData(true);
  164. var theNodeRef = v_oTree.getName() + v_oRootNode.getTreeRef();
  165. setTimeout( v_oTree.drawMoreData.bind(v_oTree, v_oRootNode, theNodeRef), 250 );
  166. }
  167. } else {
  168. this["@canExpand"] = false;
  169. }
  170. v_oTree.setNodesCanHaveChildren( this["@canExpand"] !== false );
  171. if ( !this["@multiSelect"] )
  172. {
  173. v_oTree.setRecursiveSelect(false);
  174. }
  175. v_oTree.drawAll();
  176. v_oTree.updateSelections(v_oTree.getRootNode());
  177. PRMTUtils.f_addEvent( $( this.f_getId("C_TREE_aSelAll") ), "click", v_oTree.selectAll.bind(v_oTree) );
  178. PRMTUtils.f_addEvent( $( this.f_getId("C_TREE_aSelNone") ), "click", v_oTree.deSelectAll.bind(v_oTree) );
  179. if (v_oTree.getSelectionMode() != SINGLE_TREE_SELECTION && (v_oTree.getSelectTreeUI() != CHECKBOX_TREE || v_oTree.getSelectionMode() != DISCONTIGUOUS_TREE_SELECTION) )
  180. {
  181. var v_a = $( this.f_getId("C_TREE_aSelAll") );
  182. if ( v_a )
  183. {
  184. v_a.style.display = K_PRMT_sEMPTY;
  185. }
  186. }
  187. // link a11y label if it exists
  188. var v_a11yLabel = $( this.f_getId("PRMT_LBL_") );
  189. if ( v_a11yLabel ) {
  190. var v_container = $( this.f_getId("CTree_") );
  191. v_container.setAttribute("aria-labelledby", this.f_getId("PRMT_LBL_"));
  192. }
  193. this.m_oTree = v_oTree;
  194. this.f_parent(); // call parent's f_drawCompleted
  195. }
  196. });
  197. /**
  198. See {@link cognos.Prompt.Control.addValues} for more info.
  199. @param {cognos.Value[]}
  200. @return {void}
  201. */
  202. cognos.Prompt.Control.Tree.prototype.addValues = function( v_aValues )
  203. {
  204. var v_oValue;
  205. var v_oTree = this.f_getTree();
  206. if ( this.isMulti() )
  207. {
  208. for (var v_idx = 0; v_idx < v_aValues.length; v_idx++)
  209. {
  210. v_oValue = v_aValues[v_idx];
  211. v_oTree.addToPrevSelArray( v_oValue[K_PRMT_sUSE], v_oValue[K_PRMT_sDISPLAY] )
  212. }
  213. }
  214. else
  215. {
  216. this.clearValues();
  217. if ( v_aValues.length )
  218. {
  219. v_oTree.addToPrevSelArray( v_aValues[0][K_PRMT_sUSE], v_aValues[0][K_PRMT_sDISPLAY] )
  220. }
  221. }
  222. };
  223. /**
  224. @private
  225. @param {CInnerTreeNode} v_nParent
  226. @param {HTMLelement} v_oSO
  227. @return {void}
  228. */
  229. cognos.Prompt.Control.Tree.prototype.f_addNode = function( v_nParent, v_oSO )
  230. {
  231. if ( v_oSO )
  232. {
  233. var v_node = new CInnerTreeNode(v_nParent, tntGeneric, false, v_oSO[K_PRMT_sATTR_DISPLAY_VALUE], v_oSO[K_PRMT_sATTR_USE_VALUE], false);
  234. if ( v_oSO.c && v_oSO.c.length )
  235. {
  236. for (var v_idx = 0; v_idx < v_oSO.c.length; v_idx++)
  237. {
  238. this.f_addNode( v_node, v_oSO.c[v_idx] );
  239. }
  240. }
  241. }
  242. };
  243. /**
  244. Sets the JavaScript references used by custom scripts based on generated code from Blaring and before.
  245. (Custom Scripts Workaround)
  246. @private
  247. @return {void}
  248. */
  249. cognos.Prompt.Control.Tree.prototype.f_CSW_init = function()
  250. {
  251. this.f_CSW_createJSObject( "tree", this.f_getTree() );
  252. };
  253. /**
  254. @private
  255. @param {C_PromptElement} v_el Container.
  256. @return {C_PromptElement}
  257. */
  258. cognos.Prompt.Control.Tree.prototype.f_drawInput = function( v_el )
  259. {
  260. $CE("input", {"type": "hidden", "id": this.f_getId("_TreeSubmit"), "value": this["@defaultDate"]}, v_el );
  261. var v_sClassName = (PRMTUtils.f_isHighContrast()? "clsPromptComponent clsPrompt_a11y":"clsPromptComponent");
  262. var v_oContainer = $CE("div", {"id": this.f_getId("PRMT_TREE_CONTAINER_"), "class":v_sClassName}, v_el);
  263. v_oContainer.f_appendText(K_PRMT_sEMPTY);
  264. return v_oContainer;
  265. };
  266. /**
  267. Renders the layout of the control: position lists, adornments and control inputs.
  268. @private
  269. @param {C_PromptElement} v_trLayout Container for this control.
  270. @return {C_PromptElement}
  271. */
  272. cognos.Prompt.Control.Tree.prototype.f_drawLayout = function( v_trLayout )
  273. {
  274. var v_container = null;
  275. var v_sWidth = cssParser(this["@style"], "width", true);
  276. // set to 100% only if already set to relative size
  277. v_sWidth = ( (/\d%/).test( v_sWidth ) ? "100%" : K_PRMT_sEMPTY );
  278. var v_sWidthInStyle = cssParser( this["@style"], "width" );
  279. if ( this.isMulti() )
  280. {
  281. var v_td1 = $CE( "td", {"width":v_sWidth}, v_trLayout );
  282. var v_tbl = $CE( "table", {"border": K_PRMT_DEBUG_TABLEBORDER, "cellPadding":0, "cellSpacing":0, "role":K_PRMT_ARIA_ROLE_PRESENTATION}, v_td1 );
  283. var v_tbd = $CE( "tbody", {}, v_tbl );
  284. var v_tr = $CE( "tr", {}, v_tbd );
  285. if ( !(this["@hideAdornments"] || this.m_bSkipAdornments) )
  286. {
  287. this.f_drawAdornments( v_tr );
  288. }
  289. var v_td = $CE( "td", {}, v_tr );
  290. if ( v_sWidthInStyle )
  291. {
  292. v_td1.f_setProperty( "width", "100%" );
  293. v_tbl.f_setProperty( "width", "100%" );
  294. v_td.f_setProperty( "width", "100%" );
  295. }
  296. v_container = v_td;
  297. v_tr = $CE( "tr", {}, v_tbd );
  298. var v_sCustomDir = cssParser( this["@style"], "direction", true );
  299. var v_FinalDir = ((v_sCustomDir == "ltr" || v_sCustomDir == "rtl") ? v_sCustomDir : PRMT_BidiUtils.lookupDirection($( this.f_getId(this.m_sDivPrefix) )));
  300. var v_sAlignStyle = ( ( v_FinalDir == "rtl" ) ? "left" : "right");
  301. v_td = $CE( "td", {"colSpan": "2", "align": v_sAlignStyle}, v_tr );
  302. if ( this[K_PRMT_sATTR_DISABLED] )
  303. {
  304. this.drawDisableSelectLink(v_td, v_sAlignStyle);
  305. }
  306. else
  307. {
  308. this.drawSelectLink(v_td, v_sAlignStyle);
  309. }
  310. }
  311. else
  312. {
  313. if ( !(this["@hideAdornments"] || this.m_bSkipAdornments) )
  314. {
  315. this.f_drawAdornments( v_trLayout );
  316. }
  317. v_container = $CE( "td", {}, v_trLayout );
  318. }
  319. if ( !this["@hideOuterTable"] )
  320. {
  321. v_container = $CE( "div", {"id": this.f_getId("treePane"), "class": "clsTreePane pa"}, v_container );
  322. }
  323. var v_sStyle = "";
  324. if ( v_sWidthInStyle )
  325. {
  326. v_sStyle += v_sWidthInStyle;
  327. }
  328. var v_sHeightInStyle = cssParser( this["@style"], "height" );
  329. if ( v_sHeightInStyle )
  330. {
  331. v_sStyle += v_sHeightInStyle;
  332. }
  333. if ( v_sStyle )
  334. {
  335. // Setting padding to 0px because IE and Firefox doesn't have the same box model.
  336. // Width/Height in IE include the padding, not in Firefox (Firefox does it the right way).
  337. // Setting vertical-align to top, for cases where the container is a TD.
  338. v_container.f_setProperty( "style", "vertical-align:top;overflow:auto;padding:0px;" + v_sStyle );
  339. }
  340. return (this.m_elPrompt = this.f_drawInput( v_container ));
  341. };
  342. /**
  343. @private
  344. @return {cognos.Value[]}
  345. */
  346. cognos.Prompt.Control.Tree.prototype.f_getPV = function()
  347. {
  348. var v_oTree = this.f_getTree();
  349. var children = v_oTree.getRootNode().getChildren();
  350. if (children.length > 0)
  351. {
  352. for (var j = 0; j < children.length; j++)
  353. {
  354. v_oTree.processTree(children[j]);
  355. }
  356. }
  357. var v_aPV = [];
  358. this.f_getPVforNodes( v_aPV, v_oTree.getRootNode(), v_oTree.nodesCanHaveChildren() );
  359. var v_aPrevSel = v_oTree.getPreviousSelections();
  360. if (v_aPrevSel != null)
  361. {
  362. // Create a dictionary based on the use value to find duplicates.
  363. var v_dicUseValues = {};
  364. for (var v_idxPV = 0; v_idxPV < v_aPV.length; v_idxPV++)
  365. {
  366. v_dicUseValues[ v_aPV[v_idxPV][K_PRMT_sUSE] ] = v_aPV[v_idxPV][K_PRMT_sDISPLAY];
  367. }
  368. for (var i = 0; i < v_aPrevSel.length; i++)
  369. {
  370. var v_sUse = null;
  371. var v_sDisplay = null;
  372. if (typeof v_aPrevSel[i] == K_PRMT_sSTRING) //deprecated
  373. {
  374. v_sUse = v_aPrevSel[i];
  375. v_sDisplay = v_aPrevSel[i];
  376. }
  377. else if (typeof v_aPrevSel[i] == K_PRMT_sOBJECT)
  378. {
  379. v_sUse = v_aPrevSel[i][1];
  380. v_sDisplay = v_aPrevSel[i][0];
  381. }
  382. // add only if it's not already in the parameter values.
  383. if ( v_sUse !== null && ( v_sDisplay === null || typeof v_sDisplay == K_PRMT_sUNDEFINED || !v_dicUseValues[v_sUse] ) )
  384. {
  385. var v_oPV = {"use": v_sUse};
  386. if ( v_sDisplay !== null && typeof v_sDisplay != K_PRMT_sUNDEFINED )
  387. {
  388. v_oPV[K_PRMT_sDISPLAY] = v_sDisplay;
  389. }
  390. v_aPV.push( v_oPV );
  391. }
  392. }
  393. }
  394. if ( v_aPV.length == 0 )
  395. {
  396. v_aPV = null;
  397. }
  398. else if ( v_aPV.length == 1 )
  399. {
  400. v_aPV = v_aPV[0];
  401. if ( typeof v_aPV[K_PRMT_sUSE] == K_PRMT_sUNDEFINED || v_aPV[K_PRMT_sUSE] === null )
  402. {
  403. v_aPV = null;
  404. }
  405. }
  406. return v_aPV;
  407. };
  408. /**
  409. @private
  410. @param {cognos.Value[]} v_aPV array to use to store values, passed by reference.
  411. @param {HTMLElement} v_nNode
  412. @param {boolean} v_bCanHaveChildren
  413. @return {void}
  414. */
  415. cognos.Prompt.Control.Tree.prototype.f_getPVforNodes = function( v_aPV, v_nNode, v_bCanHaveChildren )
  416. {
  417. if (v_nNode.isSelected())
  418. {
  419. v_aPV.push( {"use": v_nNode.getValue(), "display": v_nNode.getName()} );
  420. this.f_getTree().removeFromPrevSelArray( v_nNode.getValue() );
  421. }
  422. if ( (v_bCanHaveChildren || v_nNode == v_nNode.m_oRoot) && v_nNode.hasSelectedChildren() )
  423. {
  424. var children = v_nNode.getChildren();
  425. if ( children.length > 0 )
  426. {
  427. for (var j = 0; j < children.length; j++)
  428. {
  429. this.f_getPVforNodes( v_aPV, children[j], v_bCanHaveChildren );
  430. }
  431. }
  432. }
  433. };
  434. /**
  435. @private
  436. @return {CInnerTree}
  437. */
  438. cognos.Prompt.Control.Tree.prototype.f_getTree = function()
  439. {
  440. return (this.m_oTree);
  441. };
  442. /**
  443. @private
  444. @return {void}
  445. */
  446. cognos.Prompt.Control.Tree.prototype.f_setSelectChoices = function() {
  447. };
  448. /**
  449. * Small wrapper around f_getPV, returns "false" if f_getPV result array is empty.
  450. *
  451. @private
  452. @return {Boolean}
  453. */
  454. cognos.Prompt.Control.Tree.prototype.hasInputValue = function()
  455. {
  456. var v_aTmp = this.f_getPV();
  457. return (v_aTmp && v_aTmp != null && v_aTmp.length && v_aTmp.length > 0 ? true : false);
  458. };
  459. /**
  460. * Builds the Select All links
  461. *
  462. @private
  463. @param {HTMLElement} v_td : the TD element under which we should create the disabled links (Select All and Deselect All)
  464. @param {string} v_sAlignStyle : indicates if the GUI is mirrored
  465. @return {void}
  466. */
  467. cognos.Prompt.Control.Tree.prototype.drawDisableSelectLink = function(v_td, v_sAlignStyle)
  468. {
  469. if (v_sAlignStyle == "right")
  470. {
  471. var v_span = $CE( "span", {"id": this.f_getId("C_TREE_aSelAll"), "class": "clsLink pl", "style": "margin-right:5px;display:none;text-decoration:underline;color: #CCCCCC" }, v_td );
  472. v_span.f_appendText( this[K_PRMT_LABEL_RESULTS_SELECT_ALL] );
  473. v_span = $CE( "span", { "id": this.f_getId("C_TREE_aSelNone"), "class": "clsLink pl", "style": "text-decoration:underline;color: #CCCCCC" }, v_td );
  474. v_span.f_appendText(this[K_PRMT_LABEL_RESULTS_DESELECT_ALL] );
  475. }
  476. else
  477. {
  478. var v_span = $CE( "span", { "id": this.f_getId("C_TREE_aSelNone"), "class": "clsLink pl", "style": "text-decoration:underline;color: #CCCCCC" }, v_td );
  479. v_span.f_appendText(this[K_PRMT_LABEL_RESULTS_DESELECT_ALL] );
  480. v_span = $CE( "span", {"id": this.f_getId("C_TREE_aSelAll"), "class": "clsLink pl", "style": "margin-left:5px;display:none;text-decoration:underline;color: #CCCCCC" }, v_td );
  481. v_span.f_appendText( this[K_PRMT_LABEL_RESULTS_SELECT_ALL] );
  482. }
  483. };
  484. /**
  485. * Builds the Select All links
  486. *
  487. @private
  488. @param {HTMLElement} v_td : the TD element under which we should create the enabled links (Select All and Deselect All)
  489. @param {string} v_sAlignStyle : indicates if the GUI is mirrored
  490. @return {void}
  491. */
  492. cognos.Prompt.Control.Tree.prototype.drawSelectLink = function(v_td, v_sAlignStyle)
  493. {
  494. if (v_sAlignStyle == "right")
  495. {
  496. var v_a = $CE( "a", {"id": this.f_getId("C_TREE_aSelAll"), "class": "clsLink pl", "href": "javascript:;", "onclick": "document.location.hash='';", "style": "margin-right:5px;display:none;"}, v_td );
  497. v_a.f_appendText(PMT_UIM_SELECTALL);
  498. v_a = $CE( "a", {"id": this.f_getId("C_TREE_aSelNone"), "class": "clsLink pl", "href": "javascript:;", "onclick": "document.location.hash='';"}, v_td );
  499. v_a.f_appendText( this[K_PRMT_LABEL_RESULTS_DESELECT_ALL] );
  500. }
  501. else
  502. {
  503. v_a = $CE( "a", {"id": this.f_getId("C_TREE_aSelNone"), "class": "clsLink pl", "href": "javascript:;", "onclick": "document.location.hash='';"}, v_td );
  504. v_a.f_appendText( this[K_PRMT_LABEL_RESULTS_DESELECT_ALL] );
  505. var v_a = $CE( "a", {"id": this.f_getId("C_TREE_aSelAll"), "class": "clsLink pl", "href": "javascript:;", "onclick": "document.location.hash='';", "style": "margin-left:5px;display:none;"}, v_td );
  506. v_a.f_appendText(PMT_UIM_SELECTALL);
  507. }
  508. };