var _dominate = function(basis) {
    var _styleAttribute = function(val) {
        if (typeof(val) == "") {
            return val;
        } else {
            var rv = [];
            for (var k in val) {
                rv.push(String(k) + ":" + String(val[k]));
            }
            return rv.join(";");
        }
    };

    var _safeAttributeSet = function(_e, attr, val) { 
        attr = attr.toLowerCase();
        if (attr == 'class') {
            val = val.split(" ");
            for (var v=0; v<val.length; v++) {
                Element.addClassName(_e, val[v]);
            }
        } else if (attr == 'style') {
            Element.setStyle(_e, _styleAttribute(val));
        }
        else {
            _e.setAttribute(attr, val);
        }
    };

    var createDOM = function(n, attrs) {
        var _e = Element.extend(document.createElement(n));
        if (n == "a") {
            _e.href = "#";
            _e.onclick = function() { return false; };
        }
        for (var attr in attrs) {
            _safeAttributeSet(_e, attr, attrs[attr]);
        }
        if ( (arguments != null) && (arguments.length > 2) ) {
            var node_args = arguments[2];
            for (var i = 1; i <  node_args.length; ++i) {
                if (typeof(node_args[i]) == 'function')
                    _e.appendChild(node_args[i]());
                else if ( (typeof(node_args[i]) == 'string') || (typeof(node_args[i]) == 'number'))
                    _e.appendChild(document.createTextNode(node_args[i]));
                else
                    _e.appendChild(node_args[i]);
            }
        }
        return _e;
    }

    var _nodes = [ 'table', 'tbody', 'tr', 'th', 'td', 'a', 'strong', 'div', 'img',
                   'br', 'b', 'span', 'li', 'ul', 'ol', 'iframe', 'form', 'h1',
                   'input', 'h2', 'h3', 'p', 'br', 'select', 'option', 'optgroup',
                   'label', 'textarea' ];

        
    for (var i = 0; i < _nodes.length; i++) {
        var node = _nodes[i].toUpperCase();
        var nodeName = _nodes[i];
        var makeFunction = function(nodeName) { 
            return function(attrs) {
                return createDOM(nodeName, attrs, arguments);
            };
        };
        basis[node] = makeFunction(nodeName);
    }
};

_dominate(self);
