PageRenderTime 55ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/samples/feed-xt/src/webapp/js/springxt.js

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

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