

/*				*/
/* object Form	*/
/*				*/


function Form(form)
{
	try
	{
		this.getFormObject = function()
		{
			try
			{
				return form;
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.name = function()
		{
			try
			{
				if ( (arguments.length) && (form) )
				{
					form.name = arguments[0];
				}

				return (form) ? form.name : '';
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.id = function()
		{
			try
			{
				if ( (arguments.length) && (form) )
				{
					form.id = arguments[0];
				}

				return (form) ? form.id : '';
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.submit = function()
		{
			try
			{
				if (form) { form.submit(); }
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.reset = function()
		{
			try
			{
				if (form) { form.reset(); }
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.getValueByName = function(name)
		{
			try
			{
				var els = document.getElementsByName(name);
				if (els.length)
				{
					//first elements type determins the rests (if any)
					//TODO: make generic (if possible)???
					var type = els[0].type;

					switch (type)
					{
						case 'radio':
							for (var i=0; i<els.length; i++)
							{
								if (els[i].checked) { return new Array(els[i].value); }
							}

							break;
						case 'checkbox':
							var a = new Array();

							for (var i=0; i<els.length; i++)
							{
								if (els[i].checked)
								{
									a.push(els[i].value);
								}
							}

							return a;

							break;
						case 'text':

							//fall-through...
						case 'password':

							//fall-through...
						case 'hidden':
							return new Array(els[0].value);

							break;
						case 'select-one':
							return els[0].options.item(els[0].selectedIndex).value;

							break;
						default:
							window.alert('form element of type: ' + type + ' is unhandled!');

							break;
					}
				}

				return new Array();
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.setValueByName = function(name, value)
		{
			try
			{
				//TODO: add return value true/false to action and test if argument.length == 2

				var elements = document.getElementsByName(name);
				if (elements.length)
				{
					//first elements type determined the rests (if any)
					//TODO: make generic (if possible)???
					var type = elements[0].type;

					switch (type)
					{
						case 'radio':
							for (var i=0; i<elements.length; i++)
							{
								if (elements[i].value == value)
								{
									elements[i].checked = true;
									elements[i].setAttribute('marked', true);

									break;
								}
							}

							break;
						case 'checkbox':
							var values = value.split(',');

							for (var i=0; i<values.length; i++)
							{
								for (var j=0; elements.length; j++)
								{
									if (elements[j].value == values[i])
									{
										elements[j].checked = true;
										elements[j].setAttribute('marked', true);

										break;
									}
								}
							}

							break;
						case 'text':

							//note: set original content for value in attribute value2

							var resolved_value = ( (!value) || (!value.length) ) ? '' : value;
							elements[0].setAttribute('value2', resolved_value);

							//fall-through...
						case 'password':

							// note: must not preserve value for security reasons

							//fall-through...
						case 'hidden':
							elements[0].value = value;
							//elements[0].setAttribute('marked', true);

							break;
						case 'select-multiple':

							//fall-through...
						case 'select-one':
							var values = value.split(',');

							for (var i=0; i<values.length; i++)
							{
								for (var j=0; j<elements[0].options.length; j++)
								{
									var option = elements[0].options[j];
									if (option.value == values[i])
									{
										option.selected = true;
									}
								}
							}

							break;
						default:
							window.alert('form element of type: ' + type + ' is unhandled!');

							break;
					}
				}
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.removeElementsByName = function(name)
		{
			try
			{
				//TODO: check arguments.length == 1 and return true/false??

				var elements = document.getElementsByName(name);
				for (var i=elements.length-1; i>=0; i--)
				{
					elements[i].parentNode.removeChild(elements[i]);
				}
			}
			catch (ex)
			{
				throw (ex);
			}
		};


		this.createElement = function(name, id, value, type)
		{
			try
			{
				//TODO: validate arguments

				var element = null; //default return value. returns element if successful.
				switch (type)
				{
					case 'hidden':

						//fall-through...
					case 'text':
						element = document.createElement('INPUT');
						if (element)
						{
							element.type = type;
							if (name) { element.name = name; }
							if (id) { element.id = id; }
							element.value = (value) ? value : '';

							form.appendChild(element);
						}

						break;
					default:
						//window.alert(TODO: attach type \'' + type + '\' to routine!');

						break;
				}

				return element;
			}
			catch (ex)
			{
				throw (ex);
			}
		};
	}
	catch (ex)
	{
		throw (ex);
	}
};


/*				*/
/* end of file	*/
/*				*/


function getFormControlElementValue(name)
{
	try
	{
		var els = document.getElementsByName(name);
		if (els.length)
		{
			var type = els[0].type; //first elements type determined the rests (if any). TODO: make generic if possible.

			switch (type)
			{
				case 'radio':
					for (var i=0; i<els.length; i++)
					{
						if (els[i].checked) { return new Array(els[i].value); }
					}

					break;
				case 'checkbox':
					var a = new Array();

					for (var i=0; i<els.length; i++)
					{
						a.push(els[i].checked);
					}

					return a;

					break;
				case 'text':

					//fall-through...
				case 'password':

					//fall-through...
				case 'hidden':
					return new Array(els[0].value);

					break;
				case 'select-one':
					//TODO: differentiate between select with and without value attribute(s).

					return new Array(els[0].value);

					break;
				default:
					window.alert('form element of type: ' + type + ' is unhandled!');

					break;
			}
		}
	}
	catch (ex)
	{
		throw (ex);
	}

	return new Array();
};