jQuery.tableDnD={currentTable:null,dragObject:null,mouseOffset:null,oldY:0,build:function(A){this.each(function(){this.tableDnDConfig=jQuery.extend({onDragStyle:null,onDropStyle:null,onDragClass:"tDnD_whileDrag",onDrop:null,onDragStart:null,scrollAmount:5,serializeRegexp:/[^\-]*$/,serializeParamName:null,dragHandle:null},A||{});jQuery.tableDnD.makeDraggable(this)});jQuery(document).bind("mousemove",jQuery.tableDnD.mousemove).bind("mouseup",jQuery.tableDnD.mouseup);return this},makeDraggable:function(C){var B=C.tableDnDConfig;if(C.tableDnDConfig.dragHandle){var A=jQuery("td."+C.tableDnDConfig.dragHandle,C);A.each(function(){jQuery(this).mousedown(function(E){jQuery.tableDnD.dragObject=this.parentNode;jQuery.tableDnD.currentTable=C;jQuery.tableDnD.mouseOffset=jQuery.tableDnD.getMouseOffset(this,E);if(B.onDragStart){B.onDragStart(C,this)}return false})})}else{var D=jQuery("tr",C);D.each(function(){var E=jQuery(this);if(!E.hasClass("nodrag")){E.mousedown(function(F){if(F.target.tagName=="TD"){jQuery.tableDnD.dragObject=this;jQuery.tableDnD.currentTable=C;jQuery.tableDnD.mouseOffset=jQuery.tableDnD.getMouseOffset(this,F);if(B.onDragStart){B.onDragStart(C,this)}return false}}).css("cursor","move")}})}},updateTables:function(){this.each(function(){if(this.tableDnDConfig){jQuery.tableDnD.makeDraggable(this)}})},mouseCoords:function(A){if(A.pageX||A.pageY){return{x:A.pageX,y:A.pageY}}return{x:A.clientX+document.body.scrollLeft-document.body.clientLeft,y:A.clientY+document.body.scrollTop-document.body.clientTop}},getMouseOffset:function(D,C){C=C||window.event;var B=this.getPosition(D);var A=this.mouseCoords(C);return{x:A.x-B.x,y:A.y-B.y}},getPosition:function(C){var B=0;var A=0;if(C.offsetHeight==0){C=C.firstChild}while(C.offsetParent){B+=C.offsetLeft;A+=C.offsetTop;C=C.offsetParent}B+=C.offsetLeft;A+=C.offsetTop;return{x:B,y:A}},mousemove:function(G){if(jQuery.tableDnD.dragObject==null){return }var D=jQuery(jQuery.tableDnD.dragObject);var B=jQuery.tableDnD.currentTable.tableDnDConfig;var I=jQuery.tableDnD.mouseCoords(G);var F=I.y-jQuery.tableDnD.mouseOffset.y;var C=window.pageYOffset;if(document.all){if(typeof document.compatMode!="undefined"&&document.compatMode!="BackCompat"){C=document.documentElement.scrollTop}else{if(typeof document.body!="undefined"){C=document.body.scrollTop}}}if(I.y-C<B.scrollAmount){window.scrollBy(0,-B.scrollAmount)}else{var A=window.innerHeight?window.innerHeight:document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight;if(A-(I.y-C)<B.scrollAmount){window.scrollBy(0,B.scrollAmount)}}if(F!=jQuery.tableDnD.oldY){var E=F>jQuery.tableDnD.oldY;jQuery.tableDnD.oldY=F;if(B.onDragClass){D.addClass(B.onDragClass)}else{D.css(B.onDragStyle)}var H=jQuery.tableDnD.findDropTargetRow(D,F);if(H){if(E&&jQuery.tableDnD.dragObject!=H){jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject,H.nextSibling)}else{if(!E&&jQuery.tableDnD.dragObject!=H){jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject,H)}}}}return false},findDropTargetRow:function(F,G){var I=jQuery.tableDnD.currentTable.rows;for(var E=0;E<I.length;E++){var H=I[E];var B=this.getPosition(H).y;var A=parseInt(H.offsetHeight)/2;if(H.offsetHeight==0){B=this.getPosition(H.firstChild).y;A=parseInt(H.firstChild.offsetHeight)/2}if((G>B-A)&&(G<(B+A))){if(H==F){return null}var C=jQuery.tableDnD.currentTable.tableDnDConfig;if(C.onAllowDrop){if(C.onAllowDrop(F,H)){return H}else{return null}}else{var D=jQuery(H).hasClass("nodrop");if(!D){return H}else{return null}}return H}}return null},mouseup:function(C){if(jQuery.tableDnD.currentTable&&jQuery.tableDnD.dragObject){var B=jQuery.tableDnD.dragObject;var A=jQuery.tableDnD.currentTable.tableDnDConfig;if(A.onDragClass){jQuery(B).removeClass(A.onDragClass)}else{jQuery(B).css(A.onDropStyle)}jQuery.tableDnD.dragObject=null;if(A.onDrop){A.onDrop(jQuery.tableDnD.currentTable,B)}jQuery.tableDnD.currentTable=null}},serialize:function(){if(jQuery.tableDnD.currentTable){return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable)}else{return"Error: No Table id set, you need to set an id on your table and every row"}},serializeTable:function(D){var A="";var C=D.id;var E=D.rows;for(var B=0;B<E.length;B++){if(A.length>0){A+="&"}var F=E[B].id;if(F&&F&&D.tableDnDConfig&&D.tableDnDConfig.serializeRegexp){F=F.match(D.tableDnDConfig.serializeRegexp)[0]}A+=C+"[]="+F}return A},serializeTables:function(){var A="";this.each(function(){A+=jQuery.tableDnD.serializeTable(this)});return A}};jQuery.fn.extend({tableDnD:jQuery.tableDnD.build,tableDnDUpdate:jQuery.tableDnD.updateTables,tableDnDSerialize:jQuery.tableDnD.serializeTables});$(document).ready(function(){$("#dragtable tr:even").addClass("alt");$("#dragtable").tableDnD({onDragClass:"myDragClass",onDrop:function(C,E){var D=C.tBodies[0].rows;var A="";for(var B=0;B<D.length;B++){A+=D[B].id+" "}$("#debugArea").html(A)},onDragStart:function(A,B){$("#debugArea").html("")}})});