﻿jQuery.fn.sortElements=(function(){

var sort=[].sort;

return function(comparator,getSortable){

getSortable=getSortable||function(){returnthis;};

var placements=this.map(function(){

var sortElement=getSortable.call(this),
parentNode=sortElement.parentNode,

//Sincetheelementitselfwillchangeposition,wehave
//tohavesomewayofstoringitsoriginalpositionin
//theDOM.Theeasiestwayistohavea'flag'node:
nextSibling=parentNode.insertBefore(
document.createTextNode(''),
sortElement.nextSibling
);

return function(){

if(parentNode===this){
throw new Error(
"Youcan'tsortelementsifanyoneisadescendantofanother."
);
}

//Insertbeforeflag:
parentNode.insertBefore(this,nextSibling);
//Removeflag:
parentNode.removeChild(nextSibling);

};

});

return sort.call(this,comparator).each(function(i){
placements[i].call(getSortable.call(this));
});

};

})();
