function ActiveTable(table, tableNo) {
    
    var me = this;
    this.tableNum = tableNo;
    
    this.initializeSort = function(collection, column, type) {
        var rows = new Array();
        for (i=1, j=collection.length; i< j; i++) {
            key = $(collection[i].cells[column]).text();
            if (type == 'A') key = key.toLowerCase()
            else if (type == 'D') key = Date.parse(key);
            else if (type == 'C') key = parseFloat(key.replace(/[^0-9.]/g,''));
            else key = parseFloat(key);
            collection[i].sortKey = key;
            rows.push(collection[i]);
        }
        return rows;
    }
    
    this.sortTableClick = function(e) {
        
        e.stopPropagation();
        var cell = e.target;
        if (cell.nodeName != 'TH') {
            cell = $(cell).parents("th")[0];
        }
        var span = $(cell).find('span:last')[0];
        var dir;
        if ($(span).is(".sortDesc")) {
            dir = 'A';
        } else {
            dir = 'D';
        }
        me.sortTable(cell, dir);    
    }
    
    this.sortTable = function(cell, order) {
        // Get the span identifying the sort direction
        var span = $(cell).find('span:last')[0];
        var column = cell.cellIndex;
        var table = $(cell).parents("table")[0];
        // Determine the type of sort
        if (table.rows.length <= 1) return;
        
        if ($(cell).is('.date')) sortfn = 'D';
        else if ($(cell).is('.currency')) sortfn = 'C';
        else if ($(cell).is('.numeric')) sortfn = 'N';
        else if ($(cell).is('.decimal')) sortfn = 'N';
        else sortfn = 'A';
        
        var rows = me.initializeSort(table.rows, column, sortfn);

        if (sortfn == 'A') {
            rows.sort(me.sortDefault);
        } else {
            rows.sort(me.sortNumeric);
        }

        // Delete any arrows that may be showing
      $(table).find("tr span.sortAsc, tr span.sortDesc").removeClass('sortAsc').removeClass('sortDesc').html("&nbsp");
        
        if (order == 'A') {
            rows.reverse();
            $(span).addClass('sortAsc').html("&nbsp;&nabla;");
            createCookie('_AT_' + document.location.pathname + '_' + me.tableNum, '' + column + '|A');
        } else {
            $(span).addClass('sortDesc').html("&nbsp;&Delta;");
            createCookie('_AT_' + document.location.pathname + '_' + me.tableNum, '' + column + '|D');
        }
        
        for (i=0, j=rows.length;i<j;i++) {
            table.tBodies[0].appendChild(rows[i]);
        }
    }
     
    this.sortNumeric = function(a,b) { 
        aa = a.sortKey;
        bb = b.sortKey;
        if (isNaN(aa)) aa = 0;
        if (isNaN(bb)) bb = 0;
        return aa-bb;
    }
    
    this.sortDefault = function(a,b) {
        aa = a.sortKey;
        bb = b.sortKey;
        if (aa==bb) return 0;
        if (aa<bb) return -1;
        return 1;
    }
    
    //*******************************************************************************
    // Ititialization
    //*******************************************************************************
    this.SORT_COLUMN_INDEX;
    if (table.rows && table.rows.length > 0) {
        var firstRow = table.rows[0];
    }
    var cookie = readCookie('_AT_' + document.location.pathname + '_' + me.tableNum);
    var sortColumn = null;
    if (cookie) {
        cookie = cookie.split('|');
    }
    if (!firstRow) return;
    // We have a first row: assume it's the header, and make its contents clickable links
    $(firstRow).find("td,th").append("<span>&nbsp;<span>").click(me.sortTableClick).addClass("sortHeader").each(function (i) {
        if ((cookie) && (cookie[0] == i)) {
            sortColumn = this;
        }        
    })
    if (sortColumn) {
       me.sortTable(sortColumn,cookie[1]);
    }
}

$(function () {
    if (!document.getElementsByTagName) return;
    var tblNo = 0;
    $("table.activetable").each(function (i) {
      var sortTable = new ActiveTable(this, i);        
    })  
})