var formvalidator = function (form) {
	var inputs = arguments[1] || $(form).find('input,select,textarea');
	var error = [];
	var exp = {
		'string':  /[а-яА-Яa-zA-ZёЁ \-]*/gi,
		'address': /[а-яА-Яa-zA-ZёЁ0-9 \Q#№,.`'-\/\E]*/gi,
		'number':  /[0-9\- ]*/gi,
		'mail':	   /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/gi,
		'site':	   /^(http:\/\/)?([\w\-]{2,}\.)+[\w]{2,4}(.*)?$/gi,
		'phone':   /^\+?[0-9\s\.\-\(\)]*$/gi,
		'class':   /^([1-9]|1[0-2])\s?[а-я]?$/gi,
		'login':   /^[a-zA-Z0-9][a-zA-Z0-9-_\.]+$/gi,
		'name':	   /^[^\s\t\n\r`~!@#$%\^&\*\(\)_\+=\\\|'";:<>\/,.]+$/ig
	};

	function parse(value) {
		var options_array = value.split('|');
		var options = {
			'require': 0,
			'type': 'all',
			'max': 0,
			'min': false,
			'text': ''
		};
		for (var i = 0; i < options_array.length; i++) {
			var values = options_array[i].split('=');
			options[values[0]] = values[1];
		}

		return options;
	}

	function pregmatch(value, type) {
		if (type == 'all') return true;
		if (value.match(exp[type])) {
			return value.match(exp[type]).join('') == value;
		} else {
			return false;
		}
	}

	inputs.each(function() {
		var node = this;

		var attr = $(node).attr('validate');

		if (node.disabled === false && typeof attr != "undefined") {
			var validate = parse(attr);

			switch (node.tagName) {
				case 'TEXTAREA':
				case 'INPUT':
					// даёт true если элемент обязателен, но нету
					requireCheck = validate.require == 1 && node.value.length == 0;
					// даёт true если элемент есть, но не соответствует типу
					typeCheck = node.value.length > 0 && !pregmatch(node.value, validate.type);
					// даёт true если элемент есть, но длиннее максимума
					maxCheck = node.value.length > 0 && validate.max > 0 && node.value.length > validate.max;
					// даёт true если элемент есть, но короче минимума
					minCheck = node.value.length > 0 && validate.min != false && node.value.length < validate.min;
					break;

				case 'SELECT':
					var value = node.options[node.selectedIndex].value;

					// даёт true если элемент обязателен, но нету
					requireCheck = validate.require == 1 && value.length == 0;
					// даёт true если элемент есть, но не соответствует типу
					typeCheck = value.length != 0 && !pregmatch(value, validate.type);
					// даёт true если элемент есть, но больше максимума
					maxCheck = typeof(value) != "undefined" && validate.max > 0 && value > validate.max;
					// даёт true если элемент есть, но меньше минимума
					minCheck = typeof(value) != "undefined" && validate.min != false && value < validate.min;
					break;
			}

			if (requireCheck || typeCheck || maxCheck || minCheck) {
				node.error_text = validate.text;
				error.push(node);
			}

			$(node).removeClass('err');
		}
	});

	if (error.length > 0) {
		$(error).each(function() {
			$(this).ShowAlert(this.error_text, false, true);
		});
		return false;
	} else {
		return true;
	}
};

var datevalidor = function(id) {
	var main_conteiner = $('#' + id);
	var year = main_conteiner.find('select[name=Date_Year]');
	var month = main_conteiner.find('select[name=Date_Month]');
	var day = main_conteiner.find('select[name=Date_Day]');

	if (day.val() < 1) {
		ShowAlert([ day.get(0), month.get(0), year.get(0) ], 'Выберите дату');
		return false;
	}

	if (month.val() < 1) {
		ShowAlert([ month.get(0), year.get(0), day.get(0) ], 'Выберите месяц');
		return false;
	}

	if (year.val() < 1) {
		ShowAlert([ year.get(0), month.get(0), day.get(0) ], 'Выберите год');
		return false;
	}

	var set_date = new Date(year.val(), month.val() - 1, day.val());
	if ((NOW - set_date) < 0) {
		ShowAlert([ month.get(0), year.get(0), day.get(0) ], 'Неправильно указана дата');
		//		$( [ year.get(0), month.get(0), day.get(0) ] ).ShowAlert( 'Неправильно указана дата' );
		return false;
	}

	return true;
};

var datevalidorArray = function(id, arr) {
	for (var x in arr) {
		var main_conteiner = $('#' + id);
		var year = main_conteiner.find('select[name=' + arr[x] + 'Year]');
		var month = main_conteiner.find('select[name=' + arr[x] + 'Month]');
		var day = main_conteiner.find('select[name=' + arr[x] + 'Day]');

		if (day.val() < 1) {
			ShowAlert([ day.get(0), month.get(0), year.get(0) ], 'Выберите дату');
			return false;
		}

		if (month.val() < 1) {
			ShowAlert([ month.get(0), year.get(0), day.get(0) ], 'Выберите месяц');
			return false;
		}

		if (year.val() < 1) {
			ShowAlert([ year.get(0), month.get(0), day.get(0) ], 'Выберите год');
			return false;
		}

		var set_date = new Date(year.val(), month.val() - 1, day.val());
		if ((NOW - set_date) < 0) {
			ShowAlert([ month.get(0), year.get(0), day.get(0) ], 'Неправильно указана дата');
			//		$( [ year.get(0), month.get(0), day.get(0) ] ).ShowAlert( 'Неправильно указана дата' );
			return false;
		}
	}
	return true;
};
