// DOM element generators for jQuery by Franck Marcia - 2006
// Inspired by DOM element creator by Michael Geary

(function(b) {

	var tags = ['A', 'DIV', 'FORM', 'IMG', 'INPUT', 'LABEL', 'LI', 'OL', 'UL',
				'OPTION', 'PRE', 'SELECT', 'SPAN', 'TEXTAREA'];

	function tagGen(t, n) {
		var	d = document, e = d.createElement(t);

		function apStyle(v) {
			for (var s in v)
				$.attr(e.style, s, v[s]);
		}

		function apAttr(v, k) {
			v.constructor == Function ?
				b._eventsCache.push({e:e, k:k, v:v}) : $.attr(e, k, v);
		}

		function append(o, c) {
			if (c == Array)
				for (var i=0, l=o.length; i<l; ++i)
					o[i] === null || o[i] === undefined || append(o[i], o[i].constructor);
			else if (c == Object)
				for (var a in o)
					o[a] === null || o[a] === undefined ||
						(a == 'style' ? apStyle : apAttr)(o[a], a);
			else
				e.appendChild(o.nodeType ? o : d.createTextNode(o.toString()));
		}

		for (var i=0, l=n.length; i<l; ++i)
			n[i] === null || n[i] === undefined || append(n[i], n[i].constructor);

		return e;
	}

	function tagsGen(t) {
		b[t] = function() { return tagGen(t, arguments); };
	}

	for (var i=tags.length-1; i>-1; --i)
		tagsGen(tags[i]);

	b.NBSP = '\u00a0';

	b._eventsCache = [];

	b.flushEvents = function() {
		for (var i in b._eventsCache) {
			var e = b._eventsCache[i];
			addEvent(e.e, e.k, e.v);
			e.e = null;
		}
		b._eventsCache = [];
	};

})($);
