User:Gyrobo/sortISODate.js

/** *   Sort references by date if they are in YMD/ISO 8601 format *   To use, insert the following into your vector.js page: *   importScript("User:Gyrobo/sortISODate.js"); **/

var ref_sorted_type = false;

// Convert nodelist to array // http://stackoverflow.com/questions/2735067/how-to-convert-a-dom-node-list-to-an-array-in-javascript function toArray(obj) { var array = []; // iterate backwards ensuring that length is an UInt32 for (var i = obj.length >>> 0; i--;) { array[i] = obj[i]; } return array; }

function sortReferencesByDate { var references = []; var i = 0;

// FF 3.5+, Opera 10+, Safari 3.1+, Chrome, IE8+ if (document.querySelectorAll) { references = document.querySelectorAll("ol.references"); }

// You should really upgrade else { return false; }

// Iterate through each reference block for (var l = 0; l < references.length; l++) {

refs = references[l].getElementsByTagName("li"); refs = toArray(refs); var dates = []; // Build date array for (i = 0; i < refs.length; i++) { dates[dates.length] = refs[i].innerHTML.match(/\d{4}-\d{2}-\d{2}/); }

// Now, sort them with a simple bubble sort (N^2 runtime) for (i = 0; i < dates.length; i++) { for (var k = 0; k < dates.length - 1; k++) { if (dates[k + 1] < dates[k]) { var td = dates[k]; var tr = refs[k]; dates[k] = dates[k + 1]; refs[k] = refs[k + 1]; dates[k + 1] = td; refs[k + 1] = tr; }     }    }    // Should dates be reversed? if (ref_sorted_type) { dates = dates.reverse; refs = refs.reverse; ref_sorted_type = false; }   else { ref_sorted_type = true; }

// Now add all the references back to their section in order references[l].innerHTML = ""; for (i = 0; i < refs.length; i++) { references[l].appendChild(refs[i]); }

} return false; }

function addSortingButton { var references = [];

// FF 3.5+, Opera 10+, Safari 3.1+, Chrome, IE8+ if (document.querySelectorAll) { references = document.querySelectorAll("ol.references"); }

// You should really upgrade else { return false; }

for (var i = 0; i < references.length; i++) { var node = references[i].parentNode; var a = document.createElement("a"); a.href="#"; a.onclick = sortReferencesByDate; a.innerHTML = "[Sort by date]"; node.insertBefore(a, references[i]); }

}

if (window.addEventListener) { window.addEventListener("load", addSortingButton, false); } else { window.attachEvent("onload", addSortingButton); }