/**
 * Sortable feature for RightJS (requires the Drag'n'Drop feature)
 *
 * See http://rightjs.org/ui/sortable
 *
 * Copyright (C) 2009-2010 Nikolay V. Nemshilov
 */
if (!Draggable) throw "Gimme Draggable";
var Sortable=new Class(Observer,{extend:{EVENTS:$w('update'),Options:{direction:'auto',tags:'li',url:null,method:'put',Xhr:{},idParam:'id',posParam:'position',parseId:true,cssRule:'[rel^=sortable]'},rescan:function(s){}},initialize:function(e,o){this.element=$(e);this.$super(Object.merge(o,eval('('+this.element.get('data-sortable-options')+')')));var r=this.options.cssRule.split('[').last(),a=this.element.get(r.split('^=').first())||'',u=a.match(/\[(.+?)\]/);if(u)this.options.url=u[1];this.element._sortable=this.init().onUpdate('tryXhr')},destroy:function(){this.getItems.each(function(i){i.undoDraggable().undoDroppable()});delete(this.element._sortable);return this},moved:function(e){var b=this.getItems();var p=b.indexOf(e);if(p>-1&&p!=e.current_position){this.fire('update',e,p);b.each(function(a,i){a.current_position=i})}e.setStyle({left:'auto',top:'auto'})},tryXhr:function(e,a){if(this.options.url){var u=this.options.url,p={};var o=Object.merge({method:this.options.method,params:{}},this.options.Xhr);var i=e.id||'';if(this.options.parseId&&i)i=i.match(/\d+/)||'';if(u.include('%{id}'))u=u.replace('%{id}',i);else p[this.options.idParam]=i;p[this.options.posParam]=a;if(isString(o.params))o.params+='&'+Object.toQueryString(p);else o.params=Object.merge(o.params,p);Xhr.load(u,o)}},init:function(){var h=this.getItems();if(h.length){var c=this.moved.bind(this);var e=this.options.direction!='auto'?this.options.direction:['left','right'].include(h[0].getStyle('float'))?'x':'y';var f={range:this.element,axis:e,revert:true,revertDuration:0,onStop:function(){c(this.element)}};var g={overlap:e,containment:h,onHover:function(a){if(h.include(a.element)){var d=a.element.dimensions();var t=this.element.dimensions();var b=a.axisY?(d.top>t.top):(d.left>t.left);this.element.insert(a.clone,b?'before':'after')}}};h.each(function(a,i){a.makeDraggable(f).makeDroppable(g).current_position=i})}return this},getItems:function(){return this.element.subNodes(this.options.tags)}});document.onMousedown(function(a){var t=a.target,e=[t].concat(t.parents()).first('match',Sortable.Options.cssRule);if(e){var s=e._srotable||new Sortable(e);if(t._draggable)t._draggable.dragStart(a)}});Element.include({makeSortable:function(o){new Sortable(this,o);return this},undoSortable:function(){if(this._sortable)this._sortable.destroy();return this}});