function validateForm(form)
{
	var errors = new Array();
	var elementCount = form.elements['FormData_element_count'].value;

	for(index = 0; index < elementCount; index++)
	{
		var elementType = form.elements['FormData_' + index + '_type'].value;

		switch(elementType)
		{
			case 'file_upload':
			case 'standard_text_line':
			case 'standard_text_field':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				if(form.elements['FormData_' + index + '_value'].value == '')
					errors[errors.length] = form.elements['FormData_' + index + '_label'].value;

				break;
			}

			case 'standard_listbox':
			case 'standard_listbox_multi':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				var element = form.elements['FormData_' + index + '_value' + (elementType == 'standard_listbox_multi' ? '[]' : '')];

				if(element)
				{
					var hasSelection = false;

					if(element.options.length <= 0)
						hasSelection = true;
					else
					{
						for(indexOption = 0; indexOption < element.options.length; indexOption++)
						{
							if(element.options[indexOption].selected)
							{
								hasSelection = true;
								break;
							}
						}
					}

					if(!hasSelection)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				}

				break;
			}

			case 'event_venue_list':
			case 'standard_checkbox':
			case 'standard_radio':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				var element = form.elements['FormData_' + index + '_value[]'];

				if(element)
				{
					var hasSelection = false;

					if(element.type == 'hidden')
						hasSelection = true;
					else if(typeof(element.length) == 'undefined')
						hasSelection = element.checked;
					else
					{
						for(indexOption = 0; indexOption < element.length; indexOption++)
						{
							if(element[indexOption].checked)
							{
								hasSelection = true;
								break;
							}
						}
					}

					if(!hasSelection)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				}

				break;
			}

			case 'boolean':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				var element = form.elements['FormData_' + index + '_value'];

				if(element)
				{
					if(!element.checked)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				}

				break;
			}

			case 'standard_email_address':
			{
				var element = form.elements['FormData_' + index + '_value'];

				if(element)
				{
					if(element.value == '')
					{
						if(form.elements['FormData_' + index + '_is_required'].value == 'true')
							errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
					}
					else if(!element.value.match(/^[-!#$%&\'*+\\.\/0-9=?A-Z^_`a-z{\|}~]+\@[-!#$%&\'*+\\\/0-9=?A-Z^_`a-z{\|}~]+\.[-!#$%&\'*+\\.\/0-9=?A-Z^_`a-z{\|}~]+$/))
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value + ' (invalid address)';
				}

				break;
			}

			case 'standard_range':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				var optionCount = form.elements['FormData_' + index + '_option_count'].value;

				if(optionCount > 0)
				{
					var selectionCount = 0;

					for(indexOption = 0; indexOption < optionCount; indexOption++)
					{
						var element = form.elements['FormData_' + index + '_value_' + indexOption + '[]'];
						
						if(element && (typeof(element.length) != 'undefined'))
						{
							for(indexResponse = 0; indexResponse < element.length; indexResponse++)
							{
								if(element[indexResponse].checked)
								{
									selectionCount++;;
									break;
								}
							}
						}
					}
					
					if(selectionCount != optionCount)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				}

				break;
			}

			case 'textline_checked':
			{
				var text = form.elements['FormData_' + index + '_value'].value;

				if(text != '')
				{
					var isCaseSensitive = (form.elements['FormData_' + index + '_is_case_sensitive'].value == 'true');
					
					if(!isCaseSensitive)
						text = text.toLowerCase();
						
					var options = form.elements['FormData_' + index + '_options[]'];
					var foundMatch = false;
					
					if(options && (typeof(options.length) != 'undefined'))
					{
						for(optionIndex = 0; optionIndex < options.length; optionIndex++)
						{
							var optionText = options[optionIndex].value;
							
							if(!isCaseSensitive)
								optionText = optionText.toLowerCase();
								
							if(optionText == text)
							{
								foundMatch = true;
								break;
							}
						}
					}

					if(!foundMatch)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value + ' (not valid)';
				}
				else if(form.elements['FormData_' + index + '_is_required'].value == 'true')
					errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				
				break;
			}

			case 'number_range':
			{
				if(form.elements['FormData_' + index + '_is_required'].value != 'true')
					continue;

				var element = form.elements['FormData_' + index + '_value' + (elementType == 'standard_listbox_multi' ? '[]' : '')];

				if(element)
				{
					var hasSelection = false;

					if(element.options.length <= 0)
						hasSelection = true;
					else
					{
						for(indexOption = 0; indexOption < element.options.length; indexOption++)
						{
							if(element.options[indexOption].selected)
							{
								hasSelection = (element.options[indexOption].value !== '');
								break;
							}
						}
					}

					if(!hasSelection)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value;
				}

				break;
			}

			case 'telephone_number':
			{
				var value = form.elements['FormData_' + index + '_value'].value;
				
				if(value != '')
				{
					var valueClean = value.replace(/[^0-9]/g, '');
					
					if(valueClean.length != 11)
						errors[errors.length] = form.elements['FormData_' + index + '_label'].value + ' (invalid number)';
				}
				else if(form.elements['FormData_' + index + '_is_required'].value == 'true')
					errors[errors.length] = form.elements['FormData_' + index + '_label'].value;

				break;
			}
		}
	}

	if(errors.length == 0)
		return true;

	var message = 'Please complete the following fields:\n';

	for(var i = 0; i < errors.length; i++)
		message += ' - ' + errors[i] + '\n';

	alert(message);

	return false;
}

var haveAltered = false;

function countWords(textarea, writeToId, wordLimit)
{
	var wordCount = textarea.value.split(/[\s]+/);
	
	if(wordCount.length > wordLimit)
	{
		if(!haveAltered)
		{
			alert("You've exceeded the " + wordLimit + " word limit");
			haveAltered = true;
		}

		textarea.oldValue = textarea.value != textarea.oldValue ? textarea.value : textarea.oldValue;
		textarea.value = textarea.oldValue ? textarea.oldValue : '';
	}
	else
	{
		if(haveAltered)
			haveAltered = false;
	}
	
	document.getElementById(writeToId).innerHTML = wordCount.length;
}

function form_AutoCheckOptions(elmentName, currentElement, autoCheckOptionList, maxItems)
{
	var currentCount = form_CurrentSelectedCount(elmentName);
	var toBeSelectedCount = 0;

	var formElement = document.forms['contentform'].elements[elmentName + '[]'];

	if(formElement)
	{
		for(indexOption = 0; indexOption < formElement.length; indexOption++)
		{
			for(selectOption = 0; selectOption < autoCheckOptionList.length; selectOption++)
			{
				if(formElement[indexOption].id == (elmentName + '_' + autoCheckOptionList[selectOption]))
				{
					if(!formElement[indexOption].checked)
						toBeSelectedCount ++;
				}
			}
		}
		
		if((currentCount + toBeSelectedCount) > maxItems)
		{
			alert('You can only choose ' + maxItems + ' items, please untick another option');
			currentElement.checked = false;
		}
		else
		{
			for(indexOption = 0; indexOption < formElement.length; indexOption++)
			{
				for(selectOption = 0; selectOption < autoCheckOptionList.length; selectOption++)
				{
					if(formElement[indexOption].id == (elmentName + '_' + autoCheckOptionList[selectOption]))
						formElement[indexOption].checked = currentElement.checked;
				}
			}
		}
	}
}

function form_CheckMaxSelected(elmentName, maxItems, currentElement)
{
	var currentCount = form_CurrentSelectedCount(elmentName);
	
	if(currentCount > maxItems)
	{
		alert('You can only choose ' + maxItems + ' items, please untick another option');
		currentElement.checked = false;
	}
}

function form_CurrentSelectedCount(elmentName)
{
	var formElement = document.forms['contentform'].elements[elmentName + '[]'];
	var currentCount = 0;

	if(formElement)
	{
		for(indexOption = 0; indexOption < formElement.length; indexOption++)
		{
			if(formElement[indexOption].checked)
				currentCount ++;
		}
	}

	return currentCount;
}

