var form_handler = {};
form_handler.error_message = 'Nìkterá pole formuláøe jsou nesprávnì vyplnìna, nebo není vyplnìno nìkteré z povinných polí (oznaèené teèkou v pravém horním rohu).';
form_handler.init = function ()
{
	var forms = document.getElementsByTagName('form');

	for (var i = 0; i < forms.length; i++)
	{
		if (class_handler.has(forms[i], 'checkAJAX'))
		{
			event_handler.add(forms[i], 'submit', form_handler.checkAJAX);
		}
		else
		{
			event_handler.add(forms[i], 'submit', form_handler.checkForm);
		}

		var inputs = forms[i].getElementsByTagName('input');
		var texts = forms[i].getElementsByTagName('textarea');

		for (var j = 0; j < inputs.length; j++)
		{
			if (inputs[j].type == 'text' || inputs[j].type == 'password')
			{
				event_handler.add(inputs[j], 'blur', form_handler.checkField);
				event_handler.add(inputs[j], 'keyup', form_handler.checkField);
				event_handler.add(inputs[j], 'focus', form_handler.checkField);
				event_handler.add(inputs[j], 'change', form_handler.checkField);

				event_handler.add(inputs[j], 'blur', form_handler.fieldBlur);
				event_handler.add(inputs[j], 'focus', form_handler.fieldFocus);
			}
		}
	}
};
form_handler.buildRegExp = function (string)
{
	if (string)
	{
		return new RegExp("^[" + string + "]{1,}$");
	}

	return false;
};
form_handler.checkChars = function (string, re)
{
	if (string && re)
	{
		return (string.search(re) == -1) ? true : false;
	}

	return true;
};
form_handler.checkField = function (event)
{
	if (event.tagName)
	{
		field = event;
	}
	else
	{
		var event = event_handler.fix(event);
		var field = event.target;
	}

	var field_valid = true;

	var classes = class_handler.get(field);

	if (class_handler.has(field, 'required'))
	{
		field_valid = (field.value.length > 0) ? true : false;
	}

	var i = 0;
	while (field_valid && i < classes.length)
	{
		if (form_handler.default_value[classes[i]])
		{
			if ((event.type == 'focus') && event.target.value.length <= 0)
			{
				field.value = form_handler.default_value[classes[i]];
			}
			if (event.type == 'blur' && field.value == form_handler.default_value[classes[i]])
			{
				field.value = '';
			}
		}
		if (form_handler.field_type[classes[i]])
		{
			field_valid = (field.value.length > 0 && form_handler.checkChars(field.value, form_handler.field_type[classes[i]])) ? false : true;
		}
		i++;
	}

	(field_valid) ? class_handler.remove(field, 'invalid') : class_handler.add(field, 'invalid');

	return (field_valid) ? "valid" : "invalid";
};
form_handler.checkSilent = function (element)
{
	var inputs = element.getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++)
	{
		if (form_handler.checkField(inputs[i]) == 'invalid')
		{
			return false;
		}
	}

	var textareas = element.getElementsByTagName('textarea');
	for (var i = 0; i < textareas.length; i++)
	{
		if (form_handler.checkField(textareas[i]) == 'invalid')
		{
			return false;
		}
	}

	return true;
};
form_handler.checkAJAX = function (event)
{
	var event = event_handler.fix(event);

	if (!form_handler.checkForm(event))
	{
		return false;
	}

	var c = 0;
	var param = new Array();

	inputs = event.target.getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++)
	{
		if (inputs[i].tagName.toLowerCase() == 'radio' || inputs[i].tagName.toLowerCase() == 'checkbox')
		{
			if (inputs[i].checked == true || inputs[i].checked == 'true')
			{
				temp_field = new Array(inputs[i].name, inputs[i].value);
				param[c++] = temp_field;
			}
		}
		else
		{
			temp_field = new Array(inputs[i].name, inputs[i].value);
			param[c++] = temp_field;
		}
	}

	textareas = event.target.getElementsByTagName('textarea');
	for (var i = 0; i < textareas.length; i++)
	{
		temp_field = new Array(textareas[i].name, textareas[i].value);
		param[c++] = temp_field;
	}

	selects = event.target.getElementsByTagName('select');
	for (var i = 0; i < selects.length; i++)
	{
		temp_field = new Array(selects[i].name, selects[i].value);
		param[c++] = temp_field;
	}

	if (requester.loadURL('POST', form_handler.checkAJAX_script, param, false))
	{
		var response = requester.getXML();

		if (1 == 1)
		{
			return false;
		}
	}

	return true;
};
form_handler.checkForm = function (event)
{
	var event = event_handler.fix(event);

	if (!form_handler.checkSilent(event.target))
	{
		event.preventDefault();

		alert(form_handler.error_message);
		return false;
	}

	if (form_handler.checkSpecial)
	{
		if (!form_handler.checkSpecial())
		{
			event.preventDefault();

			return false;
		}
	}

	return true;
};
form_handler.fieldFocus = function (event)
{
	var event = event_handler.fix(event);

	if (!class_handler.has(event.target, 'focused'))
	{
		if (class_handler.has(event.target, 'required'))
		{
			class_handler.add(event.target, 'focused_reqired');
		}
		else
		{
			class_handler.add(event.target, 'focused');
		}
	}
};
form_handler.fieldBlur = function (event)
{
	var event = event_handler.fix(event);

	class_handler.remove(event.target, 'focused');
	class_handler.remove(event.target, 'focused_reqired');
};

/**
 * Predefined field types
 */
form_handler.field_type = new Array();
form_handler.field_type["numbers"] =						form_handler.buildRegExp("0123456789");
form_handler.field_type["integer"] =						new RegExp("^([-]|())([0123456789]{1,})$");
form_handler.field_type["float"] =							new RegExp("^([-]|())([0123456789]{1,})(()|(([\054])([0123456789]{1,})))$");

form_handler.field_type["safe_chars"] =					form_handler.buildRegExp("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_");

form_handler.field_type["alphabet_lowercase"] =	form_handler.buildRegExp("abcdefghijklmnopqrstuvwxyzáèïéìíòóø¹»úù»ý¾üöäëß ");
form_handler.field_type["alphabet_uppercase"] =	form_handler.buildRegExp("ABCDEFGHIJKLMNOPQRSTUVWXYZÁÈÏÉÌÍÒÓØ©«ÚÙ«Ý®ÜÖÄËß ");
form_handler.field_type["alphabet"] =						form_handler.buildRegExp("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáèïéìíòóø¹»úù»ý¾ÁÈÏÉÌÍÒÓØ©«ÚÙ«Ý®üöäëÜÖÄËß ");
form_handler.field_type["alphanumeric"] =				form_handler.buildRegExp("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáèïéìíòóø¹»úù»ý¾ÁÈÏÉÌÍÒÓØ©«ÚÙ«Ý®0123456789üöäëÜÖÄËß ");

form_handler.field_type["extended"] =						form_handler.buildRegExp("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáèïéìíòóø¹»úù»ý¾ÁÈÏÉÌÍÒÓØ©«ÚÙ«Ý®üöäëÜÖÄËß\n\r\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\072\073\074\075\076\077\100\134\137\140\173\175");

form_handler.field_type["phone_international"] =	new RegExp("^((([+][1-9][0-9]{2}([ ]{0,1}))|([0]{2}([ ]{0,1})[1-9][0-9]{2}([ ]{0,1})))|())([1-9]{1}[0-9]{2}([ ]{0,1})[0-9]{3}([ ]{0,1})[0-9]{3})$");

form_handler.field_type["url"] =								new RegExp("^([htt]+(p|s))|[ftp]+[:]\/\/[a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*\.[a-zA-Z]{2,4}(\/{1}[-_~&=\?\.a-z0-9\+%]*)*$");

form_handler.field_type["email"] =							new RegExp("^[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+@[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+\.[a-z]{2,4}$");

form_handler.field_type["us_date"] =						new RegExp("^(([0-9]{4})([-])((0[1-9])|(1[012]))([-])((0[1-9])|([12][0-9])|(3[01])))$");
form_handler.field_type["en_date"] =						new RegExp("^(([0-9]{4})([-])((0[1-9])|(1[012]))([-])((0[1-9])|([12][0-9])|(3[01])))$");

form_handler.field_type["us_datetime"] =				new RegExp("^((([0-9]{4})([-])((0[1-9])|(1[012]))([-])((0[1-9])|([12][0-9])|(3[01])))([ ]{1})(((0[0-9])|(1[0-9])|(2[0-3]))([:])([0-5][0-9])([:])([0-5][0-9])))$");
form_handler.field_type["en_datetime"] =				new RegExp("^((([0-9]{4})([-])((0[1-9])|(1[012]))([-])((0[1-9])|([12][0-9])|(3[01])))([ ]{1})(((0[0-9])|(1[0-9])|(2[0-3]))([:])([0-5][0-9])([:])([0-5][0-9])))$");

form_handler.field_type["cz_date"] =						new RegExp("^(((0[1-9]|[12][0-9]|3[01])([.])(0[13578]|10|12)([.])([1-2][0,9][0-9][0-9]))|(([0][1-9]|[12][0-9]|30)([.])(0[469]|11)([.])([1-2][0,9][0-9][0-9]))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([.])([1-2][0,9][0-9][0-9]))|((29)(\.|-|\/)(02)([.])([02468][048]00))|((29)([.])(02)([.])([13579][26]00))|((29)([.])(02)([.])([0-9][0-9][0][48]))|((29)([.])(02)([.])([0-9][0-9][2468][048]))|((29)([.])(02)([.])([0-9][0-9][13579][26])))$");
form_handler.field_type["cs_date"] =						new RegExp("^(((0[1-9]|[12][0-9]|3[01])([.])(0[13578]|10|12)([.])([1-2][0,9][0-9][0-9]))|(([0][1-9]|[12][0-9]|30)([.])(0[469]|11)([.])([1-2][0,9][0-9][0-9]))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([.])([1-2][0,9][0-9][0-9]))|((29)(\.|-|\/)(02)([.])([02468][048]00))|((29)([.])(02)([.])([13579][26]00))|((29)([.])(02)([.])([0-9][0-9][0][48]))|((29)([.])(02)([.])([0-9][0-9][2468][048]))|((29)([.])(02)([.])([0-9][0-9][13579][26])))$");

form_handler.field_type["time"] =								new RegExp("^(((0[0-9])|(1[0-9])|(2[0-3]))([:])([0-5][0-9]))$");

/**
 * Default values for fields (when empty - onfocus)
 */
form_handler.default_value = new Array();
form_handler.default_value['url'] = 'http://';
