jQuery(function ($) {
	$.fn.validate = function (options) {
		var opt = $.extend({
			requiredClass: 'required', 			// class for required
			errorClass: 'error', 				// class of not valid input/texta
			focusClass: 'focus', 				// class of focused input/texta
			errorMsgShow: true, 				// msg next to input
			
			msgEmpty: 'Kötelező',
			msgNotValid: 'A formátum nem megfelelő',
			
			eventSubmit: true, 					// validate when submitted
			eventBlur: false, 					// validate when input blured
			eventKeyup: false, 					// validate on typing
			eventTriggerObj: false,			// jquery selector to validate
			
			alertTarget: 'alert', 				// jquery selector / alert / console
			alertMsg: 'Kérjük nézze át az űrlapot, mert nincs megfelelően kitöltve.',
			
			hideType: 'button', 				// button/auto/link
			hideMsg: 'OK', 						// only if hideType is button or link
			showEffect: 'slideDown',
			hideEffect: 'slideUp',
			hideTime: 'slow',
			hideDelay: 1000						// only if hideTpye is auto
		},options)
		
		var rex = {
			clear: /^[\w\d]+$/,
			name: /^[a-zA-ZáéíóöőúüűÁÉÍÓÖŐÚÜŰ \.\:\-\(\)'"]{4,}$/i,
			number: /^[\d]+$/,
			phone: /^[\d-\/\+ \(\)]{7,}$/,
			text: /.+/i,
			email: /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i,
			url: /^(?:https?|s?ftp|telnet|ssh|scp):\/\/(?:(?:[\w]+:)?\w+@)?(?:(?:(?:[\w-]+\.)*\w[\w-]{0,66}\.(?:[a-z]{2,6})(?:\.[a-z]{2})?)|(?:(?:25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})))(?:\:\d{1,5})?(?:\/(~[\w-_.])?)?(?:(?:\/[\w-_.]*)*)?\??(?:(?:[\w-_.]+\=[\w-_.]+&?)*)?$/i
		}
		
		function checkInput(inputValue, check) {
			var test = rex[check].test(inputValue);
			return test;
		}
		
		function webbelValidate(obj,alertE){
			var r = true
			var inputs = obj.find('input,textarea')
			inputs.each(function(){
				// check required
				$(this).parent().children('span.errormsg').remove()
				if ($(this).attr('type')!='hidden'){
					if ($(this).hasClass( opt.requiredClass ) && $(this).val().replace(/^[\s]+$/,'').length==0) { 
						$(this).addClass( opt.errorClass )
						if (opt.errorMsgShow){ $(this).after('<span class="message">'+opt.msgEmpty+'</span>') }
						r = false
					}
					if ($(this).val().replace(/\s/,'').length>0){
						for (var i in rex){
							if (!$(this).hasClass('false') && $(this).hasClass(i)) {
								if (!checkInput( $(this).val(), i)){ 
									$(this).addClass( opt.errorClass )
									if (opt.errorMsgShow){ $(this).after('<span class="errormsg">'+opt.msgNotValid+'</span>') }
									r = false
								}
							}
						}
					}
				} else {
					if ($(this).hasClass('validate') && $(this).val()!='') { r = false; alert( 'Ön egy robot.' ); }
				}
			})
			if (!r && alertE){
				switch (opt.alertTarget){
					case 'alert': alert( opt.alertMsg ); break;
					case 'console': if (console!=undefined){ console.log( opt.alertMsg ); }; break;
					default: 
						var alertObj = $( opt.alertTarget )
						alertObj.text( opt.alertMsg )
						var hideObj
						
						if (opt.hideType=='button'){
							hideObj = $('<input type="button">')
							hideObj.val(opt.hideMsg)
						}
						if (opt.hideType=='link'){
							hideObj = $('<a href="#">')
							hideObj.text(opt.hideMsg)
						}
						
						if (hideObj!=undefined){
							hideObj.click(function(){
								eval( '$(this).parent().'+opt.hideEffect+'( opt.hideTime )' )
							})
							alertObj.append( hideObj )
						}
						//alertObj.show()
						eval( 'alertObj.'+opt.showEffect+'(opt.hideTime)' )
						
						if (opt.hideType=='auto'){
							alertObj.delay(opt.hideDelay)
							eval( 'alertObj.'+opt.hideEffect+'(opt.hideTime)' )
						}
				}
			}
			return r;
		}
		
		$(this).each(function(){
			$(this).find('input:not(:radio, :checkbox, :button, :submit),textarea').focus(function(){ 
				$(this).removeClass(opt.errorClass); 
				$(this).parent().children('span.errormsg').remove()
				$(this).addClass(opt.focusClass);
			});
			
			$(this).find('input:not(:radio, :checkbox, :button, :submit),textarea').blur(function(){ 
				$(this).removeClass(opt.focusClass); 
			});
			
			var form = $(this)

			if (opt.eventSubmit){ form.submit(function(){ return webbelValidate( form, true ) }) }
			if (opt.eventBlur){ form.find('input:not(:radio, :checkbox, :button, :submit),textarea').blur(function(){ webbelValidate( form, false) }) }
			if (opt.eventTriggerObj!=false){ 
				opt.eventTriggerObj.click(function(){ webbelValidate( form, true) }) 
			}
		})
		
		
	}
})