- if ( a[i].constructor == String ) {
- // trim whitespace, otherwise indexOf won't work as expected
- a[i] = jQuery.trim(a[i]);
-
- var table = "";
-
- if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
- table = "thead";
- a[i] = "<table>" + a[i] + "</table>";
- } else if ( !a[i].indexOf("<tr") ) {
- table = "tr";
- a[i] = "<table>" + a[i] + "</table>";
- } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
- table = "td";
- a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
- }
-
- var div = document.createElement("div");
- div.innerHTML = a[i];
-
- if ( table ) {
- div = div.firstChild;
- if ( table != "thead" ) div = div.firstChild;
- if ( table == "td" ) div = div.firstChild;
- }
+ var arg = a[i];
+ if ( arg.constructor == String ) { // Convert html string into DOM nodes
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var s = jQuery.trim(arg), div = document.createElement("div"), wrap = [0,"",""];
+
+ if ( !s.indexOf("<opt") ) // option or optgroup
+ wrap = [1, "<select>", "</select>"];
+ else if ( !s.indexOf("<thead") || !s.indexOf("<tbody") )
+ wrap = [1, "<table>", "</table>"];
+ else if ( !s.indexOf("<tr") )
+ wrap = [2, "<table>", "</table>"]; // tbody auto-inserted
+ else if ( !s.indexOf("<td") || !s.indexOf("<th") )
+ wrap = [3, "<table><tbody><tr>", "</tr></tbody></table>"];
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + s + wrap[2];
+ while ( wrap[0]-- ) div = div.firstChild;
+ arg = div.childNodes;
+ }