	fields = new Array();
	
	datepickers = 0;
	
	// constants
	
	FILTER_OPERATOR_EQUALS = 1;
	FILTER_OPERATOR_CONTAINS = 2;
	FILTER_OPERATOR_BETWEEN = 3;
	FILTER_OPERATOR_LESS = 4;
	FILTER_OPERATOR_MORE = 5;
	
	function RegisterField(field, title, type)
	{
		var fld = new Array();
		fld['title'] = title;
		fld['type'] = type;
		fields[field] = fld;
	}

	function ChangeField(objSelect)
	{
		var optSelect, undefined;
		
		var div = objSelect.parentNode;
		var inputs = div.getElementsByTagName('INPUT');
		var selects = div.getElementsByTagName('SELECT');
		var legend = div.getElementsByTagName('LEGEND');
		var buttons = div.getElementsByTagName('BUTTON');
		
		for (var i = 0; i < selects.length; i++)
		{
			if (selects[i].className == 'operator')
			{
				optSelect = selects[i];
			}
			else if (selects[i].className == 'boolean_value')
			{
				selects[i].style.display = 'none';
				selects[i].disabled = true;
			}
		}
		
		for (var i = 0; i < buttons.length; i++)
		{
			buttons[i].style.display = 'none';
		}

		if (optSelect != undefined)
		{
			if (objSelect.value != '')
			{
				optSelect.style.display = 'block';
				optSelect.options.length = 0;
				
				var fld = fields[objSelect.value];
				
				legend[0].innerHTML = fld['title'];
		
				if (fld['type'] == 'numberfield' || fld['type'] == 'datefield')
				{
					var optEquals = document.createElement('OPTION');
					optEquals.text = 'Equals';
					optEquals.value = FILTER_OPERATOR_EQUALS;
					
					var optBetween = document.createElement('OPTION');
					optBetween.text = 'Between';
					optBetween.value = FILTER_OPERATOR_BETWEEN;
					
					var optLess = document.createElement('OPTION');
					optLess.text = 'Less than';
					optLess.value = FILTER_OPERATOR_LESS;
					
					var optMore = document.createElement('OPTION');
					optMore.text = 'Greater than';
					optMore.value = FILTER_OPERATOR_MORE;
					
					optSelect.options.add(optEquals);
					optSelect.options.add(optBetween);
					optSelect.options.add(optLess);
					optSelect.options.add(optMore);
					
					if (fld['type'] == 'datefield')
					{
						for (var i = 0; i < buttons.length; i++)
						{
							if (buttons[i].className == 'calendar_trigger_1')
							{
								buttons[i].style.display = 'block';
								for (var i = 0; i < inputs.length; i++)
								{
									if (inputs[i].name == 'filtervalue_[]')
									{
										Calendar.setup({ inputField: inputs[i], ifFormat: '%m-%d-%Y', button: buttons[i] });
										break;
									}
								}
							}
						}
					}
				}
				else if (fld['type'] == 'boolfield')
				{
					var optEquals = document.createElement('OPTION');
					optEquals.text = 'Equals';
					optEquals.value = FILTER_OPERATOR_EQUALS;
					
					optSelect.options.add(optEquals);
					
					for (var i = 0; i < inputs.length; i++)
					{
						if (inputs[i].name.substr(0, 11) == 'filtervalue')
						{
							inputs[i].style.display = 'none';
							inputs[i].disabled = true;
						}
					}
					
					for (var i = 0; i < selects.length; i++)
					{
						if (selects[i].className == 'boolean_value')
						{
							selects[i].style.display = 'block';
							selects[i].disabled = false;
						}
					}
				}
				else
				{
					var optEquals = document.createElement('OPTION');
					optEquals.text = 'Equals';
					optEquals.value = FILTER_OPERATOR_EQUALS;
					
					var optContains = document.createElement('OPTION');
					optContains.text = 'Contains';
					optContains.value = FILTER_OPERATOR_CONTAINS;
					
					optSelect.options.add(optEquals);
					optSelect.options.add(optContains);
				}
				
				if (fld['type'] != 'boolfield') ChangeOperator(optSelect);
			}
			else
			{
				optSelect.style.display = 'none';
			}
		}
	}
	
	function ChangeOperator(objSelect)
	{
		var div = objSelect.parentNode;
		var inputs = div.getElementsByTagName('INPUT');
		var spans = div.getElementsByTagName('SPAN');
		var selects = div.getElementsByTagName('SELECT');
		var buttons = div.getElementsByTagName('BUTTON');
		
		var optField, undefined;
		
		for (var i = 0; i < selects.length; i++)
		{
			if (selects[i].className == 'field')
			{
				optField = selects[i];
				break;
			}
		}
		
		if (optField != undefined)
		{
			if (objSelect.value == FILTER_OPERATOR_BETWEEN)
			{
				for (var i = 0; i < inputs.length; i++)
				{
					if (inputs[i].name.substr(0, 11) == 'filtervalue')
					{
						inputs[i].style.display = 'block';
						inputs[i].disabled = false;
					}
				}
				for (var i = 0; i < spans.length; i++)
				{
					if (spans[i].className == 'between') spans[i].style.display = 'block';
				}
				if (fields[optField.value]['type'] == 'datefield')
				{
					for (var i = 0; i < buttons.length; i++)
					{
						if (buttons[i].className == 'calendar_trigger_2')
						{
							buttons[i].style.display = 'block';
							for (var i = 0; i < inputs.length; i++)
							{
								if (inputs[i].name == 'filtervalue2[]')
								{
									Calendar.setup({ inputField: inputs[i], ifFormat: '%m-%d-%Y', button: buttons[i] });
									break;
								}
							}
						}
					}
				}
			}
			else if (objSelect.value != '')
			{
				for (var i = 0; i < inputs.length; i++)
				{
					if (inputs[i].name.substr(0, 12) == 'filtervalue2')
					{
						inputs[i].style.display = 'none';
						inputs[i].disabled = true;
					}
					else if (inputs[i].name.substr(0, 11) == 'filtervalue')
					{
						inputs[i].style.display = 'block';
						inputs[i].disabled = false;
					}
				}
				for (var i = 0; i < spans.length; i++)
				{
					if (spans[i].className == 'between') spans[i].style.display = 'none';
				}
				if (fields[optField.value]['type'] == 'datefield')
				{
					for (var i = 0; i < buttons.length; i++)
					{
						if (buttons[i].className == 'calendar_trigger_2')
						{
							buttons[i].style.display = 'none';
							break;
						}
					}
				}
			}
			else
			{
				for (var i = 0; i < inputs.length; i++)
				{
					if (inputs[i].name.substr(0, 12) == 'filtervalue2')
					{
						inputs[i].style.display = 'none';
						inputs[i].disabled = true;
					}
					else if (inputs[i].name.substr(0, 11) == 'filtervalue')
					{
						inputs[i].style.display = 'block';
						inputs[i].disabled = false;
					}
				}
				if (fields[optField.value]['type'] == 'datefield')
				{
					for (var i = 0; i < buttons.length; i++)
					{
						if (buttons[i].className == 'calendar_trigger_2')
						{
							buttons[i].style.display = 'none';
							break;
						}
					}
				}
			}
		}
	}
	
	function CheckNumber(objInput)
	{
		var tmp = (!isNaN(parseInt(objInput.value)));
		if (tmp)
		{
			var div = objSelect.parentNode;
			var spans = div.getElementsByTagName('SPAN');
			for (var i = 0; i < spans.length; i++)
			{
				if (spans[i].className == 'validation') spans[i].style.display = 'none';
			}
			return true;
		}
		else
		{
			var div = objSelect.parentNode;
			var spans = div.getElementsByTagName('SPAN');
			for (var i = 0; i < spans.length; i++)
			{
				if (spans[i].className == 'validation')
				{
					spans[i].style.display = 'block';
					spans[i].innerText = "* Value must be a valid number.";
				}
			}
			return false;
		}
	}
	
	function GetYMDdate(Q) {
		var d, m, D, Undef;
		if ((D = /^(\d+)(\D)(\d\d)(\2)(\d\d)$/.exec(Q)) != null) {
			with (D = new Date(D[1], m = D[3] - 1, d = +D[5])) {
				if (getMonth() == m && getDate() == d) {
					return true;
				}
			}
		}
		return false;
	}

	function CheckDate(objInput)
	{
		var tmp = GetYMDdate(objInput.value);
		if (tmp)
		{
			var div = objInput.parentNode;
			var spans = div.getElementsByTagName('SPAN');
			for (var i = 0; i < spans.length; i++)
			{
				if (spans[i].className == 'validation') spans[i].style.display = 'none';
			}
			return true;
		}
		else
		{
			var div = objInput.parentNode;
			var spans = div.getElementsByTagName('SPAN');
			for (var i = 0; i < spans.length; i++)
			{
				if (spans[i].className == 'validation')
				{
					spans[i].innerHTML = "* Value must be a valid date in MM-DD-YYYY format.";
					spans[i].style.display = 'block';
				}
			}
			return false;
		}
	}
	
	function CheckValue(objInput)
	{
		var objFields, undefined;
		var div = objInput.parentNode;
		var selects = div.getElementsByTagName('SELECT');
		
		for (var i = 0; i < selects.length; i++)
		{
			if (selects[i].className == 'field')
			{
				objFields = selects[i];
				break;
			}
		}
		
		if (objFields != undefined)
		{
			var fld = fields[objFields.value];
			
			if (fld['type'] == 'numberfield')
			{
				return CheckNumber(objInput);
			}
			else if (fld['type'] == 'datefield')
			{
				return CheckDate(objInput);
			}
			else
			{
				return true;
			}
		}
	}
	
	function NewRule(name)
	{
		var div = document.getElementById('filterrules_'+name);
		var _r = document.getElementById('blankrule_'+name);
		var r = _r.cloneNode(true);

		var inputs = r.getElementsByTagName('INPUT');
		
		for (var i = 0; i < inputs.length; i++)
		{
			if (inputs[i].name.substr(0, 12) != 'filtervalue2')
			{
				inputs[i].disabled = false;
			}
		}
		
		var selects = r.getElementsByTagName('SELECT');
		
		for (var i = 0; i < selects.length; i++)
		{
			if (selects[i].name.substr(0, 11) != 'filtervalue')
			{
				selects[i].disabled = false;
			}
		}
		
		r.style.display = 'block';
		r.id = null;
		return div.appendChild(r);
	}
	
	function RegisterRule(field, operator, fieldvalue, fieldvalue2, name)
	{
		var div = NewRule(name);
		
		var selects = div.getElementsByTagName('SELECT');
		for (var i = 0; i < selects.length; i++)
		{
			if (selects[i].className == 'field')
			{
				selects[i].value = field;
				ChangeField(selects[i]);
			}
			else if (selects[i].className == 'operator')
			{
				selects[i].value = operator;
				ChangeOperator(selects[i]);
			}
			else if (selects[i].className == 'boolean_value' && fields[field]['type'] == 'boolfield')
			{
				selects[i].value = fieldvalue;
			}
		}
		
		var inputs = div.getElementsByTagName('INPUT');
		for (var i = 0; i < inputs.length; i++)
		{
			if (inputs[i].name.substr(0, 12) == 'filtervalue2' && inputs[i].disabled == false)
			{
				inputs[i].value = fieldvalue2;
			}
			else if (inputs[i].name.substr(0, 11) == 'filtervalue' && fields[field]['type'] != 'boolfield')
			{
				inputs[i].value = fieldvalue;
			}
			else if (inputs[i].name.substr(0, 11) == 'filtervalue' && fields[field]['type'] == 'boolfield')
			{
				inputs[i].style.display = 'none';
				inputs[i].disabled = true;
			}
		}
	}
	
	function DeleteRule(objAnchor, name)
	{
		if (confirm('Are you sure you want to delete this rule?'))
		{
			var sub = 'submit[filter_'+name+']';
			var div = objAnchor.parentNode.parentNode;
			div.parentNode.removeChild(div);
			if (typeof document.all != 'object')
			{
				var evt = document.createEvent("MouseEvent");
				evt.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
				document.forms[0].elements[sub].dispatchEvent(evt);
			}
			else
			{
				document.forms[0].elements[sub].click();
			}
		}
	}
	/* hack to ensure users don't cause mysql errors by not filling in filter form properly
	  * May 2, 2007
	  * Cody Hollis-Perdue
	  */
	function doTest(name)
	{
		var divs=document.getElementsByTagName("DIV");
		var output;
		
		for(var i=0;i<divs.length;i++)
		{
			if(divs[i].id=='null')
			{
				if(divs[i].hasChildNodes())
				{
					var kids=divs[i].getElementsByTagName("SELECT");
					if(kids[0].value=="")
					{
						alert("Error:Cannot add new filter when old ones aren't filled in");
						return false;
					}
				}
			}
		}
		NewRule(name);
	}
	function is_complete()
	{
		var divs=document.getElementsByTagName("DIV");
		var output;
		
		for(var i=0;i<divs.length;i++)
		{
			if(divs[i].id=='null')
			{
				if(divs[i].hasChildNodes())
				{
					var kids=divs[i].getElementsByTagName("SELECT");
					if(kids[0].value=="")
					{
						alert("Error:Filter not filled in");
						return false;
					}
				}
			}
		}
	}

