/////
///// Get string length
/////
function strlen(str){
	var len = 0;
	var i = 0;
	
	str = escape(str);
	
	for (i = 0; i < str.length; i ++, len ++){
		if (str.charAt(i) == "%") {
			if (str.charAt(++i) == "u") {
				i += 3;
				len++;
			}
			i++;
		}
	}
	return len;
}

/////
///// Browser check for MSIE
/////
function isMSIE(){
	return (navigator.userAgent.indexOf('MSIE') >= 0);
}

/////
///// Opacity
/////
function setOpacity(obj, val){
	if (obj){
		if (isMSIE()){
			obj.style.filter = 'alpha(opacity=' + val + ')';	// IE
			return;
		}
		else{
			var val = val / 100;
			obj.style.mozOpacity = val;							// Firefox
			obj.style.opacity = val;							// Safari
			return;
		}
	}
}

/////
///// Fade out
/////
function fadeOut(obj, startOpacity, step, speed, callBackFunc){

	var timerFadeout;
	var fadeoutOpacity = startOpacity;
	
	if (navigator.userAgent.indexOf('Opera') >= 0){
		obj.style.visibility = 'hidden';
		return;
	}
	
	var funcRefFadeout = function(){
	
		fadeoutOpacity = fadeoutOpacity - step;
		
		if (fadeoutOpacity <= 0){
			clearInterval(timerFadeout);
			setOpacity(obj, 0);
			obj.style.visibility = 'hidden';

			if (callBackFunc){
				setTimeout(callBackFunc, 0);
				clearInterval(timerFadeout);
			}
		}
		
		setOpacity(obj, fadeoutOpacity);
	};

	timerFadeout = setInterval(funcRefFadeout, speed);
}

/////
///// Clear child nodes
/////
function clearChildNodes(parentObj){
	
	if (parentObj){
		var nodes = parentObj.childNodes;
		for (var i = 0; i < nodes.length; i ++){
			if (nodes[i]){
				parentObj.removeChild(nodes[i]);
			}
		}
	}
}

/////
///// Event
/////
function addListener(elem, eventType, func, cap){
	if (elem.attachEvent){
		elem.attachEvent("on" + eventType, func);
	}
	else if (elem.addEventListener){
		elem.addEventListener(eventType, func, cap);
	}
	else{
		elem["on" + eventType] = func;
	}
}

function removeListener(elem, eventType, func, cap){
	if (elem.detachEvent){
		elem.detachEvent('on' + eventType, func);
	}
	else if (elem.removeEventListener){
		elem.removeEventListener(eventType, func, cap);
	}
}