(function(b){b.fn.dragsort=function(j){var i=b.extend({},b.fn.dragsort.defaults,j);var a=new Array();var g=null,h=null;this.each(function(d,e){var c={draggedItem:null,placeHolderItem:null,pos:null,offset:null,offsetLimit:null,container:e,init:function(){b(this.container).attr("listIdx",d).find(i.dragSelector).css("cursor","pointer").mousedown(this.grabItem)},grabItem:function(f){if(f.button==2){return}if(g!=null&&g.draggedItem!=null){g.dropItem()}b(this).css("cursor","move");g=a[b(this).parents("*[listIdx]").attr("listIdx")];g.draggedItem=b(this).is(i.itemSelector)?b(this):b(this).parents(i.itemSelector);g.offset=g.draggedItem.offset();g.offset.top=f.pageY-g.offset.top;g.offset.left=f.pageX-g.offset.left;var l=b(g.container).outerHeight()==0?Math.max(1,Math.round(0.5+b(g.container).find(i.itemSelector).size()*g.draggedItem.outerWidth()/b(g.container).outerWidth()))*g.draggedItem.outerHeight():b(g.container).outerHeight();g.offsetLimit=b(g.container).offset();g.offsetLimit.right=g.offsetLimit.left+b(g.container).outerWidth()-g.draggedItem.outerWidth();g.offsetLimit.bottom=g.offsetLimit.top+l-g.draggedItem.outerHeight();g.placeHolderItem=g.draggedItem.clone().html(i.placeHolderTemplate).addClass(i.placeHolderClass).css("height",g.draggedItem.height()).attr("placeHolder",true);g.draggedItem.after(g.placeHolderItem);g.draggedItem.css({position:"absolute",opacity:0.8});b(a).each(function(o,k){k.ensureNotEmpty();k.buildPositionTable()});g.setPos(f.pageX,f.pageY);b(document).bind("selectstart",g.stopBubble);b(document).bind("mousemove",g.swapItems);b(document).bind("mouseup",g.dropItem);return false},setPos:function(p,f){var n=f-this.offset.top;var o=p-this.offset.left;if(!i.dragBetween){n=Math.min(this.offsetLimit.bottom,Math.max(n,this.offsetLimit.top));o=Math.min(this.offsetLimit.right,Math.max(o,this.offsetLimit.left))}this.draggedItem.parents().each(function(){if(b(this).css("position")!="static"&&(!b.browser.mozilla||b(this).css("display")!="table")){var k=b(this).offset();n-=k.top;o-=k.left;return false}});this.draggedItem.css({top:n,left:o})},buildPositionTable:function(){var l=this.draggedItem==null?null:this.draggedItem.get(0);var f=new Array();b(this.container).find(i.itemSelector).each(function(o,p){if(p!=l){var k=b(p).offset();k.right=k.left+b(p).width();k.bottom=k.top+b(p).height();k.elm=p;f.push(k)}});this.pos=f},dropItem:function(){if(g.draggedItem==null){return}b(g.container).find(i.dragSelector).css("cursor","pointer");g.placeHolderItem.before(g.draggedItem);g.draggedItem.css({position:"",top:"",left:"",opacity:""});g.placeHolderItem.remove();b("*[emptyPlaceHolder]").remove();i.dragEnd.apply(g.draggedItem);g.draggedItem=null;b(document).unbind("selectstart",g.stopBubble);b(document).unbind("mousemove",g.swapItems);b(document).unbind("mouseup",g.dropItem);return false},stopBubble:function(){return false},swapItems:function(q){if(g.draggedItem==null){return false}g.setPos(q.pageX,q.pageY);var f=g.findPos(q.pageX,q.pageY);var o=g;for(var p=0;f==-1&&i.dragBetween&&p<a.length;p++){f=a[p].findPos(q.pageX,q.pageY);o=a[p]}if(f==-1||b(o.pos[f].elm).attr("placeHolder")){return false}if(h==null||h.top>g.draggedItem.offset().top||h.left>g.draggedItem.offset().left){b(o.pos[f].elm).before(g.placeHolderItem)}else{b(o.pos[f].elm).after(g.placeHolderItem)}b(a).each(function(k,l){l.ensureNotEmpty();l.buildPositionTable()});h=g.draggedItem.offset();return false},findPos:function(o,f){for(var n=0;n<this.pos.length;n++){if(this.pos[n].left<o&&this.pos[n].right>o&&this.pos[n].top<f&&this.pos[n].bottom>f){return n}}return -1},ensureNotEmpty:function(){if(!i.dragBetween){return}var n=this.draggedItem==null?null:this.draggedItem.get(0);var f=null,m=true;b(this.container).find(i.itemSelector).each(function(k,l){if(b(l).attr("emptyPlaceHolder")){f=l}else{if(l!=n){m=false}}});if(m&&f==null){b(this.container).append(g.placeHolderItem.clone().removeAttr("placeHolder").attr("emptyPlaceHolder",true))}else{if(!m&&f!=null){b(f).remove()}}}};c.init();a.push(c)});return this};b.fn.dragsort.defaults={itemSelector:"li",dragSelector:"li",dragEnd:function(){},dragBetween:false,placeHolderClass:"placeHolder",placeHolderTemplate:"&nbsp;"}})(jQuery);