function showFilterHelp(e) {
	if (!e) var e = window.event;
	var raiser = (e.srcElement ? e.srcElement : e.target);
	var rid = raiser.id;
	var oid = rid.substring(rid.lastIndexOf(":")+1);
	var obj = document.getElementById("help_" + oid);
	obj.style.visibility = "visible";
	obj.style.top = (e.clientY+getScrollY()+7) + 'px';
	obj.style.left = (e.clientX+getScrollX()+10) + 'px';
	
	// hide the drop downs for IE because it sucks
	if (typeof(document.all) != "undefined"){
		hideddls (getForm(obj));
	}
}

function hideFilterHelp(e){
	if (!e) var e = window.event;
	var raiser = (e.srcElement ? e.srcElement : e.target);
	var rid = raiser.id;
	var oid = rid.substring(rid.lastIndexOf(":")+1);
	var obj = document.getElementById("help_" + oid);
	obj.style.visibility = "hidden";

	if (typeof(document.all) != "undefined"){
		showddls(getForm(obj));
	}
}

function getScrollY(){
	if (window.pageYOffset){
		return window.pageYOffset;
	}
	else if (document.body.scrollTop){
		return document.body.scrollTop;
	}
	else return 0;
}

function getScrollX(){
	if (document.body.scrollLeft){
		return document.body.scrollLeft;
	}	
	else if (window.pageXOffset){
		return window.pageXOffset;
	}
	else return 0;
}

function getForm(obj){
	var x = obj;
	while (!isForm(x) && x.parentNode != null){
		x = x.parentNode;
	}
	return x;
}

function isForm(node){
	return node.nodeName.toLowerCase() == "form";
}

function hideddls(form){
	var selects = form.getElementsByTagName("select");
	setVisible(selects, false);
}

function showddls(form){
	var selects = form.getElementsByTagName("select");
	setVisible(selects, true);
}

function setVisible(nodes, val){
	if (nodes == null || nodes.length == 0) return;
	var sval = (val ? "visible" : "hidden");
	
	for (i = 0; i < nodes.length; i++){
		nodes[i].style.visibility=sval;
	}
}

function clearDom(node){
	while (node != null && node.hasChildNodes()){
		node.removeChild(node.childNodes[0]);
	}
}

function subfilterItem(id, text, sel){
	this.id = id;
	this.text = text;
	this.sel = sel
}

var sfCols = 3;
var sfRowsPage = 5;
var sfItemsPage = sfCols * sfRowsPage;

function divProperties(name, itemdiv, curitemvar){
	this.name = name;
	this.itemdiv = itemdiv;
	this.curitemvar = curitemvar;
}

function checkBoxGroup(check, label){
	this.check = check;
	this.label = label;
}

function renderSubfilter(name, div, sfItemArray, curitemvar){
	var itemdiv = document.createElement("div");
	itemdiv.id = "div_item_" + name;
	itemdiv.style.width="100%";
	
	var displayText = document.createElement("span");
	displayText.setAttribute("class","filterSubfilter");
	div.displayText = displayText;
	
	var curitemval = eval(curitemvar);
	var curRow = (curitemval == 0 ? 0 : sfCols/curitemval);
	var checkedItems = new Object();
	var checks = new Array();
	for (i = 0; i < sfItemArray.length; i++){
		var obj = sfItemArray[i];
		var input = document.createElement("input");
		input.type = "checkbox";
		input.id = obj.id;
		input.name = obj.id;
		input.checked = input.defaultChecked = obj.sel;
		
		if (obj.sel){
			checkedItems[obj.text] = obj;
			var x = eval(curitemvar);
			if (x == 0){
				var p = Math.floor(i/sfItemsPage);
				curRow = p*sfRowsPage;
				var startRow = Math.min(i, sfItemsPage*p);
				eval(curitemvar + " = " + startRow);
			}
		}
		var t = getShortLabel(obj.text);
		
		var label = document.createElement("label");
		label.setAttribute("for",input.id);
		label.setAttribute("title", obj.text);
		label.appendChild(document.createTextNode(t));
		
		input.sfItem = obj;
		input.div = div;
		
		label.sfItem = obj;
		label.div = div;
		
		checks[i] = new checkBoxGroup(input, label);
	}
	
	updateDisplayText(checkedItems, displayText);
	
	div.checkedItems = checkedItems;
	
	var table = createTable(div, checks);
	
	itemdiv.table = table;
	itemdiv.appendChild(table);
	
	var divprops = new divProperties(name, itemdiv, curitemvar);
	div.divprops = divprops;

	var navdiv = document.createElement("div");
	navdiv.id = "div_nav_" + name;
	
	var navtable = document.createElement("table");
	var navtbody = document.createElement("tbody");
	navtable.appendChild(navtbody);
	
	navtable.setAttribute("width","100%");
	navtable.setAttribute("cellspacing","0");
	navtable.setAttribute("cellpadding","0");
	
	var navrow = document.createElement("tr");
	var navtdp = document.createElement("td");
	var navtdn = document.createElement("td");
	navtdn.setAttribute("align","right");
	
	var prevnav = document.createElement("a");
	var prevtext = document.createTextNode("<<");
	prevnav.style.cursor = "pointer";
	prevnav.appendChild(prevtext);
	
	var nextnav = document.createElement("a");
	var nexttext = document.createTextNode(">>");
	nextnav.style.cursor = "pointer";
	nextnav.appendChild(nexttext);
	
	prevnav.div = div;
	nextnav.div = div;
	
	div.prevnav = prevnav;
	div.nextnav = nextnav;
	
	navtdp.appendChild(prevnav);
	navtdn.appendChild(nextnav);
	
	prevnav.onclick = subfilterPrevious;
	nextnav.onclick = subfilterNext;
	
	navrow.appendChild(navtdp);
	navrow.appendChild(navtdn);
	navtbody.appendChild(navrow);
	navdiv.appendChild(navtable);
	
	div.appendChild(itemdiv);
	
	// need nav div if there are pages
	if (checks.length > sfItemsPage){
		div.appendChild(navdiv);
	}
	
	div.appendChild(displayText);
	
	renderItems(name, itemdiv, curRow);
	updateNav(div, curRow, 0, table.rowCount);
}

function renderItems(name, itemdiv, curRow){
	var start = curRow;
	var end = start+sfRowsPage;
	
	var rows = itemdiv.table.getElementsByTagName("tr");
	var total = itemdiv.table.rowCount;
	
	if (end > total) end = total;
	
	// hide all rows
	for (i = 0; i < total; i++){
		rows[i].style.display="none";
	}
	
	for (i = start; i < end; i++){
		rows[i].style.display = "";
	}
}

function createTable(div, checks){
	var rowCount = 1;
	var table = document.createElement("table");
	var tbody = document.createElement("tbody");
	table.setAttribute("style","width: 100%;");
	
	table.appendChild(tbody)
	
	var tr = document.createElement("tr");

	table.itemCount = checks.length;
	
	for (i = 0; i < checks.length; i++){
	
		if (i%sfCols == 0 && i > 0){
			tbody.appendChild(tr);
			tr = document.createElement("tr");
			rowCount++;
		}
	
		var td = document.createElement("td");
		if ((i == checks.length-1) && checks.length % sfCols > 0){
			td.setAttribute("colspan", (sfCols - (checks.length % sfCols)+1));
		}
	
		var cbg = checks[i];
		var input = cbg.check;
		var label = cbg.label;
		input.checkboxgroup = cbg;
		label.checkboxgroup = cbg;
		
		input.onclick = subfilterOnclick;
		
		td.appendChild(input);
		td.appendChild(label);
		
		tr.appendChild(td);
		tbody.appendChild(tr);
	}
	
	table.rowCount = rowCount;
	
	return table;
}

function subfilterOnclick(e){
	if (!e) var e = window.event;
	var raiser = (e.srcElement ? e.srcElement : e.target);
	var chkval = false;
	
	if (typeof(raiser.checked) == "undefined"){
		chkval = raiser.checkboxgroup.check.checked;
	}
	else {
		chkval = raiser.checked;
	}
	
	if (chkval){
		raiser.div.checkedItems[raiser.sfItem.text] = raiser.sfItem;
	}
	else {
		raiser.div.checkedItems[raiser.sfItem.text] = null;
	}
	updateDisplayText(raiser.div.checkedItems, raiser.div.displayText);
}

function updateDisplayText(checkedItems, displayText){
	clearDom(displayText);
	var txs = document.createTextNode("Selected : ");
	displayText.appendChild(txs);
	for (key in checkedItems){
		if (checkedItems[key] != null){
			var lbl = document.createElement("label");
			var txnitem = document.createTextNode(getShortLabel(checkedItems[key].text) + " ");
			lbl.setAttribute("title",checkedItems[key].text);
			lbl.setAttribute("class","filterLabel");
			lbl.appendChild(txnitem);
			displayText.appendChild(lbl);
			displayText.appendChild(document.createTextNode(", "));
		}
	}
	displayText.removeChild(displayText.lastChild);
}

function subfilterPrevious(e){
	if (!e) var e = window.event;
	var raiser = (e.srcElement ? e.srcElement : e.target);
	var div = raiser.div;
	var max = div.divprops.itemdiv.table.itemCount;
	var icur = eval(div.divprops.curitemvar);
	if (icur > (sfItemsPage)) icur -= sfItemsPage;
	else icur = 0;
	eval(div.divprops.curitemvar + " = " + icur);
	
	var curRow = icur / sfCols;
	
	updateNav(div, curRow, 0, div.divprops.itemdiv.table.rowCount);
	renderItems(div.divprops.name, div.divprops.itemdiv, curRow);
}

function subfilterNext(e){
	if (!e) var e = window.event;
	var raiser = (e.srcElement ? e.srcElement : e.target);
	var div = raiser.div;
	var icur = eval(div.divprops.curitemvar);
	var max = div.divprops.itemdiv.table.itemCount;
	icur += sfItemsPage;
	if (icur > max){
		icur = max-1;
	}
	eval(div.divprops.curitemvar + " = " + icur);
	var curRow = icur / sfCols;
	
	updateNav(div, curRow, 0, div.divprops.itemdiv.table.rowCount);
	renderItems(div.divprops.name, div.divprops.itemdiv, curRow);
}

function updateNav(div, curRow, minrows, rowCount){
	var showprev = (curRow != minrows);
	var shownext = (curRow < (rowCount-sfRowsPage));
	div.prevnav.style.visibility = (showprev ? "visible" : "hidden");
	div.nextnav.style.visibility = (shownext ? "visible" : "hidden");
}

function getShortLabel(text){
	var t = text;
	if (t.length > 9) t = t.substring(0,3) + "..." + t.substring(t.length-3,t.length);
	return t;
}