function checkForm(objForm, fieldsInfo)
{
	var field_type, field_title, field_custom_message, field_custom_test_function;
	var result = true;
	//alert(fieldsInfo); return;
	// step over fields
	for (field_name in fieldsInfo)
	{
		try
		{
			tmp = fieldsInfo[field_name].split('||');
			field_type = tmp[0];
			
			// get combined types __or__
			var comb_operator = 'and';
			arr = field_type.split('__or__');
			if (arr.length>1)
			{
				field_type = arr;
				comb_operator = 'or';
			}
			else
			{
				// get combined types __and__
				arr = field_type.split('__and__');
				if (arr.length>1)
				{
					field_type = arr;
					comb_operator = 'and';
				}
			}
			
			field_title = tmp[1];
			field_custom_message = tmp[2];
			field_custom_test_function = tmp[3];
			
			// get field value
			if (objForm[field_name] != null)
				if (objForm[field_name][0] != null)
					switch (objForm[field_name][0].type)
					{
						case 'radio':
							try
							{
								for (var i=0; i<objForm[field_name].length; i++)
								{
									if (objForm[field_name][i].checked)
										value = objForm[field_name][i].value;
								}
							}
							catch (e)
							{
								alert('Field obj error: '+field_name);
								result = false;
							}
							break;
					}
				else
					switch (objForm[field_name].type)
					{
						case 'text':
						case 'select-one':
						case 'hidden':
						case 'textarea':
							try
							{
								value = objForm[field_name].value;
							}
							catch (e)
							{
								alert('Field obj error: '+field_name);
								result = false;
							}
							break;
					}
			else
			{
				alert('There is no such field: '+field_name);
				result = false;
			}
			
			var res = null;
			var test_function = null;
			
			// test field value
			var l=0;
			if (isArray(field_type)) 
				l = field_type.length-1;
			else
			{
				// get test function if type is not combined
				test_function = field_custom_test_function != null ? field_custom_test_function : "test_"+field_type;
			}
			
			//alert(isArray(field_type));

			// or:  false or  false or  false or  true  or  false
			// and: true  and true  and true  and false and true
			var stop = false;
			for (var i=0; i<=l && !stop; i++)
			{
				try
				{
					// get test function
					if (isArray(field_type))
						test_function = "test_"+field_type[i];
					//alert(test_function);
					
					// eval 
					res = eval(test_function+"(value, '"+field_custom_message+"');");
					
					if (comb_operator == 'or') 
						stop = res==true;
					else
						stop = res!=true;
				}
				catch (e)
				{
					alert('There is no such function: '+test_function+'();');
					result = false;
				}
			}
			
			// set result
			if ((comb_operator == 'or' && !stop) || (comb_operator == 'and' && stop))
				result = false;
			
			// show error message
			if (res != true && objForm[field_name])
			{
				if (objForm[field_name][0] == null)
					if (field_type!='bool') objForm[field_name].focus();
				alert(field_title+': \n'+res);
				result = false;
			}
			
			if (!result) break;
		}
		catch (e)
		{
			alert('Undefined error occured while field \''+field_name+'\' handling!');
			result = false;
		}
	}
	
	return result;
}

function isArray(obj) {
	if (obj.constructor.toString().indexOf("Array") == -1)
		return false;
	else
		return true;
}


function test_text(value, mess)
{
	result = true;
	//re = /^[\da-zA-Z \'\.\-\,]*$/ig;
	re = /^.*$/ig;
	//re = /^[\d\w ]*$/ig;
	if (value.search(re) == -1)
	{
		result = 'Field value have to consist of Latin characters or digits';
	}
	
	return result;
}


function test_notempty(value, mess)
{
	result = true;
	if (value.search(/[\d\w\-\А-Яа-я.]{1,}/ig) == -1)
	{
		result = 'Поле должно быть задано.';
	}
	return result;
}


function test_email(value, mess)
{
	result = true;
	if (value.search(/^[ ]*([_a-zA-Z\d\-\.]+@([_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+)){0,1}[ ]*$/ig) == -1)
	{
		result = 'Заполните корректно пожалуйста. Пример: jhon@yourdomain.com';
	}
	return result;
}


/*
function test_nonempty(value)
{
	result = true;
	if (value.search(/^[\d\w\-\.]{1,}$/ig) == -1)
	{
		result = 'Field value have to be set.';
	}
	return result;
}
*/