var formvalidator = function (form, fields) {
	var inputs = fields || $(form).find('input,select,textarea');
	var error = [];
	var exp = {
			'string': /[а-яА-Яa-zA-ZёЁ \-]*/gi,
			'number': /[0-9\- ]*/gi,
			'mail': /^[-a-z0-9!#$%&\'*+\/=?^_<{|}~]+(\.[-a-zA-Z0-9!#$%&\'*+\/=?^_<{|}~]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$/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
	};
 
	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 );
		});
		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;
}