Index: wikibits.js =================================================================== --- wikibits.js (revision 40285) +++ wikibits.js (working copy) @@ -607,17 +607,21 @@ } } - sortfn = ts_sort_caseinsensitive; - if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/)) - sortfn = ts_sort_date; - if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/)) - sortfn = ts_sort_date; - if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/)) - sortfn = ts_sort_date; - if (itm.match(/^[\u00a3$\u20ac]/)) // pound dollar euro - sortfn = ts_sort_currency; - if (itm.match(/^[\d.,]+\%?$/)) - sortfn = ts_sort_numeric; + // determine which sorting function to use + // matches: D(D)-M(M)-YY(YY) or M(M)-D(D)-YY(YY) + if (itm.match(/^\d{1,2}([\/\-\.\s])(?:\d{1,2}\1)?(?:\d{2}|\d{4})$/)) + var sortfn = ts_sort_date_short; + // matches: D(D)-MONTHABV-YY(YY) or MONTHABV-D(D)-YY(YY) or MONTHABV D(D), YY(YY) + else if (itm.match(/^(?:[a-zA-Z\u00c0-\uffff]+([\/\.\-\s])\d{1,2}|\d{1,2}([\/\.\-\s])[a-zA-Z\u00c0-\uffff]+)\,?(?:\1|\2)(?:\d{2}|\d{4})$/)) + var sortfn = ts_sort_date_long; + // pound dollar euro + else if (itm.match(/^[\u00a3$\u20ac]/)) + var sortfn = ts_sort_currency; + // matches: nn.nnn or nn,nnn or nn.nnn% or nn,nnn% or nn.nnn,nnn% or nn,nnn.nnn% + else if (itm.match(/^[\d.,]+\%?$/)) + var sortfn = ts_sort_numeric; + else + var sortfn = ts_sort_caseinsensitive; var reverse = (span.getAttribute("sortdir") == 'down'); @@ -661,61 +665,77 @@ } span.innerHTML = arrowHTML; - ts_alternate(table); + ts_alternate(table); } -function ts_dateToSortKey(date) { +function ts_dateToSortKey_short(date) { + // matches: D(D)-M(M)-YY(YY) or M(M)-D(D)-YY(YY) // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX - if (date.length == 11) { - switch (date.substr(3,3).toLowerCase()) { - case "jan": var month = "01"; break; - case "feb": var month = "02"; break; - case "mar": var month = "03"; break; - case "apr": var month = "04"; break; - case "may": var month = "05"; break; - case "jun": var month = "06"; break; - case "jul": var month = "07"; break; - case "aug": var month = "08"; break; - case "sep": var month = "09"; break; - case "oct": var month = "10"; break; - case "nov": var month = "11"; break; - case "dec": var month = "12"; break; - // default: var month = "00"; - } - return date.substr(7,4)+month+date.substr(0,2); - } else if (date.length == 10) { - if (ts_europeandate == false) { - return date.substr(6,4)+date.substr(0,2)+date.substr(3,2); - } else { - return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); - } - } else if (date.length == 8) { - yr = date.substr(6,2); - if (parseInt(yr) < 50) { - yr = '20'+yr; - } else { - yr = '19'+yr; - } - if (ts_europeandate == true) { - return yr+date.substr(3,2)+date.substr(0,2); - } else { - return yr+date.substr(0,2)+date.substr(3,2); - } + if (!date) return 0; + date = date.replace(/[\s\/\.]/g, '-'); + var dateParts = date.split('-'); + switch (dateParts.length) { + case (3): + var yearLen = dateParts[2].toString().length; + var frst = parseInt(dateParts[0]); + var scnd = parseInt(dateParts[1]); + var year = parseInt(dateParts[2]); + if (yearLen == 2) + year += year < 50 ? 2000 : 1900; + if (frst < 10) frst = "0" + frst; + if (scnd < 10) scnd = "0" + scnd; + if (ts_europeandate) + return "".concat(year, scnd, frst); + else + return "".concat(year, frst, scnd); + break; + case (2): + var yearLen = dateParts[1].toString().length; + var frst = parseInt(dateParts[0]); + var year = parseInt(dateParts[1]); + if (yearLen == 2) + year += year < 50 ? 2000 : 1900; + if (frst < 10) frst = "0" + frst; + return "".concat(year, frst, "00"); + break; + case (1): + var yearLen = dateParts[0].toString().length; + var year = parseInt(dateParts[0]); + if (yearLen == 2) + year += year < 50 ? 2000 : 1900; + return "".concat(year, "00", "00"); + break; } - return "00000000"; } +function ts_dateToSortKey_long(date) { + // matches: D(D)-MONTHABV-YY(YY) or MONTHABV-D(D)-YY(YY) or MONTHABV D(D), YY(YY) + // the following is valid only for the English language, and should ideally be set as a global variable in "common.js" + var monthStr = "janfebmaraprmayjunjulaugsepoctnovdec"; + var monthLen = 3; + var monthNam = date.match(/[a-zA-Z\u00c0-\uffff]+/)[0].substr(0, monthLen).toLowerCase(); + var monthNum = monthStr.indexOf(monthNam) / monthLen + 1; + date = date.replace(/,/g, '').replace(/[a-zA-Z\u00c0-\uffff]+/, monthNum); + return ts_dateToSortKey_short(date); +} + function ts_parseFloat(num) { if (!num) return 0; num = parseFloat(num.replace(/,/g, "")); return (isNaN(num) ? 0 : num); } -function ts_sort_date(a,b) { - var aa = ts_dateToSortKey(a[1]); - var bb = ts_dateToSortKey(b[1]); - return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]); +function ts_sort_date_short(a, b) { + var aa = ts_dateToSortKey_short(a[1]); + var bb = ts_dateToSortKey_short(b[1]); + return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]); } + +function ts_sort_date_long(a, b) { + var aa = ts_dateToSortKey_long(a[1]); + var bb = ts_dateToSortKey_long(b[1]); + return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]); +} function ts_sort_currency(a,b) { var aa = ts_parseFloat(a[1].replace(/[^0-9.]/g,''));