// filter-children.js
// Plugin for Echo Stream application that filters duplicate child objects,
// but for performance reasons, only if they are consecutive.

(function($) {
    var filters;

    var plugin = Echo.createPlugin({
        "name": "FilterChildren",
        "applications": ["Stream"],
        "init": function(plugin, application) {
            plugin.extendRenderer("Item", "children", plugin.childrenRenderer, "FilterChildren");
        }
    });

    plugin.childrenRenderer = function(element, dom) {
        var item = this;

        var x;
        for (x = 1; x < item.children.length; x++) {
            if (typeof item.children[x-1].data.object !== 'undefined' &&
                typeof item.children[x].data.object !== 'undefined') {
                var s1 = strip(item.children[x-1].data.object.content);
                var s2 = strip(item.children[x].data.object.content);

                // special case for rpx.me tweets. they are *always* duplicates.
                if (s1.indexOf("rpx.me") !== -1) {
                    item.children.splice(x - 1, 1);
                    x--;
                    break;
                }

                var distance = editDistance(s1, s2);
                var shortestString = Math.min(s1.length, s2.length);
            
                if (distance / shortestString < 0.5) {
                    item.children.splice(x, 1);
                    x--;
                }
            }
        }

        item.parentRenderer("children", arguments);
    };

    function strip(html) {
        return $('<div></div>').html(html).text();
    }

    function editDistance(s1, s2) {
        var array = new Array(s1.length + 1);

        for (var i=0; i < s1.length + 1; i++) {
            array[i] = new Array(s2.length + 1);
        }

        for (var i=0; i < s1.length + 1; i++) {
            array[i][0] = i;
        }

        for (var j=0; j < s2.length + 1; j++) {
            array[0][j] = j;
        }

        for (var i=1; i < s1.length + 1; i++) {
            for (var j=1; j < s2.length + 1; j++) {
                if (s1[i-1] == s2[j-1]) {
                    array[i][j] = array[i-1][j-1];
                }
                else {
                    array[i][j] = Math.min(array[i][j-1] + 1, array[i-1][j] + 1);
                    array[i][j] = Math.min(array[i][j], array[i-1][j-1] + 1);
                }
            }
        }

        return array[s1.length][s2.length];
    };

}(jQuery));
