|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var Builder = { |
|
NODEMAP: { |
|
AREA: 'map', |
|
CAPTION: 'table', |
|
COL: 'table', |
|
COLGROUP: 'table', |
|
LEGEND: 'fieldset', |
|
OPTGROUP: 'select', |
|
OPTION: 'select', |
|
PARAM: 'object', |
|
TBODY: 'table', |
|
TD: 'table', |
|
TFOOT: 'table', |
|
TH: 'table', |
|
THEAD: 'table', |
|
TR: 'table' |
|
}, |
|
|
|
|
|
node: function(elementName) { |
|
elementName = elementName.toUpperCase(); |
|
|
|
|
|
var parentTag = this.NODEMAP[elementName] || 'div'; |
|
var parentElement = document.createElement(parentTag); |
|
try { |
|
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">"; |
|
} catch(e) {} |
|
var element = parentElement.firstChild || null; |
|
|
|
|
|
if(element && (element.tagName.toUpperCase() != elementName)) |
|
element = element.getElementsByTagName(elementName)[0]; |
|
|
|
|
|
if(!element) element = document.createElement(elementName); |
|
|
|
|
|
if(!element) return; |
|
|
|
|
|
if(arguments[1]) |
|
if(this._isStringOrNumber(arguments[1]) || |
|
(arguments[1] instanceof Array) || |
|
arguments[1].tagName) { |
|
this._children(element, arguments[1]); |
|
} else { |
|
var attrs = this._attributes(arguments[1]); |
|
if(attrs.length) { |
|
try { |
|
parentElement.innerHTML = "<" +elementName + " " + |
|
attrs + "></" + elementName + ">"; |
|
} catch(e) {} |
|
element = parentElement.firstChild || null; |
|
|
|
if(!element) { |
|
element = document.createElement(elementName); |
|
for(attr in arguments[1]) |
|
element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; |
|
} |
|
if(element.tagName.toUpperCase() != elementName) |
|
element = parentElement.getElementsByTagName(elementName)[0]; |
|
} |
|
} |
|
|
|
|
|
if(arguments[2]) |
|
this._children(element, arguments[2]); |
|
|
|
return $(element); |
|
}, |
|
_text: function(text) { |
|
return document.createTextNode(text); |
|
}, |
|
|
|
ATTR_MAP: { |
|
'className': 'class', |
|
'htmlFor': 'for' |
|
}, |
|
|
|
_attributes: function(attributes) { |
|
var attrs = []; |
|
for(attribute in attributes) |
|
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + |
|
'="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); |
|
return attrs.join(" "); |
|
}, |
|
_children: function(element, children) { |
|
if(children.tagName) { |
|
element.appendChild(children); |
|
return; |
|
} |
|
if(typeof children=='object') { |
|
children.flatten().each( function(e) { |
|
if(typeof e=='object') |
|
element.appendChild(e); |
|
else |
|
if(Builder._isStringOrNumber(e)) |
|
element.appendChild(Builder._text(e)); |
|
}); |
|
} else |
|
if(Builder._isStringOrNumber(children)) |
|
element.appendChild(Builder._text(children)); |
|
}, |
|
_isStringOrNumber: function(param) { |
|
return(typeof param=='string' || typeof param=='number'); |
|
}, |
|
build: function(html) { |
|
var element = this.node('div'); |
|
$(element).update(html.strip()); |
|
return element.down(); |
|
}, |
|
dump: function(scope) { |
|
if(typeof scope != 'object' && typeof scope != 'function') scope = window; |
|
|
|
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + |
|
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + |
|
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ |
|
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ |
|
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ |
|
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); |
|
|
|
tags.each( function(tag){ |
|
scope[tag] = function() { |
|
return Builder.node.apply(Builder, [tag].concat($A(arguments))); |
|
}; |
|
}); |
|
} |
|
}; |