
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(/"/,'&quot;')+'"');
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)));
};
});
}
};
