/*----------------------------------------*\    
 * 使用 js 标记高亮关键词    
 * 参数说明:    
 * obj: 对象, 要进行高亮显示的html标签节点.    
 * hlWords: 字符串, 要进行高亮的关键词词, 使用 竖杠(|)或空格 分隔多个词 .    
 * cssClass: 字符串, 定义关键词突出显示风格的css伪类.    
 * 参考资料: javascript HTML DOM 高亮显示页面特定字词 By lijian@365.com   
\*----------------------------------------*/     
function MarkHighLight(obj,hlWords,cssClass){    
   
    hlWords=AnalyzeHighLightWords(hlWords);    
        
    if(obj==null || hlWords.length==0)    
        return;    
    if(cssClass==null)    
        cssClass="highlight";    
    MarkHighLightCore(obj,hlWords);    
        
    //------------执行高亮标记的核心方法----------------------------    
    function MarkHighLightCore(obj,keyWords){    
        var re=new RegExp(keyWords, "i");     
            
        for(var i=0; i<obj.childNodes.length; i++){    
            
            var childObj=obj.childNodes[i];    
            if(childObj.nodeType==3){    
                if(childObj.data.search(re)==-1)continue;     
                var reResult=new RegExp("("+keyWords+")", "gi");     
                var objResult=document.createElement("span");    
                objResult.innerHTML=childObj.data.replace(reResult,"<span class='"+cssClass+"'>$1</span>");                         
                if(childObj.data==objResult.childNodes[0].innerHTML) continue;     
                obj.replaceChild(objResult,childObj);                                          
            }else if(childObj.nodeType==1){    
                MarkHighLightCore(childObj,keyWords);    
            }    
        }    
    }            
   
    //----------分析关键词----------------------    
    function AnalyzeHighLightWords(hlWords)    
    {    
        if(hlWords==null) return "";    
        hlWords=hlWords.replace(/\s+/g,"|").replace(/\|+/g,"|");                
        hlWords=hlWords.replace(/(^\|*)|(\|*$)/g, "");    
            
        if(hlWords.length==0) return "";    
        var wordsArr=hlWords.split("|");     
            
        if(wordsArr.length>1){    
            var resultArr=BubbleSort(wordsArr);    
            var result="";    
            for(var i=0;i<resultArr.length;i++){    
                result=result+"|"+resultArr[i];    
            }                    
            return result.replace(/(^\|*)|(\|*$)/g, "");    
   
        }else{    
            return hlWords;    
        }     
    }        
        
    //-----利用冒泡排序法把长的关键词放前面-----        
    function BubbleSort(arr){            
        var temp, exchange;        
        for(var i=0;i<arr.length;i++){                
            exchange=false;                    
            for(var j=arr.length-2;j>=i;j--){                    
                if((arr[j+1].length)>(arr[j]).length){                        
                    temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp;    
                    exchange=true;    
                }    
            }                    
            if(!exchange)break;    
        }    
        return arr;                
    }    
   
} 