$(document).ready(function(){
	// apply form validator
	jQuery.validator.addClassRules({
		alphabet:{
			alphabet: true
		},
		alphanumeric:{
			alphanumeric: true
		},
		unique:{
			required: true,
			uniqueData: true
		},
		uniqueemail:{
			required: true,
			validateEmail: true,
			uniqueData: true
		},
		validateemail:{
			validateEmail: true
		},
		decimal:{
			number: true,
			decimal: true
		},
		atleastone:{
			atleastone: true
		},
		mobile:{
			mobile: true
		}
	});
	jQuery.validator.addMethod("validateEmail", function(value, element) {
		var reg=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
		return this.optional(element) || reg.test(String(value).toLowerCase());
	}, "Please enter a valid email address.");
	jQuery.validator.addMethod('decimal', function(value, element) {
		return this.optional(element) || /^((\d+(\\.\d{0,2})?)|((\d*(\.\d{1,2}))))$/.test(value);
	}, "Please enter a correct decimal number, format 0.00");
	jQuery.validator.addMethod('alphanumeric', function(value, element) {
		return this.optional(element) || /^([a-zA-Z0-9\. _-]*)$/.test(value);
	}, "Please enter a correct data, allowed only a-z, A-Z, 0-9, Space, Underscore, dash and dot");
	jQuery.validator.addMethod('alphabet', function(value, element) {
		return this.optional(element) || /^([a-zA-Z ]*)$/.test(value);
	}, "Please enter a correct data, allowed only a-z, A-Z, and Space");

	jQuery.validator.addMethod('mobile', function(value, element) {
		var countryVal = $('#country').val() || 1;
        var indNumb = /^[6-9]\d{9}$/;
        var othNumb = /^[0-9]\d{6,12}$/;
		if (countryVal == 1) {
			return this.optional(element) || indNumb.test(value);
		}
		else {
			return this.optional(element) || othNumb.test(value);
		}
	}, "Please enter a valid mobile number");
	
	jQuery.validator.addMethod("greaterThan", function(value, element, params) {
		if (!/Invalid|NaN/.test(new Date(value))) {
			return new Date(value) > new Date($(params).val());
		}
		return isNaN(value) && isNaN($(params).val()) || (Number(value) > Number($(params).val())); 
	},'Must be greater than {0}.');
	jQuery.validator.addMethod("atleastone", function(value, element, params) {
	   return jQuery(".atleastone:checkbox:checked").length > 0;
	},"You must select at least one!");

	jQuery.validator.addMethod('uniqueData', function(value, element) {
		var isSuccess = false;
		jQuery('#'+$(element).attr('id')).closest('div.input-icon').find('span').toggleClass('d-done, d-block');
		var fieldname = $(element).data('fieldname');
		$.ajax({
			type: "POST",
			url: ajaxurl+'/getData',
			data: {action:'validate', name:fieldname, value:value},
			dataType: 'json',
			async: false,
			headers: {
				'X-CSRF-TOKEN': _token
			},
			success: function(result)
			{
				var id = jQuery('input[name="data[id]"]').val() || 0;
				var rid = result.data[0] || -1;
				if (result.success && id != rid) isSuccess = false;
				else isSuccess = true;
				jQuery('#'+$(element).attr('id')).closest('div.input-icon').find('span').toggleClass('d-done, d-block');
			},
			failed: function(err)
			{
				jQuery('#'+$(element).attr('id')).closest('div.input-icon').find('span').toggleClass('d-done, d-block');
			}
		});
		return isSuccess;
	}, function(params, element) {
		var dmsg = $(element).data('msg-uniqueData') || ($(element).attr('id')+' already exist.Please enter another value.');
		return dmsg;
	});
	
	jQuery.validator.setDefaults({
		debug: false,
		onkeyup: false,
		ignore: [],
		errorElement: 'div',
		errorClass: 'is-invalid',  //'invalid-feedback',
		validClass: 'is-valid',  //'valid-feedback',
		errorPlacement: function (error, element) {
			$('#'+$.escapeSelector(error.attr('id'))).remove();
			error.addClass('invalid-feedback').removeClass('is-invalid');
			if (element.hasClass("select2-hidden-accessible")) { error.insertAfter(element.next('span.select2')); }
			else if (element.hasClass("datetimepicker-input")) { error.insertAfter($('#'+element.attr('id')+'_datetimepicker')); }
			else if (element.hasClass("datepicker")) { error.insertAfter($('#'+element.attr('id')).next('.input-group-append')); }
			else if (element.hasClass("custom-control-input")) { error.insertAfter($('.custom-control-error-block')); }
			else error.insertAfter(element);
		},
		highlight: function (element, errorClass, validClass) {
			var elem = $(element);
			if (elem.hasClass('select2-hidden-accessible')) {
				$('span[aria-labelledby="select2-'+elem.attr('id')+'-container"]').addClass(errorClass);
			} 
			if ( element.type === "radio" ) {
				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
			} else {
				elem.addClass( errorClass ).removeClass( validClass );
			}
		},
		unhighlight: function( element, errorClass, validClass ) {
			var elem = $(element);
			if (elem.hasClass('select2-hidden-accessible')) {
				$('span[aria-labelledby="select2-'+elem.attr('id')+'-container"]').removeClass(errorClass).addClass( validClass );
			}
			if ( element.type === "radio" ) {
				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
			} else {
				$( element ).removeClass( errorClass ).addClass( validClass );
			}
		},
		submitHandler: function(form) {
			form.submit();
		},
	});

	$('form[name^="dataForm"]').each(function() {
			$(this).validate();
	});
});
