
var CLIENT_TYPES = { DISABLED : 0, WINIE : 1, FIREFOX : 2, OPERA : 3, SAFARI : 4 };
var CLIENT_TYPE = function(ua){
	if(!!ua.match(/msie/))   return CLIENT_TYPES.WINIE;
	if(!!ua.match(/safari/)) return CLIENT_TYPES.SAFARI;
	if(!!ua.match(/gecko/))  return CLIENT_TYPES.FIREFOX;
	if(!!ua.match(/opera/))  return CLIENT_TYPES.OPERA;
	return CLIENT_TYPES.DISABLED;
}(navigator.userAgent.toLowerCase());

function _(el, attrs, styles, ch){
	for(var prop in (!!attrs ? attrs : {}))  el.setAttribute(prop, attrs[prop]);
	for(var prop in (!!styles ? styles : {})) el.style[prop] = styles[prop];
	for(var i=0,c=ch instanceof Array ? ch : !!ch ? [ch] : []; i<c.length; i++) el.appendChild(c[i]);
	return el;
}

function elementCoord(el){
	for(var t=el,coord={x:0,y:0}; !!t; t=t.offsetParent){
		coord.x += t.offsetLeft;
		coord.y += t.offsetTop;
	}
	return coord;
}

function addListener(target, evnt, func){
	switch(CLIENT_TYPE){
		case CLIENT_TYPES.WINIE:
			target.attachEvent("on" + evnt, func);
		break;
		
		case CLIENT_TYPES.SAFARI:
		case CLIENT_TYPES.FIREFOX:
		case CLIENT_TYPES.OPERA:
			target.addEventListener(evnt, func, false);
		break;
	}
}


function replaceStyleClass(element, oldClassName, newClassName){
	
	element.className = function(){
		var renameTo = [];
		for(var result={},names=element.className.split(" "),i=0; i<names.length; i++){
			if(!names[i] || names[i] == oldClassName) continue;
			result[names[i]] = true;
		}
		result[newClassName] = true;
		for(var key in result){
			renameTo.push(key);
		}
		return renameTo.join(" ");
	}();
	
}

function nodeText(node){
	if(!node || node.nodeType != 1){
		return "";
	}
	switch(CLIENT_TYPE){
		case CLIENT_TYPES.WINIE:
		case CLIENT_TYPES.OPERA:
			
		return node.innerText;
		
		case CLIENT_TYPES.SAFARI:
		case CLIENT_TYPES.FIREFOX:
		
		return node.textContent;
	}
	return "";
}

function classNameSet(element){
	if(!element) return {};
	if(element.nodeType != 1) return {};
	
	for(var result={},names=element.className.split(" "),i=0; i<names.length; i++){
		if(!names[i]) continue;
		result[names[i]] = true;
	}
	return result;
}
