1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
3 // See scriptaculous.js for full license.
22 // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
23 // due to a Firefox bug
24 node: function(elementName
) {
25 elementName
= elementName
.toUpperCase();
27 // try innerHTML approach
28 var parentTag
= this.NODEMAP
[elementName
] || 'div';
29 var parentElement
= document
.createElement(parentTag
);
30 try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
31 parentElement
.innerHTML
= "<" + elementName
+ "></" + elementName
+ ">";
33 var element
= parentElement
.firstChild
|| null;
35 // see if browser added wrapping tags
36 if(element
&& (element
.tagName
!= elementName
))
37 element
= element
.getElementsByTagName(elementName
)[0];
39 // fallback to createElement approach
40 if(!element
) element
= document
.createElement(elementName
);
42 // abort if nothing could be created
45 // attributes (or text)
47 if(this._isStringOrNumber(arguments
[1]) ||
48 (arguments
[1] instanceof Array
)) {
49 this._children(element
, arguments
[1]);
51 var attrs
= this._attributes(arguments
[1]);
53 try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
54 parentElement
.innerHTML
= "<" +elementName
+ " " +
55 attrs
+ "></" + elementName
+ ">";
57 element
= parentElement
.firstChild
|| null;
58 // workaround firefox 1.0.X bug
60 element
= document
.createElement(elementName
);
61 for(attr
in arguments
[1])
62 element
[attr
== 'class' ? 'className' : attr
] = arguments
[1][attr
];
64 if(element
.tagName
!= elementName
)
65 element
= parentElement
.getElementsByTagName(elementName
)[0];
69 // text, or array of children
71 this._children(element
, arguments
[2]);
75 _text: function(text
) {
76 return document
.createTextNode(text
);
78 _attributes: function(attributes
) {
80 for(attribute
in attributes
)
81 attrs
.push((attribute
=='className' ? 'class' : attribute
) +
82 '="' + attributes
[attribute
].toString().escapeHTML() + '"');
83 return attrs
.join(" ");
85 _children: function(element
, children
) {
86 if(typeof children
=='object') { // array can hold nodes and text
87 children
.flatten().each( function(e
) {
88 if(typeof e
=='object')
89 element
.appendChild(e
)
91 if(Builder
._isStringOrNumber(e
))
92 element
.appendChild(Builder
._text(e
));
95 if(Builder
._isStringOrNumber(children
))
96 element
.appendChild(Builder
._text(children
));
98 _isStringOrNumber: function(param
) {
99 return(typeof param
=='string' || typeof param
=='number');