var required = []
var mess = []
var special = {}

function check_form(name)
{
	if (document.forms[name] == null)
		return false;

	f = document.forms[name];
	var i = 0

	var flds = f.elements['required_fields'];
	var nms = f.elements['required_fields_messages'];
	var fields = new Array();
	var names = new Array();
	
	if(typeof flds != 'array')
		flds = [ flds ];

	if(typeof nms != 'array')
		nms = [ nms ];

	for(i = 0; i < flds.length; i++)
	{
		if(flds[i])
			fields = fields.concat(flds[i].value.split('|v|'))
	}

	fields = fields.concat(required)

	for(i = 0; i < nms.length; i++)
	{
		if(nms[i])
			names = names.concat(nms[i].value.split('|v|'))
	}
	names = names.concat(mess)

	for(i = 0; i < fields.length; i++)
	{
		var ename = fields[i]
		var elem = f.elements[ename]


		if(elem == null)
		{
			alert('DEBUG: ' + ename + ' is missing!');
			continue;
		}


		if(elem.length != null && elem[0].getAttribute('type') == 'radio')
			ret = radio_checker(elem, names[i])
		else
		{
			var fname = default_checker
			var func = null

			if (elem.getAttribute != null && 
					elem.getAttribute('check') != null)
			{
				func = elem.getAttribute('check')
			}
			else
			{
				if (f.elements['check_function_'+ename] && 
						 f.elements['check_function_'+ename].value)
					func = f.elements['check_function_'+ename].value;
				if (special[ename])
					func = special[ename];
			}

			if(func)
				ret = eval(func)
			else
				ret = fname(elem, names[i])

		}

		if(ret === true)
			continue;

		if(typeof(ret) == 'boolean')
			return false;

		alert(ret)
		return false;
	}

	return true;
}

function default_checker(elem, displayname)
{
	if	( ( displayname == null || displayname == '' ) && 
				elem.getAttribute != null &&
				elem.getAttribute('displayname'))
		displayname = elem.getAttribute('displayname')

	if(displayname == '')
		displayname = 'Some elements are missing or not valid';


	if(elem.value == '')
	{
		elem.style.backgroundColor = 'red';
		return displayname;
	}
	else
		elem.style.backgroundColor = 'white';

	return true;
}

function radio_checker(elem, displayname)
{
	var i = 0

	if	( ( displayname == null || displayname == '' ) && 
				elem[0].getAttribute != null &&
				elem[0].getAttribute('displayname'))
		displayname = elem[0].getAttribute('displayname')

	if(displayname == '')
		displayname = 'Some elements are not choosen';

	var ret = displayname

	for(i = 0; i < elem.length; i++)
	{
		if(elem[i].checked == true)
			ret = true;
	}

	if(ret !== true)
		for(i = 0; i < elem.length; i++)
		{
			elem[i].style.backgroundColor = 'red';
		}
	else
		for(i = 0; i < elem.length; i++)
		{
			elem[i].style.backgroundColor = 'white';
		}

	return ret;
}

function addRequiredField(id, mes) {
	required[required.length] = id

	mess[mess.length] = mes
}

function addSpecialField(id, funcname) {
	special[id] = funcname+'(elem,names[i])'

	addRequiredField(id, '')
}
