LSF.DOM.Element = {
	
	mass : function (action, elements) {
		var m = LSF.DOM.Element[action];
		LSF.each (elements, function (element) {
			m (element);
		});
	},
	
	compatNode : function (node) {
		node = LSF.DOM.Element.get (node);
		if (typeof node.addEventListener == 'undefined') node.addEventListener = function (eventType, callback, dummy) {
			node.attachEvent ('on' + eventType, function() {
				callback (LSF.DOM.Event.compatEvent()); 
			});
		}
		return node;
	},
	
	focus : function (element) {
		setTimeout (function() { 
			try {
				LSF.DOM.Element.get (element).focus();
			} catch (e) {} 
		}, 100);		
	},
	
	toggle : function (element) {
		element = LSF.DOM.Element.get (element);
		if (getComputedStyle (element, null).getPropertyValue ('display') == 'none') {
			element.style.display = 'block';
		} else {
			element.style.display = 'none';			
		}
	},
	
	hide : function (element) {
		element = LSF.DOM.Element.get (element);
		element.style.display = 'none';
	},
	
	show : function (element) {
		element = LSF.DOM.Element.get (element);
		element.style.display = 'block';
	},
	
	hasClass : function (element, className) {
		element = LSF.DOM.Element.get (element);
    	var re = new RegExp ('(?:^|\\s+)' + className + '(?:\\s+|$)');
    	return re.test (element.className);
	},
	
	addClass : function (element, className) {
		element = LSF.DOM.Element.get (element);
		if (LSF.DOM.Element.hasClass (element, className)) return;
		element.className = element.className && element.className.length ? element.className + ' ' + className : className;
	},
	
	removeClass : function (element, className) {
		element = LSF.DOM.Element.get (element);
		if (!LSF.DOM.Element.hasClass (element, className)) return;		
		element.className = element.className.replace (new RegExp('(^' + className + '( |$)| ' + className + '\\b)'), '');
	},
	
	get : function (elementRef) {
		return typeof elementRef == 'string' ? document.getElementById (elementRef) : elementRef;
	},
	
	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() { return RegExp.$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[LSF.DOM.Element.camelizeCSSProperty(j)] = attributes[i][j];
				}
			} else {
				element.setAttribute (i, attributes[i]);
			}
		}
	},
	
	addChildren : function (element, children) {
		children = children || [];
		LSF.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];
		LSF.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.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;			
			}*/
	
};

LSF.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;
	}
	
}

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