var cookiePre = location.href.replace(/^.*\/([^#\?]*)([#?].*)?$/, "$1"); // Part after / without ?... or #...
var shouldCookieSearch = /List/ig.test(cookiePre);
// jQuery onload to setup the filters.
$(document).ready(function(){
	  setupFilters();
});

/**
 * Overloads the page control functions for the manager tables.
 */
function managerReclass(id, table) {
	var perPage = document.getElementById("elementsPerPage_"+id).value;
	
	var rows = table.getElementsByTagName("tr");
	var rowNr = 0;
	var total = 0;
	for (var i = 1; i < rows.length; i++)
	{
		if (rows[i].parentNode != table && rows[i].parentNode.parentNode != table)
			continue;
		
		// The row is filtered, don't show it.
		if (hasClass(rows[i], "filtered")) {
			rows[i].style.display = "none";
			continue;
		}
		
		var pageNr = Math.floor(total / perPage);
		stripClass(rows[i], "page_\\d+");
		addClass(rows[i], "page_" + pageNr);
		
		if (total % 2 == 1)
		{
			stripClass(rows[i], "odd");
			addClass(rows[i], "even");
		}
		else
		{
			stripClass(rows[i], "even");
			addClass(rows[i], "odd");
		}
		
		total++;
	}
	
	document.getElementById("totalElements_"+id).value = total;
	document.getElementById("STPTotal_"+id).innerHTML = pageNr + 1;
	
	MPchangePage(0, id);
}

function MPchangePage(pageNr, id) {
	var MPcurrentPage = trim(document.getElementById("STPCurrent_"+id).innerHTML);
	
	switch (pageNr) {
		case 0: MPcurrentPage = 1; break;
		case 1: MPcurrentPage--; break;
		case 2: MPcurrentPage++; break;
		default: MPcurrentPage = pageNr;
	}
	var table = document.getElementById("smiletable_" + id);
	map(getElementsByClass("page_\\d+", table), MPhide);
	map(getElementsByClass("page_" + (MPcurrentPage-1), table), MPshow);
	
	first = document.getElementById("STPFirstPage_"+id);
	prev  = document.getElementById("STPPrevPage_"+id);
	next  = document.getElementById("STPNextPage_"+id);
	last  = document.getElementById("STPLastPage_"+id);
	
	if (MPcurrentPage > 1) {
		first.href = "javascript:MPchangePage(0, "+id+")";
		prev.href = "javascript:MPchangePage(1, "+id+")";
	} else {
		first.removeAttribute("href");
		prev.removeAttribute("href");
	}
	
	var lastPage = trim(document.getElementById("STPTotal_"+id).innerHTML);
	if (MPcurrentPage == lastPage) {
		next.removeAttribute("href");
		last.removeAttribute("href");
	} else {
		next.href = "javascript:MPchangePage(2, "+id+")";
		last.href = "javascript:MPchangePage("+lastPage+", "+id+")";
	}
	
	MPupdateCounter(MPcurrentPage, id);
	document.getElementById("STPCurrent_"+id).innerHTML = MPcurrentPage;
}

function MPupdateCounter(page, id) {
	var perPage = document.getElementById("elementsPerPage_"+id).value;
	var total = document.getElementById("totalElements_"+id).value;
	
	var start = perPage * (page-1) + 1;
	var end = Math.min( start + (perPage - 1)
			          , total);
	var oldVal = trim(document.getElementById("smiletableHeaderTotal_"+id).innerHTML);

	var newVal = oldVal.replace(/(.*?)\d+-\d+(.*?)\d+(.*?)/
							   , "$1" + start + "-" + end + "$2" + total + "$3");
	document.getElementById("smiletableHeaderTotal_"+id).innerHTML = newVal;
}

function MPhide(obj) {
	obj.style.display = "none";
}

function MPshow(obj) {
	if (!hasClass(obj, "filtered"))
		obj.removeAttribute("style");
}

/**
 * Get the filters from the cookie and perform the search if there are any.
 * @return
 */
function setupFilters() {
	if (!shouldCookieSearch) return;
	if ($(".smiletable").length != 1) return;
	headerName = $(".smiletable")[0].parentNode.id.replace("smiletable_", "hdr");
	var i = 1;
	var header;
	var doFilter = null;
	while (header = document.getElementById(headerName + "_" + i + "value"))
	{
		var cookieVal = readCookie(cookiePre + "_" + i);
		if (cookieVal) {
			getEnclosingElem(header, "th").getElementsByTagName("a")[0].onmouseup();
			header.value = cookieVal;
			doFilter = header;
		}
		i++;
	}
	if (doFilter)
		managerFilterOnEnter(null, doFilter, true);
}
function managerFilterOnEnter(event, source, justFilter) {
	if (!justFilter && !onEnter(event, "true")) return true;
	var parentTable = getEnclosingElem(getEnclosingElem(source, "table").parentNode, "table");
	
	var filters = new Array();
	var headerName = source.id.substring(0, source.id.lastIndexOf("_"));
	
	var i = 1;
	// Get filter params
	var header;
	while (header = document.getElementById(headerName + "_" + i + "value"))
	{
		filters.push(header.value);
		if (shouldCookieSearch) {
			createCookie(cookiePre + "_" + i,header.value,1);
		}
		i++;
	}
	
	var matchCount = 0;
	var lastMatch;
	var trs = parentTable.getElementsByTagName("tr");
	map(trs, function(o, i) {
		if (i == 0 || (o.parentNode != parentTable && o.parentNode.parentNode != parentTable))
			return;
		if (managerApplyFilters(o, filters)) {
			matchCount++;
			lastMatch = o;
		}
	});
	
//	if (matchCount == 1 && lastMatch && lastMatch.onclick) {
//		var click = new Object();
//		click.target = lastMatch;
//		lastMatch.onclick(click);
//	}
	managerReclass(headerName.substring(3), parentTable);
	return false;
}

function managerApplyFilters(object, filters) {
	var cells = object.getElementsByTagName("td");
	
	var isCheckedCell = cells[0].getElementsByTagName("input");
	isCheckedCell = isCheckedCell.length > 0 && isCheckedCell[0].type=="checkbox";
	
	var table = getEnclosingElem(cells[0], "table");
	var row = (!table) ? false : table.rows[0];
	var cell = (!row) ? false : row.cells[0];
	var input = (!cell) ? false : cell.getElementsByTagName("input")[0];
	isCheckedCell = !input && isCheckedCell;
	
	var matchesFilter = true;
	var size = isCheckedCell ? cells.length - 1 : cells.length;
	for (var i = 0; i < size; i++) {
		var cell = isCheckedCell ? i+1 : i;
		matchesFilter = new RegExp(filters[i], "i").test(cells[cell].innerHTML)
		             && matchesFilter;
	}
	
	if (matchesFilter) {
		stripClass(object, "filtered");
		return true;
	}
	else {
		addClass(object, "filtered");
		return false;
	}
}

var managerImgId = 0;
function managerSort(img, index, id) {
	document.body.style.cursor = 'wait';
	img.id = "imgid_" + managerImgId++;
	setTimeout("managerActualSort('"+img.id+"', '"+ index + "', '"+ id + "');", 50);
}
function managerActualSort(imgId, index, id) {
	var img = document.getElementById(imgId).getElementsByTagName("img")[0];
	var parentTable = getEnclosingElem(getEnclosingElem(img, "table").parentNode, "table");
	
	var desc = !/desc/.test(img.src);
	
	var rowItems = parentTable.getElementsByTagName("tr");
	if (rowItems.length > 0) {
		var inputs = rowItems[0].getElementsByTagName("input");
		if (inputs.length > 0 && inputs[0].type == "checkbox")
			index++;
	}
	
	var rows = new Array();
	for (var i = 0; i < rowItems.length; i++)
	{
		if (rowItems[i].parentNode != parentTable && rowItems[i].parentNode.parentNode != parentTable)
			continue;
		rows.push(rowItems[i]);
	}
	var head = rows.shift();
	managerSetSortOrder(head.getElementsByTagName("img"), img, desc)
	
	rows.sort(function(a, b) {
		var result = compare(a, b, index);
		if (!desc)
			return -result
		return result;
	});

	var parent;
	if (rows.length > 0)
		parent = rows[0].parentNode;
	while(rows.length != 0)
	{
		var item = rows.shift();
		parent.removeChild(item);
		parent.appendChild(item);
	}

	managerReclass(id, parentTable);
	document.body.style.cursor = 'default';
}

function managerSetSortOrder(imgs, sImg, desc) {
	var img = imgs[0].src;
	img = img.substring(0, img.lastIndexOf("/"));
	var unsorted = img + "/unsorted.gif";
	var sorted = img + (desc ? "/desc.gif" : "/asc.gif");
	
	for (var i = 0; i < imgs.length; i++) {
		imgs[i].src = unsorted;
	}
	sImg.src = sorted;
}

function compare(a, b, i)
{
	var reRowText = /(\< *[^\>]*\>|\&nbsp\;)/g;
	var aRowContent = trim(a.cells[i].innerHTML).replace(reRowText, "");
	var bRowContent = trim(b.cells[i].innerHTML).replace(reRowText, "");
	var aToBeCompared, bToBeCompared;

	if (!isNaN(aRowContent) || !isNaN(bRowContent))
	{
		if (trim(aRowContent) == "") aRowContent = "-1";
		if (trim(bRowContent) == "") bRowContent = "-1";
	}
	
	if (! isNaN(aRowContent) &&
		! isNaN(bRowContent))
	{
		aToBeCompared = parseFloat(aRowContent, 10);
		bToBeCompared = parseFloat(bRowContent, 10);
	}
	else
	{
		aToBeCompared = aRowContent.toLowerCase();
		bToBeCompared = bRowContent.toLowerCase();
	}

	if (aToBeCompared < bToBeCompared)
		return -1;
	if (aToBeCompared > bToBeCompared)
		return 1;
	return 0;
}

function managerTableCheckAll(checkBox) {
	var table = checkBox.parentNode.parentNode.parentNode;
	var rows = table.getElementsByTagName("tr");
	
	for (var i = 1; i < rows.length; i++) {
		var cells = rows[i].getElementsByTagName("td");
		if (cells.length > 0) {
			map(cells[0].getElementsByTagName("input"), function(a){
				a.value=checkBox.checked;
				if (isdefined("checked", a)) a.checked = checkBox.checked;
				if (a.onclick) a.onclick();
			});
		}
	}
}