jsFormLiterate = function(){
	return {
		err_msg: 'Пожалуйста, заполните обязательное поле'
	}
}();

function checkEmail(elm){
	var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
	return emailPattern.test(elm.value);
}

function checkEmpty(elm){
	return (elm.value!='');
}

function createJSForm(id,data){
	//текущий id формы
	var formId = id;

	//установка событий
	if (data.initialize!=null){
		data.initialize();
	}

	//поля которые необходимо проверять
	var flds = (data.fields!=null)?data.fields:[];

	//@TODO поправить данный скрипт на более обобщённый случай
	$(".fval").keyup(function(){
		checkField(this)
	});
	$(".fval").blur(function(){
		checkField(this);
	});
	
	//установить новое событие submit
	var submit = (data.onSubmit!=null)?
									function(){
										dat = _gatherData();
										return defaultSubmit() && data.onSubmit({data:dat});
									}:defaultSubmit;
	$("#"+formId).submit(submit);
	
	function defaultSubmit(){
		var result = true;
		for (f in flds){
			var tmp = checkField(document.getElementById(flds[f].name));
			result = result && tmp;
		}
		return result;
	}

	var _gatherData = function(){
		var res = {};
		var inps = $('#' + formId + ' input');
		for (i = 0; i < inps.length; i++) {
			var nm = inps[i];
			var nam = $(nm).attr('name');
			res[nam] = $(nm).val();
		}
		inps = $('#' + formId + ' textarea');
		for (i=0; i<inps.length;i++){
			nm = inps[i];
			res[$(nm).attr('name')] = $(nm).val();
		}
		inps = $('#' + formId + ' select');
		for (i=0; i<inps.length;i++){
			nm = inps[i];
			res[$(nm).attr('name')] = $(nm).val();
		}
		return res;
	}

	var checkField = function(fld){
		var result = true;
		for (f in flds){
			if (flds[f].name==fld.id)	result = flds[f].func(fld);
		}
		var ni = $(fld).attr('id')+'_error';
		$('#'+ni).remove();
		if (!result){
			$(fld).addClass('error');
			$(fld).after('<span id="'+ni+'" class="error">'+jsFormLiterate['err_msg']+'</span>');
		}else{
			$(fld).removeClass('error');
		}
		return result;
	}

	function _setFields(flds){
		this.flds = flds;
	}

	return {
		setFields: _setFields,
		fields: flds,
		getData: _gatherData,
		onSubmit:""
	}
}

