aboutsummaryrefslogtreecommitdiffstats
path: root/themes/default/js/plugins/jquery.sort.js
diff options
context:
space:
mode:
Diffstat (limited to 'themes/default/js/plugins/jquery.sort.js')
-rw-r--r--themes/default/js/plugins/jquery.sort.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/themes/default/js/plugins/jquery.sort.js b/themes/default/js/plugins/jquery.sort.js
new file mode 100644
index 000000000..5561f3c62
--- /dev/null
+++ b/themes/default/js/plugins/jquery.sort.js
@@ -0,0 +1,65 @@
+/**
+ * jQuery.fn.sortElements
+ * --------------
+ * @param Function comparator:
+ * Exactly the same behaviour as [1,2,3].sort(comparator)
+ *
+ * @param Function getSortable
+ * A function that should return the element that is
+ * to be sorted. The comparator will run on the
+ * current collection, but you may want the actual
+ * resulting sort to occur on a parent or another
+ * associated element.
+ *
+ * E.g. $('td').sortElements(comparator, function(){
+ * return this.parentNode;
+ * })
+ *
+ * The <td>'s parent (<tr>) will be sorted instead
+ * of the <td> itself.
+ */
+jQuery.fn.sortElements = (function(){
+
+ var sort = [].sort;
+
+ return function(comparator, getSortable) {
+
+ getSortable = getSortable || function(){return this;};
+
+ var placements = this.map(function(){
+
+ var sortElement = getSortable.call(this),
+ parentNode = sortElement.parentNode,
+
+ // Since the element itself will change position, we have
+ // to have some way of storing its original position in
+ // the DOM. The easiest way is to have a 'flag' node:
+ nextSibling = parentNode.insertBefore(
+ document.createTextNode(''),
+ sortElement.nextSibling
+ );
+
+ return function() {
+
+ if (parentNode === this) {
+ throw new Error(
+ "You can't sort elements if any one is a descendant of another."
+ );
+ }
+
+ // Insert before flag:
+ parentNode.insertBefore(this, nextSibling);
+ // Remove flag:
+ parentNode.removeChild(nextSibling);
+
+ };
+
+ });
+
+ return sort.call(this, comparator).each(function(i){
+ placements[i].call(getSortable.call(this));
+ });
+
+ };
+
+})(); \ No newline at end of file