// Adds filtering dropdowns to the thead of a table
var TableFilter = {
	addFilters : function(tblId, hideFilterForSingleValue, skipIndexes) {
		var tbl = document.getElementById(tblId);
		if(!tbl) {
			return;
		}
		var thead = tbl.tHead;
		var tbody = tbl.tBodies[0];
		if(!thead || !thead.rows[0] || !tbody) {
			return;
		}
		
		// Javascript "in array" function
		var inArray = function(arr, val) {
			for(var x = 0; x < arr.length; ++x) {
				if(arr[x] == val) {
					return true;
				}
			}
			return false;
		}
		
		// Find all the columns
		var cells = thead.rows[0].cells;
		var colInfo = [];
		for(var i = 0; i < cells.length; ++i) {
			colInfo.push({ type: cells[i].abbr, skip: inArray(skipIndexes, i) });
		}
		
		// Get all table values and store them in array
		var colValues = [];
		var val = null;
		for(var i = 0; i < tbody.rows.length; ++i) {
			for(var x = 0; x < tbody.rows[i].cells.length; ++x) {
				if(!colValues[x]) {
					colValues[x] = [];
				}
				val = tbody.rows[i].cells[x].innerHTML;
				if(val.length > 25) {
					colInfo[x].skip = true;
					continue;
				}
				if(colInfo[x].skip == false) {
					colValues[x].push(val);
				}
			}
		}
		
		// Sort by number function
		var sortNumber = function(a, b) {
			return a - b;
		}
		
		// Sort values
		for(var x = 0; x < colValues.length; ++x) {
			if(colInfo[x].type == 'number') {
				colValues[x].sort(sortNumber);
			}
			else {
				colValues[x].sort();
			}
		}
		
		// Remove duplicates
		for(var x = 0; x < colValues.length; ++x) {
			var tmp = [];
			var last = '';
			for(var i = 0; i < colValues[x].length; ++i) {
				if(colValues[x][i] != last) {
					tmp.push(colValues[x][i]);
				}
				last = colValues[x][i];
			}
			colValues[x] = tmp;
		}

		// Table filter constructor
		var TableFilter = function(colIdx, val) {
			this.colIdx = colIdx;
			this.val = val;
		}
		
		// Collection of current filters
		var tableFilters = {};
		tableFilters.current = [];
		
		// Add filter to collection
		tableFilters.add = function(filter) {
			for(var x = 0; x < tableFilters.current.length; ++x) {
				if(tableFilters.current[x].colIdx == filter.colIdx) {
					tableFilters.current[x].val = filter.val;
					return;
				}
			}
			tableFilters.current.push(filter);
		}
		
		// Remove filter from collection
		tableFilters.remove = function(colIdx) {
			for(var x = 0; x < tableFilters.current.length; ++x) {
				if(tableFilters.current[x].colIdx == colIdx) {
					tableFilters.current.splice(x, 1);
					return;
				}
			}
		}
		
		// Apply filters to table
		tableFilters.apply = function() {
			var selectBox = null;
			var selectVal = null;
			var tbl = document.getElementById(tblId);
			var tbody = tbl.tBodies[0];
			var cell = null;
			var colIdx = null;
			var rowMatches = {};
			for(var i = 0; i < tbody.rows.length; ++i) {
				rowMatches[i] = true;
			}
			for(var x = 0; x < tableFilters.current.length; ++x) {
			//alert(tableFilters.current[x]);
				colIdx = tableFilters.current[x].colIdx;
				selectVal = tableFilters.current[x].val;
				for(var i = 0; i < tbody.rows.length; ++i) {
					cell = tbody.rows[i].cells[colIdx];
					if(cell.innerHTML != selectVal) {
						rowMatches[i] = false;
						continue;
					}
					else {
						rowMatches[i] = rowMatches[i] && true;
					}
				}
			}
			for(var x in rowMatches) {
				if(rowMatches[x] == true) {
					tbody.rows[x].style.display = '';
				}
				else {
					tbody.rows[x].style.display = 'none';
				}
			}
		}	
		
			
		// Create select boxes and attach filter handling function
		var filters = [];
		var selectBoxCount = 0;
		for(var x = 0; x < colValues.length; ++x) {
			if(colInfo[x].skip == false) {
				var filter = null;
				if(hideFilterForSingleValue && colValues[x].length == 1) {
					filter = document.createTextNode(' ');
				}
				else {
					var filterBox = document.createElement('select');
					filterBox.id = 'tableFilterCol_' + x;
					filterBox.options.add(new Option('(filter)', ''));
					var changeFn = function(x) { 
						return function(e, selectBox) {
							if(selectBox.selectedIndex != -1) {
								var val = selectBox.options[selectBox.selectedIndex].value;
								if(val == '') {
									tableFilters.remove(x);
								}
								else {
									tableFilters.add(new TableFilter(x, val)); 
								}
								tableFilters.apply();
							}
						};
					}(x);
					
					for(var i = 0; i < colValues[x].length; ++i) {
						filterBox.options.add(new Option(colValues[x][i], colValues[x][i]));
					}
					YAHOO.util.Event.addListener(filterBox, "change", changeFn, filterBox);
					filter = filterBox;
					++selectBoxCount;
				}
			}
			else {
				filter = document.createTextNode(' ');
			}
			filters.push(filter);
		}
		
		// Add the filter select boxes to the thead
		if(selectBoxCount > 0) {
			var filterTr = document.createElement('tr');
			filterTr.className = 'tableFilterRow';
			for(var x = 0; x < filters.length; ++x) {
				var td = document.createElement('td');
				
				if(filters[x].style) {
				//	filters[x].style.position = 'absolute';
//					filters[x].style.top = '1px';
//					filters[x].style.left = '1px';
				}
				td.style.backgroundColor = x % 2 == 0 ? "#eaf2fb" : "#fff";
				td.appendChild(filters[x]);
				filterTr.appendChild(td);
				td = null;
			}
			thead.appendChild(filterTr);
			filterTr = null;
		}
	}
}