You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2014/12/10 16:17:32 UTC

[5/5] incubator-nifi git commit: NIFI-27: - Latest version of slickgrid.

NIFI-27:
- Latest version of slickgrid.

Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/eb880757
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/eb880757
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/eb880757

Branch: refs/heads/nifi-27
Commit: eb880757b244858e984822abeef265c9e082ca69
Parents: 0ded442
Author: Matt Gilman <ma...@gmail.com>
Authored: Wed Dec 10 10:12:43 2014 -0500
Committer: Matt Gilman <ma...@gmail.com>
Committed: Wed Dec 10 10:12:43 2014 -0500

----------------------------------------------------------------------
 .../src/main/webapp/WEB-INF/pages/canvas.jsp    |    2 +-
 .../src/main/webapp/WEB-INF/pages/cluster.jsp   |    2 +-
 .../src/main/webapp/WEB-INF/pages/counters.jsp  |    2 +-
 .../src/main/webapp/WEB-INF/pages/history.jsp   |    2 +-
 .../main/webapp/WEB-INF/pages/provenance.jsp    |    2 +-
 .../src/main/webapp/WEB-INF/pages/summary.jsp   |    2 +-
 .../src/main/webapp/WEB-INF/pages/templates.jsp |    2 +-
 .../src/main/webapp/WEB-INF/pages/users.jsp     |    2 +-
 .../js/jquery/jquery.event.drag-2.0.min.js      |  194 -
 .../js/jquery/jquery.event.drag-2.2.min.js      |    6 +
 .../webapp/js/jquery/slickgrid/MIT-LICENSE.txt  |   20 +
 .../js/jquery/slickgrid/css/images/collapse.gif |  Bin 0 -> 846 bytes
 .../js/jquery/slickgrid/css/images/expand.gif   |  Bin 0 -> 851 bytes
 .../slickgrid/css/slick-default-theme.css       |   68 +-
 .../js/jquery/slickgrid/css/slick.grid.css      |  173 +-
 .../slickgrid/plugins/slick.autotooltips.js     |  121 +-
 .../plugins/slick.cellrangedecorator.js         |  110 +-
 .../plugins/slick.cellrangeselector.js          |  194 +-
 .../plugins/slick.cellselectionmodel.js         |  210 +-
 .../plugins/slick.rowselectionmodel.js          |  325 +-
 .../webapp/js/jquery/slickgrid/slick.core.js    |  796 +--
 .../js/jquery/slickgrid/slick.dataview.js       | 1920 +++---
 .../webapp/js/jquery/slickgrid/slick.editors.js |  994 +--
 .../js/jquery/slickgrid/slick.formatters.js     |   86 +-
 .../webapp/js/jquery/slickgrid/slick.grid.js    | 6254 ++++++++++--------
 25 files changed, 6144 insertions(+), 5343 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
index c8f2ff7..09c8207 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
@@ -48,7 +48,7 @@
         <script type="text/javascript" src="js/jquery/modal/jquery.modal.js?${project.version}"></script>
         <script type="text/javascript" src="js/jquery/minicolors/jquery.minicolors.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/cluster.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/cluster.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/cluster.jsp
index e3e7b86..a0bda24 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/cluster.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/cluster.jsp
@@ -36,7 +36,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/counters.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/counters.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/counters.jsp
index 21ee508..2678bf4 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/counters.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/counters.jsp
@@ -36,7 +36,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/history.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/history.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/history.jsp
index 61be727..19d9e90 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/history.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/history.jsp
@@ -36,7 +36,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/provenance.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/provenance.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/provenance.jsp
index 2f51918..f3c9a88 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/provenance.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/provenance.jsp
@@ -38,7 +38,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/summary.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/summary.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/summary.jsp
index b34f0e6..e8a8e4c 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/summary.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/summary.jsp
@@ -38,7 +38,7 @@
         <script type="text/javascript" src="js/jquery/jquery.ellipsis.js"></script>
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/templates.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/templates.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/templates.jsp
index c7c0293..889485f 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/templates.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/templates.jsp
@@ -37,7 +37,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/users.jsp
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/users.jsp b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/users.jsp
index 770dad5..9ff887b 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/users.jsp
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/WEB-INF/pages/users.jsp
@@ -38,7 +38,7 @@
         <script type="text/javascript" src="js/jquery/jquery.each.js"></script>
         <script type="text/javascript" src="js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
         <script type="text/javascript" src="js/jquery/qtip2/jquery.qtip.min.js"></script>
-        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.0.min.js"></script>
+        <script type="text/javascript" src="js/jquery/jquery.event.drag-2.2.min.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellrangeselector.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.cellselectionmodel.js"></script>
         <script type="text/javascript" src="js/jquery/slickgrid/plugins/slick.rowselectionmodel.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.0.min.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.0.min.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.0.min.js
deleted file mode 100755
index 146b20a..0000000
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.0.min.js
+++ /dev/null
@@ -1,194 +0,0 @@
-/*! 
- * jquery.event.drag - v 2.0.0 
- * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
- * Open Source MIT License - http://threedubmedia.com/code/license
- */
-;
-(function (f) {
-    f.fn.drag = function (b, a, d) {
-        var e = typeof b == "string" ? b : "", k = f.isFunction(b) ? b : f.isFunction(a) ? a : null;
-        if (e.indexOf("drag") !== 0)
-            e = "drag" + e;
-        d = (b == k ? a : d) || {};
-        return k ? this.bind(e, d, k) : this.trigger(e)
-    };
-    var i = f.event, h = i.special, c = h.drag = {defaults: {which: 1, distance: 0, not: ":input", handle: null, relative: false, drop: true, click: false}, datakey: "dragdata", livekey: "livedrag", add: function (b) {
-            var a = f.data(this, c.datakey), d = b.data || {};
-            a.related += 1;
-            if (!a.live && b.selector) {
-                a.live = true;
-                i.add(this, "draginit." + c.livekey, c.delegate)
-            }
-            f.each(c.defaults, function (e) {
-                if (d[e] !== undefined)
-                    a[e] = d[e]
-            })
-        }, remove: function () {
-            f.data(this, c.datakey).related -= 1
-        }, setup: function () {
-            if (!f.data(this, c.datakey)) {
-                var b = f.extend({related: 0}, c.defaults);
-                f.data(this, c.datakey, b);
-                i.add(this, "mousedown", c.init, b);
-                this.attachEvent && this.attachEvent("ondragstart", c.dontstart)
-            }
-        }, teardown: function () {
-            if (!f.data(this, c.datakey).related) {
-                f.removeData(this, c.datakey);
-                i.remove(this, "mousedown", c.init);
-                i.remove(this, "draginit", c.delegate);
-                c.textselect(true);
-                this.detachEvent && this.detachEvent("ondragstart", c.dontstart)
-            }
-        }, init: function (b) {
-            var a = b.data, d;
-            if (!(a.which > 0 && b.which != a.which))
-                if (!f(b.target).is(a.not))
-                    if (!(a.handle && !f(b.target).closest(a.handle, b.currentTarget).length)) {
-                        a.propagates = 1;
-                        a.interactions = [c.interaction(this, a)];
-                        a.target = b.target;
-                        a.pageX = b.pageX;
-                        a.pageY = b.pageY;
-                        a.dragging = null;
-                        d = c.hijack(b, "draginit", a);
-                        if (a.propagates) {
-                            if ((d = c.flatten(d)) && d.length) {
-                                a.interactions = [];
-                                f.each(d, function () {
-                                    a.interactions.push(c.interaction(this, a))
-                                })
-                            }
-                            a.propagates = a.interactions.length;
-                            a.drop !== false && h.drop && h.drop.handler(b, a);
-                            c.textselect(false);
-                            i.add(document, "mousemove mouseup", c.handler, a);
-                            return false
-                        }
-                    }
-        }, interaction: function (b, a) {
-            return{drag: b, callback: new c.callback, droppable: [], offset: f(b)[a.relative ? "position" : "offset"]() || {top: 0, left: 0}}
-        }, handler: function (b) {
-            var a = b.data;
-            switch (b.type) {
-                case !a.dragging && "mousemove":
-                    if (Math.pow(b.pageX - a.pageX, 2) + Math.pow(b.pageY - a.pageY, 2) < Math.pow(a.distance, 2))
-                        break;
-                    b.target = a.target;
-                    c.hijack(b, "dragstart", a);
-                    if (a.propagates)
-                        a.dragging = true;
-                case "mousemove":
-                    if (a.dragging) {
-                        c.hijack(b, "drag", a);
-                        if (a.propagates) {
-                            a.drop !== false && h.drop && h.drop.handler(b, a);
-                            break
-                        }
-                        b.type = "mouseup"
-                    }
-                case "mouseup":
-                    i.remove(document, "mousemove mouseup", c.handler);
-                    if (a.dragging) {
-                        a.drop !== false && h.drop && h.drop.handler(b, a);
-                        c.hijack(b, "dragend", a)
-                    }
-                    c.textselect(true);
-                    if (a.click === false && a.dragging) {
-                        jQuery.event.triggered = true;
-                        setTimeout(function () {
-                            jQuery.event.triggered = false
-                        }, 20);
-                        a.dragging = false
-                    }
-                    break
-            }
-        }, delegate: function (b) {
-            var a = [], d, e = f.data(this, "events") || {};
-            f.each(e.live || [], function (k, j) {
-                if (j.preType.indexOf("drag") === 0)
-                    if (d = f(b.target).closest(j.selector, b.currentTarget)[0]) {
-                        i.add(d, j.origType + "." + c.livekey, j.origHandler, j.data);
-                        f.inArray(d, a) < 0 && a.push(d)
-                    }
-            });
-            if (!a.length)
-                return false;
-            return f(a).bind("dragend." + c.livekey, function () {
-                i.remove(this, "." + c.livekey)
-            })
-        }, hijack: function (b, a, d, e, k) {
-            if (d) {
-                var j = {event: b.originalEvent, type: b.type}, n = a.indexOf("drop") ? "drag" : "drop", l, o = e || 0, g, m;
-                e = !isNaN(e) ? e : d.interactions.length;
-                b.type = a;
-                b.originalEvent = null;
-                d.results = [];
-                do
-                    if (g = d.interactions[o])
-                        if (!(a !== "dragend" && g.cancelled)) {
-                            m = c.properties(b, d, g);
-                            g.results = [];
-                            f(k || g[n] || d.droppable).each(function (q, p) {
-                                l = (m.target = p) ? i.handle.call(p, b, m) : null;
-                                if (l === false) {
-                                    if (n == "drag") {
-                                        g.cancelled = true;
-                                        d.propagates -= 1
-                                    }
-                                    if (a == "drop")
-                                        g[n][q] = null
-                                } else if (a == "dropinit")
-                                    g.droppable.push(c.element(l) || p);
-                                if (a == "dragstart")
-                                    g.proxy = f(c.element(l) || g.drag)[0];
-                                g.results.push(l);
-                                delete b.result;
-                                if (a !== "dropinit")
-                                    return l
-                            });
-                            d.results[o] = c.flatten(g.results);
-                            if (a == "dropinit")
-                                g.droppable = c.flatten(g.droppable);
-                            a == "dragstart" && !g.cancelled && m.update()
-                        }
-                while (++o < e);
-                b.type = j.type;
-                b.originalEvent = j.event;
-                return c.flatten(d.results)
-            }
-        }, properties: function (b, a, d) {
-            var e = d.callback;
-            e.drag = d.drag;
-            e.proxy = d.proxy || d.drag;
-            e.startX = a.pageX;
-            e.startY = a.pageY;
-            e.deltaX = b.pageX - a.pageX;
-            e.deltaY = b.pageY - a.pageY;
-            e.originalX = d.offset.left;
-            e.originalY = d.offset.top;
-            e.offsetX = b.pageX - (a.pageX - e.originalX);
-            e.offsetY = b.pageY - (a.pageY - e.originalY);
-            e.drop = c.flatten((d.drop || []).slice());
-            e.available = c.flatten((d.droppable || []).slice());
-            return e
-        }, element: function (b) {
-            if (b && (b.jquery || b.nodeType == 1))
-                return b
-        }, flatten: function (b) {
-            return f.map(b, function (a) {
-                return a && a.jquery ? f.makeArray(a) : a && a.length ? c.flatten(a) : a
-            })
-        }, textselect: function (b) {
-            f(document)[b ? "unbind" : "bind"]("selectstart", c.dontstart).attr("unselectable", b ? "off" : "on").css("MozUserSelect", b ? "" : "none")
-        }, dontstart: function () {
-            return false
-        }, callback: function () {
-        }};
-    c.callback.prototype = {update: function () {
-            h.drop && this.available.length && f.each(this.available, function (b) {
-                h.drop.locate(this, b)
-            })
-        }};
-    h.draginit = h.dragstart = h.dragend = c
-})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.2.min.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.2.min.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.2.min.js
new file mode 100644
index 0000000..cff8ed6
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/jquery.event.drag-2.2.min.js
@@ -0,0 +1,6 @@
+/*!
+ * jquery.event.drag - v 2.2
+ * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
+ * Open Source MIT License - http://threedubmedia.com/code/license
+ */
+;(function(e){e.fn.drag=function(k,g,j){var i=typeof k=="string"?k:"",h=e.isFunction(k)?k:e.isFunction(g)?g:null;if(i.indexOf("drag")!==0){i="drag"+i}j=(k==h?g:j)||{};return h?this.bind(i,j,h):this.trigger(i)};var b=e.event,a=b.special,d=a.drag={defaults:{which:1,distance:0,not:":input",handle:null,relative:false,drop:true,click:false},datakey:"dragdata",noBubble:true,add:function(i){var h=e.data(this,d.datakey),g=i.data||{};h.related+=1;e.each(d.defaults,function(j,k){if(g[j]!==undefined){h[j]=g[j]}})},remove:function(){e.data(this,d.datakey).related-=1},setup:function(){if(e.data(this,d.datakey)){return}var g=e.extend({related:0},d.defaults);e.data(this,d.datakey,g);b.add(this,"touchstart mousedown",d.init,g);if(this.attachEvent){this.attachEvent("ondragstart",d.dontstart)}},teardown:function(){var g=e.data(this,d.datakey)||{};if(g.related){return}e.removeData(this,d.datakey);b.remove(this,"touchstart mousedown",d.init);d.textselect(true);if(this.detachEvent){this.detachEvent("ond
 ragstart",d.dontstart)}},init:function(i){if(d.touched){return}var g=i.data,h;if(i.which!=0&&g.which>0&&i.which!=g.which){return}if(e(i.target).is(g.not)){return}if(g.handle&&!e(i.target).closest(g.handle,i.currentTarget).length){return}d.touched=i.type=="touchstart"?this:null;g.propagates=1;g.mousedown=this;g.interactions=[d.interaction(this,g)];g.target=i.target;g.pageX=i.pageX;g.pageY=i.pageY;g.dragging=null;h=d.hijack(i,"draginit",g);if(!g.propagates){return}h=d.flatten(h);if(h&&h.length){g.interactions=[];e.each(h,function(){g.interactions.push(d.interaction(this,g))})}g.propagates=g.interactions.length;if(g.drop!==false&&a.drop){a.drop.handler(i,g)}d.textselect(false);if(d.touched){b.add(d.touched,"touchmove touchend",d.handler,g)}else{b.add(document,"mousemove mouseup",d.handler,g)}if(!d.touched||g.live){return false}},interaction:function(h,g){var i=e(h)[g.relative?"position":"offset"]()||{top:0,left:0};return{drag:h,callback:new d.callback(),droppable:[],offset:i}},handler:
 function(h){var g=h.data;switch(h.type){case !g.dragging&&"touchmove":h.preventDefault();case !g.dragging&&"mousemove":if(Math.pow(h.pageX-g.pageX,2)+Math.pow(h.pageY-g.pageY,2)<Math.pow(g.distance,2)){break}h.target=g.target;d.hijack(h,"dragstart",g);if(g.propagates){g.dragging=true}case"touchmove":h.preventDefault();case"mousemove":if(g.dragging){d.hijack(h,"drag",g);if(g.propagates){if(g.drop!==false&&a.drop){a.drop.handler(h,g)}break}h.type="mouseup"}case"touchend":case"mouseup":default:if(d.touched){b.remove(d.touched,"touchmove touchend",d.handler)}else{b.remove(document,"mousemove mouseup",d.handler)}if(g.dragging){if(g.drop!==false&&a.drop){a.drop.handler(h,g)}d.hijack(h,"dragend",g)}d.textselect(true);if(g.click===false&&g.dragging){e.data(g.mousedown,"suppress.click",new Date().getTime()+5)}g.dragging=d.touched=false;break}},hijack:function(h,o,r,p,k){if(!r){return}var q={event:h.originalEvent,type:h.type},m=o.indexOf("drop")?"drag":"drop",t,l=p||0,j,g,s,n=!isNaN(p)?p:r.in
 teractions.length;h.type=o;h.originalEvent=null;r.results=[];do{if(j=r.interactions[l]){if(o!=="dragend"&&j.cancelled){continue}s=d.properties(h,r,j);j.results=[];e(k||j[m]||r.droppable).each(function(u,i){s.target=i;h.isPropagationStopped=function(){return false};t=i?b.dispatch.call(i,h,s):null;if(t===false){if(m=="drag"){j.cancelled=true;r.propagates-=1}if(o=="drop"){j[m][u]=null}}else{if(o=="dropinit"){j.droppable.push(d.element(t)||i)}}if(o=="dragstart"){j.proxy=e(d.element(t)||j.drag)[0]}j.results.push(t);delete h.result;if(o!=="dropinit"){return t}});r.results[l]=d.flatten(j.results);if(o=="dropinit"){j.droppable=d.flatten(j.droppable)}if(o=="dragstart"&&!j.cancelled){s.update()}}}while(++l<n);h.type=q.type;h.originalEvent=q.event;return d.flatten(r.results)},properties:function(i,g,h){var j=h.callback;j.drag=h.drag;j.proxy=h.proxy||h.drag;j.startX=g.pageX;j.startY=g.pageY;j.deltaX=i.pageX-g.pageX;j.deltaY=i.pageY-g.pageY;j.originalX=h.offset.left;j.originalY=h.offset.top;j.of
 fsetX=j.originalX+j.deltaX;j.offsetY=j.originalY+j.deltaY;j.drop=d.flatten((h.drop||[]).slice());j.available=d.flatten((h.droppable||[]).slice());return j},element:function(g){if(g&&(g.jquery||g.nodeType==1)){return g}},flatten:function(g){return e.map(g,function(h){return h&&h.jquery?e.makeArray(h):h&&h.length?d.flatten(h):h})},textselect:function(g){e(document)[g?"unbind":"bind"]("selectstart",d.dontstart).css("MozUserSelect",g?"":"none");document.unselectable=g?"off":"on"},dontstart:function(){return false},callback:function(){}};d.callback.prototype={update:function(){if(a.drop&&this.available.length){e.each(this.available,function(g){a.drop.locate(this,g)})}}};var f=b.dispatch;b.dispatch=function(g){if(e.data(this,"suppress."+g.type)-new Date().getTime()>0){e.removeData(this,"suppress."+g.type);return}return f.apply(this,arguments)};var c=b.fixHooks.touchstart=b.fixHooks.touchmove=b.fixHooks.touchend=b.fixHooks.touchcancel={props:"clientX clientY pageX pageY screenX screenY".sp
 lit(" "),filter:function(h,i){if(i){var g=(i.touches&&i.touches[0])||(i.changedTouches&&i.changedTouches[0])||null;if(g){e.each(c.props,function(j,k){h[k]=g[k]})}}return h}};a.draginit=a.dragstart=a.dragend=d})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/MIT-LICENSE.txt
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/MIT-LICENSE.txt b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/MIT-LICENSE.txt
new file mode 100755
index 0000000..60f6542
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2010 Michael Leibman, http://github.com/mleibman/slickgrid
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/collapse.gif
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/collapse.gif b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/collapse.gif
new file mode 100755
index 0000000..01e6914
Binary files /dev/null and b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/collapse.gif differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/expand.gif
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/expand.gif b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/expand.gif
new file mode 100755
index 0000000..1b24ef1
Binary files /dev/null and b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/images/expand.gif differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick-default-theme.css
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick-default-theme.css b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick-default-theme.css
index c68b703..6b45f3e 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick-default-theme.css
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick-default-theme.css
@@ -31,24 +31,24 @@ classes should alter those!
 }
 
 .slick-headerrow {
-    background: #fafafa;
+  background: #fafafa;
 }
 
 .slick-headerrow-column {
-    background: #fafafa;
-    border-bottom: 0;
-    height: 100%;
+  background: #fafafa;
+  border-bottom: 0;
+  height: 100%;
 }
 
 .slick-row.ui-state-active {
-    background: #F5F7D7;
+  background: #F5F7D7;
 }
 
 .slick-row {
-    position: absolute;
-    background: white;
-    border: 0px;
-    line-height: 20px;
+  position: absolute;
+  background: white;
+  border: 0px;
+  line-height: 20px;
 }
 
 .slick-row:hover {
@@ -56,37 +56,37 @@ classes should alter those!
 }
 
 .slick-row.selected {
-    z-index: 10;
+  z-index: 10;
     background: #DFE8F6 !important;
 }
 
 .slick-cell {
-    padding-left: 4px;
-    padding-right: 4px;
+  padding-left: 4px;
+  padding-right: 4px;
     border-style: solid !important;
 }
 
 .slick-group {
-    border-bottom: 2px solid silver;
+  border-bottom: 2px solid silver;
 }
 
 .slick-group-toggle {
-    width: 9px;
-    height: 9px;
-    margin-right: 5px;
+  width: 9px;
+  height: 9px;
+  margin-right: 5px;
 }
 
 .slick-group-toggle.expanded {
-    background: url(../../../../images/collapse.gif) no-repeat center center;
+  background: url(images/collapse.gif) no-repeat center center;
 }
 
 .slick-group-toggle.collapsed {
-    background: url(../../../../images/expand.gif) no-repeat center center;
+  background: url(images/expand.gif) no-repeat center center;
 }
 
 .slick-group-totals {
-    color: gray;
-    background: white;
+  color: gray;
+  background: white;
 }
 
 .slick-cell.selected {
@@ -100,22 +100,36 @@ classes should alter those!
 }
 
 .slick-sortable-placeholder {
-    background: silver !important;
+  background: silver !important;
 }
 
-.slick-row[row$="1"], .slick-row[row$="3"], .slick-row[row$="5"], .slick-row[row$="7"], .slick-row[row$="9"] {
-    background: #fafafa;
+.slick-row.odd {
+  background: #fafafa;
 }
 
 .slick-row.ui-state-active {
-    background: #F5F7D7;
+  background: #F5F7D7;
 }
 
 .slick-row.loading {
-    opacity: 0.5;
-    filter: alpha(opacity = 50);
+  opacity: 0.5;
+  filter: alpha(opacity = 50);
 }
 
 .slick-cell.invalid {
-    border-color: red;
+  border-color: red;
+  -moz-animation-duration: 0.2s;
+  -webkit-animation-duration: 0.2s;
+  -moz-animation-name: slickgrid-invalid-hilite;
+  -webkit-animation-name: slickgrid-invalid-hilite;  
+}
+
+@-moz-keyframes slickgrid-invalid-hilite {
+  from { box-shadow: 0 0 6px red; }
+  to { box-shadow: none; }
+}
+
+@-webkit-keyframes slickgrid-invalid-hilite {
+  from { box-shadow: 0 0 6px red; }
+  to { box-shadow: none; }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick.grid.css
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick.grid.css b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick.grid.css
index 2e8f390..de94dbf 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick.grid.css
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/css/slick.grid.css
@@ -6,153 +6,152 @@ classes should alter those!
 */
 
 .slick-header.ui-state-default, .slick-headerrow.ui-state-default {
-    width: 100%;
-    overflow: hidden;
-    border-left: 0px;
+  width: 100%;
+  overflow: hidden;
+  border-left: 0px;
 }
 
 .slick-header-columns, .slick-headerrow-columns {
-    width: 999999px;
-    position: relative;
-    white-space: nowrap;
-    cursor: default;
-    overflow: hidden;
+  position: relative;
+  white-space: nowrap;
+  cursor: default;
+  overflow: hidden;
 }
 
 .slick-header-column.ui-state-default {
-    position: relative;
-    display: inline-block;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    height: 16px;
-    line-height: 16px;
-    margin: 0;
-    padding: 4px;
-    border-right: 1px solid silver;
-    border-left: 0px;
-    border-top: 0px;
-    border-bottom: 0px;
-    float: left;
+  position: relative;
+  display: inline-block;
+  overflow: hidden;
+  -o-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+  height: 16px;
+  line-height: 16px;
+  margin: 0;
+  padding: 4px;
+  border-right: 1px solid silver;
+  border-left: 0px;
+  border-top: 0px;
+  border-bottom: 0px;
+  float: left;
 }
 
 .slick-headerrow-column.ui-state-default {
-    padding: 4px;
+  padding: 4px;
 }
 
 .slick-header-column-sorted {
-    font-style: italic;
+  font-style: italic;
 }
 
 .slick-sort-indicator {
-    display: inline-block;
-    width: 8px;
-    height: 5px;
-    margin-left: 4px;
+  display: inline-block;
+  width: 8px;
+  height: 5px;
+  margin-left: 4px;
+  margin-top: 6px;
+  /*float: left;*/
 }
 
 .slick-sort-indicator-desc {
-    background: url(images/sort-desc.gif);
+  background: url(images/sort-desc.gif);
 }
 
 .slick-sort-indicator-asc {
-    background: url(images/sort-asc.gif);
+  background: url(images/sort-asc.gif);
 }
 
 .slick-resizable-handle {
-    position: absolute;
-    font-size: 0.1px;
-    display: block;
-    cursor: col-resize;
-    width: 4px;
-    right: 0px;
-    top: 0;
-    height: 100%;
+  position: absolute;
+  font-size: 0.1px;
+  display: block;
+  cursor: col-resize;
+  width: 4px;
+  right: 0px;
+  top: 0;
+  height: 100%;
 }
 
 .slick-sortable-placeholder {
-    background: silver;
+  background: silver;
 }
 
 .grid-canvas {
-    position: relative;
-    outline: 0;
+  position: relative;
+  outline: 0;
 }
 
 .slick-row.ui-widget-content, .slick-row.ui-state-active {
-    position: absolute;
-    border: 0px;
-    width: 100%;
+  position: absolute;
+  border: 0px;
+  width: 100%;
 }
 
 .slick-cell, .slick-headerrow-column {
-    position: absolute;
-
-    border: 1px solid transparent;
-    border-right: 1px dotted silver;
-    border-bottom-color: silver;
-
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    vertical-align: middle;
-    z-index: 1;
-    padding: 1px 2px 2px 1px;
-    margin: 0;
-
-    white-space: nowrap;
-
-    cursor: default;
+  position: absolute;
+  border: 1px solid transparent;
+  border-right: 1px dotted silver;
+  border-bottom-color: silver;
+  overflow: hidden;
+  -o-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+  vertical-align: middle;
+  z-index: 1;
+  padding: 1px 2px 2px 1px;
+  margin: 0;
+  white-space: nowrap;
+  cursor: default;
 }
 
 .slick-group {
 }
 
 .slick-group-toggle {
-    display: inline-block;
+  display: inline-block;
 }
 
 .slick-cell.highlighted {
-    background: lightskyblue;
-    background: rgba(0, 0, 255, 0.2);
-    -webkit-transition: all 0.5s;
-    -moz-transition: all 0.5s;
-    transition: all 0.5s;
+  background: lightskyblue;
+  background: rgba(0, 0, 255, 0.2);
+  -webkit-transition: all 0.5s;
+  -moz-transition: all 0.5s;
+  -o-transition: all 0.5s;
+  transition: all 0.5s;
 }
 
 .slick-cell.flashing {
-    border: 1px solid red !important;
+  border: 1px solid red !important;
 }
 
 .slick-cell.editable {
-    z-index: 11;
-    overflow: visible;
-    background: white;
-    border-color: black;
-    border-style: solid;
+  z-index: 11;
+  overflow: visible;
+  background: white;
+  border-color: black;
+  border-style: solid;
 }
 
 .slick-cell:focus {
-    outline: none;
+  outline: none;
 }
 
 .slick-reorder-proxy {
-    display: inline-block;
-    background: blue;
-    opacity: 0.15;
-    filter: alpha(opacity = 15);
-    cursor: move;
+  display: inline-block;
+  background: blue;
+  opacity: 0.15;
+  filter: alpha(opacity = 15);
+  cursor: move;
 }
 
 .slick-reorder-guide {
-    display: inline-block;
-    height: 2px;
-    background: blue;
-    opacity: 0.7;
-    filter: alpha(opacity = 70);
+  display: inline-block;
+  height: 2px;
+  background: blue;
+  opacity: 0.7;
+  filter: alpha(opacity = 70);
 }
 
 .slick-selection {
-    z-index: 10;
-    position: absolute;
-    border: 2px dashed black;
-}
\ No newline at end of file
+  z-index: 10;
+  position: absolute;
+  border: 2px dashed black;
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.autotooltips.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.autotooltips.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.autotooltips.js
index bce0bea..955684f 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.autotooltips.js
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.autotooltips.js
@@ -1,48 +1,83 @@
 (function ($) {
-    // register namespace
-    $.extend(true, window, {
-        "Slick": {
-            "AutoTooltips": AutoTooltips
-        }
-    });
-
-
-    function AutoTooltips(options) {
-        var _grid;
-        var _self = this;
-        var _defaults = {
-            maxToolTipLength: null
-        };
-
-        function init(grid) {
-            options = $.extend(true, {}, _defaults, options);
-            _grid = grid;
-            _grid.onMouseEnter.subscribe(handleMouseEnter);
-        }
-
-        function destroy() {
-            _grid.onMouseEnter.unsubscribe(handleMouseEnter);
-        }
+  // Register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "AutoTooltips": AutoTooltips
+    }
+  });
 
-        function handleMouseEnter(e, args) {
-            var cell = _grid.getCellFromEvent(e);
-            if (cell) {
-                var node = _grid.getCellNode(cell.row, cell.cell);
-                if ($(node).innerWidth() < node.scrollWidth) {
-                    var text = $.trim($(node).text());
-                    if (options.maxToolTipLength && text.length > options.maxToolTipLength) {
-                        text = text.substr(0, options.maxToolTipLength - 3) + "...";
-                    }
-                    $(node).attr("title", text);
-                } else {
-                    $(node).attr("title", "");
-                }
-            }
+  /**
+   * AutoTooltips plugin to show/hide tooltips when columns are too narrow to fit content.
+   * @constructor
+   * @param {boolean} [options.enableForCells=true]        - Enable tooltip for grid cells
+   * @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells
+   * @param {number}  [options.maxToolTipLength=null]      - The maximum length for a tooltip
+   */
+  function AutoTooltips(options) {
+    var _grid;
+    var _self = this;
+    var _defaults = {
+      enableForCells: true,
+      enableForHeaderCells: false,
+      maxToolTipLength: null
+    };
+    
+    /**
+     * Initialize plugin.
+     */
+    function init(grid) {
+      options = $.extend(true, {}, _defaults, options);
+      _grid = grid;
+      if (options.enableForCells) _grid.onMouseEnter.subscribe(handleMouseEnter);
+      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.subscribe(handleHeaderMouseEnter);
+    }
+    
+    /**
+     * Destroy plugin.
+     */
+    function destroy() {
+      if (options.enableForCells) _grid.onMouseEnter.unsubscribe(handleMouseEnter);
+      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.unsubscribe(handleHeaderMouseEnter);
+    }
+    
+    /**
+     * Handle mouse entering grid cell to add/remove tooltip.
+     * @param {jQuery.Event} e - The event
+     */
+    function handleMouseEnter(e) {
+      var cell = _grid.getCellFromEvent(e);
+      if (cell) {
+        var $node = $(_grid.getCellNode(cell.row, cell.cell));
+        var text;
+        if ($node.innerWidth() < $node[0].scrollWidth) {
+          text = $.trim($node.text());
+          if (options.maxToolTipLength && text.length > options.maxToolTipLength) {
+            text = text.substr(0, options.maxToolTipLength - 3) + "...";
+          }
+        } else {
+          text = "";
         }
-
-        $.extend(this, {
-            "init": init,
-            "destroy": destroy
-        });
+        $node.attr("title", text);
+      }
+    }
+    
+    /**
+     * Handle mouse entering header cell to add/remove tooltip.
+     * @param {jQuery.Event} e     - The event
+     * @param {object} args.column - The column definition
+     */
+    function handleHeaderMouseEnter(e, args) {
+      var column = args.column,
+          $node = $(e.target).closest(".slick-header-column");
+      if (!column.toolTip) {
+        $node.attr("title", ($node.innerWidth() < $node[0].scrollWidth) ? column.name : "");
+      }
     }
+    
+    // Public API
+    $.extend(this, {
+      "init": init,
+      "destroy": destroy
+    });
+  }
 })(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangedecorator.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangedecorator.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangedecorator.js
index eb2d506..0cbe71d 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangedecorator.js
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangedecorator.js
@@ -1,64 +1,66 @@
 (function ($) {
-    // register namespace
-    $.extend(true, window, {
-        "Slick": {
-            "CellRangeDecorator": CellRangeDecorator
-        }
-    });
-
-    /***
-     * Displays an overlay on top of a given cell range.
-     *
-     * TODO:
-     * Currently, it blocks mouse events to DOM nodes behind it.
-     * Use FF and WebKit-specific "pointer-events" CSS style, or some kind of event forwarding.
-     * Could also construct the borders separately using 4 individual DIVs.
-     *
-     * @param {Grid} grid
-     * @param {Object} options
-     */
-    function CellRangeDecorator(grid, options) {
-        var _elem;
-        var _defaults = {
-            selectionCss: {
-                "zIndex": "9999",
-                "border": "2px dashed red"
-            }
-        };
+  // register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "CellRangeDecorator": CellRangeDecorator
+    }
+  });
 
-        options = $.extend(true, {}, _defaults, options);
+  /***
+   * Displays an overlay on top of a given cell range.
+   *
+   * TODO:
+   * Currently, it blocks mouse events to DOM nodes behind it.
+   * Use FF and WebKit-specific "pointer-events" CSS style, or some kind of event forwarding.
+   * Could also construct the borders separately using 4 individual DIVs.
+   *
+   * @param {Grid} grid
+   * @param {Object} options
+   */
+  function CellRangeDecorator(grid, options) {
+    var _elem;
+    var _defaults = {
+      selectionCssClass: 'slick-range-decorator',
+      selectionCss: {
+        "zIndex": "9999",
+        "border": "2px dashed red"
+      }
+    };
 
+    options = $.extend(true, {}, _defaults, options);
 
-        function show(range) {
-            if (!_elem) {
-                _elem = $("<div></div>", {css: options.selectionCss})
-                        .css("position", "absolute")
-                        .appendTo(grid.getCanvasNode());
-            }
 
-            var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
-            var to = grid.getCellNodeBox(range.toRow, range.toCell);
+    function show(range) {
+      if (!_elem) {
+        _elem = $("<div></div>", {css: options.selectionCss})
+            .addClass(options.selectionCssClass)
+            .css("position", "absolute")
+            .appendTo(grid.getCanvasNode());
+      }
 
-            _elem.css({
-                top: from.top - 1,
-                left: from.left - 1,
-                height: to.bottom - from.top - 2,
-                width: to.right - from.left - 2
-            });
+      var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
+      var to = grid.getCellNodeBox(range.toRow, range.toCell);
 
-            return _elem;
-        }
+      _elem.css({
+        top: from.top - 1,
+        left: from.left - 1,
+        height: to.bottom - from.top - 2,
+        width: to.right - from.left - 2
+      });
 
-        function hide() {
-            if (_elem) {
-                _elem.remove();
-                _elem = null;
-            }
-        }
+      return _elem;
+    }
 
-        $.extend(this, {
-            "show": show,
-            "hide": hide
-        });
+    function hide() {
+      if (_elem) {
+        _elem.remove();
+        _elem = null;
+      }
     }
-})(jQuery);
\ No newline at end of file
+
+    $.extend(this, {
+      "show": show,
+      "hide": hide
+    });
+  }
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangeselector.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangeselector.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangeselector.js
index 04d2f90..520b17f 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangeselector.js
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellrangeselector.js
@@ -1,111 +1,113 @@
 (function ($) {
-    // register namespace
-    $.extend(true, window, {
-        "Slick": {
-            "CellRangeSelector": CellRangeSelector
-        }
-    });
+  // register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "CellRangeSelector": CellRangeSelector
+    }
+  });
+
+
+  function CellRangeSelector(options) {
+    var _grid;
+    var _canvas;
+    var _dragging;
+    var _decorator;
+    var _self = this;
+    var _handler = new Slick.EventHandler();
+    var _defaults = {
+      selectionCss: {
+        "border": "2px dashed blue"
+      }
+    };
+
+
+    function init(grid) {
+      options = $.extend(true, {}, _defaults, options);
+      _decorator = new Slick.CellRangeDecorator(grid, options);
+      _grid = grid;
+      _canvas = _grid.getCanvasNode();
+      _handler
+        .subscribe(_grid.onDragInit, handleDragInit)
+        .subscribe(_grid.onDragStart, handleDragStart)
+        .subscribe(_grid.onDrag, handleDrag)
+        .subscribe(_grid.onDragEnd, handleDragEnd);
+    }
 
+    function destroy() {
+      _handler.unsubscribeAll();
+    }
 
-    function CellRangeSelector(options) {
-        var _grid;
-        var _canvas;
-        var _dragging;
-        var _decorator;
-        var _self = this;
-        var _defaults = {
-            selectionCss: {
-                "border": "2px dashed blue"
-            }
-        };
-
-
-        function init(grid) {
-            options = $.extend(true, {}, _defaults, options);
-            _decorator = new Slick.CellRangeDecorator(grid, options);
-            _grid = grid;
-            _canvas = _grid.getCanvasNode();
-            _grid.onDragInit.subscribe(handleDragInit);
-            _grid.onDragStart.subscribe(handleDragStart);
-            _grid.onDrag.subscribe(handleDrag);
-            _grid.onDragEnd.subscribe(handleDragEnd);
-        }
+    function handleDragInit(e, dd) {
+      // prevent the grid from cancelling drag'n'drop by default
+      e.stopImmediatePropagation();
+    }
 
-        function destroy() {
-            _grid.onDragInit.unsubscribe(handleDragInit);
-            _grid.onDragStart.unsubscribe(handleDragStart);
-            _grid.onDrag.unsubscribe(handleDrag);
-            _grid.onDragEnd.unsubscribe(handleDragEnd);
+    function handleDragStart(e, dd) {
+      var cell = _grid.getCellFromEvent(e);
+      if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
+        if (_grid.canCellBeSelected(cell.row, cell.cell)) {
+          _dragging = true;
+          e.stopImmediatePropagation();
         }
+      }
+      if (!_dragging) {
+        return;
+      }
 
-        function handleDragInit(e, dd) {
-            // prevent the grid from cancelling drag'n'drop by default
-            e.stopImmediatePropagation();
-        }
+      _grid.focus();
 
-        function handleDragStart(e, dd) {
-            var cell = _grid.getCellFromEvent(e);
-            if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
-                if (_grid.canCellBeSelected(cell.row, cell.cell)) {
-                    _dragging = true;
-                    e.stopImmediatePropagation();
-                }
-            }
-            if (!_dragging) {
-                return;
-            }
-
-            var start = _grid.getCellFromPoint(
-                    dd.startX - $(_canvas).offset().left,
-                    dd.startY - $(_canvas).offset().top);
-
-            dd.range = {start: start, end: {}};
-
-            return _decorator.show(new Slick.Range(start.row, start.cell));
-        }
+      var start = _grid.getCellFromPoint(
+          dd.startX - $(_canvas).offset().left,
+          dd.startY - $(_canvas).offset().top);
 
-        function handleDrag(e, dd) {
-            if (!_dragging) {
-                return;
-            }
-            e.stopImmediatePropagation();
+      dd.range = {start: start, end: {}};
 
-            var end = _grid.getCellFromPoint(
-                    e.pageX - $(_canvas).offset().left,
-                    e.pageY - $(_canvas).offset().top);
+      return _decorator.show(new Slick.Range(start.row, start.cell));
+    }
 
-            if (!_grid.canCellBeSelected(end.row, end.cell)) {
-                return;
-            }
+    function handleDrag(e, dd) {
+      if (!_dragging) {
+        return;
+      }
+      e.stopImmediatePropagation();
 
-            dd.range.end = end;
-            _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
-        }
+      var end = _grid.getCellFromPoint(
+          e.pageX - $(_canvas).offset().left,
+          e.pageY - $(_canvas).offset().top);
 
-        function handleDragEnd(e, dd) {
-            if (!_dragging) {
-                return;
-            }
-
-            _dragging = false;
-            e.stopImmediatePropagation();
-
-            _decorator.hide();
-            _self.onCellRangeSelected.notify({
-                range: new Slick.Range(
-                        dd.range.start.row,
-                        dd.range.start.cell,
-                        dd.range.end.row,
-                        dd.range.end.cell
-                        )
-            });
-        }
+      if (!_grid.canCellBeSelected(end.row, end.cell)) {
+        return;
+      }
+
+      dd.range.end = end;
+      _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
+    }
 
-        $.extend(this, {
-            "init": init,
-            "destroy": destroy,
-            "onBeforeCellRangeSelected": new Slick.Event(),
-            "onCellRangeSelected": new Slick.Event()
-        });
+    function handleDragEnd(e, dd) {
+      if (!_dragging) {
+        return;
+      }
+
+      _dragging = false;
+      e.stopImmediatePropagation();
+
+      _decorator.hide();
+      _self.onCellRangeSelected.notify({
+        range: new Slick.Range(
+            dd.range.start.row,
+            dd.range.start.cell,
+            dd.range.end.row,
+            dd.range.end.cell
+        )
+      });
     }
+
+    $.extend(this, {
+      "init": init,
+      "destroy": destroy,
+
+      "onBeforeCellRangeSelected": new Slick.Event(),
+      "onCellRangeSelected": new Slick.Event()
+    });
+  }
 })(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellselectionmodel.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellselectionmodel.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellselectionmodel.js
index 9f0730a..74bc3eb 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellselectionmodel.js
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.cellselectionmodel.js
@@ -1,90 +1,154 @@
 (function ($) {
-    // register namespace
-    $.extend(true, window, {
-        "Slick": {
-            "CellSelectionModel": CellSelectionModel
-        }
+  // register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "CellSelectionModel": CellSelectionModel
+    }
+  });
+
+
+  function CellSelectionModel(options) {
+    var _grid;
+    var _canvas;
+    var _ranges = [];
+    var _self = this;
+    var _selector = new Slick.CellRangeSelector({
+      "selectionCss": {
+        "border": "2px solid black"
+      }
     });
+    var _options;
+    var _defaults = {
+      selectActiveCell: true
+    };
 
 
-    function CellSelectionModel(options) {
-        var _grid;
-        var _canvas;
-        var _ranges = [];
-        var _self = this;
-        var _selector = new Slick.CellRangeSelector({
-            "selectionCss": {
-                "border": "2px solid black"
-            }
-        });
-        var _options;
-        var _defaults = {
-            selectActiveCell: true
-        };
-
-
-        function init(grid) {
-            _options = $.extend(true, {}, _defaults, options);
-            _grid = grid;
-            _canvas = _grid.getCanvasNode();
-            _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
-            grid.registerPlugin(_selector);
-            _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
-            _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
-        }
+    function init(grid) {
+      _options = $.extend(true, {}, _defaults, options);
+      _grid = grid;
+      _canvas = _grid.getCanvasNode();
+      _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
+      _grid.onKeyDown.subscribe(handleKeyDown);
+      grid.registerPlugin(_selector);
+      _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
+      _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
+    }
 
-        function destroy() {
-            _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
-            _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
-            _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
-            _grid.unregisterPlugin(_selector);
+    function destroy() {
+      _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
+      _grid.onKeyDown.unsubscribe(handleKeyDown);
+      _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
+      _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
+      _grid.unregisterPlugin(_selector);
+    }
+
+    function removeInvalidRanges(ranges) {
+      var result = [];
+
+      for (var i = 0; i < ranges.length; i++) {
+        var r = ranges[i];
+        if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
+          result.push(r);
         }
+      }
 
-        function removeInvalidRanges(ranges) {
-            var result = [];
+      return result;
+    }
 
-            for (var i = 0; i < ranges.length; i++) {
-                var r = ranges[i];
-                if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
-                    result.push(r);
-                }
-            }
+    function setSelectedRanges(ranges) {
+      _ranges = removeInvalidRanges(ranges);
+      _self.onSelectedRangesChanged.notify(_ranges);
+    }
 
-            return result;
-        }
+    function getSelectedRanges() {
+      return _ranges;
+    }
 
-        function setSelectedRanges(ranges) {
-            _ranges = removeInvalidRanges(ranges);
-            _self.onSelectedRangesChanged.notify(_ranges);
-        }
+    function handleBeforeCellRangeSelected(e, args) {
+      if (_grid.getEditorLock().isActive()) {
+        e.stopPropagation();
+        return false;
+      }
+    }
 
-        function getSelectedRanges() {
-            return _ranges;
-        }
+    function handleCellRangeSelected(e, args) {
+      setSelectedRanges([args.range]);
+    }
 
-        function handleBeforeCellRangeSelected(e, args) {
-            if (_grid.getEditorLock().isActive()) {
-                e.stopPropagation();
-                return false;
-            }
-        }
+    function handleActiveCellChange(e, args) {
+      if (_options.selectActiveCell && args.row != null && args.cell != null) {
+        setSelectedRanges([new Slick.Range(args.row, args.cell)]);
+      }
+    }
+    
+    function handleKeyDown(e) {
+      /***
+       * Кey codes
+       * 37 left
+       * 38 up
+       * 39 right
+       * 40 down                     
+       */                                         
+      var ranges, last;
+      var active = _grid.getActiveCell(); 
 
-        function handleCellRangeSelected(e, args) {
-            setSelectedRanges([args.range]);
+      if ( active && e.shiftKey && !e.ctrlKey && !e.altKey && 
+          (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
+      
+        ranges = getSelectedRanges();
+        if (!ranges.length)
+         ranges.push(new Slick.Range(active.row, active.cell));
+         
+        // keyboard can work with last range only          
+        last = ranges.pop();
+        
+        // can't handle selection out of active cell
+        if (!last.contains(active.row, active.cell))
+          last = new Slick.Range(active.row, active.cell);
+        
+        var dRow = last.toRow - last.fromRow,
+            dCell = last.toCell - last.fromCell,
+            // walking direction
+            dirRow = active.row == last.fromRow ? 1 : -1,
+            dirCell = active.cell == last.fromCell ? 1 : -1;
+                 
+        if (e.which == 37) {
+          dCell -= dirCell; 
+        } else if (e.which == 39) {
+          dCell += dirCell ; 
+        } else if (e.which == 38) {
+          dRow -= dirRow; 
+        } else if (e.which == 40) {
+          dRow += dirRow; 
         }
-
-        function handleActiveCellChange(e, args) {
-            if (_options.selectActiveCell) {
-                setSelectedRanges([new Slick.Range(args.row, args.cell)]);
-            }
+        
+        // define new selection range 
+        var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
+        if (removeInvalidRanges([new_last]).length) {
+          ranges.push(new_last);
+          var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;
+          var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;
+         _grid.scrollRowIntoView(viewRow);
+         _grid.scrollCellIntoView(viewRow, viewCell);
         }
+        else 
+          ranges.push(last);
 
-        $.extend(this, {
-            "getSelectedRanges": getSelectedRanges,
-            "setSelectedRanges": setSelectedRanges,
-            "init": init,
-            "destroy": destroy,
-            "onSelectedRangesChanged": new Slick.Event()
-        });
+        setSelectedRanges(ranges);  
+       
+        e.preventDefault();
+        e.stopPropagation();        
+      }           
     }
-})(jQuery);
\ No newline at end of file
+
+    $.extend(this, {
+      "getSelectedRanges": getSelectedRanges,
+      "setSelectedRanges": setSelectedRanges,
+
+      "init": init,
+      "destroy": destroy,
+
+      "onSelectedRangesChanged": new Slick.Event()
+    });
+  }
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/eb880757/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.rowselectionmodel.js
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.rowselectionmodel.js b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.rowselectionmodel.js
index af966c0..0de8dd3 100755
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.rowselectionmodel.js
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-ui/src/main/webapp/js/jquery/slickgrid/plugins/slick.rowselectionmodel.js
@@ -1,184 +1,187 @@
 (function ($) {
-    // register namespace
-    $.extend(true, window, {
-        "Slick": {
-            "RowSelectionModel": RowSelectionModel
-        }
-    });
+  // register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "RowSelectionModel": RowSelectionModel
+    }
+  });
+
+  function RowSelectionModel(options) {
+    var _grid;
+    var _ranges = [];
+    var _self = this;
+    var _handler = new Slick.EventHandler();
+    var _inHandler;
+    var _options;
+    var _defaults = {
+      selectActiveRow: true
+    };
+
+    function init(grid) {
+      _options = $.extend(true, {}, _defaults, options);
+      _grid = grid;
+      _handler.subscribe(_grid.onActiveCellChanged,
+          wrapHandler(handleActiveCellChange));
+      _handler.subscribe(_grid.onKeyDown,
+          wrapHandler(handleKeyDown));
+      _handler.subscribe(_grid.onClick,
+          wrapHandler(handleClick));
+    }
 
-    function RowSelectionModel(options) {
-        var _grid;
-        var _ranges = [];
-        var _self = this;
-        var _handler = new Slick.EventHandler();
-        var _inHandler;
-        var _options;
-        var _defaults = {
-            selectActiveRow: true
-        };
-
-        function init(grid) {
-            _options = $.extend(true, {}, _defaults, options);
-            _grid = grid;
-            _handler.subscribe(_grid.onActiveCellChanged,
-                    wrapHandler(handleActiveCellChange));
-            _handler.subscribe(_grid.onKeyDown,
-                    wrapHandler(handleKeyDown));
-            _handler.subscribe(_grid.onClick,
-                    wrapHandler(handleClick));
-        }
+    function destroy() {
+      _handler.unsubscribeAll();
+    }
 
-        function destroy() {
-            _handler.unsubscribeAll();
+    function wrapHandler(handler) {
+      return function () {
+        if (!_inHandler) {
+          _inHandler = true;
+          handler.apply(this, arguments);
+          _inHandler = false;
         }
+      };
+    }
 
-        function wrapHandler(handler) {
-            return function () {
-                if (!_inHandler) {
-                    _inHandler = true;
-                    handler.apply(this, arguments);
-                    _inHandler = false;
-                }
-            };
+    function rangesToRows(ranges) {
+      var rows = [];
+      for (var i = 0; i < ranges.length; i++) {
+        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
+          rows.push(j);
         }
+      }
+      return rows;
+    }
 
-        function rangesToRows(ranges) {
-            var rows = [];
-            for (var i = 0; i < ranges.length; i++) {
-                for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
-                    rows.push(j);
-                }
-            }
-            return rows;
-        }
+    function rowsToRanges(rows) {
+      var ranges = [];
+      var lastCell = _grid.getColumns().length - 1;
+      for (var i = 0; i < rows.length; i++) {
+        ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
+      }
+      return ranges;
+    }
 
-        function rowsToRanges(rows) {
-            var ranges = [];
-            var lastCell = _grid.getColumns().length - 1;
-            for (var i = 0; i < rows.length; i++) {
-                ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
-            }
-            return ranges;
-        }
+    function getRowsRange(from, to) {
+      var i, rows = [];
+      for (i = from; i <= to; i++) {
+        rows.push(i);
+      }
+      for (i = to; i < from; i++) {
+        rows.push(i);
+      }
+      return rows;
+    }
 
-        function getRowsRange(from, to) {
-            var i, rows = [];
-            for (i = from; i <= to; i++) {
-                rows.push(i);
-            }
-            for (i = to; i < from; i++) {
-                rows.push(i);
-            }
-            return rows;
-        }
+    function getSelectedRows() {
+      return rangesToRows(_ranges);
+    }
 
-        function getSelectedRows() {
-            return rangesToRows(_ranges);
-        }
+    function setSelectedRows(rows) {
+      setSelectedRanges(rowsToRanges(rows));
+    }
 
-        function setSelectedRows(rows) {
-            setSelectedRanges(rowsToRanges(rows));
-        }
+    function setSelectedRanges(ranges) {
+      _ranges = ranges;
+      _self.onSelectedRangesChanged.notify(_ranges);
+    }
 
-        function setSelectedRanges(ranges) {
-            _ranges = ranges;
-            _self.onSelectedRangesChanged.notify(_ranges);
-        }
+    function getSelectedRanges() {
+      return _ranges;
+    }
 
-        function getSelectedRanges() {
-            return _ranges;
-        }
+    function handleActiveCellChange(e, data) {
+      if (_options.selectActiveRow && data.row != null) {
+        setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
+      }
+    }
 
-        function handleActiveCellChange(e, data) {
-            if (_options.selectActiveRow) {
-                setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
-            }
+    function handleKeyDown(e) {
+      var activeRow = _grid.getActiveCell();
+      if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
+        var selectedRows = getSelectedRows();
+        selectedRows.sort(function (x, y) {
+          return x - y
+        });
+
+        if (!selectedRows.length) {
+          selectedRows = [activeRow.row];
         }
 
-        function handleKeyDown(e) {
-            var activeRow = _grid.getActiveCell();
-            if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
-                var selectedRows = getSelectedRows();
-                selectedRows.sort(function (x, y) {
-                    return x - y
-                });
-
-                if (!selectedRows.length) {
-                    selectedRows = [activeRow.row];
-                }
-
-                var top = selectedRows[0];
-                var bottom = selectedRows[selectedRows.length - 1];
-                var active;
-
-                if (e.which == 40) {
-                    active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
-                } else {
-                    active = activeRow.row < bottom ? --bottom : --top;
-                }
-
-                if (active >= 0 && active < _grid.getDataLength()) {
-                    _grid.scrollRowIntoView(active);
-                    _ranges = rowsToRanges(getRowsRange(top, bottom));
-                    setSelectedRanges(_ranges);
-                }
-
-                e.preventDefault();
-                e.stopPropagation();
-            }
+        var top = selectedRows[0];
+        var bottom = selectedRows[selectedRows.length - 1];
+        var active;
+
+        if (e.which == 40) {
+          active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
+        } else {
+          active = activeRow.row < bottom ? --bottom : --top;
         }
 
-        function handleClick(e) {
-            var cell = _grid.getCellFromEvent(e);
-            if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
-                return false;
-            }
-
-            var selection = rangesToRows(_ranges);
-            var idx = $.inArray(cell.row, selection);
-
-            if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
-                return false;
-            }
-            else if (_grid.getOptions().multiSelect) {
-                if (idx === -1 && (e.ctrlKey || e.metaKey)) {
-                    selection.push(cell.row);
-                    _grid.setActiveCell(cell.row, cell.cell);
-                } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
-                    selection = $.grep(selection, function (o, i) {
-                        return (o !== cell.row);
-                    });
-                    _grid.setActiveCell(cell.row, cell.cell);
-                } else if (selection.length && e.shiftKey) {
-                    var last = selection.pop();
-                    var from = Math.min(cell.row, last);
-                    var to = Math.max(cell.row, last);
-                    selection = [];
-                    for (var i = from; i <= to; i++) {
-                        if (i !== last) {
-                            selection.push(i);
-                        }
-                    }
-                    selection.push(last);
-                    _grid.setActiveCell(cell.row, cell.cell);
-                }
-            }
-
-            _ranges = rowsToRanges(selection);
-            setSelectedRanges(_ranges);
-            e.stopImmediatePropagation();
-
-            return true;
+        if (active >= 0 && active < _grid.getDataLength()) {
+          _grid.scrollRowIntoView(active);
+          _ranges = rowsToRanges(getRowsRange(top, bottom));
+          setSelectedRanges(_ranges);
         }
 
-        $.extend(this, {
-            "getSelectedRows": getSelectedRows,
-            "setSelectedRows": setSelectedRows,
-            "getSelectedRanges": getSelectedRanges,
-            "setSelectedRanges": setSelectedRanges,
-            "init": init,
-            "destroy": destroy,
-            "onSelectedRangesChanged": new Slick.Event()
+        e.preventDefault();
+        e.stopPropagation();
+      }
+    }
+
+    function handleClick(e) {
+      var cell = _grid.getCellFromEvent(e);
+      if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
+        return false;
+      }
+
+      if (!_grid.getOptions().multiSelect || (
+          !e.ctrlKey && !e.shiftKey && !e.metaKey)) {
+        return false;
+      }
+
+      var selection = rangesToRows(_ranges);
+      var idx = $.inArray(cell.row, selection);
+
+      if (idx === -1 && (e.ctrlKey || e.metaKey)) {
+        selection.push(cell.row);
+        _grid.setActiveCell(cell.row, cell.cell);
+      } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
+        selection = $.grep(selection, function (o, i) {
+          return (o !== cell.row);
         });
+        _grid.setActiveCell(cell.row, cell.cell);
+      } else if (selection.length && e.shiftKey) {
+        var last = selection.pop();
+        var from = Math.min(cell.row, last);
+        var to = Math.max(cell.row, last);
+        selection = [];
+        for (var i = from; i <= to; i++) {
+          if (i !== last) {
+            selection.push(i);
+          }
+        }
+        selection.push(last);
+        _grid.setActiveCell(cell.row, cell.cell);
+      }
+
+      _ranges = rowsToRanges(selection);
+      setSelectedRanges(_ranges);
+      e.stopImmediatePropagation();
+
+      return true;
     }
+
+    $.extend(this, {
+      "getSelectedRows": getSelectedRows,
+      "setSelectedRows": setSelectedRows,
+
+      "getSelectedRanges": getSelectedRanges,
+      "setSelectedRanges": setSelectedRanges,
+
+      "init": init,
+      "destroy": destroy,
+
+      "onSelectedRangesChanged": new Slick.Event()
+    });
+  }
 })(jQuery);
\ No newline at end of file