/*
originally written by paul sowden <paul@idontsmoke.co.uk> | http://idontsmoke.co.uk
modified and localized by alexander shurkayev <alshur@narod.ru> | http://htmlcoder.visions.ru
*/

var img_dir = "/img/"; // папка с картинками
var sort_case_sensitive = false; // вид сортировки (регистрозависимый или нет)

// ф-ция, определяющая алгоритм сортировки
function _sort(a, b) {
    var a = a[0];
    var b = b[0];
    var _a = (a + '').replace(/,/, '.');
    var _b = (b + '').replace(/,/, '.');
    if (isDate(a) && isDate(b))
		return sort_dates(a, b);
    else if (parseFloat(_a) && parseFloat(_b))
		return sort_numbers(parseFloat(_a), parseFloat(_b));
    else if (!sort_case_sensitive)
		return sort_insensitive(a, b);
    else
		return sort_sensitive(a, b);
}

function isDate(value)
{
	var str = value;
	var re = /^\d+\.\d+\.\d+/;
	str = str.toString();
	if (!str.match(re))
		return false;
	else
		return true;
}

// ф-ция сортировки чисел
function sort_numbers(a, b) {
    return a - b;
}

// ф-ция сортировки дат
function sort_dates(a, b) {
	var dateStrA = a;
	var dateStrB = b;

	var strA = dateStrA.replace(/^(\d+)\.(\d+)\.(\d+)(.*)/, '$3.$2.$1$4');
	var strB = dateStrB.replace(/^(\d+)\.(\d+)\.(\d+)(.*)/, '$3.$2.$1$4');

    if (!sort_case_sensitive)
		return sort_insensitive(strA, strB);
    else
		return sort_sensitive(strA, strB);
}

// ф-ция регистронезависимой сортировки
function sort_insensitive(a, b) {
    var anew = a.toLowerCase();
    var bnew = b.toLowerCase();
    if (anew < bnew) return -1;
    if (anew > bnew) return 1;
    return 0;
}

// ф-ция регистрозависимой сортировки
function sort_sensitive(a, b) {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}

// вспомогательная ф-ция, выдирающая из дочерних узлов весь текст
function getConcatenedTextContent(node) {
    var _result = "";
    if (node == null) {
        return _result;
    }
    var childrens = node.childNodes;
    var i = 0;
    while (i < childrens.length) {
        var child = childrens.item(i);
        switch (child.nodeType) {
            case 1: // ELEMENT_NODE
            case 5: // ENTITY_REFERENCE_NODE
                _result += getConcatenedTextContent(child);
                break;
            case 3: // TEXT_NODE
            case 2: // ATTRIBUTE_NODE
            case 4: // CDATA_SECTION_NODE
                _result += child.nodeValue;
                break;
            case 6: // ENTITY_NODE
            case 7: // PROCESSING_INSTRUCTION_NODE
            case 8: // COMMENT_NODE
            case 9: // DOCUMENT_NODE
            case 10: // DOCUMENT_TYPE_NODE
            case 11: // DOCUMENT_FRAGMENT_NODE
            case 12: // NOTATION_NODE
            // skip
            break;
        }
        i++;
    }
    return _result;
}

// суть скрипта
function sort(e) {
    var el = window.event ? window.event.srcElement : e.currentTarget;
    while (el.tagName.toLowerCase() != "th") el = el.parentNode;
    var a = new Array();
//    var name = el.lastChild.nodeValue;
    var name = el.getAttribute('sortId');
    var dad = el.parentNode;
    var table = dad.parentNode.parentNode;
    var up = table.up;
    var node, arrow, curcol;
    for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {
//        if (node.lastChild.nodeValue == name){
        if (node.getAttribute('sortId') == name){
            curcol = i;
            if (node.className == "sorted"){
                arrow = node.firstChild;
                table.up = Number(!up);
            }else{
                node.className = "sorted";
                arrow = node.insertBefore(document.createElement("img"),node.firstChild);
                table.up = 0;
            }
			if (table.up)
	            arrow.src = img_dir + "sort_asc.gif";
			else
	            arrow.src = img_dir + "sort_desc.gif";
            arrow.alt = "";
        }else{
            if (node.className == "sorted"){
                node.className = "";
                if (node.firstChild) node.removeChild(node.firstChild);
            }
        }
    }
    var tbody = table.getElementsByTagName("tbody").item(0);
    for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) {
        a[i] = new Array();
        a[i][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(curcol));
        a[i][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));
        a[i][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0));
        a[i][3] = node;
        if (typeof(sort_add_column) != "undefined")
			a[i][0] = a[i][0] + getConcatenedTextContent(node.getElementsByTagName("td").item(sort_add_column));
    }
    a.sort(_sort);
    if (table.up) a.reverse();
    for (var i = 0; i < a.length; i++) {
        tbody.appendChild(a[i][3]);
    }
}

// ф-ция инициализации всего процесса
function init(e) {
    if (!document.getElementsByTagName) return;

    for (var j = 0; (thead = document.getElementsByTagName("thead").item(j)); j++) {
        var node;
		var a;
		var aFound;
        for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++)
		{
			if (node.getAttribute('sortId'))
			{
				aFound = 0;
		        for (var k = 0; (a = node.getElementsByTagName("a").item(k)); k++)
				{
		            if (a.addEventListener)
						a.addEventListener("click", sort, false);
        		    else if (a.attachEvent)
						a.attachEvent("onclick", sort);
	            	a.title = "Нажмите на заголовок, чтобы отсортировать колонку";
					aFound = 1;
				}
				if (!aFound)
				{
		            if (node.addEventListener)
						node.addEventListener("click", sort, false);
        		    else if (node.attachEvent)
						node.attachEvent("onclick", sort);
	            	node.title = "Нажмите на заголовок, чтобы отсортировать колонку";
				}
			}
        }
        thead.parentNode.up = 0;
        
        if (typeof(initial_sort_id) != "undefined"){
            td_for_event = thead.getElementsByTagName("th").item(initial_sort_id);
			a_for_event = td_for_event.getElementsByTagName("a");
			if (a_for_event)
				td_for_event = a_for_event[0];
            if (document.createEvent){
                var evt = document.createEvent("MouseEvents");
                evt.initMouseEvent("click", false, false, window, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, td_for_event);
                td_for_event.dispatchEvent(evt);
            } else if (td_for_event.fireEvent) td_for_event.fireEvent("onclick");
            if (typeof(initial_sort_up) != "undefined" && initial_sort_up){
                if (td_for_event.dispatchEvent) td_for_event.dispatchEvent(evt);
                else if (td_for_event.fireEvent) td_for_event.fireEvent("onclick");
            }
        }
    }
}

