var WordBreak = {

    breakByStyle: function() {
        if( document.styleSheets[0].addRule ){
            document.styleSheets[0].addRule(".wordBreak","word-break:break-all");
        }else if( document.styleSheets[0].insertRule ){
            document.styleSheets[0].insertRule(".wordBreak{word-break:break-all}", document.styleSheets[0].cssRules.length );
        }else{
            return false;
        }
    },

    breakWords: function() {
        var wordBreakClass = "wordBreak";
        var table = document.getElementsByTagName("table");

        for(var i=0,len=table.length ; i<len ; i++){
            var tbClass = table[i].className.split(/\s+/);
            for (var j = 0; j < tbClass.length; j++) {
                if (tbClass[j] == wordBreakClass) {
                    WordBreak.recursiveParse(table[i]);
                }
            }
        }
        var div = document.getElementsByTagName("div");
        for(var i=0,len=div.length ; i<len ; i++){
            var tbClass = div[i].className.split(/\s+/);
            for (var j = 0; j < tbClass.length; j++) {
                if (tbClass[j] == wordBreakClass) {
                    WordBreak.recursiveParse(div[i]);
                }
            }
        }
        var td = document.getElementsByTagName("td");
        for(var i=0,len=td.length ; i<len ; i++){
            var tbClass = td[i].className.split(/\s+/);
            for (var j = 0; j < tbClass.length; j++) {
                if (tbClass[j] == wordBreakClass) {
                    WordBreak.recursiveParse(td[i]);
                }
            }
        }
    },

    recursiveParse: function(pNode) {
        var childs = pNode.childNodes;
        for (var i = 0; i < childs.length; i++) {
            var cNode = childs[i];
            if (childs[i].nodeType == 1) {
                WordBreak.recursiveParse(childs[i]);
            }else if(cNode.nodeType == 3) {
                if(cNode.nodeValue.match("[^\n ]")){
                    var plTxt = cNode.nodeValue.replace(/\t/g,"")
                    var spTxt = plTxt.split("");
                    spTxt = spTxt.join(String.fromCharCode(8203));
                    var chNode = document.createTextNode(spTxt);
                    cNode.parentNode.replaceChild(chNode,cNode);
                }
            }
        }
    },

    init: function() {
        var addEvent = function(elm,listener,fn) {
            try {
                elm.addEventListener(listener, fn, false);
            } catch(e) {
                elm.attachEvent("on" + listener, fn);
            }
        }

        if (WordBreak._isAvailabledStyle()) {
            addEvent(window, "load", WordBreak.breakByStyle);
        } else {
            addEvent(window, "load", WordBreak.breakWords);
        }
    },

    breakAll: function() {
        if (WordBreak._isAvailabledStyle()) {
            WordBreak.breakByStyle();
        } else {
            WordBreak.breakWords();
        }
    },

    _isAvailabledStyle: function() {
        if (window.opera || navigator.userAgent.indexOf("Firefox") != -1) {
            return false;
        } else {
            return true;
        }
    }
};
WordBreak.init();
