// JavaScript Document
function $E(data) {
    var el;
    if ('string'==typeof data) {
        el=document.createTextNode(data);
    } else {
        //create the element
        el = document.createElement(data.tag);
        delete(data.tag);
        //append the children
        if ('undefined' != typeof data.children) {
            if ('string' == typeof data.children || 'undefined'==typeof data.children.length) {
                //strings and single elements
                el.appendChild($E(data.children));
            } else {
                //arrays of elements
                for (var i=0, child=null; 'undefined' != typeof (child=data.children[i]); i++) {
                    el.appendChild($E(child));
                }
            }
            delete(data.children);
        }

        //any other data is attributes
        for (attr in data){ 
			el[attr] = data[attr];
        }
    }
		
    return el;
}