Subversion Repositories SmartDukaan

Rev

Rev 943 | 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,
        hasTextOverflow = ('textOverflow' in style || 'OTextOverflow' in 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;';
            
            if (!hasTextOverflow) {
                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);
                    }
                });
            } else {
                return this;
            }
        }
        });
})(jQuery);