From: <ru...@us...> - 2009-06-04 11:03:59
|
Revision: 6860 http://phpwiki.svn.sourceforge.net/phpwiki/?rev=6860&view=rev Author: rurban Date: 2009-06-04 11:03:50 +0000 (Thu, 04 Jun 2009) Log Message: ----------- Move sortable to wikicommon Add WikiURL() Modified Paths: -------------- trunk/themes/default/wikicommon.js Removed Paths: ------------- trunk/themes/default/sortable.js Deleted: trunk/themes/default/sortable.js =================================================================== --- trunk/themes/default/sortable.js 2009-06-04 10:45:52 UTC (rev 6859) +++ trunk/themes/default/sortable.js 2009-06-04 11:03:50 UTC (rev 6860) @@ -1,325 +0,0 @@ -/* -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-04 10:45:52 UTC (rev 6859) +++ trunk/themes/default/wikicommon.js 2009-06-04 11:03:50 UTC (rev 6860) @@ -1,6 +1,23 @@ // Common Javascript support functions. // $Id$ +/* Globals: +var data_path = '/phpwiki-cvs'; +var pagename = 'HomePage'; +var script_url= '/wikicvs'; +var stylepath = data_path+'/themes/MonoBook/'; +*/ + +function WikiURL(page) { + if (typeof page == "undefined") + page = pagename; + if (use_path_info) { + return script_url + '/' + escapeQuotes(page) + '?'; + } else { + return script_url + '?pagename=' + escapeQuotes(page) + '&'; + } +} + function flipAll(formObj) { var isFirstSet = -1; for (var i=0; i < formObj.length; i++) { @@ -26,3 +43,252 @@ } } +// Global external objects used by this script. +/*extern ta, stylepath, skin */ + +// add any onload functions in this hook (please don't hard-code any events in the xhtml source) +var doneOnloadHook; + +if (!window.onloadFuncts) { + var onloadFuncts = []; +} + +function addOnloadHook(hookFunct) { + // Allows add-on scripts to add onload functions + onloadFuncts[onloadFuncts.length] = hookFunct; +} + +function hookEvent(hookName, hookFunct) { + if (window.addEventListener) { + window.addEventListener(hookName, hookFunct, false); + } else if (window.attachEvent) { + window.attachEvent("on" + hookName, hookFunct); + } +} + +// Todo: onloadhook to re-establish folder state in pure js, no cookies. same for toc. +function showHideFolder(id) { + var div = document.getElementById(id+'-body'); + var img = document.getElementById(id+'-img'); + var expires = new Date(); // 30 days + expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000)); + var suffix = " expires="+expires.toGMTString(); //+"; path="+data_path; + //todo: invalidate cache header + if ( div.style.display == 'none' ) { + div.style.display = 'block'; + img.src = stylepath + 'images/folderArrowOpen.png'; + document.cookie = "folder_"+id+"=Open;"+suffix; + } else { + div.style.display = 'none'; + img.src = stylepath + 'images/folderArrowClosed.png'; + document.cookie = "folder_"+id+"=Closed;"+suffix; + } +} + +function setupshowHideFolder() { + var ids = ["p-tb", "p-tbx", "p-tags", "p-rc" /*,"toc"*/]; + for (var i = 0; i < ids.length; i++) { + if (ids[i]) { + var id = ids[i]; + var cookieStr = "folder_"+id+"="; + var cookiePos = document.cookie.indexOf(cookieStr); + if (cookiePos > -1) { + document.getElementById(id+'-body').style.display = document.cookie.charAt(cookiePos + cookieStr.length) == "C" ? 'block' : 'none'; + showHideFolder(id) + } + } + } +} + +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)) { + return; + } + + // set this before running any hooks, since any errors below + // might cause the function to terminate prematurely + doneOnloadHook = true; + + histrowinit(); + unhidetzbutton(); + tabbedprefs(); + updateTooltipAccessKeys( null ); + akeytt( null ); + scrollEditBox(); + setupCheckboxShiftClick(); + sortables_init(); + + // Run any added-on functions + for (var i = 0; i < onloadFuncts.length; i++) { + onloadFuncts[i](); + } +} + +//note: all skins should call runOnloadHook() at the end of html output, +// so the below should be redundant. It's there just in case. +hookEvent("load", runOnloadHook); + +//hookEvent("load", mwSetupToolbar); + +// This script was provided for free by +// http://www.howtocreate.co.uk/tutorials/javascript/domcss +// See http://www.howtocreate.co.uk/jslibs/termsOfUse.html +function getAllSheets() { + if( !window.ScriptEngine && navigator.__ice_version ) { return document.styleSheets; } + if( document.getElementsByTagName ) { var Lt = document.getElementsByTagName('link'), St = document.getElementsByTagName('style'); + } else if( document.styleSheets && document.all ) { var Lt = document.all.tags('LINK'), St = document.all.tags('STYLE'); + } else { return []; } for( var x = 0, os = []; Lt[x]; x++ ) { + var rel = Lt[x].rel ? Lt[x].rel : Lt[x].getAttribute ? Lt[x].getAttribute('rel') : ''; + if( typeof( rel ) == 'string' && rel.toLowerCase().indexOf('style') + 1 ) { os[os.length] = Lt[x]; } + } for( var x = 0; St[x]; x++ ) { os[os.length] = St[x]; } return os; +} +function changeStyle() { + for( var x = 0, ss = getAllSheets(); ss[x]; x++ ) { + if( ss[x].title ) { ss[x].disabled = true; } + for( var y = 0; y < arguments.length; y++ ) { + if( ss[x].title == arguments[y] ) { ss[x].disabled = false; } +} } } +function PrinterStylesheet() { + changeStyle('Printer'); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |