jQuery.fn.truncate=function(max,settings){settings=jQuery.extend({chars:/\s/,trail:["...",""]},settings);var myResults={};var ie=$.browser.msie;function fixIE(o){if(ie){o.style.removeAttribute("filter")}}return this.each(function(){var $this=jQuery(this);var myStrOrig=$this.html().replace(/\r\n/gim,"");var myStr=myStrOrig;var myRegEx=/<\/?[^<>]*\/?>/gim;var myRegExArray;var myRegExHash={};var myResultsKey=$("*").index(this);while((myRegExArray=myRegEx.exec(myStr))!=null){myRegExHash[myRegExArray.index]=myRegExArray[0]}myStr=jQuery.trim(myStr.split(myRegEx).join(""));if(myStr.length>max){var c;while(max<myStr.length){c=myStr.charAt(max);if(c.match(settings.chars)){myStr=myStr.substring(0,max);break}max--}if(myStrOrig.search(myRegEx)!=-1){var endCap=0;for(eachEl in myRegExHash){myStr=[myStr.substring(0,eachEl),myRegExHash[eachEl],myStr.substring(eachEl,myStr.length)].join("");if(eachEl<myStr.length){endCap=myStr.length}}$this.html([myStr.substring(0,endCap),myStr.substring(endCap,myStr.length).replace(/<(\w+)[^>]*>.*<\/\1>/gim,"").replace(/<(br|hr|img|input)[^<>]*\/?>/gim,"")].join(""))}else{$this.html(myStr)}myResults[myResultsKey]=myStrOrig;$this.html(["<div class='truncate_less'>",$this.html(),settings.trail[0],"</div>"].join("")).find(".truncate_show",this).click(function(){if($this.find(".truncate_more").length==0){$this.append(["<div class='truncate_more' style='display: none;'>",myResults[myResultsKey],settings.trail[1],"</div>"].join("")).find(".truncate_hide").click(function(){$this.find(".truncate_more").css("background","#fff").fadeOut("normal",function(){$this.find(".truncate_less").css("background","#fff").fadeIn("normal",function(){fixIE(this);$(this).css("background","none")});fixIE(this)});return false})}$this.find(".truncate_less").fadeOut("normal",function(){$this.find(".truncate_more").fadeIn("normal",function(){fixIE(this)});fixIE(this)});jQuery(".truncate_show",$this).click(function(){$this.find(".truncate_less").css("background","#fff").fadeOut("normal",function(){$this.find(".truncate_more").css("background","#fff").fadeIn("normal",function(){fixIE(this);$(this).css("background","none")});fixIE(this)});return false});return false})}})};

jQuery.fn.truncateSafeEnd=function(max,end,settings){
    settings=jQuery.extend({chars:/\s/,trail:["...",""]},settings);
    var myResults={};
    var ie=$.browser.msie;
    var maxMax=max*.5;
    var maxEnd=end*1.5;
    var origMax = max;/*--CAC--*/
    max-=end;/*--CAC--*/
    function fixIE(o){
        if(ie){
            o.style.removeAttribute("filter")
        }
    }
    
    return this.each(function(){
        var $this=jQuery(this);
        var myStrOrig=$this.html().replace(/\r\n/gim,"");
        var myStr=myStrOrig;
        var myEndStr=myStrOrig;/*---CAC--*/
        var myRegEx=/<\/?[^<>]*\/?>/gim;
        var myRegExArray;
        var myRegExHash={};
        var myResultsKey=$("*").index(this);
        var startPos=0;/*--CAC--*/
        var storeMax=max;/*--CAC--*/
        var storeEnd=end;/*--CAC--*/
        
        while((myRegExArray=myRegEx.exec(myStr))!=null){
            myRegExHash[myRegExArray.index]=myRegExArray[0]
        }
        myStr=jQuery.trim(myStr.split(myRegEx).join(""));
        if(myStr.length>origMax){
            var c;
            while(max<myStr.length){
                c=myStr.charAt(max);
                if(c.match(settings.chars)){
                    myStr=myStr.substring(0,max);
                    startPos=max;
                    break;
                }
                if(max<maxMax){
                    myStr=myStr.substring(0,max);
                    startPos=max;
                    break;
                }
                max--
            }
            /*--CAC--*/
            
            if(startPos>=(myEndStr.length-end)){
                myEndStr=myEndStr.substring(startPos,myEndStr.length);
            }
            else{
                myEndStr=myEndStr.substring(myEndStr.length-end,myEndStr.length);
            }
            if(myStrOrig.search(myRegEx)!=-1){
                var endCap=0;
                for(eachEl in myRegExHash){
                    myStr=[myStr.substring(0,eachEl),myRegExHash[eachEl],myStr.substring(eachEl,myStr.length)].join("");
                    if(eachEl<myStr.length){
                        endCap=myStr.length
                    }
                }
                $this.html([myStr.substring(0,endCap),myStr.substring(endCap,myStr.length).replace(/<(\w+)[^>]*>.*<\/\1>/gim,"").replace(/<(br|hr|img|input)[^<>]*\/?>/gim,"")].join(""))
            }
            else{
                $this.html(myStr)
            }
            max=storeMax;/*--CAC--*/
            end=storeEnd;/*--CAC--*/
            myResults[myResultsKey]=myStrOrig;
            /*--CAC--*/$this.html(["<div class='truncate_less'>",$this.html(),settings.trail[0],myEndStr,"</div>"].join("")).find(".truncate_show",this).click(function(){
                if($this.find(".truncate_more").length==0){
                    $this.append(["<div class='truncate_more' style='display: none;'>",myResults[myResultsKey],settings.trail[1],"</div>"].join("")).find(".truncate_hide").click(function(){
                        $this.find(".truncate_more").css("background","#fff").fadeOut("normal",function(){
                            $this.find(".truncate_less").css("background","#fff").fadeIn("normal",function(){
                                fixIE(this);$(this).css("background","none")
                            });
                            fixIE(this)
                        });
                        return false
                    })
                }
                $this.find(".truncate_less").fadeOut("normal",function(){
                    $this.find(".truncate_more").fadeIn("normal",function(){
                        fixIE(this)
                    });
                    fixIE(this)
                });
                jQuery(".truncate_show",$this).click(function(){
                    $this.find(".truncate_less").css("background","#fff").fadeOut("normal",function(){
                        $this.find(".truncate_more").css("background","#fff").fadeIn("normal",function(){
                            fixIE(this);
                            $(this).css("background","none")
                        });
                        fixIE(this)
                    });
                    return false
                });
                return false
            })
        }
    })
};

jQuery.fn.truncateMid=function(max,settings){
    settings=jQuery.extend({chars:/\s/,trail:["...",""]},settings);
    var myResults={};
    var ie=$.browser.msie;
    var maxMax=max*.5;
    var maxEnd=max*1.5;
    var origMax = max;/*--CAC--*/
    end = max = parseInt(max/2);/*--CAC--*/
    var storeMax=max;/*--CAC--*/
    var storeEnd=end;/*--CAC--*/
    function fixIE(o){
        if(ie){
            o.style.removeAttribute("filter")
        }
    }
    return this.each(function(){
        var $this=jQuery(this);
        var myStrOrig=$this.html().replace(/\r\n/gim,"");
        var myStr=myStrOrig;
        var myEndStr=myStrOrig;/*---CAC--*/
        var myRegEx=/<\/?[^<>]*\/?>/gim;
        var myRegExArray;
        var myRegExHash={};
        var myResultsKey=$("*").index(this);
        var startPos=0;/*--CAC--*/
        while((myRegExArray=myRegEx.exec(myStr))!=null){
            myRegExHash[myRegExArray.index]=myRegExArray[0]
        }
        myStr=jQuery.trim(myStr.split(myRegEx).join(""));
        if(myStr.length>origMax){
            var c;
            while(max<myStr.length){
                c=myStr.charAt(max);
                if(c.match(settings.chars)){
                    myStr=myStr.substring(0,max);
                    startPos=max;
                    break;
                }
                if(max<maxMax){
                    myStr=myStr.substring(0,max);
                    startPos=max;
                    break;
                }
                max--
            }
            /*--CAC--*/
            c='';
            while(end<myEndStr.length){
                c=myEndStr.charAt(myEndStr.length-end);
                if(c.match(settings.chars)){
                    if(startPos>=(myEndStr.length-end)){
                        myEndStr=myEndStr.substring(startPos+1,myEndStr.length);
                        break;
                    }
                    else{
                        myEndStr=myEndStr.substring(myEndStr.length-end+1,myEndStr.length);
                        break;
                    }
                }
                if(end>maxEnd){
                    myEndStr=myEndStr.substring(myEndStr.length-end,myEndStr.length);
                    break;
                }
                if(startPos>=(myEndStr.length-end)){
                    myEndStr=myEndStr.substring(startPos,myEndStr.length);
                    break;
                }
                end++;
            }
            if(myStrOrig.search(myRegEx)!=-1){
                var endCap=0;
                for(eachEl in myRegExHash){
                    myStr=[myStr.substring(0,eachEl),myRegExHash[eachEl],myStr.substring(eachEl,myStr.length)].join("");
                    if(eachEl<myStr.length){
                        endCap=myStr.length
                    }
                }
                $this.html([myStr.substring(0,endCap),myStr.substring(endCap,myStr.length).replace(/<(\w+)[^>]*>.*<\/\1>/gim,"").replace(/<(br|hr|img|input)[^<>]*\/?>/gim,"")].join(""))
            }
            else{
                $this.html(myStr)
            }
            max=storeMax;/*--CAC--*/
            end=storeEnd;/*--CAC--*/
            myResults[myResultsKey]=myStrOrig;
            /*--CAC--*/$this.html(["<div class='truncate_less'>",$this.html(),settings.trail[0],myEndStr,"</div>"].join("")).find(".truncate_show",this).click(function(){
                if($this.find(".truncate_more").length==0){
                    $this.append(["<div class='truncate_more' style='display: none;'>",myResults[myResultsKey],settings.trail[1],"</div>"].join("")).find(".truncate_hide").click(function(){
                        $this.find(".truncate_more").css("background","#fff").fadeOut("normal",function(){
                            $this.find(".truncate_less").css("background","#fff").fadeIn("normal",function(){
                                fixIE(this);$(this).css("background","none")
                            });
                            fixIE(this)
                        });
                        return false
                    })
                }
                $this.find(".truncate_less").fadeOut("normal",function(){
                    $this.find(".truncate_more").fadeIn("normal",function(){
                        fixIE(this)
                    });
                    fixIE(this)
                });
                jQuery(".truncate_show",$this).click(function(){
                    $this.find(".truncate_less").css("background","#fff").fadeOut("normal",function(){
                        $this.find(".truncate_more").css("background","#fff").fadeIn("normal",function(){
                            fixIE(this);
                            $(this).css("background","none")
                        });
                        fixIE(this)
                    });
                    return false
                });
                return false
            })
        }
    })
};