// JavaScript Document
var errBox, msgBox;

var tomboyFormRules =
{
	'#tbForm' : function(element)
	{
		element.style.display = 'block';
	},
	'form.tomboyForm p.messages' : function(element)
	{
		msgBox = new jsMsgBox(element, 'Warnings');
	},
	'form.tomboyForm p.errors' : function(element)
	{
		errBox = new jsMsgBox(element, 'Errors');
	},
	'#tbForm_reset' : function(element)
	{
		element.observe('click', function()
		{
			$('tbForm').reset();
		});
	},
	'#tbForm_submit' : function(element)
	{
		element.observe('click', function()
		{
			var Errors = '';
			errBox.hide(true);
			elements = $('tbForm').getElements();

			elements.each
			(
				function(node,k)
				{
					node = $(node);
					label = node.getAttribute('label');

					if (node.type)	type = node.tagName + ' ' + node.type;
					else			type = node.tagName;

					switch (type.toLowerCase())
					{
						case 'textarea textarea':
							if (parseInt(node.getAttribute('required')) == 1 && node.getValue().blank())
							{
								Errors += '  - ' + label + ' is required\n';
							}
						break;
						case 'input file':
							if (parseInt(node.getAttribute('required')) == 1 && node.getValue().blank())
							{
								Errors += '  - ' + label + ' is required to have a file selected\n';
							}
						break;
						case 'select select-one':
						case 'select select-multiple':
							if (parseInt(node.getAttribute('required')) == 1)
							{
								value = node.getValue();
								switch (true)
								{
									case Object.isString(value):
										if (value == '')
										{
											Errors += '  - ' + label + ' is required to have an option selected\n';
										} else if (value == 'other' && $(node.id + '_other').getValue().blank())
										{
											Errors += '  - ' + label + ' is required to have a value for "other"\n';
										}
									break;
									case Object.isArray(value):
										if (value.length == 0)
										{
											Errors += '  - ' + label + ' is required to have at least one option selected\n';
										}
									break;
									default:
										Errors += '  - ' + label + ' is required to have an option selected\n';
									break;
								}
							}
						break;
						case 'input checkbox':
							if (isNaN(value = parseInt(node.getValue()))) break;
							if (! Object.isArray(node.parentNode.checked))
							{
								node.parentNode.checked = [ ];
							}

							if (node.parentNode.checked.indexOf(value) == -1 && node.checked) node.parentNode.checked.push(value);
							if ((i = node.parentNode.checked.indexOf(value)) != -1 && ! node.checked) node.parentNode.checked.splice(i, 1);
						break;
						case 'input radio':
							if (isNaN(value = parseInt(node.getValue()))) break;
							if (! Object.isArray(node.parentNode.checked))
							{
								node.parentNode.checked = [ ];
							}

							if (node.parentNode.checked.indexOf(value) == -1 && node.checked) node.parentNode.checked.push(value);
							if ((i = node.parentNode.checked.indexOf(value)) != -1 && ! node.checked) node.parentNode.checked.splice(i, 1);
						break;
						case 'input text':
							xlength = 0;
							xmin = 0;
							xmax = 0;

							if ((xlength = node.getValue().strip().length) > 1 || parseInt(node.getAttribute('required')) == 1)
							{
								if (xlength < (xmin = parseInt(node.getAttribute('minlength'))))
								{
									Errors += '  - ' + label + ' is required to be at least ' + xmin + ' characters long\n';
									break;
								}
							}

							if (xlength > (xmax = parseInt(node.getAttribute('maxlength'))))
							{
								Errors += '  - ' + label + ' is required to be at most ' + xmax + ' characters long\n';
								break;
							}

							regex = null;
							regexErr = '';
							switch (parseInt(node.getAttribute('validation')))
							{
								case 1:
									regex = REGEXP['Email'];
									regexErr = 'is required to be a valid e-mail address';
								break;
								case 2:
									if (! (ext = $(node.id + '_ext')))
									{
										regex = new RegExp(/^\(([0-9]){3}\)\ ([0-9]){3}\-([0-9]){4}$/);
										regexErr = 'is required to be a valid phone number';
									} else
									{
										regex = new RegExp(/^\(([0-9]){3}\)\ ([0-9]){3}\-([0-9]){4}$/);
										regexErr = 'is required to be a valid phone number';

										if (! RegExp(/^[0-9]*$/).test($F(ext)))
										{
											Errors += '  - ' + label + ' extension should be a whole number\n';
										}
									}
								break;
								case 3:
									regex = new RegExp(/^[a-zA-Z0-9\ ]*$/);
									regexErr = 'is required to be alphanumeric (letters, numbers, space)';
								break;
								case 4:
									regex = new RegExp(/^[0-9]*$/);
									regexErr = 'is required to be a whole number';
								break;
								case 5:
									regex = new RegExp(/^[0-9]+[\.]?[0-9]*$/);
									regexErr = 'is required to be a number';
								break;
								case 6:
									regex = new RegExp(/^[0-1]?[0-9]\/[0-3]?[0-9]\/(19|20)[0-9]{2}$/);
									regexErr = 'is required to be a valid date';
								break;
								case 7:
									regex = new RegExp(/^[0-2]?[0-9]:[0-9]{2}\ ?(am|pm)?$/);
									regexErr = 'is required to be a valid time';
								break;
								case 8:
									regex = new RegExp(/^[0-1][0-9]\/[0-3][0-9]\/(19|20)[0-9]{2} [0-2][0-9](:[0-5][0-9]){2}$/);
									regexErr = 'is required to be a valid date and time';
								break;
								case 9:
									if(xlength > xmin)
									{
										regex = new RegExp(node.getAttribute('valregex'));
										regexErr = 'is not properly formatted';
									}
								break;
								case 10:
									regex = new RegExp(/^[a-zA-Z0-9\s\.\,\-\/\&\(\)\:]*$/);
									regexErr = 'is required to be alphanumeric (letters, numbers, space, some special characters)';
								break;
							}

							if (regex != null)
							{
								if (! regex.test(node.getValue()))
								{
									Errors += '  - ' + label + ' ' + regexErr + '\n';
								}
							}
						break;
					}

				}
			);

			// Multiple Elements
			list = document.getElementsBySelector('form.tomboyForm td[required=1]');
			if (Object.isArray(list))
			{
				list.each(function(v)
				{
					label = v.getAttribute('label');
					switch (v.getAttribute('type'))
					{
						case 'radio':
						case 'checkbox':
							if (! Object.isArray(v.checked) || v.checked.length == 0)
							{
								Errors += '  - ' + label + ' is required to have at least one option checked\n';
							}

							v.checked = [ ];
						break;
					}
				});
			}

			if (Errors != '')
			{
				errBox.show('The following errors where encountered while trying to submit your information:\n\n' + Errors);
				// alert ('The following errors where encountered while trying to submit your information:\n\n' + Errors);
				return false;
			}

			$('tbForm_action').value = 'submit';

			$('tbForm').submit();
		});
	},
	'form.tomboyForm input' : function(element)
	{
		switch ((validation = parseInt(element.getAttribute('validation'))))
		{
			case 2:
				element.observe('blur', function()
				{
					if (this.getValue().blank()) return true;

					value = '';
					for (var c = 0; c < this.getValue().length; c++)
					{
						if ('0123456789'.indexOf(this.getValue().charAt(c)) != -1)
						{
							value += this.getValue().charAt(c);
						}
					}

					if (value.length == 10) this.value = ("(" + value.substr(0, 3) + ")" + " " + value.substr(3, 3) + "-" + value.substr(6, 4));
				});
			break;
			case 6:
			case 8:
				img = document.createElement('img');
				img = $(img);
				img.calendar = new calendar2(element);
				img.calendar.year_scroll = true;
				img.calendar.time_comp = (validation == 8);
				img.src = WSPATH + '_ext/calendar/img/cal.gif';
				img.border = 0;
				img.addClassName('calendar');
				img.observe('click', function(){ this.calendar.popup(); })

				element.parentNode.insertBefore(img, element.nextSibling);
			break;
		}
	},
	'form.tomboyForm select' : function(element)
	{

		element.observe('change', function()
		{
			switch($F(this))
			{
				case 'other':
					if (! (other = $(this.name + '_other'))) break;
					other.style.display = '';
					other.activate();
				break;
				default:
					if (! (other = $(this.name + '_other'))) break;
					other.setValue('');
					other.blur();
					other.style.display = 'none';
				break;
			}
		});
	}
};

Behaviour.register(tomboyFormRules);