// DOM element creator for jQuery and Prototype by Michael Geary
// http://mg.to/topics/programming/javascript/jquery
// Inspired by MochiKit.DOM by Bob Ippolito
// Free beer and free speech. Enjoy!

$.defineTag = function( tag ) {
    $[tag.toUpperCase()] = function() {
        return $._createNode( tag, arguments );
    }
};

(function() {
    var tags = [
    'a', 'b', 'br', 'button', 'canvas', 'div', 'fieldset', 'form',
    'h1', 'h2', 'h3', 'hr', 'i', 'iframe', 'img', 'input', 'label', 'legend',
    'li', 'ol', 'optgroup', 'option', 'p', 'pre', 'select',
    'span', 'script', 'strong', 'table', 'tbody', 'td', 'textarea',
    'tfoot', 'th', 'thead', 'tr', 'tt', 'ul' ];
    for( var i = tags.length - 1;  i >= 0;  i-- ) {
        $.defineTag( tags[i] );
    }
})();

$.NBSP = '\u00a0';

$._createNode = function( tag, args ) {
    var fix = {
        'class':'className',
        'Class':'className'
    };
    var e;
    try {
        if (typeof(args[0]) == 'string' || args[0].nodeType == 1) {
            var newArgs = [{}];
            for (i=0; i < args.length; i++) newArgs.push(args[i]);
            args = newArgs;
        }
        /*
        if (typeof(args[0] == 'array')) {
            var newArgs = [{}]
        }*/
        var attrs = args[0] || {};
        e = document.createElement( tag );
        /*
        for( var attr in attrs ) {
            var a = fix[attr] || attr;
            e[a] = attrs[attr];
        }
        */
        /*
        for(var attr in attrs)
            $.attr(e,attr,attrs[attr]);
            */
        $(e).attr(attrs);
        if (attrs.style) $(e).css(attrs.style);
        for( var i = 1;  i < args.length;  i++ ) {
            var arg = args[i];
            if( arg == null ) continue;
            if( arg.constructor != Array ) append( arg );
            else for( var j = 0;  j < arg.length;  j++ )
                append( arg[j] );
        }
    }
    catch( ex ) {
        //console.log(ex);
        /*alert( 'Cannot create <' + tag + '> element:\n' +
            args.toSource() + '\n' + args );
            */
        alert("Cannot create tag " + tag + "\n" + ex);
        e = null;
    }

    function append( arg ) {
        if( arg == null || arg == "" ) return;
        var c = arg.constructor;
        switch( typeof arg ) {
            case 'number': arg = '' + arg;  // fall through
            case 'string': arg = document.createTextNode( arg );
        }
        e.appendChild( arg );
    }

    return e;
};

$.TEXT = function(s) {
    return document.createTextNode(s);
};

