﻿function pageToolsInit() {
    var div = document.getElementById("tools-block");
    if (div) {
        var lis = div.getElementsByTagName("li");
        if (lis && (lis.length > 0) && (lis[lis.length - 1].className == "print-li")) {
            lis[lis.length - 1].style.display = "block";
        }
    }
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
}

function handleSearchEnter(evt) {
    var characterCode = null;
    var id = null;
    if (evt) {
        if (evt.which) {
            characterCode = evt.which;
            id = evt.target.id;
        } else if (evt.keyCode) {
            characterCode = evt.keyCode;
            id = evt.srcElement.id;
        }
    }
    if (characterCode == 13) {  
        document.getElementById(id + "Button").focus();
        return true;
    } else {
        return false;
    }
}

function checkSiteSearchInput(searchBoxId) {
    var value = document.getElementById(searchBoxId).value.trim();
    if ((value.length < 3) || (value == "Site Search")) {
        alert("You have to enter at least 3 characters.");
        return false;
    } else {
        return true;
    }
}

function searchCareers(searchBoxId, url) {
    var value = document.getElementById(searchBoxId).value.trim();
    if (value.length < 3) {
        alert("You have to enter at least 3 characters.");
    } else {
        window.open(url + escape(value));
    }
    return false;
}

// quick & dirty js slide toggle (can't use the jQuery one because flash/java applets will reload/flicker; known FF bug 
// exposed by the way toggle is implemented in jQuery...)
function slideToggle(element, callback) {
    if (!element.toggleInProgress) {
        element.toggleInProgress = true;
        if (element.css("height") != "0px") {
            element.animate({ height: "0px" }, "slow", null, function() { element.toggleInProgress = false; if (callback) callback(); });
        } else {
            element.animate({ height: "334px" }, "slow", null, function() { element.toggleInProgress = false; if (callback) callback(); });
        }
    }
}

// table paging/sorting functionality; TODO: encapsulate this in a neat class if there's time...
Array.prototype.swap = function(a, b) {
	var tmp = this[a];
	this[a] = this[b];
	this[b] = tmp;
}

var recordsPerPage = 20;
var sortLink = null;
var pageLink = new Array(2);
var pageSpan = new Array(2);
var table = null;
var records = new Array();
var permutation = new Array();
var page = 1;
var pages = 1;
var columns = 1;
var sort = 0;
var tableRowDisplay = "block";

function quickSort(left, right) {
    var column = Math.abs(sort) - 1;
	if (right > left) {
		var pivot = left + Math.floor(Math.random() * (right - left));
		
	    permutation.swap(pivot, right);
	    pivot = records[permutation[right]][column];
	    var newPivot = left;
	    for (var i = left; i < right; i++) {
            if (((sort > 0) && (records[permutation[i]][column] <= pivot)) || ((sort < 0) && (records[permutation[i]][column] >= pivot))) {
			    permutation.swap(newPivot, i);
			    newPivot++;
		    }
	    }
	    permutation.swap(right, newPivot);

		quickSort(left, newPivot - 1);
		quickSort(newPivot + 1, right);
	}
}

function sortRecords(column) {
    if ((column < 1) || (column > columns)) {
        return;
    }
    var prevColumn = Math.abs(sort);
    if (prevColumn == column) {
        sort = -sort;
    } else {
        sort = column;
    }
    if (prevColumn != 0) {
        $(sortLink[prevColumn - 1]).find("img").each(function(i) {
            $(this).css("display", "none");
        });
    }
    var columnSort = (sort > 0 ? 1 : (sort < 0 ? 0 : 2));
    $(sortLink[column - 1]).find("img").each(function(i) {
        $(this).css("display", (i == columnSort ? "inline" : "none"));
    });
   
    for (var i = 0; i < records.length; i++) {
        permutation[i] = i;
    }
    if (sort != 0) {
	    quickSort(0, records.length - 1);
	}
	gotoPage(page);
}

function gotoPage(pageNumber) {
    if ((pageNumber < 1) || (pageNumber > pages)) {
        return;
    }
    if (page != pageNumber) {
        for (var i = 0; i <= 1; i++) {
            if (page == 1) {
                $(pageLink[i][0]).css("display", "inline");
                $(pageSpan[i][0]).css("display", "none");
            } else if (pageNumber == 1) {
                $(pageLink[i][0]).css("display", "none");
                $(pageSpan[i][0]).css("display", "inline");
            }
            $(pageLink[i][page]).css("display", "inline");
            $(pageSpan[i][page]).css("display", "none");
            $(pageLink[i][pageNumber]).css("display", "none");
            $(pageSpan[i][pageNumber]).css("display", "inline");
            if (page == pages) {
                $(pageLink[i][pages + 1]).css("display", "inline");
                $(pageSpan[i][pages + 1]).css("display", "none"); 
            } else if (pageNumber == pages) {
                $(pageLink[i][pages + 1]).css("display", "none");
                $(pageSpan[i][pages + 1]).css("display", "inline"); 
            }
        }
        page = pageNumber;
    }
    
    table.find("tr").each(function(i) {
        if (i > 0) {
            var offset = ((page - 1) * recordsPerPage) + i - 1;
            if (offset < records.length) {
                var tds = $(this).find("td");
                var a = $(tds[0]).find("a");
                a.text(records[permutation[offset]][0]);
                a.attr("title", records[permutation[offset]][0] + ". ");
                a.attr("href", records[permutation[offset]][columns]);
                for (var j = 1; j < columns; j++) {
                    $(tds[j]).text(records[permutation[offset]][j]);
                }
                $(this).css("display", tableRowDisplay);
            } else {
                $(this).css("display", "none");
            }
        }
    });
}

function initTable() {
    table = $("div.generated-table-listing > table");
    columns = table.find("tr:first th").length;
    sortLink = table.find("tr:first a");
//    columns = sortLink.length;
    for (var i = 0; i < sortLink.length; i++) {
        sortLink[i].column = i + 1;
        $(sortLink[i]).click(function() {
            sortRecords(this.column);
            return false;
        });
    }

    pageLink[0] = $("ul.pagination:first a");
    pageSpan[0] = $("ul.pagination:first span");
    pageLink[1] = $("ul.pagination:last a");
    pageSpan[1] = $("ul.pagination:last span");

    if (pageLink[0].length > 2) {
        pages = pageLink[0].length - 2;
        for (var j = 0; j <= 1; j++) {
            if (pageLink[j][0].processed) {
                continue;
            } else {
                pageLink[j][0].processed = true;
            }
            
            $(pageLink[j][0]).click(function() {
                if (page > 1) {
                    gotoPage(page - 1);
                }
                return false;
            });
            $(pageLink[j][pages + 1]).click(function() {
                if (page < pages) {
                    gotoPage(page + 1);
                }
                return false;
            });
            for (var i = 1; i <= pages; i++) {
                pageLink[j][i].page = i;
                $(pageLink[j][i]).click(function() {
                    gotoPage(this.page);
                    return false;
                });
            }
        }
    }
    
    table.find("tr").each(function(i) {
        if (i-- > 0) {
            var tr = $(this);
            var tds = tr.find("td");
//            var a = $(tds[0]).find("a");
            var a = tr.find("a");
            records[i] = new Array(columns + 1);
            records[i][0] = a.text();
            for (var j = 1; j < columns; j++) {
//                records[i][j] = $(tds[j]).text();
                records[i][j] = (tds[j].innerText ? tds[j].innerText : tds[j].textContent) || "";
            }
            records[i][columns] = a.attr("href");
            permutation[i] = i;
            a.attr("title", records[i][0] + ". ");
        } else {
            tableRowDisplay = $(this).css("display");
        }
    });
/*    if (records.length > recordsPerPage) {
        table.find("tr:gt(" + recordsPerPage + ")").remove();
        $("ul.pagination").css("display", "block");
    } */
    
    if (records.length > recordsPerPage) {
        var oldTable = table;
        table.after("<table cellspacing=\"0\" cellpadding=\"0\"></table>");
        table = table.next();
        table.append(oldTable.find("tr:lt(" + (recordsPerPage + 1) + ")"));

// note that this might be leaking some memory due to several facts:
// 1. we're not using the builting jQuery remove function in IE (because it's much much slower)
// 2. certain browsers (*cough* IE) leak when performing certain DOM manipulations (removeChild function for example)
// we should be able to get away with this unless someone's reloading a page containing list of 500+ items every second
// in one browser instance...
        if (typeof(oldTable[0].outerHTML) != "undefined") {
            oldTable[0].outerHTML = "";
        } else {
            oldTable[0].parentNode.removeChild(oldTable[0]);
        }
        $("ul.pagination").css("display", "block");
    }
}

