From: <var...@us...> - 2009-06-19 11:19:26
|
Revision: 6942 http://phpwiki.svn.sourceforge.net/phpwiki/?rev=6942&view=rev Author: vargenau Date: 2009-06-19 11:19:19 +0000 (Fri, 19 Jun 2009) Log Message: ----------- Make sortable tables work again Modified Paths: -------------- trunk/lib/WikiTheme.php trunk/themes/Sidebar/wikibits.js trunk/themes/default/wikicommon.js Added Paths: ----------- trunk/themes/default/sortable.js Modified: trunk/lib/WikiTheme.php =================================================================== --- trunk/lib/WikiTheme.php 2009-06-17 19:02:07 UTC (rev 6941) +++ trunk/lib/WikiTheme.php 2009-06-19 11:19:19 UTC (rev 6942) @@ -223,7 +223,7 @@ return; } $this->addMoreHeaders(JavaScript('',array('src' => $this->_findData("wikicommon.js")))); - //$this->addMoreHeaders(JavaScript('',array('src' => $this->_findData("sortable.js")))); + $this->addMoreHeaders(JavaScript('',array('src' => $this->_findData("sortable.js")))); // by pixels if ((is_object($GLOBALS['request']) // guard against unittests and $GLOBALS['request']->getPref('doubleClickEdit')) Modified: trunk/themes/Sidebar/wikibits.js =================================================================== --- trunk/themes/Sidebar/wikibits.js 2009-06-17 19:02:07 UTC (rev 6941) +++ trunk/themes/Sidebar/wikibits.js 2009-06-19 11:19:19 UTC (rev 6942) @@ -979,144 +979,6 @@ } } -/* - * Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/. - * Based on a script from http://www.kryogenix.org/code/browser/sorttable/. - * Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html . - * - * Copyright (c) 1997-2006 Stuart Langridge, Joost de Valk. - * - * @todo don't break on colspans/rowspans (bug 8028) - * @todo language-specific digit grouping/decimals (bug 8063) - * @todo support all accepted date formats (bug 8226) - */ - -var ts_image_path = stylepath+"images/"; -var ts_image_up = "sort_up.gif"; -var ts_image_down = "sort_down.gif"; -var ts_image_none = "sort_none.gif"; -var wgContentLanguage = "en"; -var ts_europeandate = true; -var ts_alternate_row_colors = true; -var SORT_COLUMN_INDEX; - -function sortables_init() { - var idnum = 0; - // Find all tables with class sortable and make them sortable - var tables = getElementsByClassName(document, "table", "sortable"); - for (var ti = 0; ti < tables.length ; ti++) { - if (!tables[ti].id) { - tables[ti].setAttribute('id','sortable_table_id_'+idnum); - ++idnum; - } - ts_makeSortable(tables[ti]); - } -} - -function ts_makeSortable(table) { - var firstRow; - if (table.rows && table.rows.length > 0) { - if (table.tHead && table.tHead.rows.length > 0) { - firstRow = table.tHead.rows[table.tHead.rows.length-1]; - } else { - firstRow = table.rows[0]; - } - } - if (!firstRow) return; - - // We have a first row: assume it's the header, and make its contents clickable links - for (var i = 0; i < firstRow.cells.length; i++) { - var cell = firstRow.cells[i]; - if ((" "+cell.className+" ").indexOf(" unsortable ") == -1) { - cell.innerHTML += ' <a href="#" class="sortheader" onclick="ts_resortTable(this);return false;"><span class="sortarrow"><img src="'+ ts_image_path + ts_image_none + '" alt="↓"/></span></a>'; - } - } - if (ts_alternate_row_colors) { - ts_alternate(table); - } -} - -function ts_getInnerText(el) { - if (typeof el == "string") return el; - if (typeof el == "undefined") { return el }; - if (el.innerText) return el.innerText; // Not needed but it is faster - var str = ""; - - var cs = el.childNodes; - var l = cs.length; - for (var i = 0; i < l; i++) { - switch (cs[i].nodeType) { - case 1: //ELEMENT_NODE - str += ts_getInnerText(cs[i]); - break; - case 3: //TEXT_NODE - str += cs[i].nodeValue; - break; - } - } - return str; -} - -function ts_parseFloat(num) { - if (!num) return 0; - num = parseFloat(num.replace(/,/, "")); - 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_currency(a,b) { - var aa = ts_parseFloat(a[1].replace(/[^0-9.]/g,'')); - var bb = ts_parseFloat(b[1].replace(/[^0-9.]/g,'')); - return (aa != bb ? aa - bb : a[2] - b[2]); -} - -function ts_sort_numeric(a,b) { - var aa = ts_parseFloat(a[1]); - var bb = ts_parseFloat(b[1]); - return (aa != bb ? aa - bb : a[2] - b[2]); -} - -function ts_sort_caseinsensitive(a,b) { - var aa = a[1].toLowerCase(); - var bb = b[1].toLowerCase(); - return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]); -} - -function ts_sort_default(a,b) { - return (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]); -} - -function ts_alternate(table) { - // Take object table and get all it's tbodies. - var tableBodies = table.getElementsByTagName("tbody"); - // Loop through these tbodies - for (var i = 0; i < tableBodies.length; i++) { - // Take the tbody, and get all it's rows - var tableRows = tableBodies[i].getElementsByTagName("tr"); - // Loop through these rows - // Start at 1 because we want to leave the heading row untouched - for (var j = 0; j < tableRows.length; j++) { - // Check if j is even, and apply classes for both possible results - var oldClasses = tableRows[j].className.split(" "); - var newClassName = ""; - for (var k = 0; k < oldClasses.length; k++) { - if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd") - newClassName += oldClasses[k] + " "; - } - tableRows[j].className = newClassName + (j % 2 == 0 ? "even" : "odd"); - } - } -} - -/* - * End of table sorting code - */ - function runOnloadHook() { // don't run anything below this for non-dom browsers if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName)) { Copied: trunk/themes/default/sortable.js (from rev 6859, trunk/themes/default/sortable.js) =================================================================== --- trunk/themes/default/sortable.js (rev 0) +++ trunk/themes/default/sortable.js 2009-06-19 11:19:19 UTC (rev 6942) @@ -0,0 +1,325 @@ +/* +Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/. +Based on a script from http://www.kryogenix.org/code/browser/sorttable/. +Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html . + +Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk. + +Version 1.5.7 +*/ + +/* You can change these values */ +var image_path = "/images/"; +var image_up = "sort_up.gif"; +var image_down = "sort_down.gif"; +var image_none = "sort_none.gif"; +var europeandate = true; +var alternate_row_colors = true; + +/* Don't change anything below this unless you know what you're doing */ +addEvent(window, "load", sortables_init); + +var SORT_COLUMN_INDEX; +var thead = false; + +function sortables_init() { + // Find all tables with class sortable and make them sortable + if (!document.getElementsByTagName) return; + tbls = document.getElementsByTagName("table"); + for (ti=0;ti<tbls.length;ti++) { + thisTbl = tbls[ti]; + if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) { + ts_makeSortable(thisTbl); + } + } +} + +function ts_makeSortable(t) { + if (t.rows && t.rows.length > 0) { + if (t.tHead && t.tHead.rows.length > 0) { + var firstRow = t.tHead.rows[t.tHead.rows.length-1]; + thead = true; + } else { + var firstRow = t.rows[0]; + } + } + if (!firstRow) return; + + // We have a first row: assume it's the header, and make its contents clickable links + for (var i=0;i<firstRow.cells.length;i++) { + var cell = firstRow.cells[i]; + var txt = ts_getInnerText(cell); + if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) { + cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;">'+txt+'<span class="sortarrow"> <img src="'+ image_path + image_none + '" alt="↓"/></span></a>'; + } + } + if (alternate_row_colors) { + alternate(t); + } +} + +function ts_getInnerText(el) { + if (typeof el == "string") return el; + if (typeof el == "undefined") { return el }; + if (el.innerText) return el.innerText; //Not needed but it is faster + var str = ""; + + var cs = el.childNodes; + var l = cs.length; + for (var i = 0; i < l; i++) { + switch (cs[i].nodeType) { + case 1: //ELEMENT_NODE + str += ts_getInnerText(cs[i]); + break; + case 3: //TEXT_NODE + str += cs[i].nodeValue; + break; + } + } + return str; +} + +function ts_resortTable(lnk, clid) { + var span; + for (var ci=0;ci<lnk.childNodes.length;ci++) { + if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci]; + } + var spantext = ts_getInnerText(span); + var td = lnk.parentNode; + var column = clid || td.cellIndex; + var t = getParent(td,'TABLE'); + // Work out a type for the column + if (t.rows.length <= 1) return; + var itm = ""; + var i = 0; + while (itm == "" && i < t.tBodies[0].rows.length) { + var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]); + itm = trim(itm); + if (itm.substr(0,4) == "<!--" || itm.length == 0) { + itm = ""; + } + i++; + } + if (itm == "") return; + sortfn = ts_sort_caseinsensitive; + if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date; + if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) sortfn = ts_sort_date; + if (itm.match(/^-?[\xA3$\x80ۢ\xB4]\d/)) sortfn = ts_sort_numeric; + // ape: added to provide numeric sort on size for the docs tools. + if (itm.match(/^\d+ *(B|KB|MB)$/)) sortfn = ts_sort_numeric; + if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric; + SORT_COLUMN_INDEX = column; + var firstRow = new Array(); + var newRows = new Array(); + for (k=0;k<t.tBodies.length;k++) { + for (i=0;i<t.tBodies[k].rows[0].length;i++) { + firstRow[i] = t.tBodies[k].rows[0][i]; + } + } + for (k=0;k<t.tBodies.length;k++) { + if (!thead) { + // Skip the first row + for (j=1;j<t.tBodies[k].rows.length;j++) { + newRows[j-1] = t.tBodies[k].rows[j]; + } + } else { + // Do NOT skip the first row + for (j=0;j<t.tBodies[k].rows.length;j++) { + newRows[j] = t.tBodies[k].rows[j]; + } + } + } + newRows.sort(sortfn); + if (span.getAttribute("sortdir") == 'down') { + ARROW = ' <img src="'+ image_path + image_down + '" alt="↓"/>'; + newRows.reverse(); + span.setAttribute('sortdir','up'); + } else { + ARROW = ' <img src="'+ image_path + image_up + '" alt="↑"/>'; + span.setAttribute('sortdir','down'); + } + // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones + // don't do sortbottom rows + for (i=0; i<newRows.length; i++) { + if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) { + t.tBodies[0].appendChild(newRows[i]); + } + } + // do sortbottom rows only + for (i=0; i<newRows.length; i++) { + if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) + t.tBodies[0].appendChild(newRows[i]); + } + // Delete any other arrows there may be showing + var allspans = document.getElementsByTagName("span"); + for (var ci=0;ci<allspans.length;ci++) { + if (allspans[ci].className == 'sortarrow') { + if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us? + allspans[ci].innerHTML = ' <img src="'+ image_path + image_none + '" alt="↓"/>'; + } + } + } + span.innerHTML = ARROW; + alternate(t); +} + +function getParent(el, pTagName) { + if (el == null) { + return null; + } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) { + return el; + } else { + return getParent(el.parentNode, pTagName); + } +} + +function sort_date(date) { + // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX + dt = "00000000"; + if (date.length == 11) { + mtstr = date.substr(3,3); + mtstr = mtstr.toLowerCase(); + switch(mtstr) { + case "jan": var mt = "01"; break; + case "feb": var mt = "02"; break; + case "mar": var mt = "03"; break; + case "apr": var mt = "04"; break; + case "may": var mt = "05"; break; + case "jun": var mt = "06"; break; + case "jul": var mt = "07"; break; + case "aug": var mt = "08"; break; + case "sep": var mt = "09"; break; + case "oct": var mt = "10"; break; + case "nov": var mt = "11"; break; + case "dec": var mt = "12"; break; + // default: var mt = "00"; + } + dt = date.substr(7,4)+mt+date.substr(0,2); + return dt; + } else if (date.length == 10) { + if (europeandate == false) { + dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2); + return dt; + } else { + dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2); + return dt; + } + } else if (date.length == 8) { + yr = date.substr(6,2); + if (parseInt(yr) < 50) { + yr = '20'+yr; + } else { + yr = '19'+yr; + } + if (europeandate == true) { + dt = yr+date.substr(3,2)+date.substr(0,2); + return dt; + } else { + dt = yr+date.substr(0,2)+date.substr(3,2); + return dt; + } + } + return dt; +} + +function ts_sort_date(a,b) { + dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX])); + dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); + + if (dt1==dt2) { + return 0; + } + if (dt1<dt2) { + return -1; + } + return 1; +} +function ts_sort_numeric(a,b) { + var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]); + aa = clean_num(aa); + var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]); + bb = clean_num(bb); + return compare_numeric(aa,bb); +} +function compare_numeric(a,b) { + var a = parseFloat(a); + a = (isNaN(a) ? 0 : a); + var b = parseFloat(b); + b = (isNaN(b) ? 0 : b); + return a - b; +} +function ts_sort_caseinsensitive(a,b) { + aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase(); + bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase(); + if (aa==bb) { + return 0; + } + if (aa<bb) { + return -1; + } + return 1; +} +function ts_sort_default(a,b) { + aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]); + bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]); + if (aa==bb) { + return 0; + } + if (aa<bb) { + return -1; + } + return 1; +} +function addEvent(elm, evType, fn, useCapture) +// addEvent and removeEvent +// cross-browser event handling for IE5+, NS6 and Mozilla +// By Scott Andrew +{ + if (elm.addEventListener){ + elm.addEventListener(evType, fn, useCapture); + return true; + } else if (elm.attachEvent){ + var r = elm.attachEvent("on"+evType, fn); + return r; + } else { + alert("Handler could not be removed"); + } +} +function clean_num(str) { + str = str.replace(new RegExp(/[^-?0-9.]/g),""); + return str; +} +function trim(s) { + return s.replace(/^\s+|\s+$/g, ""); +} +function alternate(table) { + // Take object table and get all it's tbodies. + var tableBodies = table.getElementsByTagName("tbody"); + // Loop through these tbodies + for (var i = 0; i < tableBodies.length; i++) { + // Take the tbody, and get all it's rows + var tableRows = tableBodies[i].getElementsByTagName("tr"); + // Loop through these rows + // Start at 1 because we want to leave the heading row untouched + for (var j = 0; j < tableRows.length; j++) { + // Check if j is even, and apply classes for both possible results + if ( (j % 2) == 0 ) { + if ( !(tableRows[j].className.indexOf('odd') == -1) ) { + tableRows[j].className = tableRows[j].className.replace('odd', 'even'); + } else { + if ( tableRows[j].className.indexOf('even') == -1 ) { + tableRows[j].className += " even"; + } + } + } else { + if ( !(tableRows[j].className.indexOf('even') == -1) ) { + tableRows[j].className = tableRows[j].className.replace('even', 'odd'); + } else { + if ( tableRows[j].className.indexOf('odd') == -1 ) { + tableRows[j].className += " odd"; + } + } + } + } + } +} Modified: trunk/themes/default/wikicommon.js =================================================================== --- trunk/themes/default/wikicommon.js 2009-06-17 19:02:07 UTC (rev 6941) +++ trunk/themes/default/wikicommon.js 2009-06-19 11:19:19 UTC (rev 6942) @@ -104,144 +104,6 @@ hookEvent("load", setupshowHideFolder); -/* - * Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/. - * Based on a script from http://www.kryogenix.org/code/browser/sorttable/. - * Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html . - * - * Copyright (c) 1997-2006 Stuart Langridge, Joost de Valk. - * - * @todo don't break on colspans/rowspans (bug 8028) - * @todo language-specific digit grouping/decimals (bug 8063) - * @todo support all accepted date formats (bug 8226) - */ - -var ts_image_up = "sort_up.gif"; -var ts_image_down = "sort_down.gif"; -var ts_image_none = "sort_none.gif"; -var wgContentLanguage = "en"; -var ts_europeandate = true; -var ts_alternate_row_colors = true; -var SORT_COLUMN_INDEX; - -function sortables_init() { - var idnum = 0; - // Find all tables with class sortable and make them sortable - var tables = getElementsByClassName(document, "table", "sortable"); - for (var ti = 0; ti < tables.length ; ti++) { - if (!tables[ti].id) { - tables[ti].setAttribute('id','sortable_table_id_'+idnum); - ++idnum; - } - ts_makeSortable(tables[ti]); - } -} - -function ts_makeSortable(table) { - var firstRow; - var ts_image_path = stylepath+"images/"; - if (table.rows && table.rows.length > 0) { - if (table.tHead && table.tHead.rows.length > 0) { - firstRow = table.tHead.rows[table.tHead.rows.length-1]; - } else { - firstRow = table.rows[0]; - } - } - if (!firstRow) return; - - // We have a first row: assume it's the header, and make its contents clickable links - for (var i = 0; i < firstRow.cells.length; i++) { - var cell = firstRow.cells[i]; - if ((" "+cell.className+" ").indexOf(" unsortable ") == -1) { - cell.innerHTML += ' <a href="#" class="sortheader" onclick="ts_resortTable(this);return false;"><span class="sortarrow"><img src="'+ ts_image_path + ts_image_none + '" alt="↓"/></span></a>'; - } - } - if (ts_alternate_row_colors) { - ts_alternate(table); - } -} - -function ts_getInnerText(el) { - if (typeof el == "string") return el; - if (typeof el == "undefined") { return el }; - if (el.innerText) return el.innerText; // Not needed but it is faster - var str = ""; - - var cs = el.childNodes; - var l = cs.length; - for (var i = 0; i < l; i++) { - switch (cs[i].nodeType) { - case 1: //ELEMENT_NODE - str += ts_getInnerText(cs[i]); - break; - case 3: //TEXT_NODE - str += cs[i].nodeValue; - break; - } - } - return str; -} - -function ts_parseFloat(num) { - if (!num) return 0; - num = parseFloat(num.replace(/,/, "")); - 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_currency(a,b) { - var aa = ts_parseFloat(a[1].replace(/[^0-9.]/g,'')); - var bb = ts_parseFloat(b[1].replace(/[^0-9.]/g,'')); - return (aa != bb ? aa - bb : a[2] - b[2]); -} - -function ts_sort_numeric(a,b) { - var aa = ts_parseFloat(a[1]); - var bb = ts_parseFloat(b[1]); - return (aa != bb ? aa - bb : a[2] - b[2]); -} - -function ts_sort_caseinsensitive(a,b) { - var aa = a[1].toLowerCase(); - var bb = b[1].toLowerCase(); - return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]); -} - -function ts_sort_default(a,b) { - return (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]); -} - -function ts_alternate(table) { - // Take object table and get all it's tbodies. - var tableBodies = table.getElementsByTagName("tbody"); - // Loop through these tbodies - for (var i = 0; i < tableBodies.length; i++) { - // Take the tbody, and get all it's rows - var tableRows = tableBodies[i].getElementsByTagName("tr"); - // Loop through these rows - // Start at 1 because we want to leave the heading row untouched - for (var j = 0; j < tableRows.length; j++) { - // Check if j is even, and apply classes for both possible results - var oldClasses = tableRows[j].className.split(" "); - var newClassName = ""; - for (var k = 0; k < oldClasses.length; k++) { - if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd") - newClassName += oldClasses[k] + " "; - } - tableRows[j].className = newClassName + (j % 2 == 0 ? "even" : "odd"); - } - } -} - -/* - * End of table sorting code - */ - function runOnloadHook() { // don't run anything below this for non-dom browsers if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |