Results 1 to 8 of 8

Thread: JavaScript Sorting Code Problem

  1. #1
    Join Date
    Jan 2011
    Posts
    5
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default JavaScript Sorting Code Problem

    I'm using the following code in conjunction with css and html code to display a tabel with sortable rows. Problem is it seems to be sorting in European style, not US,as I prefer. I am stuck on this. I can post the css and html also if needed. Thanks for all your help! Preston

    /*
    http://www.joostdevalk.nl/code/sortable-table/.
    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 = "http://www.igwtamerica.org/";
    var image_up = "arrow-up.gif";
    var image_down = "arrow-down.gif";
    var image_none = "arrow-none.gif";
    var europeandate = false;
    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"><imag src="'+ image_path + image_none + '" alt="&darr;"/></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(/^-?[£$€Û¢´]\d/)) 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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_down + '" alt="&darr;"/>';
    newRows.reverse();
    span.setAttribute('sortdir','up');
    } else {
    ARROW = '&nbsp;&nbsp;<imag src="'+ image_path + image_up + '" alt="&uarr;"/>';
    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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_none + '" alt="&darr;"/>';
    }
    }
    }
    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";
    }
    }
    }
    }
    }
    }

  2. #2
    Join Date
    Dec 2008
    Location
    Portsmouth, UK
    Posts
    1,891
    Thanks
    2
    Thanked 441 Times in 435 Posts

    Default

    please post the HTML and CSS
    Vic
    God Loves You and will never love you less.
    http://www.vicsjavascripts.org/Home.htm
    If my post has been useful please donate to http://www.operationsmile.org.uk/

  3. #3
    Join Date
    Jan 2011
    Posts
    5
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default Thank You So Much

    Thanks, Vic! I really appreciate you responding. That was my first post here. And, I saw your signature...God bless you, Brother.

    Here is the CSS:
    /* Copyright 2006 Joost de Valk */
    a img {
    border: 0;
    }
    /* This is border line for entire table Note: I changed the border-collapse from collapse to seperate...this allowed me to then change the width of the boxes in below code */
    table.sortable {
    border-spacing: 20;
    border: 10px outset #5f9ea0;
    border-collapse: seperate;
    }
    /* This is for the size of entire table and individual boxes. Note: The 1st value sets the spacing distance on top of text in boxes, the 2nd sets the right spacing, the 3rd sets the bottom spacing and the 4th padding value sets the left spacing */
    table.sortable th, table.sortable td {
    text-align: center;
    padding: 2px 8px 2px 8px;
    width: 800px;
    border-style: solid;
    border-color: #fa8072;
    }
    /* This is the top header attributes */
    table.sortable th {
    border-width: 2px 2px 2px 2px;
    background-color: #0g0;
    }
    /* This is for sizing Hor. and Vert. lines of individual boxes */
    table.sortable td {
    border-width: 2px 1px 2px 1px;
    }
    /* This is for the odd and even box background colors */
    table.sortable tr.odd td {
    background-color: #ddd;
    }
    table.sortable tr.even td {
    background-color: #fff
    ;
    }
    table.sortable tr.sortbottom td {
    border-top: 1px solid #444;
    background-color: #ccc;
    font-weight: bold;
    }

    Here is the html:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>igwtamerica.org "Yes Vote" Cities</title>
    <link rel="stylesheet" type="text/css" href="GA_Style.css"/>
    <meta name="author" content="Joost de Valk, http://www.joostdevalk.nl/" />
    <link href="http://www.joostdevalk.nl/" rev="made" />
    <script type="text/javascript" src="GA_Script.js"></script>
    </head>

    <body>

    <table class="sortable" id="anyid" cellpadding="0" cellspacing="0">
    <tr>
    <th>State</th>
    <th>City</th>
    <th>County</th>
    <th>"Yes City" Date</th>
    <th>City Pages</th>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">County&nbspof&nbspBerrian</td>
    <td><center>Berrian</center></td>
    <td align="center">2010/12/10</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/CountyofBerrianCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">County&nbspof&nbspTift</td>
    <td><center>Tift</center></td>
    <td align="center">2010/08/11</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/CountyofTiftCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">County of Turner</td>
    <td><center>Turner</center></td>
    <td align="center">2010/02/11</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/CountyofTurnerCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">Lenox</td>
    <td><center>Cook</center></td>
    <td align="center">2010/11/10</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/LenoxCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">Omega </td>
    <td><center>Tift</center></td>
    <td align="center">2010/05/10</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/Omega CA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">Sycamore</td>
    <td><center>Turner</center></td>
    <td align="center">2010/09/09</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/SycamoreCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">Tifton</td>
    <td><center>Tift</center></td>
    <td align="center">2010/13/09</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/TiftonCA.php">City Page</a></td>
    </tr>
    <tr>
    <td align="center">Georgia</td>
    <td width="300px" height="21px">Tyty</td>
    <td><center>Tift</center></td>
    <td align="center">2010/07/09</td>
    <td align="center"><a href="http://www.igwtamerica.org/CA/TytyCA.php">City Page</a></td>
    </tr>

    </table>

    </body>
    </html>

    I'm sure you get the idea of what I am doing here, overall. I have been uploading the three files into the individual state folders on the server and then, as new cities/states join, editing and uploading the html files to their respective folders.

    Thanks again and God bless,
    Preston

  4. #4
    Join Date
    Dec 2008
    Location
    Portsmouth, UK
    Posts
    1,891
    Thanks
    2
    Thanked 441 Times in 435 Posts

    Default

    modified functions

    Code:
    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(/^-?[£$€Û¢´]\d/)){
     sortfn = ts_sort_numeric;
    }
    if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)){
     sortfn = ts_sort_numeric;
    }
    if (itm.match(/Date/)){
     sortfn = ts_sort_date;
    }
    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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_down + '" alt="&darr;"/>';
    newRows.reverse();
    span.setAttribute('sortdir','up');
    } else {
    ARROW = '&nbsp;&nbsp;<imag src="'+ image_path + image_up + '" alt="&uarr;"/>';
    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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_none + '" alt="&darr;"/>';
    }
    }
    }
    span.innerHTML = ARROW;
    alternate(t);
    }

    Code:
    function ts_sort_date(a,b) {
     var nu1=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
     var nu2=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
     return (nu1[0]+nu1[2]+nu1[1])-(nu2[0]+nu2[2]+nu2[1]);
    }
    this is specific to your application
    Vic
    God Loves You and will never love you less.
    http://www.vicsjavascripts.org/Home.htm
    If my post has been useful please donate to http://www.operationsmile.org.uk/

  5. #5
    Join Date
    Jan 2011
    Posts
    5
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default

    Thanks for the help, Vic. For some reason the sorting is still not happening correctly. I believe I made the changes you provided as you suggested. Would you mind visiting the following page, http://www.igwtamerica.org/CA/CA_Yes...rtCodeTest.php where I have described the problem and put the code in as I changed it?

    Thanks again,
    Preston

  6. #6
    Join Date
    Dec 2008
    Location
    Portsmouth, UK
    Posts
    1,891
    Thanks
    2
    Thanked 441 Times in 435 Posts

    Default

    thats because you changes the date format

    for mm/dd/yyyy

    Code:
    function ts_sort_date(a,b) {
     var nu1=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
     var nu2=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
     return (nu1[2]+nu1[0]+nu1[1])-(nu2[2]+nu2[0]+nu2[1]);
    }
    Vic
    God Loves You and will never love you less.
    http://www.vicsjavascripts.org/Home.htm
    If my post has been useful please donate to http://www.operationsmile.org.uk/

  7. #7
    Join Date
    Jan 2011
    Posts
    5
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default

    Hi Vic...sorry i did not make it clear I wanted the format to be mm/dd/yyyy. I placed that last code in the script, but seems it did not help. It looks like it's doing same as before. Below is the code I'm using on test page:
    Thanks..,Preston

    /*
    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 = "http://www.igwtamerica.org/";
    var image_up = "arrow-up.gif";
    var image_down = "arrow-down.gif";
    var image_none = "arrow-none.gif";
    var europeandate = false;
    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"><imag src="'+ image_path + image_none + '" alt="&darr;"/></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(/^-?[£$€Û¢´]\d/)){
    sortfn = ts_sort_numeric;
    }
    if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)){
    sortfn = ts_sort_numeric;
    }
    if (itm.match(/Date/)){
    sortfn = ts_sort_date;
    }
    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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_down + '" alt="&darr;"/>';
    newRows.reverse();
    span.setAttribute('sortdir','up');
    } else {
    ARROW = '&nbsp;&nbsp;<imag src="'+ image_path + image_up + '" alt="&uarr;"/>';
    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 = '&nbsp;&nbsp;<imag src="'+ image_path + image_none + '" alt="&darr;"/>';
    }
    }
    }
    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) {
    var nu1=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
    var nu2=a.cells[SORT_COLUMN_INDEX].innerHTML.split(/\D/);
    return (nu1[2]+nu1[0]+nu1[1])-(nu2[2]+nu2[0]+nu2[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";
    }
    }
    }
    }
    }
    }

  8. #8
    Join Date
    Jan 2011
    Posts
    5
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default

    Anyone else out there that might be able to help me with this? I would reall appreciate it!

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •