jQuery.extend($.fn, {
	validate: function() {
		$('.email-validator', this).keyup(function(){
			$.validator_email_check(this);
		});
		$('.text-validator', this).keyup(function(){
			$.validator_text_check(this);
		}).blur(function(){
			$.validator_text_check(this);
		});
		$('.phone-validator', this).keyup(function(){
			$.validator_phone_check(this);
		});
		$('.postcode-validator', this).keyup(function(){
			$.validator_postcode_check(this);
		});
		$('.int-validator', this).keyup(function(){
			$.validator_int_check(this);
		});
		$('.float-validator', this).keydown(function(event){
		  if($(this).hasClass('number-limit-7')) {
		    keyCode = event.keyCode;
        if((keyCode==null) || (keyCode==0) || (keyCode==8) || (keyCode==9) || (keyCode==13) || (keyCode==27) )
          return true; 
        if($(this).val().length>=7) {
          event.preventDefault();
          return false;
        }
      }		  
    }).blur(function(){
			$.validator_float_fix(this);
			if($(this).hasClass('number-limit-7')) {
        if($(this).val().length>=7) {
          $(this).val( $(this).val().substr($(this).val().length-7, 7) );
        }
      }
		});
		$('.checkbox-validator', this).change(function(){
			$.validator_checkbox_check(this);
		}).click(function(){
		  $.validator_checkbox_check(this);
    });
		$('.select-validator', this).change(function(){
			$.validator_select_check(this);
		});
		$('.repeat-password-validator', this).keyup(function(){
			$.validator_repeat_password_check(this);
		});
		$('.ajax-exist-validator', this).keyup(function(){
			$.validator_ajax_exist_check(this);
		}).blur(function(){
			$.validator_ajax_exist_check(this);
		});
		$('.check-link-validator', this).blur(function(){
			$.validator_check_link(this);
		});
		
		$(this).submit(function (){
			return $.validator(this);
		});
	}
});
var classToRemove = '.validator.positive, .validator.negative, .validator.loader';
//Wyświetlanie komunikatów
$.validatorClear = function(input) {
	$(input).parent().parent().parent().nextAll(classToRemove).remove();
}
$.validatorOk = function( input, message ) {
	$.validatorClear(input);
	$(input).parent().parent().parent().parent().append('<span class="validator positive">' + message + '</span>');
};
$.validatorError = function( input, message ) {
	$.validatorClear(input);
	$(input).parent().parent().parent().parent().append('<span class="validator negative">' + message + '</span>');
};
$.validatorLoader = function( input, message ) {
	$.validatorClear(input);
	$(input).parent().parent().parent().parent().append('<span class="validator loader">' + message + '</span>');
};
//Waliacja przyjzanego linku (konwersja nazwy tylko)
$.validator_check_link = function( input ) {
	if($(input).val()!='' && $("input[name='sLink']").val()=='') {
		$("input[name='sLink']").val(change2Url($(input).val()));
	}
	if($(input).val()!='' && $("input[name='sMetaTitle']").val()=='')
		$("input[name='sMetaTitle']").val($(input).val());
}
//Walidacja ajax
$.validator_ajax_exist_check = function( input ) {
	var type;
	var required = false;
	var minLenght = 6;
	var maxLenght = 100;
	var selfId = $("input[name='iId']").val();
	if($(input).attr('alt')!='') {
		var opt = $(input).attr('alt').split(':');
		type = opt[0];
		required = opt[1]=='required';
		minLenght = opt[2]!=undefined?opt[2]:minLenght;
		maxLenght = opt[3]!=undefined?opt[3]:maxLenght;
		selfId = opt[4]!=undefined?$(opt[4]).val():selfId;
		preCheck = opt[5]!=undefined?opt[5]:false;
	}
	if(required==true || $(input).attr('value')!='') {
		var	reS = /\s/gi;
		var checkStr = $(input).attr('value').replace(reS, "");
		if (checkStr.length==0) {
			$.validatorError( input, locale.RequiredFieldError );
			return false;
		} else if (checkStr.length < minLenght) {
			$.validatorError( input, locale.ToShortTextError );
			return false;
		} else if (checkStr.length > maxLenght) {
			$.validatorError( input, locale.ToLongTextError );
			return false;
		} else {
			if(preCheck!=false) {
				if(preCheck=='email') {
					if($.validator_email_check( input ) == false)
						return false;
				}
			}
			$.validatorLoader(input, locale.CheckingExistance);
			var response;
			$.ajax({
			      url: locale.AjaxURL + 'existence/type/' + type + '/value/' + checkStr + '/selfid/' + selfId,
			      global: false,
			      async: false,
			      type: "GET",
			      dataType: "json",
			      success: function(res){
					response=res;
			      }
			});
			if(response.exist) {
				if(preCheck=='email')
					$.validatorError( input, locale.EmailExistError );
				else
					$.validatorError( input, locale.ValueExistError );
				return false;
			} else {
				$.validatorOk( input, 'OK' );
				return true;
			}
			
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_ajax_exist = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_ajax_exist_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};
//Walidacja textu
$.validator_text_check = function( input ) {
	var required = false;
	var minLenght = 6;
	var maxLenght = 100;
	if($(input).attr('alt')!='') {
		var opt = $(input).attr('alt').split(':');
		required = opt[0]=='required';
		minLenght = opt[1]!=undefined?opt[1]:minLenght;
		maxLenght = opt[2]!=undefined?opt[2]:maxLenght;
	}		
	if(required==true || $(input).attr('value')!='') {
		var	reS = /\s/gi;
		var checkStr = $(input).attr('value').replace(reS, "");
		if (checkStr.length==0) {
			$.validatorError( input, locale.RequiredFieldError );
			return false;
		} else if (checkStr.length < minLenght) {
			$.validatorError( input, locale.ToShortTextError );
			return false;
		} else if (checkStr.length > maxLenght) {
			$.validatorError( input, locale.ToLongTextError );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_text = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_text_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};

//Walidacja adresu Email
$.validator_email_check = function( input ) {
	reEmail = /^[a-z0-9_.-]+([_\\.-][a-z0-9]+)*@([a-z0-9_\.-]+([\.][a-z]{2,4}))+$/i;
	if($(input).attr('alt')=='required' || $(input).attr('value')!='') {
		if ($(input).attr('value').search(reEmail) == -1) {
			$.validatorError( input, locale.BadEmailAddress );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_email = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_email_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};

//Walidacja numeru telefonu
$.validator_phone_check = function( input ) {
	rePhone = /^\(\d{3}\) \d{3}-\d{4}$/i;
	if($(input).attr('alt')=='required' || $(input).attr('value')!='') {
		if ($(input).attr('value').search(rePhone) == -1) {
			$.validatorError( input, locale.BadPhoneNumber );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_phone = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_phone_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};

//Walidacja kodu pocztowego
$.validator_postcode_check = function( input ) {
	rePostcode = /^\d{2}-\d{3}$/i;
	if($(input).attr('alt')=='required' || $(input).attr('value')!='') {
		if ($(input).attr('value').search(rePostcode) == -1) {
			$.validatorError( input, locale.BadPostCode );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}	
}
$.validator_postcode = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_postcode_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};

//Walidacja liczb całkowitych
$.validator_int_check = function( input ) {
	var	reInt = /^-?[0-9]{1,}$/i;
	if($(input).attr('alt')=='required' || $(input).attr('value')!='') {
		if ($(input).attr('value').search(reInt) == -1) {
			$.validatorError( input, locale.NotIntError );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_int = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_int_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};

//Walidacja liczb zmiennoprzecinkowych
$.validator_float_check = function( input ) {
	var	reFloat = /^-?[0-9]{1,}[.]{1}[0-9]{1,}$/i;
	if($(input).attr('alt')=='required' || $(input).attr('value')!='') {
		$(input).attr('value', $(input).attr('value').replace(/,/, "."));
		if ($(input).attr('value').search(reFloat) == -1) {
			$.validatorError( input, locale.NotFloatError );
			return false;
		} else {
			$.validatorOk( input, locale.OK );
			return true;
		}
	} else {
		$.validatorClear(input);
		return true;
	}
}
$.validator_float = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_float_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};
$.validator_float_fix = function( input ) {
  $(input).val($(input).val().replace(',', '.'));
	if ($(input).attr('value').search(/[.]/i) == -1) {
		if($(input).attr('value')=='')
			$(input).attr('value','0.00');
		else
			$(input).attr('value',$(input).attr('value') + '.00');
		$.validator_float_check(input);
	}
}


$.validator_checkbox_check = function( input ) {
	if ($(input).attr('checked') == false) {
		$.validatorError( input, locale.MustCheckThisField );
		return false;
	} else {
		$.validatorOk( input, locale.OK );
		return true;
	}
}
$.validator_checkbox = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if ($.validator_checkbox_check( inputs[i] ) == false)
			wynik = false;
	}
	return wynik;
};
// Walidacja selecta
$.validator_select_check = function( select ) {
	var zeroInclude = true;
	if($(select).attr('alt')!=undefined) {
		var opt = $(select).attr('alt').split(':');
		zeroInclude = opt[0]=='zeroInclude';
	}
	if( (!zeroInclude && $(select).attr('value')==0) || $(select).attr('value')=='') {
		$.validatorError( select, locale.MustChooseOption );
		return false;
	} else {
		$.validatorOk( select, locale.OK );
		return true;
	}
}

$.validator_select = function( selects ) {
	wynik = true;
	for (var i = 0; i<selects.length; i++) {
		if($.validator_select_check( selects[i] )==false)
			wynik = false;
	}
	return wynik;
}
// Walidacja powtórzonego hasła
$.validator_repeat_password_check = function( input ) {
	var opt = $(input).attr('alt').split(':');
	required = opt[0]=='required';
	if ($(input).attr('value')=='' && required == false && $('.pass-to-check').attr('value') == '') {
		$.validatorClear(input);
		return true;
	} else if ($(input).attr('value')=='' && required == false && $('.pass-to-check').attr('value') != '') {
		$.validatorError( input, locale.RepeatPasswordError );
		return false;
	} else if ($(input).attr('value')=='') {
		$.validatorError( input, locale.RequiredFieldError );
		return false;
	} else if($(input).attr('value') != $('.pass-to-check').attr('value')) {
		$.validatorError( input, locale.RepeatPasswordError );
		return false;
	} else {
		$.validatorOk( input, locale.OK );
		return true;
	}
}

$.validator_repeat_password = function( inputs ) {
	wynik = true;
	for (var i = 0; i<inputs.length; i++) {
		if($.validator_repeat_password_check( inputs[i] )==false)
			wynik = false;
	}
	return wynik;
}

//Klasa walidatora
$.validator = function( form ) {

	var wynik = true;
	if ($.validator_email($('.email-validator', $(form))) == false)
		wynik = false;
	if ($.validator_text($('.text-validator', $(form))) == false)
		wynik = false;
	if ($.validator_phone($('.phone-validator', $(form))) == false)
		wynik = false;
	if ($.validator_postcode($('.postcode-validator', $(form))) == false)
		wynik = false;
	if ($.validator_int($('.int-validator', $(form))) == false)
		wynik = false;
	if ($.validator_float($('.float-validator', $(form))) == false)
		wynik = false;
	if ($.validator_checkbox($('.checkbox-validator', $(form))) == false)
		wynik = false;
	if ($.validator_select($('.select-validator', $(form))) == false)
		wynik = false;
	if ($.validator_repeat_password($('.repeat-password-validator')) == false)
		wynik = false;
	if ($.validator_ajax_exist($('.ajax-exist-validator')) == false)
		wynik = false;
	
	if(!wynik) {
		prepareDialog(locale.FormError, 'warning', locale.CheckFormError);
		$("#dialog").dialog({
			bgiframe: true,
			modal: true,
			closeOnEscape: false,
			buttons: {
				Ok: function() {
					$(this).dialog('destroy');
				}
			},
			close: function(event, ui) {
				$(this).dialog('destroy');
			}

		});
	}
	
	if($(form).hasClass('confirm_form')) {
		wynik = false;
		prepareDialog(locale.AreYouSure, 'question', locale.AreYouSure);
		var buttons = Object();
		buttons[locale.No] = function() {
			$(this).dialog('destroy');
		};
		buttons[locale.Yes] = function() {
			$(form).removeClass('confirm_form');
			$(form).submit();
		};
		$("#dialog").dialog({
			bgiframe: true,
			modal: true,
			closeOnEscape: false,
			buttons: buttons,
			close: function(event, ui) {
				$(this).dialog('destroy');
			}
		});
	}
	
	return wynik;
};

function change2Url(txt) {
	
	var fromChar = [/\s/g, /\./g, /ą/ig, /ę/ig, /ę/ig, /ó/ig, /ś/ig, /ł/ig, /ż/ig, /ź/ig, /ć/ig, /ń/ig];
	var toChar = ['-', '-', 'a', 'e', 'o', 's', 'l', 'z', 'z', 'c', 'n'];
	for ( var i in fromChar )
		txt = txt.replace(fromChar[i], toChar[i]);
	
	var remChar = [/[^a-zA-Z0-9\-]/g];
	for ( var i in remChar )
		txt = txt.replace(remChar[i], '');
	txt = txt.replace(/^\-\-*/, '').replace(/\-\-*$/, '');
	return txt.toLowerCase();
}
