
/*	DOM Builder - you can parse it a JS object or a HTML string to build you HTML, events are also parsed
	use		$B.node();		- for JSON
	use		$B.eval();		- for HTML
	*/
		var $B = IPC.DOM.Build = {
			IE_TRANS : { 'class' : 'className', 'for' : 'htmlFor' }, 
			HTML_TAGS : $w( ["p div span strong em img table tr td th thead tbody tfoot pre code h1 h2 h3 h4 h5 h6 ul ol",
						" li form input textarea legend fieldset select option blockquote cite br hr dd dl dt address a button", 
						" abbr acronym script link style bdo ins del object param col colgroup optgroup caption label dfn kbd samp var embed"].join( '' ) ), 
/*			HTML_ATTR : $w( ["abbr accept-charset accept accesskey action align alink alt archive axis background bgcolor ", 
						"border cellpadding cellspacing char charoff charset checked cite class classid clear code codebase ", 
						"codetype color cols colspan compact content coords data datetime declare defer dir enctype face ", 
						"for frame frameborder headers height href hreflang hspace http-equiv id ismap label lang language ", 
						"link longdesc marginheight marginwidth maxlength media method multiple name nohref noresize ", 
						"noshade nowrap object onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup ", 
						"onload onmousedown onmousemove onmouseout onmouseover onmouseup onreset onselect onsubmit ", 
						"onunload profile prompt readonly rel rev rows rowspan rules scheme scope scrolling selected shape size ", 
						"span src standby start style summary tabindex target text title type usemap valign value valuetype ", 
						"version vlink vspace width"].join( '' ) ), */
			eval : function( str )
			{
				return $( document.createElement( 'div' ) ).update( str.strip() ).down() || document.createTextNode( str.strip() );
			},
			node : function( obj, options )
			{
				if ( this._string( obj ) ) return this.eval( obj );
				if ( TEST.htmlElement( obj ) ) return $( obj );
				this.options = $H( {
					xml : false
				} ).merge( options || {} );
				
				var el, attr, child;
				var key = obj.shift();
				if ( obj[0].constructor == Object || obj[0].constructor == Hash ) 
					attr = obj.shift();
				if ( obj[0] && ( obj[0].constructor == Array || this._string( obj[0] ) || TEST.htmlElement( obj[0] ) ) )
					child = obj.shift();
				
				if ( ( !this.options.xml && this.HTML_TAGS.indexOf( key ) > -1 ) || this.options.xml )
					el = $( document.createElement( key ) );
				else {
					alert( "Non-standard HTML tag (" + key + ") entered.\nSet xml option to true to use non-standard tags." );
					return false;
				}
				
				if ( attr )
				{
					$H( attr ).each( function( a ) {
						if ( $USER.browser == 'Explorer' )
						{
							if ( this.IE_TRANS[a.key] ) el[this.IE_TRANS[a.key]] = a.value;
							else if ( a.key == 'style' ) el.style.cssText = a.value;
							else if ( /^on.+$/.test( a.key ) ) el[a.key] = new Function( a.value );
							else el.setAttribute( a.key, a.value );
						}
						else el.setAttribute( a.key, a.value );
					}.bind( this ) );
				}
				if ( child ) {
					this._children( child ).each( function( child ) {
						try { el.appendChild( child );}
						catch ( e ) { }
					} );
				}
				return $( el );
			}, 
			_children : function( val )
			{
				if ( val instanceof Array && !this._string( val[0] ) )
					return val.collect( function( obj ) { 
						return this.node( obj, this.options ); 
					}.bind( this ) );
				else
					return [this.node( val )];
			}, 
			_string : function( val )
			{
				return ( TEST.string( val ) || TEST.number( val ) );
			}
		};
		/*
		Event.observe( window, 'load', function() {
			document.body.appendChild( $B.node( [ 'div', { 'class' : 'vcard' }, [
				[ 'h2', { 'class' : 'fn org' }, 'Wikimedia Foundation Inc.' ], 
				[ 'div', { 'class' : 'adr' }, [
					[ 'p', { 'class' : 'street-address' }, '200 2nd Ave. South #358' ], 
					[ 'p', [
						[ 'span', { 'class' : 'locality' }, 'St. Petersburg' ], 
						[ 'abbr', { 'class' : 'region', 'title' : 'Florida' }, 'FL' ], 
						' ',
						[ 'span', { 'class' : 'postal-code' }, '33701-4313' ]
					] ],
					[ 'p', { 'class' : 'country-name' }, 'USA' ]
				] ], 
				[ 'p', [
					'Phone: ', 
					[ 'span', { 'class' : 'tel' }, '+1-727-231-0101' ]
				] ],
				[ 'p', [
					'Email: ', 
					[ 'span', { 'class' : 'email' }, 'info@wikimedia.org' ]
				] ],
				[ 'p', [
					[ 'span', { 'class' : 'tel' }, [
						[ 'span', { 'class' : 'type' }, 'Fax' ], 
						': ',
						[ 'span', { 'class' : 'value' }, '+1-727-258-0207' ]
					] ]
				] ]
			] ] ) );
		} );
		*/