var tableCurrentCol = 0
var tablePreviousCol = -1;
var tableCurrentElement = null;
var tableCurrentSort = 1;

function CompareAlpha(a, b) {
	if (a.value < b.value) { return -1; }
	if (a.value > b.value) { return 1; }
	return 0;
}

function CompareAlphaIgnore(a, b) {
	strA = a.value.toLowerCase();
	strB = b.value.toLowerCase();
	if (strA < strB) { return -1; }
	else {
		if (strA > strB) { return 1; }
		else { return 0; }
	}
}

function CompareDate(a, b) {
	// this one works with date formats conforming to Javascript specifications, e.g. m/d/yyyy
	datA = new Date(a.value);
	datB = new Date(b.value);
	if (datA < datB) { return -1; }
	else {
		if (datA > datB) { return 1; }
		else { return 0; }
	}
}

function CompareDateEuro(a, b) {
	// this one works with european date formats, e.g. d.m.yyyy
	strA = a.value.split(".");
	strB = b.value.split(".")
	datA = new Date(strA[2], strA[1], strA[0]);
	datB = new Date(strB[2], strB[1], strB[0]);
	if (datA < datB) { return -1; }
	else {
		if (datA > datB) { return 1; }
		else { return 0; }
	}
}
function CompareNumeric(a, b) {
	//window.alert ("CompareNumeric");
	numA = a.value
	numB = b.value
	if (isNaN(numA)) { return 0;}
	else {
		if (isNaN(numB)) { return 0; }
		else { return numA - numB; }
	}
}

function SortTable(myTable, myCol, myType, myElement) {
    if (tableCurrentElement == null) {
        tableCurrentElement = myElement;
    }
    else {
        if (tableCurrentElement != myElement) {
            var myElementTxt = new String(tableCurrentElement.innerHTML);
            if (myElementTxt.indexOf("<SPAN>")>=0) {
                myElementTxt = myElementTxt.substring(0,myElementTxt.indexOf("<SPAN>"));
            }
            tableCurrentElement.innerHTML = myElementTxt;
        }
    }
    tableCurrentElement = myElement;
    var myElementTxt = new String(tableCurrentElement.innerHTML);
    if (myElementTxt.indexOf("<SPAN>")>=0) {
        myElementTxt = myElementTxt.substring(0,myElementTxt.indexOf("<SPAN>"));
    }
    var table = document.getElementById(myTable);
    var tableBody = table.getElementsByTagName("tbody")[0];
    var tableRows = tableBody.getElementsByTagName("tr");
    // Get the data of selected column
    var originalColumnArray = new Array();
    for (var i=0; i < tableRows.length; i++) {
        originalColumnArray[i] = new Object;
        originalColumnArray[i].oldIndex = i;
        originalColumnArray[i].value = "" + tableRows[i].cells[myCol].innerHTML;
    }
    if (myCol == tablePreviousCol) {
        // User clicked on the same column
        // again, reverse sort direction.
        originalColumnArray.reverse();
        if (tableCurrentSort > 0) {
    		myElementTxt += "<SPAN>&nbsp;&uarr;</SPAN>";
    		tableCurrentSort = -1;
        }
        else {
    		myElementTxt += "<SPAN>&nbsp;&darr;</SPAN>";
    		tableCurrentSort = 1;
        }
    }
    else {
        myElementTxt += "<SPAN>&nbsp;&darr;</SPAN>";
        tableCurrentSort = 1;
		switch (myType) {
			case "a":
				originalColumnArray.sort(CompareAlpha);
				break;
			case "ai":
				originalColumnArray.sort(CompareAlphaIgnore);
				break;
			case "d":
				originalColumnArray.sort(CompareDate);
				break;
			case "de":
				originalColumnArray.sort(CompareDateEuro);
				break;
			case "n":
				originalColumnArray.sort(CompareNumeric);
				break;
			default:
				originalColumnArray.sort()
		}
        // Select sorting method depending on
        // column type
        //if (selectedColumnIndex == 2)
        //{
          //originalColumnArray.sort(CompareDigits);
        //}
        //else
        //{
        //originalColumnArray.sort(Compare);
        //}
        tablePreviousCol = myCol;
    }

    // Create a new tbody and copy old rows
    // using the sorted index
    var sortedTableBody = document.createElement("tbody");
    for (var i=0; i < originalColumnArray.length; i++) {
        sortedTableBody.appendChild(tableRows[originalColumnArray[i].oldIndex].cloneNode(true));
    }
    // Replace old table with new one
    table.replaceChild(sortedTableBody,tableBody);

    tableCurrentElement.innerHTML = myElementTxt;
    if (document.getElementById("soeg")) document.getElementById("soeg").value = "";
    return 0;

}



/*
 * A very simple script to filter a table according to search criteria
 *
 * http://leparlement.org/filterTable
 * See also http://www.vonloesch.de/node/23
 */
function filterTable(term, table) {
	dehighlight(table);
	var terms = term.value.toLowerCase().split(" ");

	for (var r = 0; r < table.rows.length; r++) {
		var display = '';
		for (var i = 0; i < terms.length; i++) {
			if (table.rows[r].innerHTML.replace(/<[^>]+>/g, "").toLowerCase().indexOf(terms[i]) < 0) {
				display = 'none';
			} else {
				if (terms[i].length) highlight(terms[i], table.rows[r]);
			}
			table.rows[r].style.display = display;
		}
	}
}


/*
 * Transform back each
 * <span>preText <span class="highlighted">term</span> postText</span>
 * into its original
 * preText term postText
 */
function dehighlight(container) {
	for (var i = 0; i < container.childNodes.length; i++) {
		var node = container.childNodes[i];

		if (node.attributes && node.attributes['class']
			&& node.attributes['class'].value == 'highlighted') {
			node.parentNode.parentNode.replaceChild(
					document.createTextNode(
						node.parentNode.innerHTML.replace(/<[^>]+>/g, "")),
					node.parentNode);
			// Stop here and process next parent
			return;
		} else if (node.nodeType != 3) {
			// Keep going onto other elements
			dehighlight(node);
		}
	}
}

/*
 * Create a
 * <span>preText <span class="highlighted">term</span> postText</span>
 * around each search term
 */
function highlight(term, container) {
	for (var i = 0; i < container.childNodes.length; i++) {
		var node = container.childNodes[i];

		if (node.nodeType == 3) {
			// Text node
			var data = node.data;
			var data_low = data.toLowerCase();
			if (data_low.indexOf(term) >= 0) {
				//term found!
				var new_node = document.createElement('span');

				node.parentNode.replaceChild(new_node, node);

				var result;
				while ((result = data_low.indexOf(term)) != -1) {
					new_node.appendChild(document.createTextNode(
								data.substr(0, result)));
					new_node.appendChild(create_node(
								document.createTextNode(data.substr(
										result, term.length))));
					data = data.substr(result + term.length);
					data_low = data_low.substr(result + term.length);
				}
				new_node.appendChild(document.createTextNode(data));
			}
		} else {
			// Keep going onto other elements
			highlight(term, node);
		}
	}
}

function create_node(child) {
	var node = document.createElement('span');
	node.setAttribute('class', 'highlighted');
	node.attributes['class'].value = 'highlighted';
	node.appendChild(child);
	return node;
}



/*
 * Here is the code used to set a filter on all filterable elements, usually I
 * use the behaviour.js library which does that just fine
 */

function startfilter() {
    tables = document.getElementsByTagName('table');
    for (var t = 0; t < tables.length; t++) {
    	element = tables[t];

    	if (element.attributes['class'] && element.attributes['class'].value == 'filterable') {

    		// Here is dynamically created a form
    		var form = document.createElement('form');
    		form.setAttribute('class', 'filter');
    		// For ie...
    		form.attributes['class'].value = 'filter';
    		var input = document.createElement('input');
    		input.onkeyup = function() {
    			filterTable(input, element);
    		}
    		form.appendChild(input);
    		element.parentNode.insertBefore(form, element);
    	}
    }
}

