/*============================================================================*\
	DOM
	Based on DOM element creator for jQuery and Prototype by Michael Geary
	http://mg.to/topics/programming/javascript/jquery
	Inspired by MochiKit.DOM by Bob Ippolito
\*============================================================================*/

$.fn.appendNodes = function() {
	var args = arguments;
	return this.each(function(){
		for (var i=0, e; e=args[i]; ++i)
			$.apply(this, $.appendNodes, [e]);
	});
};

$.appendNodes = function(elt) {
	var _children = [], _events = [], i, e;
	if (elt._children) {
		_children = elt._children;
		elt._children = null;
	}
	if (elt._events) {
		_events = elt._events;
		elt._events = null;
	}
	var cur = this.appendChild(elt);
	for (i=0, e; e=_events[i]; ++i)
		addEvent(cur, e.n, e.h);
	for (i=0, e; e=_children[i]; ++i)
		$.apply(cur, $.appendNodes, [e]);
};

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

(function() {
	var tags = [
		'A', 'BR', 'BUTTON', 'CANVAS', 'DIV', 'FIELDSET', 'FORM',
		'H1', 'H2', 'H3', 'HR', 'IMG', 'INPUT', 'LABEL', 'LEGEND',
		'LI', 'OL', 'OPTGROUP', 'OPTION', 'P', 'PRE', 'SELECT',
		'SPAN', 'STRONG', 'TABLE', 'TBODY', 'TD', 'TEXTAREA',
		'TFOOT', 'TH', 'THEAD', 'TR', 'TT', 'UL' ];
	for (var i=0, l=tags.length; i<l; ++i)
		$.defineTag(tags[i]);
})();

$.NBSP = '\u00a0';

$._createNode = function( tag, args ) {

	var fix = { 'class':'className', 'Class':'className' };
	var attrs = args[0] || {};
	var e = document.createElement(tag);

	for (var attr in attrs ) {
		var a = fix[attr] || attr;
		if (attrs[attr].constructor == Function) {
			if (!e._events) e._events = [];
			e._events.push({'n':a,'h':attrs[attr]});
		} else {
			e[a] = attrs[attr];
		}
	}

	if (args[1]) e._children = [];

	for (var i=1, arg; arg=args[i]; ++i)
		if (arg.constructor != Array)
			append(arg);
		else
			for (var j=0, sarg; sarg=arg[j]; ++j)
				append(sarg);

	function append(arg) {
		switch (typeof arg) {
			case 'number': arg = '' + arg;  // fall through
			case 'string': arg = document.createTextNode(arg);
		}
		e._children.push(arg);
	}

	return e;
};
