(function($) {
	$.fn.formValidate = function(options){
		
		var self = this;
		
		options = jQuery.extend({
			upload: null
		}, options);
		
		// Метод проверки даты
		jQuery.validator.addMethod("dateT", function(value, element) {
			var elm = $("select", $(element).parent().get(0));
			for(i=0; i<elm.length; i++)
				if(!$(elm[i]).val())
					return false;
			return true;
		}, jQuery.validator.messages.required);
		
		jQuery.validator.addMethod("lettersonly", function(value, element) {
			return this.optional(element) || /^[a-zA-Z\.\-\*\(\)\:]+$/i.test(value);
		}, "Letters only please");

		jQuery.validator.addMethod("login", function(value, element) {
			var result = true;
			if(!value.length) {
				result = false;
			} else if(value.length < 4) {
				result = false;
			} else if(!/^[a-z]+[a-z0-9]*[\._-]?[a-z0-9]+$/i.test(value)) {
				result = false;
			} else if(value.length > 50) {
				result = false;
			}

			return result;

		}, jQuery.validator.messages.user_login_letters);
		
		// Метод проверки расширения файла
		jQuery.validator.addMethod("ext", function(value, element) {
			value = value.toLowerCase();
			if(value.length && $(element).attr('ext')){
				var dot = value.lastIndexOf(".");
				if (dot > 0) {
					$(element).attr('mask')
					var ext = value.substr(dot, value.length).replace(new RegExp("^[.]+", "g"), "");
					var arr = $(element).attr('ext').split('|');
					var res = false;
					for(e in arr) {
						if(arr[e] == ext)
							res = true;
					}
					return res;
				}
			}
			return true;
		}, jQuery.validator.messages.file_ext);
		
		// Инициализируем плагин validate
		this.validate({
			rules: {
				captcha: {
					required: true,
					remote: "/framework/server/Utils/CaptchaHandler.php"
				},
				user_login: {
					required: true,
					login: true,
					remote: {
						url: "/user/check/",
						type: "post",
						data: {
							key: "user_login", 
							val: function() {
								return $("#user_login").val();
							}
						}
					}
				}
			},
			error: function(element, message) {
				if ($(element).attr('class') != 'multiUpload') {
					
					$(element).parents('div.input_layer, div.input_box').removeClass('valid').addClass('invalid');
					if (jQuery.fn.jtooltip) {
						var parent = $(element).parents('div.input_layer, div.input_box');
						if(parent.find('.jtooltip').length);
							parent.find('.jtooltip').remove();
						parent.jtooltip({
							message: message
						});
					}
				}
			},
			success: function(element, message) {
				if ($(element).attr('class') != 'multiUpload') {
					$(element).parents('div.input_layer, div.input_box').removeClass('invalid').addClass('valid');
					if (jQuery.fn.jtooltip) {
						$(element).parents('div.input_layer, div.input_box').find('div.jtooltip').hide();
					}
				}
			},
			messages: {
				captcha: jQuery.validator.messages.captcha,
				user_login: {
					required: jQuery.validator.messages.required,
					login: jQuery.validator.messages.user_login_letters,
					remote: jQuery.validator.messages.user_login
				}
			},
			label: false
		});
		
		var check = null;
		
		$(":input", this).each(function() {
			if (typeof(tinyMCE) != 'undefined') {
				
				if (this.type == 'submit') {
					this.onclick = function(){
						$(":input", self).each(function(){
							if (this.type == 'textarea') {
								var tarea = tinyMCE.get(this.id);
								if (typeof(tarea) != 'undefined') 
									this.value = tarea.getContent();
							}
						});
					}
				}
			}
			
			// Добавляем маску
			if ($(this).attr('mask')) {
				$(this).mask($(this).attr('mask'));
			}
			
			// Если есть функция сравнения и тип поля password
			if(this.type.toLowerCase() == 'password' && $(this).attr('equalTo')) {
				
				var field = $($(this).attr('equalTo'));
				
				$(field).keyup(function() {
				
					// Если длина текста больше то получаем степень защищености пароля
					if ($(this).attr('minlength') <= $(this).val().length) {
						var res = passwordStrength($(this).val());
						
						$(field).parent().removeClass('invalid').addClass('valid');
						
						// Отображаем div с цветом защищености пароля
						$('#pass_meter').attr('class', res.type).show();
						
					}
					else {
						$(field).parent().removeClass('valid').addClass('invalid');
						$('#pass_meter').hide();
					}
				});
			}
				
			if($(this).attr('captcha')){
				$("#refreshimg").click(function() {
					$("#captchaimage").attr("src", '/framework/server/Utils/Captcha.php?' + new Date().getTime());
					return false;
				});
			}
			
			if($(this).attr('type') && $(this).attr('type') == 'text' && $(this).val())
				check = true;
		});
		
		if(check)
			$(this).valid()
		
		return this;
	}
})(jQuery);
