PageRenderTime 61ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 1ms

/projects/spring-modules-xt/src/main/js/lib/core/springxt.js

http://github.com/astubbs/spring-modules
JavaScript | 1647 lines | 1408 code | 191 blank | 48 comment | 309 complexity | 0135ef23f2c8cda5d80359858843e19d MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. var XT = {};
  2. XT.version = 20080223;
  3. XT.defaultLoadingElementId = null;
  4. XT.defaultLoadingImage = null;
  5. XT.defaultErrorHandler = null;
  6. XT.doAjaxAction = function(eventId, sourceElement, serverParams, clientParams) {
  7. if (! clientParams) {
  8. clientParams = {};
  9. }
  10. if ((! clientParams.loadingElementId) || (! clientParams.loadingImage)) {
  11. clientParams.loadingElementId = this.defaultLoadingElementId;
  12. clientParams.loadingImage = this.defaultLoadingImage;
  13. }
  14. if (! clientParams.errorHandler) {
  15. clientParams.errorHandler = this.defaultErrorHandler;
  16. }
  17. var ajaxClient = null;
  18. if (clientParams.clearQueryString && clientParams.clearQueryString == true && document.URL.indexOf("?") != -1) {
  19. ajaxClient = new XT.ajax.Client(document.URL.substring(0, document.URL.indexOf("?")));
  20. } else {
  21. ajaxClient = new XT.ajax.Client(document.URL);
  22. }
  23. if (clientParams.formName) {
  24. return ajaxClient.doAjaxAction(eventId, document.forms[clientParams.formName], sourceElement, serverParams, clientParams);
  25. } else if (clientParams.formId) {
  26. return ajaxClient.doAjaxAction(eventId, document.getElementById(clientParams.formId), sourceElement, serverParams, clientParams);
  27. } else {
  28. return ajaxClient.doAjaxAction(eventId, document.forms[0], sourceElement, serverParams, clientParams);
  29. }
  30. };
  31. XT.doAjaxSubmit = function(eventId, sourceElement, serverParams, clientParams) {
  32. if (! clientParams) {
  33. clientParams = {};
  34. }
  35. if ((! clientParams.loadingElementId) || (! clientParams.loadingImage)) {
  36. clientParams.loadingElementId = this.defaultLoadingElementId;
  37. clientParams.loadingImage = this.defaultLoadingImage;
  38. }
  39. if (! clientParams.errorHandler) {
  40. clientParams.errorHandler = this.defaultErrorHandler;
  41. }
  42. var ajaxClient = null;
  43. if (clientParams.clearQueryString && clientParams.clearQueryString == true && document.URL.indexOf("?") != -1) {
  44. ajaxClient = new XT.ajax.Client(document.URL.substring(0, document.URL.indexOf("?")));
  45. } else {
  46. ajaxClient = new XT.ajax.Client(document.URL);
  47. }
  48. if (clientParams.formName) {
  49. return ajaxClient.doAjaxSubmit(eventId, document.forms[clientParams.formName], sourceElement, serverParams, clientParams);
  50. } else if (clientParams.formId) {
  51. return ajaxClient.doAjaxSubmit(eventId, document.getElementById(clientParams.formId), sourceElement, serverParams, clientParams);
  52. } else {
  53. return ajaxClient.doAjaxSubmit(eventId, document.forms[0], sourceElement, serverParams, clientParams);
  54. }
  55. };
  56. XT.ajax = {};
  57. XT.ajax.Client = function(url) {
  58. var requestUrl = url
  59. var ajaxParameter = "ajax-request";
  60. var eventParameter = "event-id";
  61. var elementParameter = "source-element";
  62. var elementIdParameter = "source-element-id";
  63. var jsonParameters = "json-params";
  64. this.doAjaxAction = function(eventId, sourceForm, sourceElement, serverParams, clientParams) {
  65. var ajaxRequestType = "ajax-action";
  66. var queryString = prepareQueryString(ajaxRequestType, eventId, sourceElement, serverParams);
  67. var ajaxRequest = new XT.taconite.AjaxRequest(requestUrl);
  68. configureRequest(ajaxRequest, clientParams);
  69. ajaxRequest.addFormElements(sourceForm);
  70. ajaxRequest.setQueryString(ajaxRequest.getQueryString() + "&" + queryString);
  71. ajaxRequest.sendRequest();
  72. };
  73. this.doAjaxSubmit = function(eventId, sourceForm, sourceElement, serverParams, clientParams) {
  74. var ajaxRequestType = "ajax-submit";
  75. if (clientParams && clientParams.enableUpload && clientParams.enableUpload == true) {
  76. var queryParameters = prepareQueryParameters(ajaxRequestType, eventId, sourceElement, serverParams);
  77. var iframeRequest = new XT.taconite.IFrameRequest(sourceForm, requestUrl, queryParameters);
  78. configureRequest(iframeRequest, clientParams);
  79. iframeRequest.sendRequest();
  80. } else {
  81. var queryString = prepareQueryString(ajaxRequestType, eventId, sourceElement, serverParams);
  82. var ajaxRequest = new XT.taconite.AjaxRequest(requestUrl);
  83. configureRequest(ajaxRequest, clientParams);
  84. ajaxRequest.addFormElements(sourceForm);
  85. ajaxRequest.setQueryString(ajaxRequest.getQueryString() + "&" + queryString);
  86. ajaxRequest.setUsePOST();
  87. ajaxRequest.sendRequest();
  88. }
  89. };
  90. function prepareQueryString(ajaxRequestType, eventId, sourceElement, serverParams) {
  91. var qs = "";
  92. if (ajaxRequestType) {
  93. qs = ajaxParameter + "=" + ajaxRequestType;
  94. }
  95. if (eventId) {
  96. qs = qs + "&" + eventParameter + "=" + eventId;
  97. }
  98. if (sourceElement) {
  99. if (sourceElement.name != null) {
  100. qs = qs + "&" + elementParameter + "=" + sourceElement.name;
  101. }
  102. if (sourceElement.id != null) {
  103. qs = qs + "&" + elementIdParameter + "=" + sourceElement.id;
  104. }
  105. }
  106. if (serverParams) {
  107. qs = qs + "&" + jsonParameters + "=" + encodeURIComponent(JSON.stringify(serverParams));
  108. }
  109. return qs;
  110. };
  111. function prepareQueryParameters(ajaxRequestType, eventId, sourceElement, serverParams) {
  112. var params = {};
  113. params[ajaxParameter] = ajaxRequestType;
  114. params[eventParameter] = eventId;
  115. if (sourceElement) {
  116. if (sourceElement.name != null) {
  117. params[elementParameter] = sourceElement.name;
  118. }
  119. if (sourceElement.id != null) {
  120. params[elementIdParameter] = sourceElement.id;
  121. }
  122. }
  123. if (serverParams) {
  124. params[jsonParameters] = encodeURIComponent(JSON.stringify(serverParams));
  125. }
  126. return params;
  127. };
  128. function configureRequest(request, clientParams) {
  129. if (! clientParams) {
  130. return;
  131. }
  132. if (clientParams.loadingElementId != null && clientParams.loadingImage != null) {
  133. request.loadingElementId = clientParams.loadingElementId;
  134. request.loadingImage = clientParams.loadingImage;
  135. request.setPreRequest(showLoadingSign);
  136. request.setPostRequest(hideLoadingSign);
  137. }
  138. if (clientParams.errorHandler != null) {
  139. request.setErrorHandler(clientParams.errorHandler);
  140. }
  141. };
  142. function showLoadingSign(request) {
  143. var targetEl = document.getElementById(request.loadingElementId);
  144. if (targetEl != null) {
  145. var img = document.createElement("img");
  146. img.setAttribute("src", request.loadingImage);
  147. targetEl.appendChild(img);
  148. }
  149. };
  150. function hideLoadingSign(request) {
  151. var targetEl = document.getElementById(request.loadingElementId);
  152. if (targetEl != null && targetEl.childNodes.length > 0) {
  153. targetEl.removeChild(targetEl.childNodes[0]);
  154. }
  155. };
  156. };
  157. XT.taconite = {};
  158. XT.taconite.isIE = document.uniqueID;
  159. XT.taconite.BaseRequest = function() {
  160. var preRequest = null;
  161. var postRequest = null;
  162. var errorHandler = null;
  163. this.setPreRequest = function(func) {
  164. preRequest = func;
  165. };
  166. this.setPostRequest = function(func) {
  167. postRequest = func;
  168. };
  169. this.getPreRequest = function() {
  170. return preRequest;
  171. };
  172. this.getPostRequest = function() {
  173. return postRequest;
  174. };
  175. this.setErrorHandler = function(func){
  176. errorHandler = func;
  177. };
  178. this.getErrorHandler = function() {
  179. return errorHandler;
  180. };
  181. };
  182. XT.taconite.AjaxRequest = function(url) {
  183. var ajaxRequest = this;
  184. var xmlHttp = createXMLHttpRequest();
  185. var queryString = "";
  186. var requestURL = url;
  187. var method = "GET";
  188. var async = true;
  189. this.getXMLHttpRequestObject = function() {
  190. return xmlHttp;
  191. };
  192. this.setUsePOST = function() {
  193. method = "POST";
  194. };
  195. this.setUseGET = function() {
  196. method = "GET";
  197. };
  198. this.setQueryString = function(qs) {
  199. queryString = qs;
  200. };
  201. this.getQueryString = function() {
  202. return queryString;
  203. };
  204. this.setAsync = function(asyncBoolean){
  205. async = asyncBoolean;
  206. };
  207. this.addFormElements = function(form) {
  208. var formElements = new Array();
  209. if (form != null) {
  210. if (typeof form == "string") {
  211. var el = document.getElementById(form);
  212. if (el != null) {
  213. formElements = el.elements;
  214. }
  215. } else {
  216. formElements = form.elements;
  217. }
  218. }
  219. var values = toQueryString(formElements);
  220. accumulateQueryString(values);
  221. };
  222. this.addNameValuePair = function(name, value) {
  223. var nameValuePair = name + "=" + encodeURIComponent(value);
  224. accumulateQueryString(nameValuePair);
  225. };
  226. this.addNamedFormElementsByFormID = function() {
  227. var elementName = "";
  228. var namedElements = null;
  229. for(var i = 1; i < arguments.length; i++) {
  230. elementName = arguments[i];
  231. namedElements = document.getElementsByName(elementName);
  232. var arNamedElements = new Array();
  233. for(j = 0; j < namedElements.length; j++) {
  234. if(namedElements[j].form && namedElements[j].form.getAttribute("id") == arguments[0]){
  235. arNamedElements.push(namedElements[j]);
  236. }
  237. }
  238. if(arNamedElements.length > 0){
  239. elementValues = toQueryString(arNamedElements);
  240. accumulateQueryString(elementValues);
  241. }
  242. }
  243. };
  244. this.addNamedFormElements = function() {
  245. var elementName = "";
  246. var namedElements = null;
  247. for(var i = 0; i < arguments.length; i++) {
  248. elementName = arguments[i];
  249. namedElements = document.getElementsByName(elementName);
  250. elementValues = toQueryString(namedElements);
  251. accumulateQueryString(elementValues);
  252. }
  253. };
  254. this.addFormElementsById = function() {
  255. var id = "";
  256. var element = null;
  257. var elements = new Array();
  258. for(var h = 0; h < arguments.length; h++) {
  259. element = document.getElementById(arguments[h]);
  260. if(element != null) {
  261. elements[h] = element;
  262. }
  263. }
  264. elementValues = toQueryString(elements);
  265. accumulateQueryString(elementValues);
  266. };
  267. this.sendRequest = function() {
  268. if(this.getPreRequest()) {
  269. var preRequest = this.getPreRequest();
  270. preRequest(this);
  271. }
  272. if(async) {
  273. xmlHttp.onreadystatechange = handleStateChange;
  274. }
  275. if(requestURL.indexOf("?") > 0) {
  276. requestURL = requestURL + "&ts=" + new Date().getTime();
  277. }
  278. else {
  279. requestURL = requestURL + "?ts=" + new Date().getTime();
  280. }
  281. try {
  282. if(method == "GET") {
  283. if(queryString.length > 0) {
  284. requestURL = requestURL + "&" + queryString;
  285. }
  286. xmlHttp.open(method, requestURL, async);
  287. xmlHttp.send(null);
  288. }
  289. else {
  290. xmlHttp.open(method, requestURL, async);
  291. //Fix a bug in Firefox when posting
  292. try {
  293. if (xmlHttp.overrideMimeType) {
  294. xmlHttp.setRequestHeader("Connection", "close");//set header after open
  295. }
  296. }
  297. catch(e) {
  298. // Do nothing
  299. }
  300. xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  301. xmlHttp.send(queryString);
  302. }
  303. }
  304. catch(exception) {
  305. if(this.getErrorHandler()) {
  306. var errorHandler = this.getErrorHandler();
  307. errorHandler(this, exception);
  308. }
  309. else {
  310. throw exception;
  311. }
  312. }
  313. if(!async) { //synchronous request, handle the state change
  314. handleStateChange();
  315. }
  316. };
  317. function handleStateChange() {
  318. if(ajaxRequest.getXMLHttpRequestObject().readyState != 4) {
  319. return;
  320. }
  321. if(ajaxRequest.getXMLHttpRequestObject().status != 200) {
  322. var errorHandler = ajaxRequest.getErrorHandler();
  323. if (errorHandler) {
  324. errorHandler(ajaxRequest);
  325. }
  326. return;
  327. }
  328. try {
  329. //handle null responseXML
  330. var nodes = null;
  331. if (ajaxRequest.getXMLHttpRequestObject().responseXML != null) {
  332. nodes = ajaxRequest.getXMLHttpRequestObject().responseXML.documentElement.childNodes;
  333. }
  334. else {
  335. nodes = new Array();
  336. }
  337. var parser = new XT.taconite.XhtmlToDOMParser();
  338. for(var i = 0; i < nodes.length; i++) {
  339. if(nodes[i].nodeType != 1) {
  340. continue;
  341. }
  342. parser.parseXhtml(nodes[i]);
  343. }
  344. }
  345. catch(exception) {
  346. if(ajaxRequest.getErrorHandler()) {
  347. var errorHandler = ajaxRequest.getErrorHandler();
  348. errorHandler(ajaxRequest, exception);
  349. }
  350. else {
  351. throw exception;
  352. }
  353. }
  354. finally {
  355. try {
  356. if(ajaxRequest.getPostRequest()) {
  357. var postRequest = ajaxRequest.getPostRequest();
  358. postRequest(ajaxRequest);
  359. }
  360. }
  361. catch(exception) {
  362. if(ajaxRequest.getErrorHandler()) {
  363. var errorHandler = ajaxRequest.getErrorHandler();
  364. errorHandler(ajaxRequest, exception);
  365. }
  366. }
  367. }
  368. };
  369. function createXMLHttpRequest() {
  370. var req = false;
  371. if (window.XMLHttpRequest) {
  372. req = new XMLHttpRequest();
  373. }
  374. else if (window.ActiveXObject) {
  375. try {
  376. req = new ActiveXObject("Msxml2.XMLHTTP");
  377. }
  378. catch(e) {
  379. try {
  380. req = new ActiveXObject("Microsoft.XMLHTTP");
  381. }
  382. catch(e) {
  383. req = false;
  384. }
  385. }
  386. }
  387. return req;
  388. };
  389. function accumulateQueryString(newValues) {
  390. if(queryString == "") {
  391. queryString = newValues;
  392. }
  393. else {
  394. queryString = queryString + "&" + newValues;
  395. }
  396. };
  397. function toQueryString(elements) {
  398. var node = null;
  399. var qs = "";
  400. var name = "";
  401. var tempString = "";
  402. for(var i = 0; i < elements.length; i++) {
  403. tempString = "";
  404. node = elements[i];
  405. name = node.getAttribute("name");
  406. //use id if name is null
  407. if (!name) {
  408. name = node.getAttribute("id");
  409. }
  410. name = encodeURIComponent(name);
  411. if(node.tagName.toLowerCase() == "input") {
  412. if(node.type.toLowerCase() == "radio" || node.type.toLowerCase() == "checkbox") {
  413. if(node.checked) {
  414. tempString = name + "=" + encodeURIComponent(node.value);
  415. }
  416. }
  417. if(node.type.toLowerCase() == "text" || node.type.toLowerCase() == "hidden" || node.type.toLowerCase() == "password") {
  418. tempString = name + "=" + encodeURIComponent(node.value);
  419. }
  420. }
  421. else if(node.tagName.toLowerCase() == "select") {
  422. tempString = getSelectedOptions(node);
  423. }
  424. else if(node.tagName.toLowerCase() == "textarea") {
  425. tempString = name + "=" + encodeURIComponent(node.value);
  426. }
  427. if(tempString != "") {
  428. if(qs == "") {
  429. qs = tempString;
  430. }
  431. else {
  432. qs = qs + "&" + tempString;
  433. }
  434. }
  435. }
  436. return qs;
  437. };
  438. function getSelectedOptions(select) {
  439. var options = select.options;
  440. var option = null;
  441. var qs = "";
  442. var tempString = "";
  443. for(var x = 0; x < options.length; x++) {
  444. tempString = "";
  445. option = options[x];
  446. if(option.selected) {
  447. tempString = encodeURIComponent(select.name) + "=" + encodeURIComponent(option.value);
  448. }
  449. if(tempString != "") {
  450. if(qs == "") {
  451. qs = tempString;
  452. }
  453. else {
  454. qs = qs + "&" + tempString;
  455. }
  456. }
  457. }
  458. return qs;
  459. };
  460. };
  461. XT.taconite.AjaxRequest.prototype = new XT.taconite.BaseRequest();
  462. XT.taconite.IFrameRequest = function(form, url, parameters) {
  463. var iFrameRequest = this;
  464. var requestForm = form;
  465. var requestURL = url;
  466. var requestParams = parameters;
  467. var containerId = "CONTAINER-" + Math.floor(Math.random() * 99999);
  468. var frameId = "FRAME-" + Math.floor(Math.random() * 99999);
  469. var container = null;
  470. var frame = null;
  471. init();
  472. this.sendRequest = function() {
  473. if (this.getPreRequest()) {
  474. var preRequest = this.getPreRequest();
  475. preRequest(this);
  476. }
  477. try {
  478. requestForm.setAttribute("target", frame.getAttribute("id"));
  479. requestForm.submit();
  480. var interval = window.setInterval(
  481. function() {
  482. if (frames[frameId].document
  483. && frames[frameId].document.documentElement
  484. && frames[frameId].document.getElementsByTagName("ajax-response").length == 1) {
  485. /* We use frames[frameId].document.getElementsByTagName("ajax-response")
  486. * instead of a more compact form because IE puts the ajax-response tag
  487. * inside a body tag.
  488. */
  489. onComplete();
  490. window.clearInterval(interval);
  491. }
  492. },
  493. 250
  494. );
  495. } catch(ex) {
  496. if (this.getErrorHandler()) {
  497. var errorHandler = this.getErrorHandler();
  498. errorHandler(this, exception);
  499. }
  500. else {
  501. throw ex;
  502. }
  503. }
  504. return true;
  505. };
  506. function init() {
  507. container = document.createElement("div");
  508. container.setAttribute("id", containerId);
  509. for (var name in requestParams) {
  510. var input = document.createElement("input");
  511. input.setAttribute("type", "hidden");
  512. input.setAttribute("name", name);
  513. input.setAttribute("value", requestParams[name]);
  514. container.appendChild(input);
  515. }
  516. frame = document.createElement("iframe");
  517. frame.setAttribute("id", frameId);
  518. frame.setAttribute("name", frameId);
  519. frame.setAttribute("src", "");
  520. frame.setAttribute("style", "width:0;height:0;visibility:hidden;");
  521. frame.style.cssText = "width:0;height:0;visibility:hidden;";
  522. container.appendChild(frame);
  523. requestForm.appendChild(container);
  524. // IE hack: we need to set id and name if undefined.
  525. if (! frames[frameId].id) {
  526. frames[frameId].id = frameId;
  527. }
  528. if (! frames[frameId].name) {
  529. frames[frameId].name = frameId;
  530. }
  531. };
  532. function onComplete() {
  533. try {
  534. var nodes = frames[frameId].document.getElementsByTagName("ajax-response")[0].childNodes;
  535. var parser = new XT.taconite.XhtmlToDOMParser();
  536. for (var i = 0; i < nodes.length; i++) {
  537. if (nodes[i].nodeType != 1) {
  538. continue;
  539. }
  540. parser.parseXhtml(nodes[i]);
  541. }
  542. } catch(ex) {
  543. if (iFrameRequest.getErrorHandler()) {
  544. var errorHandler = iFrameRequest.getErrorHandler();
  545. errorHandler(iFrameRequest, exception);
  546. }
  547. else {
  548. throw ex;
  549. }
  550. } finally {
  551. try {
  552. // Remove the whole container, with the iframe and all hidden input fields:
  553. requestForm.removeChild(container);
  554. //
  555. if (iFrameRequest.getPostRequest()) {
  556. var postRequest = iFrameRequest.getPostRequest();
  557. postRequest(iFrameRequest);
  558. }
  559. }
  560. catch(exception) {
  561. if (iFrameRequest.getErrorHandler()) {
  562. var errorHandler = iFrameRequest.getErrorHandler();
  563. errorHandler(iFrameRequest, exception);
  564. }
  565. }
  566. }
  567. };
  568. };
  569. XT.taconite.IFrameRequest.prototype = new XT.taconite.BaseRequest();
  570. XT.taconite.XhtmlToDOMParser = function() {
  571. this.parseXhtml = function(xml) {
  572. var xmlTagName=xml.tagName.toLowerCase();
  573. switch (xmlTagName) {
  574. case "append-as-children":
  575. executeAction(xml, appendAsChildrenAction);
  576. break;
  577. case "delete":
  578. executeAction(xml, deleteAction);
  579. break;
  580. case "append-as-first-child":
  581. executeAction(xml, appendAsFirstChildAction);
  582. break;
  583. case "insert-after":
  584. executeAction(xml, insertAfterAction);
  585. break;
  586. case "insert-before":
  587. executeAction(xml, insertBeforeAction);
  588. break;
  589. case "replace-children":
  590. executeAction(xml, replaceChildrenAction);
  591. break;
  592. case "replace":
  593. executeAction(xml, replaceAction);
  594. break;
  595. case "set-attributes":
  596. executeAction(xml, setAttributesAction);
  597. break;
  598. case "redirect":
  599. executeAction(xml, executeRedirectAction);
  600. break;
  601. case "execute-javascript":
  602. executeAction(xml, executeJavascriptAction);
  603. break;
  604. default :
  605. throw {'message' : 'Wrong tag name!'};
  606. }
  607. };
  608. function executeAction(xml, action) {
  609. var context = xml.getElementsByTagName("context")[0];
  610. var content = xml.getElementsByTagName("content")[0];
  611. if (context) {
  612. var contextNodes = getContextNodes(context);
  613. for (var i = 0; i < contextNodes.length; i++) {
  614. var contextNode = contextNodes[i];
  615. action(contextNode, content);
  616. }
  617. } else {
  618. action(content);
  619. }
  620. };
  621. function getContextNodes(context) {
  622. var matchMode = context.getElementsByTagName("matcher")[0].getAttribute("matchMode");
  623. var contextNodes = new Array();
  624. if (matchMode != null) {
  625. switch(matchMode) {
  626. case "plain" :
  627. contextNodes = getContextNodesByPlainMatch(context);
  628. break;
  629. case "wildcard" :
  630. contextNodes = getContextNodesByWildcardMatch(context);
  631. break;
  632. case "selector" :
  633. contextNodes = getContextNodesBySelectorMatch(context);
  634. break;
  635. }
  636. } else {
  637. contextNodes = getContextNodesByPlainMatch(context);
  638. }
  639. return contextNodes;
  640. };
  641. function getContextNodesByPlainMatch(context) {
  642. var contextNodeID = context.getElementsByTagName("matcher")[0].getAttribute("contextNodeID");
  643. var contextIDs = contextNodeID.split(',');
  644. var contextNodes = new Array();
  645. for (var i = 0, k = 0; i < contextIDs.length; i++) {
  646. var tmp = document.getElementById(contextIDs[i].trim());
  647. if (tmp != null) {
  648. contextNodes[k] = tmp;
  649. k++;
  650. }
  651. }
  652. return contextNodes;
  653. };
  654. function getContextNodesByWildcardMatch(context) {
  655. var contextNodeID = context.getElementsByTagName("matcher")[0].getAttribute("contextNodeID");
  656. var contextIDs = contextNodeID.split(',');
  657. var contextNodes = new Array();
  658. for (var i = 0; i < contextIDs.length; i++) {
  659. contextNodes = contextNodes.concat(document.getElementsByMatchingId(contextIDs[i].trim()));
  660. }
  661. return contextNodes;
  662. };
  663. function getContextNodesBySelectorMatch(context) {
  664. var selector = new XT.util.DOMSelector();
  665. var contextNodeSelector = context.getElementsByTagName("matcher")[0].getAttribute("contextNodeSelector");
  666. var contextSelectors = contextNodeSelector.split(',');
  667. var contextNodes = new Array();
  668. for (var i = 0; i < contextSelectors.length; i++) {
  669. contextNodes = contextNodes.concat(selector.select(contextSelectors[i].trim()));
  670. }
  671. return contextNodes;
  672. };
  673. function setAttributesAction(domNode,xml){
  674. var sourceNode = xml.getElementsByTagName("attributes")[0];
  675. handleAttributes(domNode, sourceNode);
  676. };
  677. function appendAsFirstChildAction(domNode,xml){
  678. var firstNode=null;
  679. if(domNode.childNodes.length > 0) {
  680. firstNode=domNode.childNodes[0];
  681. }
  682. for(var i=0;i<xml.childNodes.length;i++){
  683. domChildNode=handleNode(xml.childNodes[i]);
  684. if(domChildNode!=null){
  685. if(firstNode==null){
  686. domNode.appendChild(domChildNode);
  687. firstNode=domChildNode;
  688. }
  689. else {
  690. domNode.insertBefore(domChildNode,firstNode);
  691. }
  692. }
  693. }
  694. };
  695. function insertAfterAction(domNode,xml){
  696. var domChildNode=null;
  697. var nextSibling=domNode.nextSibling;
  698. for(var i=0;i<xml.childNodes.length;i++){
  699. domChildNode=handleNode(xml.childNodes[i]);
  700. if(domChildNode!=null){
  701. if(nextSibling!=null) {
  702. domNode.parentNode.insertBefore(domChildNode,nextSibling);
  703. }
  704. else {
  705. domNode.parentNode.appendChild(domChildNode);
  706. }
  707. }
  708. }
  709. };
  710. function insertBeforeAction(domNode,xml){
  711. var domChildNode=null;
  712. for(var i=0;i<xml.childNodes.length;i++){
  713. domChildNode=handleNode(xml.childNodes[i]);
  714. if(domChildNode!=null) {
  715. domNode.parentNode.insertBefore(domChildNode,domNode);
  716. }
  717. }
  718. };
  719. function replaceAction(domNode,xml){
  720. insertAfterAction(domNode,xml);
  721. domNode.parentNode.removeChild(domNode);
  722. };
  723. function deleteAction(domNode) {
  724. domNode.parentNode.removeChild(domNode);
  725. };
  726. function appendAsChildrenAction(domNode,xml) {
  727. internalAppendOrReplaceChildren(domNode, xml, false);
  728. };
  729. function replaceChildrenAction(domNode,xml) {
  730. internalAppendOrReplaceChildren(domNode, xml, true);
  731. };
  732. function executeRedirectAction(xmlNode) {
  733. var targetUrl = xmlNode.getElementsByTagName("target")[0].getAttribute("url");
  734. window.location.href = targetUrl;
  735. };
  736. function executeJavascriptAction(xmlNode) {
  737. var scripts = xmlNode.getElementsByTagName("script");
  738. for (var i = 0; i < scripts.length; i++) {
  739. var script = scripts[i];
  740. if (script.getAttribute("type") == "text/javascript") {
  741. var js = "";
  742. for (var i = 0; i < script.childNodes.length; i++) {
  743. js = js + script.childNodes[i].nodeValue;
  744. }
  745. eval(js);
  746. }
  747. }
  748. };
  749. function internalAppendOrReplaceChildren(domNode,xml,doRemoveChildren) {
  750. var domChildNode=null;
  751. if(doRemoveChildren){
  752. while(domNode.childNodes.length >0){
  753. domNode.removeChild(domNode.childNodes[0]);
  754. }
  755. }
  756. for(var i=0;i<xml.childNodes.length;i++){
  757. domChildNode=handleNode(xml.childNodes[i]);
  758. if(domChildNode!=null) {
  759. // Here we have to check xml.childNodes[i].nodeType==1 because of an IE7 bug
  760. if (XT.taconite.isIE && xml.childNodes[i].nodeType==1) {
  761. checkForIEMultipleSelectHack(domNode, domChildNode);
  762. }
  763. domNode.appendChild(domChildNode);
  764. }
  765. }
  766. };
  767. function isInlineMode(node) {
  768. var lowerCaseTag = node.tagName.toLowerCase();
  769. if(lowerCaseTag == "button") {
  770. return true;
  771. }
  772. var attrType = node.getAttribute("type");
  773. if(lowerCaseTag == "input" && (attrType == "radio" || attrType == "checkbox")) {
  774. return true;
  775. }
  776. return false;
  777. };
  778. function handleAttributes(domNode, xmlNode, returnAsText) {
  779. var attr = null;
  780. var attrString = "";
  781. var name = "";
  782. var value = "";
  783. for(var x = 0; x < xmlNode.attributes.length; x++) {
  784. attr = xmlNode.attributes[x];
  785. name = cleanAttributeName(attr.name.trim());
  786. value = attr.value.trim();
  787. if(!returnAsText){
  788. if(name == "style") {
  789. /* IE workaround */
  790. domNode.style.cssText = value;
  791. /* Standards compliant */
  792. domNode.setAttribute(name, value);
  793. }
  794. else if(name.trim().toLowerCase().substring(0, 2) == "on") {
  795. /* IE workaround for event handlers */
  796. if(XT.taconite.isIE) {
  797. eval("domNode." + name.trim().toLowerCase() + "=function(){" + value + "}");
  798. }
  799. else {
  800. domNode.setAttribute(name,value);
  801. }
  802. }
  803. else if(name == "value") {
  804. /* IE workaround for the value attribute -- makes form elements selectable/editable */
  805. domNode.value = value;
  806. }
  807. else if(useIEFormElementCreationStrategy(xmlNode.tagName) && name == "name") {
  808. //Do nothing, as the "name" attribute was handled in the createFormElementsForIEStrategy function
  809. continue;
  810. }
  811. else {
  812. /* Standards compliant */
  813. domNode.setAttribute(name,value);
  814. }
  815. /* class attribute workaround for IE */
  816. if(name == "class") {
  817. domNode.setAttribute("className",value);
  818. }
  819. /* This is a workaround for a bug in IE where select elemnts with multiple don't have
  820. all the appropriate options selected. Only one is selected. Appears fixed in IE7.
  821. */
  822. if(XT.taconite.isIE) {
  823. if(name == "multiple" && domNode.id != "") {
  824. setTimeout(
  825. function() {
  826. var selectNode = document.getElementById(domNode.id);
  827. var options = selectNode.getElementsByTagName("option");
  828. var option;
  829. for(var i = 0; i < options.length; i++) {
  830. option = options[i];
  831. if (typeof(option.taconiteOptionSelected) != "undefined") {
  832. option.selected = true;
  833. }
  834. else {
  835. option.selected = false;
  836. }
  837. }
  838. },
  839. 100);
  840. }
  841. if(name == "selected") {
  842. domNode.taconiteOptionSelected = true;
  843. }
  844. }
  845. } else{
  846. attrString = attrString + name + "=\"" + value + "\" " ;
  847. }
  848. }
  849. return attrString;
  850. };
  851. function handleNode(xmlNode){
  852. var nodeType = xmlNode.nodeType;
  853. switch(nodeType) {
  854. case 1: //ELEMENT_NODE
  855. return handleElement(xmlNode);
  856. case 3: //TEXT_NODE
  857. case 4: //CDATA_SECTION_NODE
  858. var textNode = document.createTextNode(xmlNode.nodeValue);
  859. if(XT.taconite.isIE) {
  860. textNode.nodeValue = textNode.nodeValue.replace(/\n/g, '\r');
  861. }
  862. return textNode;
  863. }
  864. return null;
  865. };
  866. function handleElement(xmlNode){
  867. var domElemNode = null;
  868. var xmlNodeTagName = xmlNode.tagName.toLowerCase();
  869. if(XT.taconite.isIE){
  870. if(isInlineMode(xmlNode)) {
  871. return document.createElement("<" + xmlNodeTagName + " " + handleAttributes(domElemNode, xmlNode, true) + ">");
  872. }
  873. if(xmlNodeTagName == "style"){
  874. //In internet explorer, we have to use styleSheets array.
  875. var text,rulesArray,styleSheetPtr;
  876. var regExp = /\s+/g;
  877. text=xmlNode.text.replace(regExp, " ");
  878. rulesArray=text.split("}");
  879. domElemNode=document.createElement("style");
  880. styleSheetPtr=document.styleSheets[document.styleSheets.length-1];
  881. for(var i=0;i<rulesArray.length;i++){
  882. rulesArray[i]=rulesArray[i].trim();
  883. var rulePart=rulesArray[i].split("{");
  884. if(rulePart.length==2) {//Add only if the rule is valid
  885. styleSheetPtr.addRule(rulePart[0],rulePart[1],-1);//Append at the end of stylesheet.
  886. }
  887. }
  888. return domElemNode;
  889. }
  890. }
  891. if(domElemNode == null){
  892. if(useIEFormElementCreationStrategy(xmlNodeTagName)) {
  893. domElemNode = createFormElementsForIEStrategy(xmlNode);
  894. }
  895. else {
  896. domElemNode = document.createElement(xmlNodeTagName);
  897. }
  898. handleAttributes(domElemNode,xmlNode);
  899. //Fix for IE Script tag: Unexpected call to method or property access error
  900. //IE don't allow script tag to have child
  901. if(XT.taconite.isIE && !domElemNode.canHaveChildren){
  902. if(xmlNode.childNodes.length > 0){
  903. domElemNode.text=xmlNode.text;
  904. }
  905. }
  906. else{
  907. for(var z = 0; z < xmlNode.childNodes.length; z++) {
  908. var domChildNode=handleNode(xmlNode.childNodes[z]);
  909. if(domChildNode!=null) {
  910. domElemNode.appendChild(domChildNode);
  911. }
  912. }
  913. }
  914. }
  915. return domElemNode;
  916. };
  917. function useIEFormElementCreationStrategy(xmlNodeTagName) {
  918. var useIEStrategy = false;
  919. var nodeName = xmlNodeTagName.toLowerCase();
  920. if (XT.taconite.isIE && (nodeName == "form" ||
  921. nodeName == "input" ||
  922. nodeName == "textarea" ||
  923. nodeName == "select" ||
  924. nodeName == "a" ||
  925. nodeName == "applet" ||
  926. nodeName == "button" ||
  927. nodeName == "img" ||
  928. nodeName == "link" ||
  929. nodeName == "map" ||
  930. nodeName == "object")) {
  931. useIEStrategy = true;
  932. }
  933. return useIEStrategy;
  934. };
  935. function createFormElementsForIEStrategy(xmlNode) {
  936. var attr = null;
  937. var name = "";
  938. var value = "";
  939. for (var x = 0; x < xmlNode.attributes.length; x++) {
  940. attr = xmlNode.attributes[x];
  941. name = attr.name.trim();
  942. if (name == "name") {
  943. value = attr.value.trim();
  944. }
  945. }
  946. domElemNode = document.createElement("<" + xmlNode.tagName + " name='" + value + "' />"); // e.g. document.createElement("<input name='slot2'>");
  947. return domElemNode;
  948. };
  949. function checkForIEMultipleSelectHack(domNode, domChildNode) {
  950. if(XT.taconite.isIE && domChildNode.nodeType == 1 && domChildNode.tagName.toLowerCase() == "select" && domChildNode.getAttribute("multiple") != null) {
  951. createIEMultipleSelectHack(domNode);
  952. }
  953. };
  954. function createIEMultipleSelectHack(contextNode) {
  955. //this is a total and complete hack for IE 6's totally broken select
  956. //box implementation. A "multiple" select box only appears as a drop-
  957. //down box... but for some reason, creating another select around it
  958. //makes it render correctly (??). So, create a bogus select box and hide
  959. //it.
  960. var selectBox = document.createElement("select");
  961. selectBox.size = 3;
  962. for (x=0; x < 1; x++) {
  963. selectBox.options[x] = new Option(x, x);
  964. }
  965. //hide it
  966. selectBox.style.display = "none";
  967. contextNode.appendChild(selectBox);
  968. };
  969. function cleanAttributeName(name) {
  970. if(XT.taconite.isIE == false) {
  971. return;
  972. }
  973. // IE workaround to change cellspacing to cellSpacing, etc
  974. var cleanName = name.toLowerCase();
  975. if(cleanName == "cellspacing") {
  976. cleanName = "cellSpacing";
  977. }
  978. else if(cleanName == "cellpadding") {
  979. cleanName = "cellPadding";
  980. }
  981. else if(cleanName == "colspan") {
  982. cleanName = "colSpan";
  983. }
  984. else if(cleanName == "tabindex") {
  985. cleanName = "tabIndex";
  986. }
  987. else if(cleanName == "readonly") {
  988. cleanName = "readOnly";
  989. }
  990. else if(cleanName == "maxlength") {
  991. cleanName = "maxLength";
  992. }
  993. else if(cleanName == "rowspan") {
  994. cleanName = "rowSpan";
  995. }
  996. else if(cleanName == "valign") {
  997. cleanName = "vAlign";
  998. }
  999. return cleanName;
  1000. };
  1001. };
  1002. XT.util = {};
  1003. XT.util.DOMSelector = function() {
  1004. this.select = function(selector, rootContext) {
  1005. if (! rootContext) {
  1006. rootContext = document;
  1007. }
  1008. // Remove unwanted spaces between combinators:
  1009. // > combinator
  1010. selector = selector.replace(/\s*(?=>)/g, '');
  1011. selector = selector.replace(/>\s*/g, '>');
  1012. // + combinator
  1013. selector = selector.replace(/\s*(?=\+)/g, '');
  1014. selector = selector.replace(/\+\s*/g, '+');
  1015. // ~ combinator
  1016. selector = selector.replace(/\s*(?=~)/g, '');
  1017. selector = selector.replace(/~\s*/g, '~');
  1018. // Split selector into tokens
  1019. var splitter = /\s|>|\+|~/g;
  1020. var combinators = selector.match(splitter);
  1021. var tokens = selector.split(splitter);
  1022. var currentContext = new Array(rootContext);
  1023. // Prepare regular expressions that will be used later:
  1024. var attributesRegexp = /^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/;
  1025. var pseudoClassesRegexp = /^(\w*)\:(\w+-?\w+)/;
  1026. var regexpResult = null;
  1027. // Go!
  1028. for (var i = 0; i < tokens.length; i++) {
  1029. var combinator = i == 0 ? " " : combinators[i - 1];
  1030. var token = tokens[i].trim();
  1031. if (token.indexOf('#') > -1) {
  1032. // Token is an ID selector
  1033. var tagName = token.substring(0, token.indexOf('#'));
  1034. var id = token.substring(token.indexOf('#') + 1, token.length);
  1035. var filterFunction = function(e) {
  1036. return (e.id == id);
  1037. };
  1038. var found = new Array();
  1039. for (var h = 0; h < currentContext.length; h++) {
  1040. found = selectByFilter(combinator, currentContext[h], tagName, filterFunction);
  1041. if (found && found.length == 1) {
  1042. break;
  1043. }
  1044. }
  1045. // Set currentContext to contain just this element
  1046. currentContext = found;
  1047. // Skip to next token
  1048. continue;
  1049. }
  1050. else if ((regexpResult = attributesRegexp.exec(token))) {
  1051. // Token contains attribute selectors
  1052. var tagName = regexpResult[1];
  1053. var attrName = regexpResult[2];
  1054. var attrOperator = regexpResult[3];
  1055. var attrValue = regexpResult[4];
  1056. // Attribute filtering functions:
  1057. var filterFunction = null; // This function will be used to filter the elements
  1058. switch (attrOperator) {
  1059. case '=': // Equality
  1060. filterFunction = function(e) {
  1061. return (e.getAttribute(attrName) && e.getAttribute(attrName) == attrValue);
  1062. };
  1063. break;
  1064. case '~': // Match one of space seperated words
  1065. filterFunction = function(e) {
  1066. return (e.getAttribute(attrName) && e.getAttribute(attrName).match(new RegExp('(\\s|^)' + attrValue + '(\\s|$)')));
  1067. };
  1068. break;
  1069. case '|': // Match start with value followed by optional hyphen
  1070. filterFunction = function(e) {
  1071. return (e.getAttribute(attrName) && e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?')));
  1072. };
  1073. break;
  1074. case '^': // Match starts with value
  1075. filterFunction = function(e) {
  1076. return (e.getAttribute(attrName) && e.getAttribute(attrName).indexOf(attrValue) == 0);
  1077. };
  1078. break;
  1079. case '$': // Match ends with value - fails with "Warning" in Opera 7
  1080. filterFunction = function(e) {
  1081. return (e.getAttribute(attrName) && (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length));
  1082. };
  1083. break;
  1084. case '*': // Match contains value
  1085. filterFunction = function(e) {
  1086. return (e.getAttribute(attrName) && e.getAttribute(attrName).indexOf(attrValue) > -1);
  1087. };
  1088. break;
  1089. default :
  1090. // Just test for existence of attribute
  1091. filterFunction = function(e) {
  1092. return e.getAttribute(attrName);
  1093. };
  1094. }
  1095. var found = new Array();
  1096. var counter = 0;
  1097. for (var h = 0; h < currentContext.length; h++) {
  1098. var elements = selectByFilter(combinator, currentContext[h], tagName, filterFunction);
  1099. for (var j = 0; j < elements.length; j++) {
  1100. found[counter++] = elements[j];
  1101. }
  1102. }
  1103. currentContext = found;
  1104. // Skip to next token
  1105. continue;
  1106. }
  1107. else if ((regexpResult = pseudoClassesRegexp.exec(token))) {
  1108. // Token contains pseudo-class selectors
  1109. var tagName = regexpResult[1];
  1110. var pseudoClass = regexpResult[2];
  1111. // Pseudo class filtering functions:
  1112. var filterFunction = null; // This function will be used to filter the elements
  1113. switch (pseudoClass) {
  1114. case 'first-child':
  1115. filterFunction = function(e) {
  1116. var parent = e.parentNode;
  1117. var i = 0;
  1118. while (parent.childNodes[i] && parent.childNodes[i].nodeType != 1) i++;
  1119. return (parent.childNodes[i] == e);
  1120. };
  1121. break;
  1122. case 'last-child':
  1123. filterFunction = function(e) {
  1124. var parent = e.parentNode;
  1125. var i = parent.childNodes.length - 1;
  1126. while (parent.childNodes[i] && parent.childNodes[i].nodeType != 1) i--;
  1127. return (parent.childNodes[i] == e);
  1128. };
  1129. break;
  1130. case 'empty':
  1131. filterFunction = function(e) {
  1132. return (e.childNodes.length == 0);
  1133. };
  1134. break;
  1135. default :
  1136. filterFunction = function(e) {
  1137. return false;
  1138. };
  1139. }
  1140. var found = new Array();
  1141. var counter = 0;
  1142. for (var h = 0; h < currentContext.length; h++) {
  1143. var elements = selectByFilter(combinator, currentContext[h], tagName, filterFunction);
  1144. for (var j = 0; j < elements.length; j++) {
  1145. found[counter++] = elements[j];
  1146. }
  1147. }
  1148. currentContext = found;
  1149. // Skip to next token
  1150. continue;
  1151. }
  1152. else if (token.indexOf('.') > -1) {
  1153. // Token contains a class selector
  1154. var tagName = token.substring(0, token.indexOf('.'));
  1155. var className = token.substring(token.indexOf('.') + 1, token.length);
  1156. var regexp = new RegExp('(\\s|^)' + className + '(\\s|$)');
  1157. var filterFunction = function(e) {
  1158. return (e.className && e.className.match(regexp));
  1159. };
  1160. var found = new Array();
  1161. var counter = 0;
  1162. for (var h = 0; h < currentContext.length; h++) {
  1163. var elements = selectByFilter(combinator, currentContext[h], tagName, filterFunction);
  1164. for (var j = 0; j < elements.length; j++) {
  1165. found[counter++] = elements[j];
  1166. }
  1167. }
  1168. currentContext = found;
  1169. // Skip to next token
  1170. continue;
  1171. }
  1172. else {
  1173. // If we get here, token is just an element (not a class or ID selector)
  1174. tagName = token;
  1175. var filterFunction = function(e) {
  1176. return true;
  1177. };
  1178. var found = new Array();
  1179. var counter = 0;
  1180. for (var h = 0; h < currentContext.length; h++) {
  1181. var elements = selectByFilter(combinator, currentContext[h], tagName, filterFunction);
  1182. for (var j = 0; j < elements.length; j++) {
  1183. found[counter++] = elements[j];
  1184. }
  1185. }
  1186. currentContext = found;
  1187. }
  1188. }
  1189. return currentContext;
  1190. };
  1191. function selectByFilter(combinator, context, tagName, filterFunction) {
  1192. var result = new Array();
  1193. var elements = new Array();
  1194. // Get elements to filter depending on the combinator:
  1195. if (combinator == " ") {
  1196. elements = context.all ? context.all : context.getElementsByTagName('*');
  1197. } else if (combinator == ">") {
  1198. elements = context.childNodes;
  1199. } else if (combinator == "+") {
  1200. var sibling = context.nextSibling;
  1201. while (sibling && sibling.nodeType != 1) {
  1202. sibling = sibling.nextSibling;
  1203. }
  1204. if (sibling) elements = new Array(sibling);
  1205. else elements = new Array();
  1206. } else if (combi

Large files files are truncated, but you can click here to view the full file