Вход Регистрация
Файл: li/styles/gs_sortable.js
Строк: 358
<?php
// Copyright 2007 - 2010 Gennadiy Shvets
// The program is distributed under the terms of the GNU General
// Public License 3.0
//
// See http://www.allmyscripts.com/Table_Sort/index.html for usage details.

// Script version 1.8

var TSort_Store;
var 
TSort_All;

function 
TSort_StoreDef () {
    
this.sorting = [];
    
this.nodes = [];
    
this.rows = [];
    
this.row_clones = [];
    
this.sort_state = [];
    
this.initialized = 0;
//    this.last_sorted = -1;
    
this.history = [];
    
this.sort_keys = [];
    
this.sort_colors = [ '#FF0000', '#800080', '#0000FF' ];
};

function 
tsInitOnload ()
{
    
//    If TSort_All is not initialized - do it now (simulate old behavior)
    
if    (TSort_All == null)
        
tsRegister();

    for (var 
id in TSort_All)
    {
        
tsSetTable (id);
        
tsInit();
    }
    if    (
window.onload_sort_table)
        
window.onload_sort_table();
}

function 
tsInit()
{

    if    (
TSort_Data.push == null)
        return;
    var 
table_id = TSort_Data[0];
    var 
table = document.getElementById(table_id);
    
// Find thead
    
var thead = table.getElementsByTagName('thead')[0];
    if    (
thead == null)
    {
        
alert ('Cannot find THEAD tag!');
        return;
    }
    var 
tr = thead.getElementsByTagName('tr');
    var 
cols, i, node, len;
    if    (
tr.length > 1)
    {
        var    
cols0 = tr[0].getElementsByTagName('th');
        if    (
cols0.length == 0)
            
cols0 = tr[0].getElementsByTagName('td');
        var 
cols1;
        var    
cols1 = tr[1].getElementsByTagName('th');
        if    (
cols1.length == 0)
            
cols1 = tr[1].getElementsByTagName('td');
        
cols = new Array ();
        var 
j0, j1, n;
        
len = cols0.length;
        for (
j0 = 0, j1 = 0; j0 < len; j0++)
        {
            
node = cols0[j0];
            
n = node.colSpan;
            if    (
n > 1)
            {
                while (
n > 0)
                {
                    
cols.push (cols1[j1++]);
                    
n--;
                }
            }
            else
            {
                if    (
node.rowSpan == 1)
                    
j1++;
                
cols.push (node);
            }
        }
    }
    else
    {
        
cols = tr[0].getElementsByTagName('th');
        if    (
cols.length == 0)
            
cols = tr[0].getElementsByTagName('td');
    }
    
len = cols.length;
    for (var 
i = 0; i < len; i++)
    {
        if    (
i >= TSort_Data.length - 1)
            break;
        
node = cols[i];
        var 
sorting = TSort_Data[i + 1].toLowerCase();
        if    (
sorting == null)  sorting = '';
        
TSort_Store.sorting.push(sorting);

        if    ((
sorting != null)&&(sorting != ''))
        {
//            node.tsort_col_id = i;
//            node.tsort_table_id = table_id;
//            node.onclick = tsDraw;
            
node.innerHTML = "<a href='' onClick="tsDraw(" + i + ",'" +
                table_id + "'
); return false">" + node.innerHTML +
                
'</a><b><span id="TS_' + i + '_' + table_id + '"></span></b>';
            
node.style.cursor = "pointer";
        }
    }

    
// Get body data
    
var tbody = table.getElementsByTagName('tbody')[0];
    if    (
tbody == null)    return;
    
// Get TR rows
    
var rows = tbody.getElementsByTagName('tr');
    var 
date = new Date ();
    var 
len, text, a;
    for (
i = 0; i < rows.length; i++)
    {
        var 
row = rows[i];
        var 
cols = row.getElementsByTagName('td');
        var 
row_data = [];
        for (
j = 0; j < cols.length; j++)
        {
            
// Get cell text
            
text = cols[j].innerHTML.replace(/^s+/, '');
            
text = text.replace(/s+$/, '');
            var 
sorting = TSort_Store.sorting[j];
            if    (
sorting == 'h')
            {
                
text = text.replace(/<[^>]+>/g, '');
                
text = text.toLowerCase();
            }
            else if    (
sorting == 's')
                
text = text.toLowerCase();
            else if (
sorting == 'i')
            {
                
text = parseInt(text);
                if    (
isNaN(text))    text = 0;
            }
            else if (
sorting == 'n')
            {
                
text = text.replace(/(d),(?=ddd)/g, "$1");
                
text = parseInt(text);
                if    (
isNaN(text))    text = 0;
            }
            else if (
sorting == 'c')
            {
                
text = text.replace(/^$/, '');
                
text = text.replace(/(d),(?=ddd)/g, "$1");
                
text = parseFloat(text);
                if    (
isNaN(text))    text = 0;
            }
            else if (
sorting == 'f')
            {
                
text = parseFloat(text);
                if    (
isNaN(text))    text = 0;
            }
            else if (
sorting == 'g')
            {
                
text = text.replace(/(d),(?=ddd)/g, "$1");
                
text = parseFloat(text);
                if    (
isNaN(text))    text = 0;
            }
            else if (
sorting == 'd')
            {
                if    (
text.match(/^dddd-dd?-dd?(?: dd?:dd?:dd?)?$/))
                {
                    
a = text.split (/[s-:]/);
                    
text = (a[3] == null)?
                        
Date.UTC(a[0], a[1] - 1, a[2],    0,    0,    0, 0):
                        
Date.UTC(a[0], a[1] - 1, a[2], a[3], a[4], a[5], 0);
                }
                else
                    
text = Date.parse(text);
            }
            
row_data.push(text);
        }
        
TSort_Store.rows.push(row_data);
        
// Save a reference to the TR element
        
var new_row = row.cloneNode(true);
        
new_row.tsort_row_id = i;
        
TSort_Store.row_clones[i] = new_row;
    }
    
TSort_Store.initialized = 1;

    if    (
TSort_Store.cookie)
    {
        var 
allc = document.cookie;
        
i = allc.indexOf (TSort_Store.cookie + '=');
        if    (
i != -1)
        {
            
i += TSort_Store.cookie.length + 1;
            
len = allc.indexOf (";", i);
            
text = decodeURIComponent (allc.substring (i, (len == -1)?
                
allc.length: len));
            
TSort_Store.initial = (text == '')? null: text.split(/s*,s*/);
        }
    }

    var    
initial = TSort_Store.initial;
    if    (
initial != null)
    {
        var 
itype = typeof initial;
        if    ((
itype == 'number')||(itype == 'string'))
            
tsDraw(initial);
        else
        {
            for (
i = initial.length - 1; i >= 0; i--)
                
tsDraw(initial[i]);
        }
    }
}

function 
tsDraw(p_id, p_table)
{
    if    (
p_table != null)
        
tsSetTable (p_table);

    if    ((
TSort_Store == null)||(TSort_Store.initialized == 0))
        return;

    var 
i = 0;
    var 
sort_keys = TSort_Store.sort_keys;
    var 
id;
    var 
new_order = '';
    if    (
p_id != null)
    {
        if    (
typeof p_id == 'number')
            
id = p_id;
        else    if    ((
typeof p_id == 'string')&&(p_id.match(/^d+[ADU]$/i)))
        {
            
id = p_id.replace(/^(d+)[ADU]$/i, "$1");
            
new_order = p_id.replace(/^d+([ADU])$/i, "$1").toUpperCase();
        }
    }
    if    (
id == null)
    {
        
id = this.tsort_col_id;
        if    ((
p_table == null)&&(this.tsort_table_id != null))
            
tsSetTable (this.tsort_table_id);
    }
    var 
table_id = TSort_Data[0];

    var 
order = TSort_Store.sort_state[id];
    if    (
new_order == 'U')
    {
        if    (
order != null)
        {
            
TSort_Store.sort_state[id] = null;
            
obj = document.getElementById ('TS_' + id + '_' + table_id);
            if    (
obj != null)    obj.innerHTML = '';
        }
    }
    else if    (
new_order != '')
    {
        
TSort_Store.sort_state[id] = (new_order == 'A')? true: false;
        
//    Add column number to the sort keys array
        
sort_keys.unshift(id);
        
i = 1;
    }
    else
    {
        if    ((
order == null)||(order == true))
        {
            
TSort_Store.sort_state[id] = (order == null)? true: false;
            
//    Add column number to the sort keys array
            
sort_keys.unshift(id);
            
i = 1;
        }
        else
        {
            
TSort_Store.sort_state[id] = null;
            
obj = document.getElementById ('TS_' + id + '_' + table_id);
            if    (
obj != null)    obj.innerHTML = '';
        }
    }

    var 
len = sort_keys.length;
    
//    This will either remove the column completely from the sort_keys
    //    array (i = 0) or remove duplicate column number if present (i = 1).
    
while (i < len)
    {
        if    (
sort_keys[i] == id)
        {
            
sort_keys.splice(i, 1);
            
len--;
            break;
        }
        
i++;
    }
    if    (
len > 3)
    {
        
i = sort_keys.pop();
        
obj = document.getElementById ('TS_' + i + '_' + table_id);
        if    (
obj != null)    obj.innerHTML = '';
        
TSort_Store.sort_state[i] = null;
    }

    
// Sort the rows
    
TSort_Store.row_clones.sort(tsSort);

    
// Save the currently selected order
    
var new_tbody = document.createElement('tbody');
    var 
row_clones = TSort_Store.row_clones;
    
len = row_clones.length;
    var 
classes = TSort_Store.classes;
    if    (
classes == null)
    {
        for (
i = 0; i < len; i++)
            
new_tbody.appendChild (row_clones[i].cloneNode(true));
    }
    else
    {
        var clone;
        var 
j = 0;
        var 
cl_len = classes.length;
        for (
i = 0; i < len; i++)
        {
            clone = 
row_clones[i].cloneNode(true);
            clone.
className = classes[j++];
            if    (
j >= cl_len)  j = 0;
            
new_tbody.appendChild (clone);
        }
    }

    
// Replace table body
    
var table = document.getElementById(table_id);
    var 
tbody = table.getElementsByTagName('tbody')[0];
    
table.removeChild(tbody);
    
table.appendChild(new_tbody);

    var 
obj, color, icon, state;
    
len = sort_keys.length;
    var 
sorting = new Array ();
    for (
i = 0; i < len; i++)
    {
        
id = sort_keys[i];
        
obj = document.getElementById ('TS_' + id + '_' + table_id);
        if    (
obj == null)  continue;
        
state = (TSort_Store.sort_state[id])? 0: 1;
        
icon = TSort_Store.icons[state];
        
obj.innerHTML = (icon.match(/</))? icon:
            
'<font color="' + TSort_Store.sort_colors[i] + '">' + icon + '</font>';
        
sorting.push(id + ((state)? 'D': 'A'));
    }

    if    (
TSort_Store.cookie)
    {
        
//    Store the contents of "sorting" array into a cookie for 30 days
        
var date = new Date();
        
date.setTime (date.getTime () + 2592000);
        
document.cookie = TSort_Store.cookie + "=" +
            
encodeURIComponent (sorting.join(',')) + "; expires=" +
            
date.toGMTString () + "; path=/";
    }
}

function 
tsSort(a, b)
{
    var 
data_a = TSort_Store.rows[a.tsort_row_id];
    var 
data_b = TSort_Store.rows[b.tsort_row_id];
    var 
sort_keys = TSort_Store.sort_keys;
    var 
len = sort_keys.length;
    var 
id;
    var 
type;
    var 
order;
    var 
result;
    for (var 
i = 0; i < len; i++)
    {
        
id = sort_keys[i];
        
type = TSort_Store.sorting[id];

        var 
v_a = data_a[id];
        var 
v_b = data_b[id];
        if    (
v_a == v_b)  continue;
        if    ((
type == 'i')||(type == 'f')||(type == 'd'))
            
result = v_a - v_b;
        else
            
result = (v_a < v_b)? -1: 1;
        
order = TSort_Store.sort_state[id];
        return (
order)? result: 0 - result;
    }

    return (
a.tsort_row_id < b.tsort_row_id)? -1: 1;
}

function 
tsRegister()
{
    if    (
TSort_All == null)
        
TSort_All = new Object();

    var 
ts_obj = new TSort_StoreDef();
    
ts_obj.sort_data = TSort_Data;
    
TSort_Data = null;
    if    (
typeof TSort_Classes != 'undefined')
    {
        
ts_obj.classes = TSort_Classes;
        
TSort_Classes = null;
    }
    if    (
typeof TSort_Initial != 'undefined')
    {
        
ts_obj.initial = TSort_Initial;
        
TSort_Initial = null;
    }
    if    (
typeof TSort_Cookie != 'undefined')
    {
        
ts_obj.cookie = TSort_Cookie;
        
TSort_Cookie = null;
    }
    if    (
typeof TSort_Icons != 'undefined')
    {
        
ts_obj.icons = TSort_Icons;
        
TSort_Icons = null;
    }
    if    (
ts_obj.icons == null)
        
ts_obj.icons = new Array ("u2193", "u2191");

    if    (
ts_obj.sort_data != null)
        
TSort_All[ts_obj.sort_data[0]] = ts_obj;
}

function    
tsSetTable (p_id)
{
    
TSort_Store = TSort_All[p_id];
    if    (
TSort_Store == null)
    {
        
alert ("Cannot set table '" + p_id + "' - table is not registered");
        return;
    }
    
TSort_Data = TSort_Store.sort_data;
}

if    (
window.addEventListener)
    
window.addEventListener("load", tsInitOnload, false);
else if (
window.attachEvent)
    
window.attachEvent ("onload", tsInitOnload);
else
{
    if  ((
window.onload_sort_table == null)&&(window.onload != null))
        
window.onload_sort_table = window.onload;
    
// Assign new onload function
    
window.onload = tsInitOnload;
}
?>
Онлайн: 0
Реклама