/*
    js_natsort.js - Natural Sort (natsort, natcasesort)
    Copyright (C) 2007  Ingo Volkmann
	Visit my site and get in contact with me at http://myinterests.de

    This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
	without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
	See the GNU General Public License for more details at http://www.gnu.org/licenses/gpl.html
*/

	// natsort
	// sorts integer, string and mixed arrays - also strings with numbers included will be sorted
	// define how much characters will be compared - note that huge arrays and lots of chars will slow down the functions
	// js_natsortType 1: lower cases will be ordered between the upper ones
	// js_natsortType 2: lower cases will be ordered after all of the upper ones
	// usage: array.sort(js_natsort);
	var js_natsortLimit = 20;
	var js_natsortType = 1;

	// natsort
	function js_natsort(a,b) { // case sensitive

		if( js_natsortType == 1 ) { // lower cases between the upper cases
			var replaceArray= new Array('0','1','2','3','4','5','6','7','8','9','A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','_');
		} else if( js_natsortType == 2 ) { // lower cases after all upper cases
			var replaceArray= new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_');
		}

		a = a.toString();
		if( a.length > js_natsortLimit ) a = a.substr(0,js_natsortLimit);
		a = a.replace(/\W/g, '_');
		var aArr = a.split('');
		for( var i=0; i < replaceArray.length; i++ ) {
			for( var k=0; k < aArr.length; k++ ) {
				if( aArr[k] == replaceArray[i] ) {
					if( i < 10 ) aArr[k] = parseInt(i);
					else aArr[k] = i.toString();
				}
			}
		}

		b = b.toString();
		if( b.length > js_natsortLimit ) b = b.substr(0,js_natsortLimit);
		b = b.replace(/\W/g, '_');
		var bArr = b.split('');
		for( var i=0; i < replaceArray.length; i++ ) {
			for( var k=0; k < bArr.length; k++ ) {
				if( bArr[k] == replaceArray[i] ) {
					if( i < 10 ) bArr[k] = parseInt(i);
					else bArr[k] = i.toString();
				}
			}
		}

		aArr = js_natsort_combineInt(aArr);
		bArr = js_natsort_combineInt(bArr);
		for( var i=0; i < aArr.length; i++ ) {
			if( aArr[i] != bArr[i] ) {
				if( typeof aArr[i] == typeof bArr[i] ) {
					return (aArr[i]==bArr[i]) ? 0 : (aArr[i]>bArr[i]) ? 1 : -1;
				} else {
					if( typeof aArr[i] == 'string' && typeof bArr[i] == 'number' ) return 1;
					if( typeof aArr[i] == 'number' && typeof bArr[i] == 'string' ) return -1;
				}
			}
		}

		return 0;
	}

	// natcasesort
	function js_natcasesort(a,b) { // not case sensitive

		var replaceArray= new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_');

		a = a.toString();
		if( a.length > js_natsortLimit ) a = a.substr(0,js_natsortLimit);
		a = a.replace(/\W/g, '_');
		var aArr = a.split('');
		for( var i=0; i < replaceArray.length; i++ ) {
			for( var k=0; k < aArr.length; k++ ) {
				if( !isInt(aArr[k]) && aArr[k].toLowerCase() == replaceArray[i] ) {
					aArr[k] = i.toString();
				} else if( aArr[k] == replaceArray[i] ) {
					aArr[k] = parseInt(i);
				}
			}
		}

		b = b.toString();
		if( b.length > js_natsortLimit ) b = b.substr(0,js_natsortLimit);
		b = b.replace(/\W/g, '_');
		var bArr = b.split('');
		for( var i=0; i < replaceArray.length; i++ ) {
			for( var k=0; k < bArr.length; k++ ) {
				if( !isInt(bArr[k]) && bArr[k].toLowerCase() == replaceArray[i] ) {
					bArr[k] = i.toString();
				} else if( bArr[k] == replaceArray[i] ) {
					bArr[k] = parseInt(i);
				}
			}
		}

		aArr = js_natsort_combineInt(aArr);
		bArr = js_natsort_combineInt(bArr);
		for( var i=0; i < aArr.length; i++ ) {
			if( aArr[i] != bArr[i] ) {
				if( typeof aArr[i] == typeof bArr[i] ) {
					return (aArr[i]==bArr[i]) ? 0 : (aArr[i]>bArr[i]) ? 1 : -1;
				} else {
					if( typeof aArr[i] == 'string' && typeof bArr[i] == 'number' ) return 1;
					if( typeof aArr[i] == 'number' && typeof bArr[i] == 'string' ) return -1;
				}
			}
		}

		return 0;
	}

	// natsort helper - js_natsort_combineInt
	function js_natsort_combineInt(array) {

		for( var i=0; i < array.length; i++ ) {
			if( typeof array[i] == 'number' && typeof array[i+1] == 'number' ) {
				var num = array[i].toString() + array[i+1].toString();
				array[i] = parseInt(num);
				array = js_natsort_delArrayEl(array, i+1);
				js_natsort_combineInt(array);
				break;
			}
		}

		while( array.length < js_natsortLimit ) void array.push('00');
		return array;

	}

	// remove element from array
	function js_natsort_delArrayEl(array, element) {
		for( var i = element; i < array.length; i++ ) {
			array[i] = array[i+1];
		}
		array.pop();
		return array;
	}

	// is int
	function isInt(x) {
		var y = parseInt(x);
		if (isNaN(y)) return false;
		return x == y && x.toString() == y.toString();
	}

allTableContent = new Array();
lastSort = new Array();
altContent = new Array();
rev = new Array();
function initTables()
{
    var allTables = document.getElementsByTagName("table");
    for (var i=0;i<allTables.length;i++)
    {
        if (allTables[i].getAttribute("alt") == "1")
            initTable(i);
        allTables[i].removeAttribute("alt");
    }

}

function initTable(num)
{
    if (document.addEventListener) isW3C = true;
    else if (window.event) isIE = true;
    rev[num] = false;
    tableContent = new Array();
    altContent[num] = new Array();
    allTableContent[num] = new Array();

    var table = document.getElementsByTagName("table")[num];
    var k = table.firstChild;
    while (k.nodeName != "TBODY")
    {
        k = k.nextSibling;
    }
    var n = k.firstChild;
    var row = 0;
    rev[num] = false;
    for (var i=0;i<k.childNodes.length;i++)
    {
        if (k.childNodes[i].nodeName == "TR")
        {
		        tableContent[row] = new Array();
                var col = 0;
                var thcol = 0;
                var td = true;
                var sortBy;
                var m = k.childNodes[i];
                for (var a=0;a<m.childNodes.length;a++)
                {
                    if (m.childNodes[a].nodeName == "TD")
                    {
                        tableContent[row][col] = m.childNodes[a].innerHTML;
                        if (altContent[num][row] == undefined)
                        {
                            altContent[num][row] = m.alt;
                            if (m.alt == undefined)
                            {
                                altContent[num][row] = m.id;
                            }
                        }
                        col++;
                        td = true;
                    }
                    else if (m.childNodes[a].nodeName == "TH")
                    {
                        if (m.childNodes[a].getAttribute("alt") == "3" && sortBy == undefined)
                        {
                            m.childNodes[a].setAttribute("alt", "1");
                            sortBy = thcol;
                            lastSort[num] = thcol;
                            rev[num] = false;
                        }
                        else if (m.childNodes[a].getAttribute("alt") == "2" && sortBy == undefined)
                        {
                            m.childNodes[a].setAttribute("alt", "1");
                            sortBy = thcol;
                            rev[num] = true;
                        }
                        if (m.childNodes[a].getAttribute("alt") == "1")
                        {
                            m.childNodes[a].setAttribute("alt", "Hier klicken um zu sortieren.");
                            var title = m.childNodes[a].firstChild.nodeValue;
                            var link = document.createElement("a");
                            link.setAttribute("href", "#");
                            var text = document.createTextNode(title);
                            link.appendChild(text);
                            m.childNodes[a].setAttribute("onclick", "sortTable(" + thcol + ", " + num + ");");
                            if (thcol == 0)
                            {
                                var first = link;
                                var fhcol = thcol;
                            }
                            if (thcol == sortBy)
                            {
                                var ar = document.createElement("img");
                                ar.setAttribute("src", "images/icon_aup.gif");
                                ar.setAttribute("style", "images/border: 0px; margin-left: 10px;");
                                ar.setAttribute("id", "icon-arrow" + num);
                                link.appendChild(ar);
                            }
                            m.childNodes[a].replaceChild(link, m.childNodes[a].firstChild);
                        }
                        m.childNodes[a].removeAttribute("alt", "");
                        thcol++;
                        td = false;
                    }
                }
                if (td) row++;
                
        }
    }
    if (sortBy == undefined)
    {
        sortBy = 0;
        lastSort[num] = fhcol;
        var ar = document.createElement("img");
        ar.setAttribute("src", "images/icon_aup.gif");
        ar.setAttribute("style", "images/border: 0px; margin-left: 10px;");
        ar.setAttribute("id", "icon-arrow" + num);
        first.appendChild(ar);
        rev[num] = true;
    }
    if (lastSort[num] == undefined)
        lastSort[num] = -1;
    allTableContent[num] = tableContent;
    sortTable(sortBy, num);
}

function rebuildTable(num)
{
    var tableContent = allTableContent[num];
    var table = document.getElementsByTagName("table")[num];
    var k = table.firstChild;
    while (k.nodeName != "TBODY")
    {
        k = k.nextSibling;
    }
    if (rev[num])
    {
        var row = tableContent.length - 1;
    }
    else
    {
        var row = 0;
    }

    for (var i=0;i<k.childNodes.length;i++)
    {
        if (k.childNodes[i].nodeName == "TR")
        {
            var col = 0;
            var td = false;
            var thcol = 0;
            var m = k.childNodes[i];
            var alt = false;
            if (m.childNodes[0].nodeName == "TD" && alt == false)
            {
                var tc = altContent[num][row].split('#@@@#');
                m.alt = tc[0];
                alt = true;
            }
            for (var a=0;a<m.childNodes.length;a++)
            {
                if (m.childNodes[a].nodeName == "TD")
                {
                    m.childNodes[a].innerHTML = tableContent[row][col];
                    col++;
                    td = true;
                }
                else if (m.childNodes[a].nodeName == "TH")
                {
                    var id = "icon-arrow" + num;
                    var arrow = document.getElementById(id);

                    if (rev[num]) arrow.setAttribute("src", "images/icon_adown.gif");
                    else arrow.setAttribute("src", "images/icon_aup.gif");
                    if (thcol == lastSort[num]) m.childNodes[a].firstChild.appendChild(arrow);
                    thcol++;
                }

            }
            if (rev[num] && td)
            {
                row--;
            }
            else if (td)
            {
                row++;
            }
        }
    }
}

function sortTable(col, table)
{
    tableContent = allTableContent[table];
    dateContent = new Array();
	//zuerst ein Array aus der gefragten Spalte erstellen
	colArray = new Array();
    var reg = /([0-9]{2})\.([0-9]{2})\.([0-9]{4})/;
    for (var i=0;i<tableContent.length;i++)
    {
        var d = dateContent[i] = tableContent[i][col];
        var dat = "";
        if (reg.exec(d))
        {
            var da = d.split(" - ");
            for (var j=0;j<da.length;j++)
            {
                if (j > 0)
                    dat += " - ";
                if (reg.exec(da[j]) != null)
                    dat += mktime(0, 0, 0, RegExp.$2, RegExp.$1, RegExp.$3);
            }
        }
        else
        {
            dat = d;
        }
        colArray[i] = dat + '#@@@#' + i;
    }
    colArray = colArray.sort(js_natcasesort);
    position = new Array();
    for (var i=0;i<colArray.length;i++)
    {
        var pos = colArray[i].split('#@@@#');
        pos = pos[1];
        position[i] = pos;
        colArray[i] = dateContent[pos];
    }
    
    ntableContent = new Array();
    naltContent = new Array();
    for (var i=0;i<colArray.length;i++)
    {
        ntableContent[i] = new Array();
        for (var a=0;a<tableContent[i].length;a++)
        {
            if (a != col)
            {
                var p = position[i];
                ntableContent[i][a] = tableContent[p][a];
                //alert('Neue Spalte: ' + i + ' Neue Reihe: ' + a + ' Alte Spalte: ' + i + ' Alte Reihe: ' + p + ' Index: ' + c[1] + ' Wert: ' + c[0]);
            }
            else
            {
                ntableContent[i][a] = colArray[i];
            }
        }
		var p = position[i];
		if (naltContent[i] == undefined)
        {
            var ca = altContent[table][p].split('#@@@#');
            naltContent[i] = ca[0] + '#@@@#' + i;
        }
    }
    if (lastSort[table] == col && !rev[table])
    {
        rev[table] = true;
    }
    else
    {
        rev[table] = false;
    }
    lastSort[table] = col;
    allTableContent[table] = new Array();
    allTableContent[table] = ntableContent;
    altContent[table] = new Array();
    altContent[table] = naltContent;
    rebuildTable(table);
}



