
	function Element(properties) {
		this.prop = properties;
		return this.build();
	}

	Element.prototype = {

		makingNew: true,
		prop: null,
		textNode: null,
    
		build: function() {
			if(this.prop.text)
				this.textNode = document.createTextNode(this.prop.text);
			if($.id(this.prop.id)) {
				this.makingNew = false;
				return;
			}  

			var newEl = document.createElement(this.prop.tag);
			for(property in this.prop) {
				if(property == 'className') 
					DomUtils.setAnyAttribute(newEl, property, 'class');
				if(property !== 'tag' && property !== 'text')
					DomUtils.setAnyAttribute(newEl, property, this.prop[property]);
			}
			if(this.textNode !== null)newEl.appendChild(this.textNode);
			
			return newEl;   
		}
	}

	ElementHandler = function() {
    	
		return { 
	
			_getEl: function(properties, update) {
				if(typeof el == 'undefined') var el = new Element(properties);
				if(el.makingNew == false && update !== true) {
					newEl = $.id(el.prop.id).cloneNode(true);
					$.id(el.prop.id).parentNode.removeChild($.id(el.prop.id));
					return newEl;		    
				}
				return el;
			},
	
			putBefore: function(destination, properties) {
				var newEl = this._getEl(properties);
				if(newEl.makingNew = false) this._getEl(properties);
				var parent = $.id(destination).parentNode;
				parent.insertBefore(newEl,$.id(destination));	       
			},
		
			putAfter: function(destination, properties) {
				var newEl = this._getEl(properties);
				if(newEl.makingNew = false) this._getEl(properties); //**** Test this ****/
				var parent = $.id(destination).parentNode;
				var destination = DomUtils.getNext(destination); //change
				parent.insertBefore(newEl,$.id(destination));
			},
		    
			putAtStart: function(parent, properties) {
				var newEl = this._getEl(properties);
				var destination = DomUtils.getChildren(parent)[0];
				$.id(parent).insertBefore(newEl,$.id(destination));
			},
			      
			putAtEnd: function(parent, properties) {
				var newEl = this._getEl(properties);
				$.id(parent).appendChild(newEl);
			},
		    
			replace: function(element, properties) {
				var newEl = this._getEl(properties);
				var parent = $.id(element).parentNode;
				var destination = $.id(element).nextSibling;
				$.id(element).parentNode.removeChild($.id(element));
				$.id(parent).insertBefore(newEl,$.id(destination));
			},
		    
			updateThis: function(element, properties) {
				var element = $.id(element);	    
				var newEl = this._getEl(properties, true);
				for (property in newEl.prop) {
					if (property !== 'style')
						element[property] = newEl.prop[property];
					else {
						var styles = newEl.prop.style.split(/;\s?/gi);
						for (var i = 0; i < styles.length; i++) {
							var stylePairs = styles[i].split(/:\s?/ig);
							element.style[stylePairs[0]] = stylePairs[1];
						}
					}
				}
				if (newEl.textNode !== null) 
				element.appendChild(newEl.textNode);
			},

			remove: function(element) {
				var element = $.id(element);
				if (element == null)
					return;
				var parent = element.parentNode;
				parent.removeChild(element);
			}
		}  
	}();



