CFilterExpression.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. **
  4. ** BI and PM: qs
  5. **
  6. ** (C) Copyright IBM Corp. 2001, 2015
  7. **
  8. ** US Government Users Restricted Rights - Use, duplication or
  9. ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *****************************************************************/
  11. // Copyright (C) 2008 Cognos ULC, an IBM Company. All Rights Reserved.
  12. // Cognos and the Cognos logo are trademarks of Cognos ULC (formerly Cognos Incorporated) in the United States and/or other countries. IBM and the IBM logo are trademarks of International Business Machines Corporation in the United States, or other countries, or both. Other company, product, or service names may be trademarks or service marks of others.
  13. var gsFEslash = '/';
  14. var gsFEspace = ' ';
  15. var gsFElt = '<';
  16. var gsFEgt = '>';
  17. var gsFEquote = '"';
  18. var gsFEequal = '=';
  19. var gsFEtrue = 'true';
  20. var gsFEfalse = 'false';
  21. var gsFE_NODE = "FE";
  22. var gsFE_FROM_NODE = "From";
  23. var gsFE_TO_NODE = "To";
  24. var gsFE_VALUE_NODE = "Value";
  25. var gsFE_ID_ATTR = "id";
  26. var gsFE_USE_ATTR = "use";
  27. var gsFE_DISPLAY_ATTR = "display";
  28. var gsFE_EXCLUSIVE_ATTR = "exclusive";
  29. var gsFE_CLASSNAME_ATTR = "className";
  30. var gsFE_DATATYPE_ATTR = "dataType";
  31. var gsFE_DEFAULT_ATTR = "default";
  32. var gsFE_FILTERTYPE_ATTR = "filterType";
  33. var gsFE_LABEL_ATTR = "label";
  34. var gsFE_NULL_ATTR = "nullOption";
  35. var gsFE_PROMPT_ATTR = "prompt";
  36. var gsFE_REPLACEWITH_ATTR = "replaceWith";
  37. var gsFE_STYLE_ATTR = "style";
  38. var gsFE_FILTERTYPE_ENUM = "enum";
  39. var gsFE_FILTERTYPE_RANGE = "range";
  40. var gsFE_FILTERTYPE_SINGLE = "singleValue";
  41. var gsFE_FILTERTYPE_STARTSWITH = "startsWith";
  42. var gsFE_FILTERTYPE_ENDSWITH = "endsWith";
  43. var gsFE_FILTERTYPE_CONTAINS = "contains";
  44. var gsFE_FILTERTYPE_ISLIKE = "isLike";
  45. var gsFE_FILTERTYPE_DAYS_BEFORE_TODAY = "daysBeforeToday";
  46. var gsFE_FILTERTYPE_TYPEINRANGE = "typeInRange";
  47. var gsFE_FILTERTYPE_EXACTLYMATCHES = "exactlyMatches";
  48. var gsFE_FILTERTYPE_SEARCH = "search";
  49. var gsFE_NULL_EMPTY = "";
  50. var gsFE_NULL_INCLUDE = "include";
  51. var gsFE_NULL_EXCLUDE = "exclude";
  52. var gsFE_NULL_ONLY = "only";
  53. var gsFE_REPLACEWITH_LABEL = "label";
  54. var gsFE_REPLACEWITH_EXPR = "expression";
  55. var gsFE_REPLACEWITH_NULL = "null";
  56. var reFE_FILTERTYPE_VALID = new RegExp('^(|' + [gsFE_FILTERTYPE_ENUM, gsFE_FILTERTYPE_RANGE, gsFE_FILTERTYPE_SINGLE, gsFE_FILTERTYPE_STARTSWITH, gsFE_FILTERTYPE_ENDSWITH, gsFE_FILTERTYPE_CONTAINS, gsFE_FILTERTYPE_ISLIKE, gsFE_FILTERTYPE_DAYS_BEFORE_TODAY, gsFE_FILTERTYPE_TYPEINRANGE, gsFE_FILTERTYPE_EXACTLYMATCHES, gsFE_FILTERTYPE_SEARCH].join('|') + ')$', 'i');
  57. var reFE_REPLACEWITH_VALID = new RegExp('^$(|' + [gsFE_REPLACEWITH_LABEL, gsFE_REPLACEWITH_EXPR, gsFE_REPLACEWITH_NULL].join('|') + ')$', 'i');
  58. var reFE_NODENAME_VALID = new RegExp('^(' + [gsFE_FROM_NODE, gsFE_TO_NODE, gsFE_VALUE_NODE].join('|') + ')$', 'i');
  59. var reFE_NULLOPTION_VALID = new RegExp('^(' + [gsFE_NULL_EMPTY, gsFE_NULL_INCLUDE, gsFE_NULL_EXCLUDE, gsFE_NULL_ONLY].join('|') + ')$', 'i');
  60. function CFilterExpression(sId, aValues, bDefault, sFilterType, sDataType, sNullOption, sClassName, sStyle, sLabel, sReplaceWith, sPrompt, sDataItemName)
  61. {
  62. if (sId && sId.nodeName)
  63. {
  64. this.m_nNode = sId;
  65. }
  66. else
  67. {
  68. this.init(sId, aValues, bDefault, sFilterType, sDataType, sNullOption, sClassName, sStyle, sLabel, sReplaceWith, sPrompt, sDataItemName);
  69. }
  70. return this;
  71. };
  72. function CFilterExpression_init(sId, aValues, bDefault, sFilterType, sDataType, sNullOption, sClassName, sStyle, sLabel, sReplaceWith, sPrompt, sDataItemName)
  73. {
  74. var oDoc = getOrCreateMiniQueryDocument();
  75. var oMQMgr = goApplicationManager.getMiniQueryManager();
  76. this.m_nNode = XMLBuilderCreateElementNS("", "FE", getOrCreateMiniQueryDocument());
  77. if (typeof sId == "string")
  78. {
  79. this.m_nNode.setAttribute("id", sId);
  80. }
  81. if (aValues && typeof aValues == 'object' && aValues.length)
  82. {
  83. for (var idxValue = 0; idxValue < aValues.length; idxValue++)
  84. {
  85. var nValue = XMLBuilderCreateElementNS("", "Value", this.m_nNode.ownerDocument);
  86. nValue.setAttribute("use", aValues[idxValue].getUse());
  87. nValue.setAttribute("display", aValues[idxValue].getDisplay());
  88. this.m_nNode.appendChild(nValue);
  89. }
  90. }
  91. if (bDefault === true || bDefault == gsFEtrue)
  92. {
  93. this.m_nNode.setAttribute("default", "true");
  94. }
  95. if (reFE_FILTERTYPE_VALID.test(sFilterType))
  96. {
  97. this.m_nNode.setAttribute(gsFE_FILTERTYPE_ATTR, sFilterType);
  98. }
  99. if (typeof sDataType == "string")
  100. {
  101. this.m_nNode.setAttribute(gsFE_DATATYPE_ATTR, sDataType);
  102. }
  103. if (reFE_NULLOPTION_VALID.test(sNullOption))
  104. {
  105. this.m_nNode.setAttribute(gsFE_NULL_ATTR, sNullOption);
  106. }
  107. if (typeof sClassName == "string")
  108. {
  109. this.m_nNode.setAttribute(gsFE_CLASSNAME_ATTR, sClassName);
  110. }
  111. if (typeof sStyle == "string")
  112. {
  113. this.m_nNode.setAttribute(gsFE_STYLE_ATTR, sStyle);
  114. }
  115. if (typeof sLabel == "string")
  116. {
  117. this.m_nNode.setAttribute(gsFE_LABEL_ATTR, sLabel);
  118. }
  119. if (reFE_REPLACEWITH_VALID.test(sReplaceWith))
  120. {
  121. this.m_nNode.setAttribute(gsFE_REPLACEWITH_ATTR, sReplaceWith);
  122. }
  123. if (typeof sPrompt == "string")
  124. {
  125. this.m_nNode.setAttribute(gsFE_PROMPT_ATTR, sPrompt);
  126. }
  127. this.m_oFilter = null;
  128. if (typeof sDataItemName == "string")
  129. {
  130. this.m_nNode.setAttribute("ddataItemName", sDataItemName);
  131. }
  132. };
  133. function CFilterExpression_clone()
  134. {
  135. return (new CFilterExpression(this.m_nNode.cloneNode(true)));
  136. };
  137. function CFilterExpression_equals(o)
  138. {
  139. return (this.getXML() == o.getXML());
  140. };
  141. function CFilterExpression_addValue(sUse, sDisplay)
  142. {
  143. this.removeAllNodes(gsFE_FROM_NODE);
  144. this.removeAllNodes(gsFE_TO_NODE);
  145. if (typeof sDisplay !== "string")
  146. {
  147. sDisplay = "";
  148. }
  149. var nValue = XMLBuilderCreateElementNS("", gsFE_VALUE_NODE, this.m_nNode.ownerDocument);
  150. if (sUse instanceof CFilterValue)
  151. {
  152. nValue.setAttribute(gsFE_USE_ATTR, sUse.getUse());
  153. nValue.setAttribute(gsFE_DISPLAY_ATTR, sUse.getDisplay());
  154. }
  155. else
  156. {
  157. nValue.setAttribute(gsFE_USE_ATTR, sUse);
  158. nValue.setAttribute(gsFE_DISPLAY_ATTR, sDisplay);
  159. }
  160. this.m_nNode.appendChild(nValue);
  161. var sPreviousFilterType = this.m_nNode.getAttribute("filterType");
  162. if (! sPreviousFilterType || sPreviousFilterType === "")
  163. {
  164. this.setFilterType(gsFE_FILTERTYPE_ENUM);
  165. }
  166. return (new CFilterValue(nValue));
  167. };
  168. function CFilterExpression_addValues(aValues)
  169. {
  170. if (typeof aValues == 'object' && aValues.length)
  171. {
  172. for (var idxValue = 0; idxValue < aValues.length; idxValue++)
  173. {
  174. this.addValue(aValues[idxValue]);
  175. }
  176. }
  177. };
  178. function CFilterExpression_getFilter()
  179. {
  180. var nFilter = this.m_nNode.parentNode;
  181. while (nFilter && !nFilter.nodeName.match(/^Filter$/i))
  182. {
  183. nFilter = nFilter.parentNode;
  184. }
  185. var oFilter = null;
  186. if (nFilter)
  187. {
  188. oFilter = new CFilter("", nFilter);
  189. }
  190. return oFilter;
  191. };
  192. function CFilterExpression_getPromptDisplayValues()
  193. {
  194. var cf = getConfigFrame();
  195. var oClone = this.clone();
  196. var aPV = getPromptPageParameterValues();
  197. var sPName = "p_" + this.m_sPrompt;
  198. var pv = "";
  199. if (aPV && aPV.length)
  200. {
  201. for (var idxPV = 0; idxPV < aPV.length; ++idxPV)
  202. {
  203. if (aPV[idxPV][0] == sPName)
  204. {
  205. pv = aPV[idxPV][1];
  206. }
  207. }
  208. }
  209. var xmlPV = (typeof XMLParser == 'function' ? XMLParser(pv) : null);
  210. if (xmlPV)
  211. {
  212. var start = xmlPV.findChildByName("start");
  213. var end = xmlPV.findChildByName("end");
  214. var values = xmlPV.getElementsByTagName("selectOption");
  215. if (start || end)
  216. {
  217. if (start)
  218. {
  219. oClone.setFrom(start.getAttribute("useValue"), start.getAttribute("displayValue"));
  220. }
  221. if (end)
  222. {
  223. oClone.setTo(end.getAttribute("useValue"), end.getAttribute("displayValue"));
  224. }
  225. }
  226. else if (values.length)
  227. {
  228. for (var idxValue = 0; idxValue < values.length; idxValue++)
  229. {
  230. oClone.addValue(values[idxValue].getAttribute("useValue"), values[idxValue].getAttribute("displayValue"));
  231. }
  232. }
  233. }
  234. oClone.setPrompt("");
  235. return sXmlDecode(oClone.getText());
  236. };
  237. function CFilterExpression_getText()
  238. {
  239. var oFilter = this.getFilter();
  240. var sText = "";
  241. if (oFilter)
  242. {
  243. sText = oFilter.getText();
  244. }
  245. return sText;
  246. };
  247. function CFilterExpression_getXML()
  248. {
  249. var sXML = "";
  250. if (this.m_nNode.hasChildNodes()
  251. || this.m_nNode.getAttribute("prompt")
  252. || this.isDefault()
  253. || (this.getNullOption() && this.getNullOption().length != 0)
  254. )
  255. {
  256. sXML = XMLBuilderSerializeNode( this.m_nNode );
  257. }
  258. return sXML;
  259. };
  260. function CFilterExpression_removeAllNodes(sNodeName)
  261. {
  262. var aNodes = XMLHelper_FindChildrenByTagName(this.m_nNode, sNodeName, false);
  263. for (var idxNode = 0; idxNode < aNodes.length; idxNode)
  264. {
  265. this.m_nNode.removeChild(aNodes[idxNode]);
  266. }
  267. };
  268. function CFilterExpression_setFrom(sUse, sDisplay, bExclude)
  269. {
  270. this.removeAllNodes(gsFE_VALUE_NODE);
  271. if (!sUse)
  272. {
  273. return;
  274. }
  275. if (typeof sDisplay !== "string")
  276. {
  277. sDisplay = "";
  278. }
  279. var nValue = XMLBuilderCreateElementNS("", gsFE_FROM_NODE, this.m_nNode.ownerDocument);
  280. nValue.setAttribute(gsFE_USE_ATTR, sUse);
  281. nValue.setAttribute(gsFE_DISPLAY_ATTR, sDisplay);
  282. if (bExclude)
  283. {
  284. nValue.setAttribute(gsFE_EXCLUSIVE_ATTR, "true");
  285. }
  286. this.m_nNode.appendChild(nValue);
  287. this.setFilterType(gsFE_FILTERTYPE_RANGE);
  288. };
  289. function CFilterExpression_setTo(sUse, sDisplay, bExclude)
  290. {
  291. this.removeAllNodes(gsFE_VALUE_NODE);
  292. if (!sUse)
  293. {
  294. return;
  295. }
  296. if (typeof sDisplay !== "string")
  297. {
  298. sDisplay = "";
  299. }
  300. var nValue = XMLBuilderCreateElementNS("", gsFE_TO_NODE, this.m_nNode.ownerDocument);
  301. nValue.setAttribute(gsFE_USE_ATTR, sUse);
  302. nValue.setAttribute(gsFE_DISPLAY_ATTR, sDisplay);
  303. if (bExclude)
  304. {
  305. nValue.setAttribute(gsFE_EXCLUSIVE_ATTR, "true");
  306. }
  307. this.m_nNode.appendChild(nValue);
  308. this.setFilterType(gsFE_FILTERTYPE_RANGE);
  309. };
  310. CFilterExpression.prototype.init = CFilterExpression_init;
  311. CFilterExpression.prototype.clone = CFilterExpression_clone;
  312. CFilterExpression.prototype.equals = CFilterExpression_equals;
  313. CFilterExpression.prototype.addValue = CFilterExpression_addValue;
  314. CFilterExpression.prototype.addValues = CFilterExpression_addValues;
  315. CFilterExpression.prototype.getFilter = CFilterExpression_getFilter;
  316. CFilterExpression.prototype.getPromptDisplayValues = CFilterExpression_getPromptDisplayValues;
  317. CFilterExpression.prototype.getText = CFilterExpression_getText;
  318. CFilterExpression.prototype.getXML = CFilterExpression_getXML;
  319. CFilterExpression.prototype.removeAllNodes = CFilterExpression_removeAllNodes;
  320. CFilterExpression.prototype.setFrom = CFilterExpression_setFrom;
  321. CFilterExpression.prototype.setTo = CFilterExpression_setTo;
  322. CFilterExpression.prototype.isDefault = function()
  323. {
  324. return (this.m_nNode.getAttribute(gsFE_DEFAULT_ATTR)=="true");
  325. };
  326. CFilterExpression.prototype.isRange = function()
  327. {
  328. return (this.getFilterType() == gsFE_FILTERTYPE_RANGE);
  329. };
  330. CFilterExpression.prototype.setDefault = function(b)
  331. {
  332. if (b===true||b==gsFEtrue)
  333. {
  334. this.m_nNode.setAttribute(gsFE_DEFAULT_ATTR, "true");
  335. }
  336. else
  337. {
  338. this.m_nNode.removeAttribute(gsFE_DEFAULT_ATTR);
  339. }
  340. };
  341. CFilterExpression.prototype.getNullOption = function()
  342. {
  343. return (this.m_nNode.getAttribute(gsFE_NULL_ATTR));
  344. };
  345. CFilterExpression.prototype.setNullOption = function(s)
  346. {
  347. if (reFE_NULLOPTION_VALID.test(s))
  348. {
  349. this.m_nNode.setAttribute(gsFE_NULL_ATTR, s);
  350. }
  351. else
  352. {
  353. this.m_nNode.removeAttribute(gsFE_NULL_ATTR);
  354. }
  355. };
  356. CFilterExpression.prototype.getClassName = function()
  357. {
  358. return (this.m_nNode.getAttribute(gsFE_CLASSNAME_ATTR));
  359. };
  360. CFilterExpression.prototype.setAttribute = function(sName, sValue)
  361. {
  362. if (sValue)
  363. {
  364. this.m_nNode.setAttribute(sName, sValue);
  365. }
  366. else
  367. {
  368. this.m_nNode.removeAttribute(sName);
  369. }
  370. };
  371. CFilterExpression.prototype.setClassName = function(s)
  372. {
  373. this.setAttribute(gsFE_CLASSNAME_ATTR, s);
  374. };
  375. CFilterExpression.prototype.getDataType = function()
  376. {
  377. return (this.m_nNode.getAttribute(gsFE_DATATYPE_ATTR));
  378. };
  379. CFilterExpression.prototype.setDataType = function(s)
  380. {
  381. this.setAttribute(gsFE_DATATYPE_ATTR, s);
  382. };
  383. CFilterExpression.prototype.getFilterType = function()
  384. {
  385. return (this.m_nNode.getAttribute(gsFE_FILTERTYPE_ATTR));
  386. };
  387. CFilterExpression.prototype.setFilterType = function(s)
  388. {
  389. if (reFE_FILTERTYPE_VALID.test(s))
  390. {
  391. this.m_nNode.setAttribute(gsFE_FILTERTYPE_ATTR, s);
  392. }
  393. };
  394. CFilterExpression.prototype.getId = function()
  395. {
  396. return (this.m_nNode.getAttribute(gsFE_ID_ATTR));
  397. };
  398. CFilterExpression.prototype.setId = function(s)
  399. {
  400. this.setAttribute(gsFE_ID_ATTR, s);
  401. };
  402. CFilterExpression.prototype.getLabel = function()
  403. {
  404. return (this.m_nNode.getAttribute(gsFE_LABEL_ATTR));
  405. };
  406. CFilterExpression.prototype.setLabel = function(s)
  407. {
  408. this.setAttribute(gsFE_LABEL_ATTR, s);
  409. };
  410. CFilterExpression.prototype.getPrompt = function()
  411. {
  412. return (this.m_nNode.getAttribute(gsFE_PROMPT_ATTR));
  413. };
  414. CFilterExpression.prototype.setPrompt = function(s)
  415. {
  416. this.setAttribute(gsFE_PROMPT_ATTR, s);
  417. };
  418. CFilterExpression.prototype.getReplaceWith = function()
  419. {
  420. return (this.m_nNode.getAttribute(gsFE_REPLACEWITH_ATTR));
  421. };
  422. CFilterExpression.prototype.setReplaceWith = function(s)
  423. {
  424. if (reFE_REPLACEWITH_VALID.test(s))
  425. {
  426. this.m_nNode.setAttribute(gsFE_REPLACEWITH_ATTR, s);
  427. }
  428. };
  429. CFilterExpression.prototype.getStyle = function()
  430. {
  431. return (this.m_nNode.getAttribute(gsFE_STYLE_ATTR));
  432. };
  433. CFilterExpression.prototype.setStyle = function(s)
  434. {
  435. this.setAttribute(gsFE_STYLE_ATTR, s);
  436. };
  437. CFilterExpression.prototype.getValues = function()
  438. {
  439. return (this.m_aValues);
  440. };
  441. CFilterExpression.prototype.setValues = function(o)
  442. {
  443. if (typeof o=='object'){this.m_aValues=o;}
  444. };
  445. CFilterExpression.prototype.getDataItemName = function()
  446. {
  447. return (this.m_nNode.getAttribute("dataItemName"));
  448. };
  449. CFilterExpression.prototype.setDataItemName = function(s)
  450. {
  451. this.setAttribute("dataItemName", s);
  452. };
  453. function CFilterValue(sUse, sDisplay, bExclude)
  454. {
  455. this.m_nNode = null;
  456. if (sUse && sUse.nodeName)
  457. {
  458. this.m_nNode = sUse;
  459. }
  460. else
  461. {
  462. var oMQMgr = goApplicationManager.getMiniQueryManager();
  463. this.m_nNode = XMLBuilderCreateElementNS("", "Value", oMQMgr.getDoc());
  464. this.setUse(sUse);
  465. this.setDisplay(sDisplay);
  466. this.setExclusive(bExclude);
  467. }
  468. return this;
  469. };
  470. function CFilterValue_clone()
  471. {
  472. return (new CFilterValue(this.n_nNode.cloneNode(true)));
  473. };
  474. function CFilterValue_equals(o)
  475. {
  476. return (this.getXML() == o.getXML());
  477. };
  478. function CFilterValue_getXML(nodeName)
  479. {
  480. return XMLBuilderSerializeNode( this.m_nNode );
  481. };
  482. CFilterValue.prototype.clone = CFilterValue_clone;
  483. CFilterValue.prototype.equals = CFilterValue_equals;
  484. CFilterValue.prototype.getXML = CFilterValue_getXML;
  485. CFilterValue.prototype.getUse = function()
  486. {
  487. return (this.m_nNode.getAttribute(gsFE_USE_ATTR));
  488. };
  489. CFilterValue.prototype.setUse = function(sUse)
  490. {
  491. this.m_nNode.setAttribute(gsFE_USE_ATTR, (sUse ? sUse : ''));
  492. };
  493. CFilterValue.prototype.getDisplay = function()
  494. {
  495. var sDisplay = this.m_nNode.getAttribute(gsFE_DISPLAY_ATTR);
  496. if (!sDisplay)
  497. {
  498. sDisplay = this.getUse();
  499. }
  500. return (sDisplay);
  501. };
  502. CFilterValue.prototype.setDisplay = function(sDisplay)
  503. {
  504. if (sDisplay)
  505. {
  506. this.m_nNode.setAttribute(gsFE_DISPLAY_ATTR, sDisplay);
  507. }
  508. else
  509. {
  510. this.m_nNode.removeAttribute(gsFE_DISPLAY_ATTR);
  511. }
  512. };
  513. CFilterValue.prototype.getExclusive = function()
  514. {
  515. return (this.m_nNode.getAttribute(gsFE_EXCLUSIVE_ATTR));
  516. };
  517. CFilterValue.prototype.setExclusive = function(bExclude)
  518. {
  519. if (bExclude === true || bExclude == gsFEtrue)
  520. {
  521. this.m_nNode.setAttribute(gsFE_EXCLUSIVE_ATTR, "true");
  522. }
  523. else
  524. {
  525. this.m_nNode.removeAttribute(gsFE_EXCLUSIVE_ATTR);
  526. }
  527. };