var textReplace = function(srcText, replacedText, obj){
	if(!srcText || !replacedText) return;
	if(!obj) obj = document.getElementsByTagName("body")[0];
	var stack = new Array();
	stack.push(obj);
	var node;
	while(node = stack.pop()){
		var children = node.childNodes;
		var nChildren = children.length;
		for(var i=0; i<nChildren; ++i){
			if(children[i].tagName)
				stack.push(children[i]);
			else
				children[i].nodeValue = children[i].nodeValue.replace(srcText, replacedText);
		}
	}
};
var textReplaceAdv = function(params){
	if(!params) return;
	if(!params.srcText) return;
	if(!params.aroundElem && !params.replacedText) return;
	var range = params.range;
	var aroundElem = params.aroundElem;
	var srcText = params.srcText;
	var replacedText = params.replacedText;
	var nLenSrcText = srcText.length;
	if(!range)
		range = [document.getElementsByTagName("body")[0]];
	else if(range.length == undefined)
		range = [range];
	var nObj = range.length;
	var stack = new Array();
	for(var i=0; i<nObj; ++i)
		stack.push(range[i]);
	var node;
	while(node = stack.pop()){
		var children = node.childNodes;
		var nChildren = children.length;
		for(i=0; i<nChildren; ++i){
			var node = children[i];
			if(node.tagName)
				stack.push(node);
			else{
				if(node.nodeType == 8) continue; // Node.COMMENT_NODE
				if(aroundElem){
					var text = node.nodeValue;
					var pos = text.indexOf(srcText);
					if(pos<0) continue;
					var before_text = text.substr(0, pos);
					var after_text = text.substr(pos + nLenSrcText);
					var newElem = aroundElem.cloneNode(false);
					if(replacedText)
						newElem.innerHTML = replacedText;
					else
						newElem.innerHTML = srcText;
					node.parentNode.insertBefore(newElem, node);
					node.parentNode.insertBefore(document.createTextNode(before_text), newElem);
					node.nodeValue = after_text;
				}else{
					node.nodeValue = node.nodeValue.replace(srcText, replacedText);
				}
			}
		}
	}
};