Author: nbelaevski
Date: 2009-03-03 18:53:46 -0500 (Tue, 03 Mar 2009)
New Revision: 12815
Modified:
trunk/framework/impl/src/main/javascript/ajaxjsf/sarissa.js
Log:
https://jira.jboss.org/jira/browse/RF-1234
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/sarissa.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/sarissa.js 2009-03-03 18:22:16 UTC
(rev 12814)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/sarissa.js 2009-03-03 23:53:46 UTC
(rev 12815)
@@ -481,7 +481,17 @@
if((typeof(document.importNode) == "undefined") &&
Sarissa._SARISSA_IS_IE){
try{
- /**
+ var importTable = {
+ TBODY: ['<table>', '</table>'
],
+ THEAD: ['<table>', '</table>' ],
+ TFOOT: ['<table>', '</table>' ],
+ TR: ['<table><tbody>',
'</tbody></table>' ],
+ TH: ['<table><thead><tr>',
'</tr></thead></table>'],
+ TD: ['<table><tbody><tr>',
'</tr></tbody></table>'],
+ OPTION: ['<select>', '</select>' ]
+ };
+
+ /**
* Implementation of importNode for the context window document in IE.
* If <code>oNode</code> is a TextNode,
<code>bChildren</code> is ignored.
* @param oNode the Node to import
@@ -494,33 +504,53 @@
return document.createTextNode(oNode.data);
}
else {
- var tbody = false;
- if(oNode.nodeName == "tbody" && oNode.parentNode){
- oNode = oNode.parentNode;
- tbody = true;
- }
- else if(oNode.nodeName == "tbody" || oNode.nodeName ==
"tr"){
- tmp = document.createElement("tr");
- }
- else if(oNode.nodeName == "td"){
- tmp = document.createElement("tr");
- }
- else if(oNode.nodeName == "option"){
- tmp = document.createElement("select");
- }
- if(!tmp){
- tmp = document.createElement("div");
- }
- if(bChildren){
- tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML;
- }else{
- tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml :
oNode.cloneNode(false).outerHTML;
- }
- if (tbody) {
- return tmp.firstChild.tBodies[0];
+ var tagName = oNode.nodeName.toUpperCase();
+ var wrapper = importTable[tagName];
+
+ var nodeHtml;
+ if (bChildren) {
+ nodeHtml = oNode.xml ? oNode.xml : oNode.outerHTML;
} else {
- return tmp.getElementsByTagName("*")[0];
+ nodeHtml = oNode.xml ? oNode.cloneNode(false).xml :
oNode.cloneNode(false).outerHTML;
}
+
+ var wrapperElt = document.createElement("div");
+ if (wrapper) {
+ nodeHtml = wrapper[0] + nodeHtml + wrapper[1];
+ }
+
+ wrapperElt.innerHTML = nodeHtml;
+
+ //Breadth-first search
+ var stack = new Array(wrapperElt.firstChild);
+ var result;
+
+ while (!result) {
+ var newStack = new Array();
+
+ for (var i = 0; i < stack.length && !result; i++) {
+ var elt = stack[i];
+ while (elt) {
+ if (elt.tagName /* we can meet text nodes */ &&
+ elt.tagName.toUpperCase() == tagName) {
+
+ result = elt;
+ break;
+ } else {
+ if (elt.firstChild) {
+ newStack.push(elt.firstChild);
+ }
+
+ elt = elt.nextSibling;
+ }
+ }
+ }
+
+ stack = newStack;
+ }
+ //Breadth-first search end
+
+ return result;
}
};
}catch(e){ }