/**
 * jQuery Plugin JSONDOM v1.0
 *
 * Create DOM elements from a JSON representation of DOM elements
 *
 * Copyright (c) 2008 Tom Chislett
 *
 * @version     $Id: jquery.jsondom-1.0.js 9 2008-07-09 22:20:23Z tom $
 *
 * @author      Tom
 * @copyright   (C) 2008. All rights reserved.
 *
 * @package     jQuery Plugins
 * @subpackage  JSONDOM
 *
 */

/**
 * Create DOM elements from a JSON representation of DOM elements
 *
 * @uses    jQuery
 *
 * @param   string  json - JSON object containing a representation of the DOM elements to be appended
 *
 * @return  jQuery  element - The jQuery object representing the new element
 *
 * @since   1.0
 */
jQuery.fn.appendJSON = function( json )
{
	if ( typeof json == 'object' && json instanceof Object )
	{
		var element = __JSONDOM_createElementsFromObjects( json );
		this[0].appendChild( element );
		return jQuery( element );
	}
}

__JSONDOM_createElementsFromObjects = function( json )
{
	var attribute_counter = 0;
	var event = null;

	for ( var x in json )
	{
		if ( attribute_counter++ == 0 )
		{console.log(x);
			var child = document.createElement( x );
			if ( typeof json[x] == 'string' ) child.appendChild( document.createTextNode( json[x].match( /\&#?[a-zA-Z0-9]+;/ ) ? __JSONDOM_decodeHTMLEntities( json[x] ) : json[x] ) );
			else if ( typeof json[x] == 'object' && json[x] instanceof Array )
			{
				for ( var y = 0; y < json[x].length; y++ )
				{
					if ( typeof json[x][y] == 'string' ) child.appendChild( document.createTextNode( json[x][y].match( /\&#?[a-zA-Z0-9]+;/ ) ? __JSONDOM_decodeHTMLEntities( json[x][y] ) : json[x][y] ) );
					else child.appendChild( __JSONDOM_createElementsFromObjects( json[x][y] ) );
				}
			}
			else if ( typeof json[x] == 'object' && json[x] instanceof Object ) child.appendChild( __JSONDOM_createElementsFromObjects( json[x] ) );
		}
		else if ( event = x.match( /^on([a-z]+)$/ ) ) child.addEventListener( event[1], json[x], false );
		else try { child.setAttribute( x, json[x] ) } catch(e) { child.x = json[x] };
	}

	return child;
}

function __JSONDOM_decodeHTMLEntities( str ) { var x=document.createElement('div');x.innerHTML=str.toString();var y='';for(var z=0;z<x.childNodes.length;z++)y+=x.childNodes[z].nodeValue;return y };
