User:Ganiman/builder.js

// script.aculo.us builder.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/

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' }, // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, //      due to a Firefox bug node: function(elementName) { elementName = elementName.toUpperCase; // try innerHTML approach var parentTag = this.NODEMAP[elementName] || 'div'; var parentElement = document.createElement(parentTag); try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" + elementName + ">"; } catch(e) {} var element = parentElement.firstChild || null; // see if browser added wrapping tags if(element && (element.tagName.toUpperCase != elementName)) element = element.getElementsByTagName(elementName)[0]; // fallback to createElement approach if(!element) element = document.createElement(elementName); // abort if nothing could be created if(!element) return;

// attributes (or text) 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 { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" +elementName + " " + attrs + ">"; } catch(e) {} element = parentElement.firstChild || null; // workaround firefox 1.0.X bug 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]; }       }

// text, or array of children 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') { // array can hold nodes and text      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; //global scope 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)));        }     }); } }