Logi.DOM.Element = {
	
	mass : function (action, elements) {
		var m = Logi.DOM.Element[action];
		Logi.each (elements, function (element) {
			m (element);
		});
	},
	
	compatNode : function (nodeRef) {
		var node = Logi.DOM.Element.get (nodeRef);
		if (!node) {
			throw "compatNode failed: Invalid node provided: " + nodeRef;
		}
		if (typeof node.addEventListener == 'undefined') node.addEventListener = function (eventType, callback, dummy) {
			node.attachEvent ('on' + eventType, function() {
				callback (Logi.DOM.Event.compatEvent()); 
			});
		}
		return node;
	},
	
	focus : function (element) {
		setTimeout (function() { 
			try {
				Logi.DOM.Element.get (element).focus();
			} catch (e) {} 
		}, 100);		
	},

	isVisible : function (element) {
		element = Logi.DOM.Element.get (element);
		return getComputedStyle (element, null).getPropertyValue ('display') != 'none';
	},
	
	toggle : function (element) {
		element = Logi.DOM.Element.get (element);
		if (Logi.DOM.Element.isVisible (element)) {
			element.style.display = 'none';
			return false;
		} else {
			var dmode = 'block';
			if (element.nodeName == 'TR') {
				dmode = 'table-row';
			}
			if (element.nodeName == 'TD') {
				dmode = 'table-cell';
			}
			element.style.display = dmode;
			return true;
		}
	},
	
	hide : function (element) {
		element = Logi.DOM.Element.get (element);
		element.style.display = 'none';
	},
	
	show : function (element) {
		element = Logi.DOM.Element.get (element);
		var dmode = 'block';
		if (element.nodeName == 'TR') {
			dmode = 'table-row';
		}
		if (element.nodeName == 'TD') {
			dmode = 'table-cell';
		}
		element.style.display = dmode;
	},
	
	toggleClass : function (element, className) {
		element = Logi.DOM.Element.get (element);
		Logi.DOM.Element[Logi.DOM.Element.hasClass (element, className) ? 'removeClass' : 'addClass'](element, className);
	},
	
	hasClass : function (element, className) {
		element = Logi.DOM.Element.get (element);
    	var re = new RegExp ('(?:^|\\s+)' + className + '(?:\\s+|$)');
    	return re.test (element.className || '');
	},
	
	addClass : function (element, className) {
		element = Logi.DOM.Element.get (element);
		if (Logi.DOM.Element.hasClass (element, className)) return;
		element.className = element.className && element.className.length ? element.className + ' ' + className : className;
	},
	
	removeClass : function (element, className) {
		element = Logi.DOM.Element.get (element);
		if (!Logi.DOM.Element.hasClass (element, className)) return;		
		element.className = element.className.replace (new RegExp('(^' + className + '( |$)| ' + className + '\\b)'), '');
	},
	
	insertAfter : function (newNode, refNode) {
		if (refNode.nextSibling) {
			return refNode.parentNode.insertBefore (newNode, refNode.nextSibling);
		} else {
			return refNode.parentNode.appendChild (newNode);
		}
	},
	
	next: function (element) {
		var e = element;
		do {
			e = e.nextSibling;
			if (!e) return;
			if (e.nodeType == 1) {
				return e;
			}
		} while (1);
	},
	
	previous: function (element) {
		var e = element;
		do {
			e = e.previousSibling;
			if (!e) return;
			if (e.nodeType == 1) {
				return e;
			}
		} while (1);
	},
	
	get : function (elementRef) {
		return typeof elementRef == 'string' ? document.getElementById (elementRef) : elementRef;
	},

	getText : function (element) {
		element = Logi.DOM.Element.get (element);
		ecl = element.childNodes.length;
		for (var i = 0; i < ecl; i++) {
			var c = element.childNodes[i];
			if (c.nodeType == 3) {
				var content = c.textContent || c.data;
				if (!content.match (/(^\s+$)/)) {
					return content;
				}
			}
		}
		return '';
	},
	
	getPosition : function (element, relatedElement) {
		relatedElement = relatedElement || document.body;
		var posX = 0, posY = 0;
		var n = element;
		while (n && n != relatedElement) {
			posX += n.offsetLeft;
			posY += n.offsetTop;
			n = n.offsetParent;
		}
		return { x : posX, y : posY };
	},
	
	fillCombo : function (combo, data, leaveFirst) {
		combo.options.length = leaveFirst ? 1 : 0;
		for (var id in data) {
			combo.options.add (new Option (data[id], id));
		}
	},

	camelizeCSSProperty : function (property) {
		return property.replace (/\-([a-z])/g, function (str) { return str.charAt(1).toUpperCase() }) 
	},
	
	setAttributes : function (element, attributes) {
		attributes = attributes || {};
		for (var i in attributes) {
			if (i == 'className') {
				element.className = attributes[i];
			} else if (i == 'style') {
				for (var j in attributes[i]) {
					element.style[Logi.DOM.Element.camelizeCSSProperty(j)] = attributes[i][j];
				}
			} else {
				element.setAttribute (i, attributes[i]);
			}
		}
	},
	
	addChildren : function (element, children) {
		children = children || [];
		Logi.each (children, function (child) {
			if (typeof child == 'function') {
				child (element);
			}
			if (typeof child == 'string' || typeof child == 'number') {
				child = document.createTextNode (child);
			}
			try{
				element.appendChild (child);
			} catch(e){}
		});
	},
	
	setContent : function (container, contents) {
		container.innerHTML = '';
		if (typeof (contents) == 'undefined') return;
		if (typeof (contents) == 'string' || typeof (contents) == 'number') {
			container.innerHTML = contents;
			return;
		}
		if (typeof (contents) == 'function') {
			contents (container);
			return;
		}
		if (!(contents instanceof Array)) contents = [contents];
		Logi.each (contents, function (content) {
			container.appendChild (content);
		});
	},
	
	create : function (tag, attributes, children, parentNode) {
		if (typeof children != 'undefined' && !(children instanceof Array)) children = [children];

		var el = document.createElement (tag.toUpperCase());
		
		this.setAttributes (el, attributes);
		this.addChildren (el, children);
		
		if (typeof parentNode != 'undefined' && parentNode !== null) {
			parentNode.appendChild (el);
		}
		return el;
	},
	createSpecial : {
		select : {
			
		}
	}
		/*	
			newSelect : function (attributes, options, value) {
				var el = document.createElement ('SELECT');
				for (var i in attributes) {
					el.setAttribute (i, attributes[i]);
				}
				for (var i = 0; i < options.length; i++) {
					var opt = options[i];
					if (value == opt.value) {
						el.appendChild (SnakeStuck.Dom.newElement ('OPTION', { 'value' : opt.value, 'selected' : 'selected' }, opt.text));
					} else {
						el.appendChild (SnakeStuck.Dom.newElement ('OPTION', { 'value' : opt.value }, opt.text));
					}
				}
				return el;			
			}*/
	
};

Logi.DOM.HTML = {
	
	escape : function (html) {
		return String (html).replace (/&/g, "&amp;").replace (/</g, "&lt;").replace (/>/g, "&gt;").replace (/"/g, "&quot;");
	},
	/*"*/
	unescape : function (html) {
		var temp = document.createElement('DIV');
		temp.innerHTML = str;
		return temp.firstChild.nodeValue;
	}
	
}

Logi.quickAccess ('dom', Logi.DOM.Element);
Logi.quickAccess ('cn', Logi.DOM.Element.compatNode);
Logi.quickAccess ('$el', Logi.DOM.Element.get);
