function form_submit(form)
{
	var e=null;
	var i=0;
	var n=0;
	var y=true;
	var p=null;
	var alt=new RegExp('(^|\s)alternative(\s|$)');
	
	//check if field where allready indexed
	if(typeof(form.field)=='undefined')
	{
		var r=new RegExp('(^|\s)required(\s|$)');
		form.field=new Array();
		e=form.getElementsByTagName('*');
		n=e.length;
		while(i<n)
		{
			if(e[i].nodeName && (e[i].nodeName=='INPUT' || e[i].nodeName=='TEXTAREA'))
			{
				e[i].required=false;
				p=e[i];
				while(p)
				{
					if(p.className && p.className.match(r))
					{
						e[i].required=true;
						break;
					}
					p=p.parentNode;	
				}
				form.field[form.field.length]=e[i];	
			}
			++i;
		}
	}
	
	
	
	//now check if all required fields contain data
	e=form.field;
	n=e.length;
	i=0;
	while(i<n)
	{
		if(e[i].required && (!e[i].value || (e[i].type.toLowerCase()=='checkbox' && !e[i].checked)) )
		{
			//required but empty
			if(e[i].className)
			{
				if(e[i].className.match(alt))
				{
					//get parent of logical fieldset (alternatives)
					p = e[i];
					while(p)
					{
						if(p.className && p.className.match(/(^|\s)required(\s|$)/) && !form_alternative_set(p)) 	
						{							
							y=false;
							e[i].style.background='#FFCCCC';
							break;
						}
						p = p.parentNode;
					}
				}
				else
				{
					//there is no alternative
					y=false;
					e[i].style.background='#FFCCCC';
				}
			}
			else
			{
				y=false;
				e[i].style.background='#FFCCCC';	
			}
		}
		else
		{
			e[i].style.background='#FFFFFF';	
		}
		++i;
	}
	return y;
}


/*
 * @return boolean, true if at least one alternative child element is set
 */
function form_alternative_set(p)
{
	var e = p.getElementsByTagName('input');
	var n = e.length;
	var i = 0;
	if(n)
	{
		while(i<n)
		{
			e[i].style.border='3px solid lime';
			if((e[i].type.toLowerCase()=='checkbox' || e[i].type.toLowerCase()=='radio') && e[i].checked)
			{
				return true;
			}
			else if(e[i].value)
			{
				return true;	
			}
			++i;
		}
	}
	e = p.getElementsByTagName('textarea');
	n = e.length;
	i = 0;
	if(n)
	{
		while(i<n)
		{
			if(e[i].value)
			{
				return true;	
			}
			++i;
		}
	}
	return false;
}
