var _form = new Object;
_form.validationRules = new Object;
_form.triggers = new Object;

_form.ButtonReplace = function(formID, name, value, buttonPath)
	{
	/*
	if(document.getElementById)
		{
		var button = document.getElementById(formID + '_' + name);
		var newButton = _form.CreateButton(formID, name, value, buttonPath);
		
		switch(name)
			{
			case 'submit':
				newButton.onmouseup = function() {var form = document.getElementById(this.formName); if(_form.Validate(form)){;form.submit();}};
			break;
			case 'reset':
				newButton.onclick = function() {var form = document.getElementById(this.formName); _form.Reset(form); form.reset();};
			break;
			case 'clear':
				newButton.onclick = _form.Clear;
			break;
			}
		
		button.parentNode.replaceChild(newButton, button);
		}
	*/
	}

_form.CreateButton = function(formID, name, label, buttonPath)
	{
	var innerSpan = document.createElement('span');
	var outterSpan = document.createElement('span');
	var button = document.createElement('span');
	
	innerSpan.appendChild(button);
	outterSpan.appendChild(innerSpan);
	
	if(name == 'submit')
		{
		var image = document.createElement('input');
		image.type = 'image';
		image.src = buttonPath;

		button.appendChild(image);
		}
	
	button.appendChild(document.createTextNode(label));
	
	outterSpan.className = 'pageForm-Button';
	outterSpan.id = formID + '_' + name;
	outterSpan.formName = formID;
	
	return outterSpan;
	}

_form.SetTrigger = function(id)
	{
	var el = document.getElementById(id);
	
/*	el.onkeydown = Trigger;
	el.onmousedown = Trigger;
	el.onclick = Trigger;
	el.onclick();*/
	}

_form.Trigger = function()
	{
	var state = _form.ElementFilledIn(this, this.parentNode.className.split(' ')[1]);
	
	var effectedEls = _form.triggers[this.form.id][this.id];
	
	for(var i = 0; i < effectedEls.length; i++)
		{
		var effectedEl = document.getElementById(effectedEls[i].id);
		
		switch(effectedEls[i].type)
			{
			case 'enableDisable':
				effectedEl.disabled = state;
			break;
			case 'showHide':
				if(effectedEl.currentStyle)
					var display = effectedEl.currentStyle.display;
				else if (document.defaultView && document.defaultView.getComputedStyle)
					var display = document.defaultView.getComputedStyle(effectedEl, '').getPropertyValue("display");
				else
					var display = 'block';
				
				if(effectedEl.form == null)
					effectedEl = effectedEl.parentNode;
				
				if(effectedEl.nodeName != 'div')
					effectedEl = ParentElement(effectedEl, 'div');
				
				if(effectedEls[i].display == null)
					effectedEls[i].display = display;
				
				effectedEl.style.display = (state)?'none':effectedEls[i].display;
			break;
			}
		}
	}

_form.Clear = function()
	{
	var form = document.getElementById(this.formName)
	
	if(confirm(confirmMsg))
		{
		if(window.location.search.indexOf('action=clear') > -1)
			{
			window.location = window.location;
			}
		else
			{
			if(window.location.search.indexOf('?') > -1)
				{
				window.location += '&action=clear';
				}
			else
				{
				window.location += '?action=clear';
				}
			}
		}
	}

_form.Reset = function(form)
	{
	var formElements = _form.validationRules[form.id];
	var errors = false;
	
	for(var i = 0; i < formElements.length; i++)
		{
		var elContainer = document.getElementById(formElements[i].id).parentNode;
		var errorBox = elContainer.getElementsByTagName('ins')[0];
		var cssClasses = elContainer.className.split(' ');
		
		cssClasses[cssClasses.search('error')] = null;
		elContainer.className = cssClasses.join(' ');
		
		if(errorBox.firstChild != null)
			{
			errorBox.removeChild(errorBox.firstChild);
			}
		}
	}

_form.DisableSubmit = function(form)
	{
	var submit = document.getElementById(form.id + '_submit');
	submit.style.opacity = '0.5';
	submit.firstChild.firstChild.lastChild.data = _form.SubmittingText;
	submit.onclick = null;
	}

_form.Validate = function(form)
	{
/*	try
		{*/
		var formElements = _form.validationRules[form.id];
		var errors = false;
		
		for(var i = 0; i < formElements.length; i++)
			{
			var element = document.getElementById(formElements[i].id);
			var elContainer = element.parentNode;
			var errorBox = elContainer.getElementsByTagName('ins')[0];
			var cssClasses = elContainer.className.split(' ');
			var value = '';
			var error = false;
			
			if(cssClasses[1] == 'multidropdown')
				element = elContainer.getElementsByTagName('select')[0];
			
			if(!element.disabled && element.style.display != 'none' && element.style.visibility != 'hidden')
				{
				for(var j = 0; j < formElements[i].rules.length && !error; j++)
					{
					var errorIndex = cssClasses.search('error');
					var errMsg = '';
					
					if(formElements[i].rules[j].mandatory != null && formElements[i].rules[j].mandatory == true)
						{
						error = !_form.ElementFilledIn(element, cssClasses[1]);
						errMsg = mandatory;
						}
					else
						{
						value = _form.GetNodeValue(element);
						
						if(formElements[i].rules[j].re != null)
							{
							if(!formElements[i].rules[j].re.test(value.trim()))
								{
								error = true;
								}
							}
						else if(formElements[i].rules[j].match != null)
							{
							var matchingEl = document.getElementById(formElements[i].rules[j].match);
							
							if(value.trim() != _form.GetNodeValue(matchingEl))
								{
								error = true;
								}
							}
						
						errMsg = formElements[i].rules[j].msg;
						}
					}
				}
			
			if(error)
				{
				if(!errors)
					{
					if(cssClasses[1] == 'selectionlist')
						element.getElementsByTagName('input')[0].focus
					else
						element.focus();
					}
				
				if(errorBox.firstChild != null)
					{
					errorBox.removeChild(errorBox.firstChild);
					}
				
				errorBox.appendChild(document.createTextNode(errMsg));
				
				if(errorIndex == -1)
					{
					elContainer.className += ' error';
					}
				
				errors = true;
				}
			else
				{
				cssClasses[errorIndex] = null;
				elContainer.className = cssClasses.join(' ');
				
				if(errorBox.firstChild != null)
					{
					errorBox.removeChild(errorBox.firstChild);
					}
				}
			}
		
		if(errors)
			return false;
		else
			{
			//_form.DisableSubmit(form);
			return true;
			}
/*		}
	catch(e)
		{return false;}*/
	}

_form.ElementFilledIn = function(element, type)
	{
	switch(type)
		{
		case 'selectionlist':
			var items = element.getElementsByTagName('input');
			
			for(var i = 0; i < items.length; i++)
				if(items[i].checked)
					return true;
			
			return false;
		break;
		case 'multidropdown':
			var items = element.parentNode.parentNode.getElementsByTagName('select');
			
			for(var i = 0; i < items.length; i++)
				if(items[i].parentNode.className == 'item')
					if(items[i].selectedIndex <= 0)
						return false;
			
			return true;
		break;
		case 'textarea':
		case 'text':
		case 'password':
			if(element.value.trim() != '')
				return true;
			else
				return false;
		break;
		case 'radio':
		case 'checkbox':
			if(element.checked)
				return true;
			else
				return false;
		case 'dropdown':
			if(element.selectedIndex > 0)
				return true;
			else
				return false;
		break;
		default:
			return true;
		}
	}

_form.GetNodeValue = function(element)
	{
	switch(element.nodeName.toLowerCase())
		{
		case 'input':
			return element.value;
		case 'textarea':
			return element.value;
		default:
			return '';
		}
	}

_form.UpdateTextareaSize = function(e)
	{
	var text = this.value;
	var count = 0;
	
	var matches = text.match(/\n/g);
	
	if(matches == null)
		count = 0;
	else
		count = matches.length;
	
	if(count < 2)
		count = 2;
	
	el.style.height = ((count + 1) * 1.165) + 'em';
	}

_form.SetupTextarea = function(e)
	{
/*	this.onclick = UpdateTextareaSize();
	this.onkeypress = UpdateTextareaSize();
	this.onkeydown = UpdateTextareaSize();
	this.onkeyup = UpdateTextareaSize();
	this.onmousedown = UpdateTextareaSize();*/
	}

_form.SetupMultiDropDown = function(id, elements)
	{
	var values, text, data;
	
	var el = document.getElementById(id);
	var elContainer = el.parentNode;
	var previousSelect;
	var previousVals = new Array();
	var userValues = new Array();
	var topOptionValue = el.options[0].firstChild.data;
	var dependents = new Array();
	
	var div = elContainer.getElementsByTagName('div');
	
	for(var i = 0; i < div.length; i++)
		{
		if(div[i].className == 'label')
			{
			elContainer.removeChild(div[i]);
			break;
			}
		}
	
	for(var i = 0; i < elements.length; i++)
		{
		var div = document.createElement('div');
		var divlabel = document.createElement('div');
		var label = document.createElement('label');
		var select = document.createElement('select');
		
		divlabel.appendChild(label);
		divlabel.className = 'label';
		
		div.appendChild(divlabel);
		div.appendChild(select);
		
		div.className = 'item';
		
		label.id = elements[i][0] + '_label';
		
		select.name = elements[i][0];
		select.id = elements[i][0];
		select.options[0] = new Option(topOptionValue, '')
		select.level = i;
		select.container = elContainer;
		select.group = id;
		
		if(el.disabled)
			select.disabled = true;
		
		label.innerHTML = elements[i][1];
		
		if(i != 0)
			{
			var previousSel = dependents[dependents.length - 1];
			previousSel.onchange = _form.UpdateDecendents;
			previousSel.child = select;
			select.parent = previousSel;
			}
		
		dependents[dependents.length] = select;
		previousVals[previousVals.length] = null;
		
		elContainer.insertBefore(div, el);
		
		userValues[userValues.length] = elements[i][2];
		}
	
	var tree = new Object();
	tree.children = new Array();
	var node, newData;
	
	//start at 1 to skip 'select...'
	for(var i = 1; i < el.options.length; i++)
		{
		var values = el.options[i].value.split('||');
		var text = el.options[i].firstChild.data.split(' --> ');
		
		node = tree;
		newData = false;
		
 		for(var j = 0; j < values.length; j++)
			{
			if(values[j] != previousVals[j])
				newData = true;
			
			if(newData)
				{
				var newNode = {displayName:text[j], id:values[j], children:Array(), selected:userValues[j]==values[j], leaf:(j == values.length - 1)};
				node.children[node.children.length] = newNode;
				node = newNode;
				}
			else
				node = node.children[node.children.length - 1];
			}
		
		previousVals = values;
		}
	
	_form.UpdateSelect(dependents[0], tree.children, false);
	
	elContainer.datadropdown = tree;
	
	el.style.display = 'none';
	}

_form.UpdateDecendents = function()
	{
	var currentValue = this.options[this.selectedIndex].value;
	var branch, childBranch;
	
	if(this.level == 0)
		branch = this.container.datadropdown.children;
	else
		branch = this.parent.current;
	
	for(var i = 0; i < branch.length; i++)
		if(branch[i].id == currentValue)
			childBranch = branch[i].children;
	
	this.current = childBranch;
	
	if(this.selectedIndex != '')
		_form.UpdateSelect(this.child, childBranch, true);
	else
		_form.UpdateSelect(this.child, null, true);
	}

_form.UpdateSelect = function(el, branch, manualChange)
	{
	var selectedBranch, childBranch;
	
	el.options.length = 1;
	
	if(branch != null)
		for(var i = 0; i < branch.length; i++)
			{
			el.options[el.options.length++] = new Option(branch[i].displayName, branch[i].id, false, false);
			
			if(!manualChange)
				if(branch[i].selected)
					{
					el.options[el.options.length - 1].selected = true;
					childBranch = branch[i].children;
					}
			}
	
	if(el.options.length == 2)
		{
		el.options[1].selected = true;
		childBranch = branch[0].children;
		}
	
	if(el.child != null)
		_form.UpdateSelect(el.child, childBranch, manualChange);
	}

String.prototype.trim = function()
	{
	return this.replace(/^\s*|\s*$/g,'');
	}

Array.prototype.search = function(find)
	{
	for(var i = 0; i < this.length; i++)
		{
		if(this[i] == find)
			return i;
		}
	
	return -1;
	}
