
/**
 * insert a  breakable char into a string to make it break line in web browser
 * such as firefox.
 *
 * a tag with a css classname 'break-word' will be proccessed.
 * 
 * suppport:
 *   ie6, ie7, ie8, firefox 3, opera 10
 * issue:
 *      not work for firefox 2
 */
function fnWordBreakAll(o) {
	var o = o || {};
	var iWord = o.word || 13;
	var iRe = o.re || "[a-zA-Z0-9]";
	var bAll = o.all || false;
	var sClassName = o.className || "break-word";
	var aEls = o.els || (function () {
		var aEls = [];
		var aAllEls = document.getElementsByTagName("*");
		var re = new RegExp("(?:^|\\s+)" + sClassName + "(?:\\s+|$)");
		for (var i = 0, iLen = aAllEls.length; i < iLen; ++i) {
			if (re.test(aAllEls[i].className)) {
				aEls[aEls.length] = aAllEls[i];
			}
		}
		return aEls;
	})() || [];
	
	for (var i = 0, n = aEls.length; i < n; ++i) {
		var sUa = navigator.userAgent, sTn = aEls[i].tagName.toLowerCase();
		if ((/Opera/).test(sUa) || (/Firefox/).test(sUa) || (/Gecko/).test(sUa) || (/Mozilla/).test(sUa) || ((/KHTML/).test(sUa) && (sTn === "td" || sTn === "th")) || bAll) {
			fnBreakWord(aEls[i],iRe,iWord);
		}
	}
}

function fnBreakWord(oEl,Re,Word) {
	var iWord = Word || 13;
	var iRe = Re || "[a-zA-Z0-9]";
    // http://www.hedgerwow.com/360/dhtml/css-word-break.html
	if (!oEl || oEl.nodeType !== 1) {
		return false;
	} else {
		if (oEl.currentStyle && typeof oEl.currentStyle.wordWrap === "string") {
			breakWord = function (oEl) {
				oEl.runtimeStyle.wordWrap = "break-word";
				oEl.runtimeStyle.wordBreak = "break-all";
				return true;
			};
			return breakWord(oEl);
		} else {
			if (document.createTreeWalker) {
				var trim = function (str) {
					str = str.replace(/^\s\s*/, "");
					var ws = /\s/, i = str.length;
					while (ws.test(str.charAt(--i))) {
					}
					return str.slice(0, i + 1);
				};
				breakWord = function (oEl) {
					var dWalker = document.createTreeWalker(oEl, NodeFilter.SHOW_TEXT, null, false);
					var node, s, c = String.fromCharCode("8203"), re = new RegExp("(" + iRe + "{0," + iWord + "})");
					while (dWalker.nextNode()) {
						node = dWalker.currentNode;
						s = trim(node.nodeValue).split(re).join(c);
						node.nodeValue = s;
					}
					return true;
				};
				return breakWord(oEl);
			}
		}
	}
}
	
// call it
//fnWordBreakAll({word:15, re:"[\w]", all:false, className:"break-word"});
//fnWordBreakAll({word:15, re:"[\w]", all:true, className:"break-word"}); // include ie
//fnBreakWord(element,RegExp,char_count);
