var html = function() {
	var rootNode = document.createElement('div');
	
	var create = function(name, params, pointer) {
		var ele = document.createElement(name);
		
		if(typeof params != "undefined") {
			if(params.className)
				ele.className = params.className;
			if(params.id)
				ele.id = params.id;
			if(params.src)
				ele.src = params.src;
			if(params.href)
				ele.href = params.href;
			if(params.title)
				ele.title = params.title;
			if(params.type)
				ele.type = params.type;
			if(params.name)
				ele.name = params.name;
			if(params.value)
				ele.value = params.value;
		}
		
		pointer.appendChild(ele);				
		addText(ele, params);
		
		return ele;
	}
	
	var addText = function(ele, params) {
		if(typeof params == "undefined")
			return;
	
		if(typeof params == "object") {
			if(params.text)
				ele.appendChild(document.createTextNode(params.text));
		} else
			ele.appendChild(document.createTextNode(params));
	}
	
	
	return {
		_pointer: rootNode,
		
		div: function(params){
			this._pointer = create('div', params, this._pointer);
			return this;
		}, 
		p: function(params) {
			this._pointer = create('p', params, this._pointer);
			return this;
		}, 
		a: function(params){
			this._pointer = create('a', params, this._pointer);
			return this;
		},
		ul: function(params) {
			this._pointer = create('ul', params, this._pointer);
			return this;
		},
		ol: function(params) {
			this._pointer = create('ol', params, this._pointer);
			return this;
		},
		li: function(params) {
			this._pointer = create('li', params, this._pointer);
			return this;
		},
		span: function(params) {
			this._pointer = create('span', params, this._pointer);
			return this;
		},
		form: function(params) {
			this._pointer = create('form', params, this._pointer);
			return this;
		},
		fieldset: function(params) {
			this._pointer = create('fieldset', params, this._pointer);
			return this;
		},
		input: function(params) {
			this._pointer = create('input', params, this._pointer);
			return this;
		},
		label: function(params) {
			this._pointer = create('label', params, this._pointer);
			return this;
		},
		add: function(func) {
			var pointer = this._pointer;
			var t = this;
			func.apply({
				p: function(params) {
					t._pointer = create('p', params, pointer);
					return t;
				},
				a: function(params) {
					t._pointer = create('a', params, pointer);
					return t;
				},						
				div: function(params) {
					t._pointer = create('div', params, pointer);
					return t;
				},
				ul: function(params) {
					t._pointer = create('ul', params, pointer);
					return t;
				},	
				ol: function(params) {
					t._pointer = create('ol', params, pointer);
					return t;
				},	
				li: function(params) {
					t._pointer = create('li', params, pointer);
					return t;
				},
				span: function(params) {
					t._pointer = create('span', params, pointer);
					return t;
				},
				form: function(params) {
					t._pointer = create('form', params, pointer);
					return t;
				},
				fieldset: function(params) {
					t._pointer = create('fieldset', params, pointer);
					return t;
				},
				input: function(params) {
			    t._pointer = create('input', params, pointer);
					return t;
		    },
				label: function(params) {
			    t._pointer = create('label', params, pointer);
					return t;
		    },
			});
			
			this._pointer = pointer.parentNode;
			return this;
		}, 
		toString: function() {
			return this.html();
		},
		html: function(){
			return rootNode.innerHTML;
		},
		fragment: function(){
			var fragment = document.createDocumentFragment(rootNode.innerHTML);
			
			for(var i = 0; i < rootNode.children.length; i++)
				fragment.appendChild(rootNode.children[i]);
			
			return fragment;
		}
	};

}	
