!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):window.jQuery)}(function(e){"use strict";function n(n,s){function u(r){return v=n.find("tbody"),v=v.length>0?v:n,h=v.find("tr"),h.length<2?!0:(m=e(this).closest("tr"),0===m.length?!0:m.hasClass(p.disabledRowClass)?!0:(i=!0,b=h.index(m[0]),p.dragClass&&m.addClass(p.dragClass),p.tableDragClass&&n.addClass(p.tableDragClass),"function"==typeof p.onDragStart&&p.onDragStart(v[0],m[0],b),o?(C=parseInt(r.originalEvent.touches[0].pageY,10),t.on("touchmove",d)):(C=parseInt(r.pageY,10),h.not(m[0]).on("mousemove",f)),t.on(a,g),r.preventDefault(),!1))}function d(n){var o=n.originalEvent.touches[0],r=t[0].elementFromPoint(o.clientX,o.clientY);return r?(r=e(r).closest("tr"),void(r&&r[0]!==m[0]&&r[0].parentNode===v[0]&&c(r[0],o.pageY))):!0}function f(e){c(this,e.pageY)}function c(e,n){if(p.onBeforeMove){var t=v.find("tr").index(e);if(p.onBeforeMove(v[0],m[0],t,b)===!1)return}n>C&&e.nextSibling!==m[0]?e.nextSibling?v[0].insertBefore(m[0],e.nextSibling):v[0].appendChild(m[0]):C>=n&&e.previousSibling!==m[0]&&v[0].insertBefore(m[0],e),C=n}function g(){o?t.off("touchmove",d):h.off("mousemove",f),t.off(a,g),p.dragClass&&m.removeClass(p.dragClass),p.tableDragClass&&n.removeClass(p.tableDragClass);var e=v.find("tr").index(m[0]);e!==b&&"function"==typeof p.onDrop&&!function(e,n,t,o){p.onDrop(e,n,t,o)}(v[0],m[0],e,b),m=null,i=!1,b=0}var p=e.extend({},l,s),v=null,h=null,m=null,C=0,b=0;if(n=e(n),n.is("table")===!1)throw new Error("Specified parameter is not a table.");n.data("row-sorter-attached")!==!0&&(n.on(r,p.handler,u),n.data("row-sorter-attached",!0)),"function"!=typeof p.onBeforeMove&&(p.onBeforeMove=!1)}var t=e(window.document),o=!!("ontouchstart"in t[0].documentElement),r=o?"touchstart":"mousedown",a=o?"touchend":"mouseup",s=!!("onselectstart"in t[0].documentElement),i=!1,l={handler:"tbody > tr",tableDragClass:"sorting-table",disabledRowClass:"nodrag",dragClass:"sorting-row",onDragStart:null,onBeforeMove:null,onDrop:null};s&&(t[0].onselectstart=function(){return i?!1:void 0}),e.fn.extend({rowSorter:function(e){this.each(function(t,o){n(o,e)})}})});