Subversion Repositories SmartDukaan

Rev

Rev 1035 | Blame | Last modification | View Log | RSS feed

/*!
 * jQuery Text Overflow v0.7
 *
 * Licensed under the new BSD License.
 * Copyright 2009-2010, Bram Stein
 * All rights reserved.
 */
/*global jQuery, document, setInterval*/
(function ($) {
        var style = document.documentElement.style,
        
                domSplit = function (root, maxIndex) {
                        var index = 0, result = [],
                                domSplitAux = function (nodes) {
                                        var i = 0, tmp;

                                        if (index > maxIndex) {
                                                return;
                                        }

                                        for (i = 0; i < nodes.length; i += 1) {
                                                if (nodes[i].nodeType === 1) {
                                                        tmp = nodes[i].cloneNode(false);
                                                        result[result.length - 1].appendChild(tmp);
                                                        result.push(tmp);
                                                        domSplitAux(nodes[i].childNodes);
                                                        result.pop();
                                                } else if (nodes[i].nodeType === 3) {
                                                        if (index + nodes[i].length < maxIndex) {
                                                                result[result.length - 1].appendChild(nodes[i].cloneNode(false));
                                                        } else {
                                                                tmp = nodes[i].cloneNode(false);
                                                                tmp.textContent = $.trim(tmp.textContent.substring(0, maxIndex - index));
                                                                result[result.length - 1].appendChild(tmp);     
                                                        }
                                                        index += nodes[i].length;
                                                } else {
                                                        result.appendChild(nodes[i].cloneNode(false));
                                                }
                                        }
                                };
                        result.push(root.cloneNode(false));
                        domSplitAux(root.childNodes);
                        return $(result.pop().childNodes);
                };

        $.extend($.fn, {
        textOverflow: function (str, autoUpdate) {
            var more = str || '&#x2026;';
            
            return this.each(function () {
                var element = $(this),

                // the clone element we modify to measure the width 
                clone = element.clone(),

                // we save a copy so we can restore it if necessary
                originalElement = element.clone(),
                originalText = element.text(),
                originalWidth = element.width(),
                low = 0, mid = 0,
                high = originalText.length,
                reflow = function () {
                        if (originalWidth !== element.width()) {
                                element.replaceWith(originalElement);
                                element = originalElement;
                                originalElement = element.clone();
                                element.textOverflow(str, false);
                                originalWidth = element.width();                                                                
                        }
                };

                element.after(clone.hide().css({
                        'position': 'absolute',
                        'width': 'auto',
                        'overflow': 'visible',
                        'max-width': 'inherit'
                }));    

                if (clone.width() > originalWidth) {
                        while (low < high) {
                                mid = Math.floor(low + ((high - low) / 2));
                                clone.empty().append(domSplit(originalElement.get(0), mid)).append(more);
                                if (clone.width() < originalWidth) {
                                        low = mid + 1;
                                } else {
                                        high = mid;
                                }
                        }

                        if (low < originalText.length) {
                                element.empty().append(domSplit(originalElement.get(0), low - 1)).append(more);
                        }
                        element.attr("title", originalText);
                }
                clone.remove();

                if (autoUpdate) {    
                        setInterval(reflow, 200);
                }
            });
        }
        });
})(jQuery);