function createMessage(form_id, messageText)
{
	var message_id = form_id + '_message';
	var message = $(message_id);

	if (!messageText)
	{
		if (!document.messageText)
		{
			messageText = 'Done.';
		}
		else
		{
			messageText = document.messageText;
		}
	}
	
	if (!message)
	{
		message = new Element('div', {
			'events': {
				'click': function() {
					this.remove();
				}
			},
			'class': 'alert',
			'id': message_id,
			'title': 'Click to close this box'
		});
				
		message.injectBefore($(form_id));
		message.setStyle('color', $(message).getStyle('background-color'))
	}
	
	message.setHTML(messageText);

	to_color = '#353536';
	from_color = message.getStyle('background-color');
	if (message.myFx)
	{
		message.myFx.stop();
	}
	
	var messageCoordinates = message.getCoordinates();

	if (window.getScrollTop() > messageCoordinates.top)
	{
		window.scrollTo(0, messageCoordinates.top - 10);
	}
	
	message.myFx = new Fx.Style(message.id, 'color', {duration:500}).start(from_color, to_color);
}

var currentForm = null;

function submitForm(form, container)
{
	document.messageText = '';
	
	currentForm = form;
	
	form.id = form.action + '_form';

	createMessage(form.id, 'Processing...');
	
	var options = {
		evalScripts: true,
		onFailure: function(request) 
		{
			createMessage(form.id, 'Request failed.');
		},
		onSuccess: function(result) 
		{
			(function(){createMessage(form.id);}).delay(50); // need to set a delay - FF bug
		}
	};
	
	if (container)
	{
		options['update'] = container;
	}
	
	$(form.id).send(options);

	return false;
}

function clearForm(form)
{
	if (form)
	{
		targetForm = form;
	}
	else if (currentForm)
	{
		targetForm = currentForm;
	}
	
	if (targetForm)
	{
		var elements = $(targetForm).getFormElements();
		
		elements.each(function(element)
		{
			switch(element.getTag())
			{
				case 'select':
					if (element.multiple)
					{
						element.value = null;
					}
					else
					{
						element.value = '';
					}
					element.fireEvent('change');
					break;
				case 'textarea': 
					element.value = '';
					element.fireEvent('change');
					break;
				case 'input': 
					if (element.readOnly)
					{
						break;
					}
					if (['checkbox', 'radio'].contains(element.type))
					{
						element.checked = false; 
						element.fireEvent('click');
					}
					else if (['hidden', 'text', 'password'].contains(element.type))
					{
						element.value = '';
						element.fireEvent('change');
					}
					break;
			}
		});
	}

	return false;
}

function confirmAction(selector, message)
{
	var selected = false;
	
	$$(selector).each(function(element)
	{
		if (element.checked)
		{
			selected = true;
		}
	});
	
	if (selected)
	{
		if (!window.confirm(message))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	else
	{
		alert('Make a selection first.');

		return false;
	}
}

function selectAll(selector, state)
{
	$$(selector).each(function(element)
	{
		element.checked = state
	});
}

function previewForm(form)
{
	form.id = form.action + '_form';

	labels = $(form).getElements('td[class=labels]');
	var curId = 0;
	var previewStr = '<div class="preview_caption">Preview your submission</div><br /><table width="100%" cellpadding="2" cellspacing="2">';
	
	$(form).getElements('td[class=values]').each(function(e1)
	{
		curValue = '';
		skip = false;
		
		e1.getElementsBySelector('input[type=text],textarea,select').each(function(e2)
		{
			if (e2.getProperty('disabled'))
			{
				skip = true;
			}

			switch(e2.getTag()){
				case 'select':
					var values = [];
					$each(e2.options, function(option){
						if (option.selected) values.push(option.text);
					});
					value = (e2.multiple) ? values : values[0];
				case 'input': if (!(e2.checked && ['checkbox', 'radio'].contains(e2.type)) && !['hidden', 'text', 'password'].contains(e2.type)) break;
				case 'textarea': value = e2.value.replace(/\r?\n|\r/g, '<br />');
			}

			if ($type(value) == 'array')
			{
				strValue = value.join(', ');
			}
			else
			{
				strValue = value;
			}

			if (curValue && strValue)
			{
				curValue += ', ';
			}
			
			curValue += strValue;
		});
		
		if (!skip)
		{
			previewStr = previewStr + '<tr><td class="preview_labels" nowrap>' + labels[curId].innerHTML + '</td><td class="preview_text">' + curValue + '</td></tr>';
		}
		
		curId++;
	});
	
	previewStr = previewStr + '</table>';
	
	createMessage(form.id, previewStr)
	
	return false;
}

function bindUSACheck(target, containers)
{
	$(target).addEvent('change', function()
	{
		target = this;
		
		$$(containers).each(function(container)
		{
			if (target.getTag() == 'select' && target.getProperty('multiple'))
			{
				disabled = true;
				
				$A(target.options).each(function(item, index)
				{
					if (item.selected && item.value == 'United States')
					{
						disabled = false;
					}
				});
			}
			else
			{
				disabled = target.value != 'United States';
			}
			
			container.setStyle('display', disabled ? 'none' : '');
			
			container.getElementsBySelector('input[type=text],textarea,select').each(function(element)
			{
				element.setProperty('disabled', disabled);
			});
		});
	}).fireEvent('change');
}

// IE7 bugfix

XHR.prototype.setTransport = function(){
	if (window.ie7)
	{
		this.transport = (window.XMLHTTPRequest) ? new XMLHTTPRequest() : (window.ie ? new ActiveXObject('Microsoft.XMLHTTP') : false);
	}
	else
	{
		this.transport = (window.XMLHttpRequest) ? new XMLHttpRequest() : (window.ie ? new ActiveXObject('Microsoft.XMLHTTP') : false);
	}
	return this;
}