jQuery( function( $ ) {
	//code when going to previous tab from a href with class next
	$('.previous').on('click', function(event) {
		var ph_form = $(this).closest('form');
		jQuery('#' + ph_form.id + '_feedback').html(''); 

		//var previous = $(this).closest('div').prev();
		var previous = $(this).closest('div[name^="fieldblock_"]').prevAll('div[name^="fieldblock_"][skip!="true"]').first();
		
		var current = $(this).closest('div[name^="fieldblock_"]');
		current.hide();
		previous.show();
		
		doFocusFirstElementFromFieldBlock(previous);

		resetLSP();

		return false;

		
	});

	//a11y after validation is done remove color from radio button that interperts still as error
	$('input[type="radio"]').on("click", function(){
		if (!$(this).hasClass("valid")) {
			$(this).closest('fieldset').find('input[type="radio"]').removeAttr("aria-invalid");	
		}
	});

    //code when going to a specifiek fieldblock group from the summary page off a href with class to_fb
	$('.to_fb').on('click', function() { 
		//feedback leegmaken
		var ph_form = $(this).closest('form');
		jQuery('#' + ph_form.id + '_feedback').html(''); 

		var foundId = $(this).attr("id").match(/\d+/);
		var toOpen = $('#fb_step_' + foundId);
		var current = $(this).closest('div').parent('div');
		current.hide();
		toOpen.show();

		doFocusFirstElementFromFieldBlock(toOpen);

		resetLSP();
		
		return false;
	}); 
	
	//Trigger om voor jquery direct de errors  er uit te halen.
	$('form select[id^=date-of-]').on('change', function( event ) {
		//jQuery(this).removeAttr('aria-invalid');
		if (jQuery(this).attr('name').search(/^date-of-([\w]+)-[\w]+/) >= 0 ) { 
			var name = 'date-of-' + jQuery(this).attr('name').match(/^date-of-([\w]+)-[\w]+/)[1];
			if (jQuery('#' + name + '-error').length) {
				var ph_form = jQuery(this).closest('form');
				if( jQuery(ph_form).find('select[id=' + name + '-day]').val() && 
						jQuery(ph_form).find('select[id=' + name + '-month]').val() && 
						jQuery(ph_form).find('select[id=' + name + '-year]').val() ) {
					jQuery(ph_form).find('select[id=' + name + '-day]').valid();
					jQuery(ph_form).find('select[id=' + name + '-month]').valid(); 
					jQuery(ph_form).find('select[id=' + name + '-year]').valid();	
					jQuery(ph_form).find('#' + name + '-error').remove();	
				}
			}
		}
	});

	$.validator.methods.required = function (value, element, param) {
		if (jQuery(element).attr('name').search(/^date-of-([\w]+)-[\w]+/) >= 0 ) { 
			var name = 'date-of-' + jQuery(element).attr('name').match(/^date-of-([\w]+)-[\w]+/)[1];
			var ph_form = jQuery(element).closest('form');
			return jQuery(ph_form).find('select[id=' + name + '-day]').val() && 
					jQuery(ph_form).find('select[id=' + name + '-month]').val() && 
					jQuery(ph_form).find('select[id=' + name + '-year]').val();		
		} 
		else {
			//onderstaand komt 1 op 1 uit de source van jquery, ik kreeg anders het niet goed voorelkaar
			// Check if dependency is met
			if ( !this.depend( param, element ) ) {
				return "dependency-mismatch";
			}
			if ( element.nodeName.toLowerCase() === "select" ) {

				// Could be an array for select-multiple or a string, both are fine this way
				var val = $( element ).val();
				return val && val.length > 0;
			}
			if ( this.checkable( element ) ) {
				return this.getLength( value, element ) > 0;
			}
			return value !== undefined && value !== null && value.length > 0;
		}
	}

	//add de jQuery validator with custom messages for requered fields. This is ph-forms wide but should for all fields the same and that's why i'm placeing it here.
	$.extend(jQuery.validator.messages, {
		required: function (param, input) {
			if (input.name == 'sig-dataUrl') {
				return "Handtekening is niet ingevuld.";
			}
			if (input.name.includes('anamneseQ')) {
				return "Er is geen keuze gemaakt voor 'anamnese'.";
			}	
			if (input.name == "referral") {
				return "Verwijzing is niet ingevuld.";
			}		
			if (input.name == "branch") {
				return "Vestiging is niet ingevuld.";
			}		
			if (input.name == "gender") {
				return "Geslacht is niet ingevuld.";
			}
			if (input.name == "verwijzing") {
				return "Verwijzing is niet ingevuld.";
			}	
			if (input.name == "stadiumzwanger") {
				return "Stadium zwangerschap is niet ingevuld.";
			} else if (input.name == "delivery") {
				return "Er is geen keuze gemaakt voor 'bezorgen'.";
			} 
			else if (input.name == "email") {
				return "Het e-mailadres is verkeerd ingevuld. Vul als volgt in: naam@domein.nl.";
			}
			else if (input.name == "pickuplocations") {
				return "Er is geen keuze gemaakt voor 'afhaallocatie'.";
			}
			else if (input.name == "permitmedhistory") {
				return "Er is geen keuze gemaakt voor 'toestemming medicatiehistorie'.";
			}
			else if (input.name == "uselabwaarden")	{
				return "Er is geen keuze gemaakt voor 'toestemming Labwaarden'.";
			}
			else if (input.name == "permitlsp") {
				return "Er is geen keuze gemaakt voor 'toestemming LSP'.";
			}	
			else if (input.name == "healthcares") {
				return "Er is geen keuze gemaakt voor 'Zorgverlener'.";
			}	
			else if (input.name == "mpreason[]") {
				return "Er is geen keuze gemaakt voor 'reden medicijnpaspoort'.";
			}			
			//sneaky groeperings functie. De error wordt 1 keer uit gespucht en in de higlight handler pas weggehaald wanneer alle velden actief zijn.
			else if (input.name.search(/^date-of-([\w]+)-[\w]+/) >= 0 ) { 
				if (input.name.match(/^date-of-([\w]+)-[\w]+/)[1] == 'birth') {
					return "'Geboortedatum' is niet ingevuld. Vul als volgt in: dd-mm-jjjj.";
				}
				if (input.name.match(/^date-of-([\w]+)-[\w]+/)[1] == 'departure') {
					return "Vertrekdatum is niet ingevuld.";
				}
				return "Datum is niet ingevuld.";
			}
			return "Het veld `" + $($("label[for='"+input.name+"']").contents().get(0)).text() + "` is niet ingevuld.";
		},
		email: function (param, input) {
			//for email alway this kind of error
			return "Het e-mailadres is verkeerd ingevuld. Vul als volgt in: naam@domein.nl.";
		},
		digits: function (param, input) {
			if (input.name.includes('housenumber')) {
				return "Het huisnummer is verkeerd ingevuld. Vul als volgt in: 11.";
			}
			if (input.name.includes('phone-local')) {
				return "Het nummer is verkeerd ingevuld. Vul als volgt in: 0123456789.";
			}
		},
		maxlength: function (param, input) {
			if (input.name.includes('phone-local')) {
				return "Het nummer is verkeerd ingevuld. Vul als volgt in: 0123456789.";
			}
		},
		minlength: function (param, input) {
			if (input.name.includes('phone-local')) {
				return "Het nummer is verkeerd ingevuld. Vul als volgt in: 0123456789.";
			}
		}	
	});

	jQuery.validator.addMethod("datepickercheck", function(value, element, param) {
		if (!jQuery('#datepickerwrapper').is(":visible")) {
			return true;
		}
		

		if (jQuery('#datepickerwrapper').is(":visible")) {
			if (document.querySelector('#datepickerhidden').value.length){
				return true;
			}
		} 
				
		//document.querySelector('div.inclusive-dates-calendar__body').setAttribute('data-rule-datepickercheck', 'true');
		//document.querySelector('div.inclusive-dates-calendar__body').setAttribute('aria-invalid', 'true');
		//document.querySelector('div.inclusive-dates-calendar__body').setAttribute('aria-describedby','datepickerhidden-error');

		return false;
    }, 'Er is geen datum geselecteerd.');

	jQuery.validator.addMethod("checksigsec", function(value, element, param) {
		return value && isMinorPatient();
    }, 'Handtekening ouders/voogd is niet ingevuld.');

	jQuery.validator.addMethod("nlpostalcode", function(value, element, param) {
		return value && /^[1-9][0-9]{3} ?(?![Ss][Aa]|[Ss][Dd]|[Ss][Ss])[A-Za-z]{2}$/.test(value);
    }, 'De postcode is verkeerd ingevuld. Vul als volgt in: 1234AB.');

	//toogletip setup aria-expanded and show hide bubble
		$('.toggletipbutton').on( "click", function() {
			$("#"+ $(this).data('id')).toggle();
			if ($(this).attr('aria-expanded') == "false") { 
				$(this).attr("aria-expanded","true");
			} 
			else {
				$(this).attr("aria-expanded", "false");
			}
			});

});

var isMinorPatient = function() {
	var birthdateday = jQuery('#date-of-birth-day').val();
	var birthdatemonth = jQuery('#date-of-birth-month').val();
	var birthdateyear = jQuery('#date-of-birth-year').val();
			
	dob = new Date(birthdateyear + '-' + birthdatemonth + '-' + birthdateday);
	var today = new Date();
	var age = Math.floor((today-dob) / (365.25 * 24 * 60 * 60 * 1000));
	if (age >= 12 && age <= 16) {
		return true;	
	}
	return false;
}

//https://stackoverflow.com/questions/10975408/generic-selection-using-jquery-validate
var defaultSubmitHandler = function (ph_form) {
	if (!jQuery('#LastSubmit').is(":visible")) {
		//ga naar het volgende tabblad
		var current = jQuery(ph_form).find('div[name^="fieldblock_"]:visible');
		//var next = jQuery(current).next();
		var next = jQuery(current).nextAll('div[name^="fieldblock_"][skip!="true"]').first();
		current.hide();
		//foutmeldingingen weghalen
		jQuery(ph_form).validate().resetForm();

		//hier nog input,select gebruiken?
		jQuery(ph_form).find('input[aria-invalid="true"]').each(function() {jQuery(this).removeAttr('aria-invalid');});
		next.show();
		if (jQuery(next).attr('name') == 'fieldblock_summary') {
			jQuery(next).find('.elementWrapper').hide();
			getAllValuesForSummary();
			//in samenvatting de focus op wijzingen
			jQuery('#to_fb_1').trigger('focus');
		} else {
			doFocusFirstElementFromFieldBlock(next);
		}
		return false;
	}

	//alleen submitten wanneer ook de catcha ok is.
	if(jQuery("div.phf_recaptcha").length > 0) {
		//captcha *container* exists
		if (!grecaptcha.getResponse()) {
			return false;
		}
	}

	//submit button disablen
	jQuery(ph_form).find('#LastSubmit').prop("disabled", true);
	startLoadingForms(ph_form);

	// serialize the form data				
	var ajax_form_data = jQuery('#' + ph_form.id).serialize();
	
	//add our own ajax check as X-Requested-With is not always reliable
	ajax_form_data = ajax_form_data+'&ajaxrequest=true&submit=Submit+Form';
	
	jQuery.ajax({
		url:    ajax_object.ajax_url, // domain/wp-admin/admin-ajax.php
		type:   'post',                
		data:   ajax_form_data
	})
	
	.done( function( response ) { // response from the PHP action
		window.location.replace(ajax_object.referer);
		//jQuery('#' + ph_form.id + '_feedback').html( "<h2>The request was successful </h2><br>" + response );
	})
	
	// something went wrong  
	.fail( function() {
		if (ph_form.id == 'afsprakenfrm') {
			jQuery('#afsprakenfrm_feedback').html('<div style=\"color: red;\"><p><strong>Fout opgetreden</strong></p><p>Er is helaas een technische fout opgetreden. Dit kan de volgende redenen hebben:</p><ul><li>Het ophalen van beschikbare tijdstippen lukt niet.</li><li>Het tijdstip dat u heeft gekozen is inmiddels niet meer beschikbaar.</li><li>De door u ingevoerde gegevens konden niet verstuurd worden.</li></ul><p>Kies een ander tijdstip of probeer het later opnieuw. Mocht dit ook niet lukken, neem dan contact op met de praktijk.</p></div>');
		}
		else {
			jQuery('#' + ph_form.id + '_feedback').html( "<h2 style=\"color: red;\">Het is helaas niet gelukt om het formulier succesvol te versturen. Controleer uw invoer, misschien bent u een verplicht veld vergeten (bv. Achternaam), en probeer het opnieuw. Wanneer het dan wederom niet lukt kunt u proberen het formulier via het menu weer even helemaal opnieuw in te laten vullen omdat dan uw sessie waarschijnlijk is verlopen. Excuses voor het ongemak.</h2>" );                  
		}
		jQuery(ph_form).find('#LastSubmit').prop("disabled", false);
		// toggleSpinner(ph_form)
		stopLoadingForms(ph_form);
	})

	// after all this time?
	.always( function() {
		//event.target.reset();
	});
	
	return false; // required to block normal submit since you used ajax
};

var defaultHighlightHandler = function(element, errorClass, validClass) {

	//hier zit bij ons stijling overheen, die willen we graag direct zien. ipv focus-in, focus-out
	jQuery(element).attr('aria-invalid', 'true');

	//when no aria-describedby than it's ok to go out of this function, but every field which shoul be validated should have this! 
	var old_aria_describedby = jQuery(element).attr("aria-describedby");
	if (!old_aria_describedby) {
		return true;
	}
	
	//make array
	old_aria_describedby = old_aria_describedby.split(" ");

	//get label of the error
	var errorLabel = jQuery(element).attr("id") + "-error";

	//get label of the info when available
	var infoLabel = jQuery(element).attr("id") + "-info";
	
	var new_aria_describedby = [];
	//if it's have a required-description save it for later use
	if (jQuery.inArray("required-description", old_aria_describedby) > -1) {
		new_aria_describedby.push("required-description");
		//filter it out so it's not double added later
		old_aria_describedby = old_aria_describedby.filter(function(item) {return item !== "required-description";});
	}
	//save the errorlabel for later user
	if (jQuery.inArray(errorLabel, old_aria_describedby) > -1) {
		new_aria_describedby.push(errorLabel);
		//filter it out so it's not double added later
		old_aria_describedby = old_aria_describedby.filter(function(item) {return item !== errorLabel;});
	}
	//save the infolabel when available for later user
	if (jQuery.inArray(infoLabel, old_aria_describedby) > -1) {
		new_aria_describedby.push(infoLabel);
		//filter it out so it's not double added later
		old_aria_describedby = old_aria_describedby.filter(function(item) {return item !== infoLabel;});
	}
	//push the rest of aria-describedby but they now alway on the end
	new_aria_describedby.push(old_aria_describedby);
	new_aria_describedby = new_aria_describedby.join(" ").trim(); //space delemetered and trimmed on the ends

	//add the new aria-descrbiedby with error and other fields presevered
	jQuery(element).attr("aria-describedby", new_aria_describedby);
}

var defaultSuccessHandler = function(label, element) {	
	//remove the error but keep all other aria-desribedby functions there.
	var new_aria_describedby = jQuery(element).attr("aria-describedby");
	new_aria_describedby = new_aria_describedby.split(" ");
	
	
	var errorLabel = jQuery(element).attr("id") + "-error";	
	new_aria_describedby = new_aria_describedby.filter(function(item) {
		return item !== errorLabel;
	});

	//verwijderen extra radio error
	var element_name = jQuery(element).attr('name');
	if (element_name == 'mpreason[]') {
		element_name = element_name.replace(/(:|\.|\[|\]|,|=|@)/g, "\\$1");
	} 
	var errorLabelId = element_name + "-error-0";
	if (jQuery('#' + errorLabelId).length) {
		jQuery('#' + errorLabelId).remove();	
	}

	//verwijderen verplichte datum velden
	if (jQuery(element).attr('name').search(/^date-of-([\w]+)-[\w]+/) >= 0 ) { 
		var name = 'date-of-' + jQuery(element).attr('name').match(/^date-of-([\w]+)-[\w]+/)[1];
		if (jQuery('#' + name + '-error').length) {
			var ph_form = jQuery(element).closest('form');
			if( jQuery(ph_form).find('select[id=' + name + '-day]').val() && 
					jQuery(ph_form).find('select[id=' + name + '-month]').val() && 
					jQuery(ph_form).find('select[id=' + name + '-year]').val() ) {
				jQuery(ph_form).find('#' + name + '-error').remove();	
			}
		}
	}

	new_aria_describedby = new_aria_describedby.join(" ").trim();


	if (new_aria_describedby.length == 0) {
		jQuery(element).removeAttr("aria-describedby");
	} else {
		jQuery(element).attr("aria-describedby", new_aria_describedby);
	}

	label.remove();
}

var defaultInvalidHandler = function(ph_form, validator) {
	var errors = validator.numberOfInvalids();
	if (errors) {                    
		validator.errorList[0].element.focus();
	}
} 

var defaultErrorPlacement = function(error, element) {
	if (element.attr('name').includes('datepickerhidden')) {
		error.attr('tabindex', 0);
		//error.insertBefore(jQuery('#datepickerhidden'));
		error.insertAfter(jQuery('label.inclusive-dates__label'));
	} else if (element.attr('name').includes('anamneseQ') || element.attr('name') == 'referral' || element.attr('name') == 'branch' || element.attr('name') == 'gender' || element.attr('name') == 'permitlsp' || element.attr('name') == 'stadiumzwanger' || element.attr('name') == 'delivery' || element.attr('name') == 'pickuplocations' || element.attr('name') == 'permitmedhistory' || element.attr('name') == 'uselabwaarden' || element.attr('name') == 'verwijzing' || element.attr('name') == 'mpreason[]') {
		var element_name = element.attr('name');
		if (element_name == 'mpreason[]') {
			element_name = element_name.replace(/(:|\.|\[|\]|,|=|@)/g, "\\$1");
		} 
		secondErrorElementId = element_name + '-error-0';

		if (!jQuery('#' + secondErrorElementId).length) {
			var myerror = jQuery(error).clone(false);
			jQuery(myerror).attr('aria-hidden', 'true');
			jQuery(myerror).attr('id', jQuery(myerror).attr('id') + '-0');
			//jQuery(myerror).attr('class', 'bla'); //moet een kopie worden van de bestaande error class maar mag geen error heten. Jquery validation haalt dit dan automatisch weg
			myerror.insertAfter('#' + element_name + '-achor');		
		}
		error.appendTo('#' + element_name + 'Legend');
		jQuery(error).addClass('visually-hidden');
	} else if (element.attr('name').search(/^date-of-([\w]+)-[\w]+/) >= 0 ) { //indexOf('date-of-birth-') >= 0) 
		var name = 'date-of-' + element.attr('name').match(/^date-of-([\w]+)-[\w]+/)[1];
		/*secondErrorElementId = 'date-of-birth-error';
		if (!jQuery('#' + secondErrorElementId).length) {
			var myerror = jQuery(error).clone(false);
			jQuery(myerror).attr('aria-hidden', 'true');
			jQuery(myerror).attr('id', secondErrorElementId);
			myerror.insertAfter('#date-of-birth-achor');		
		}*/
		secondErrorElementId = name + '-error';
		if (!jQuery('#' + secondErrorElementId).length) {
			var myerror = jQuery(error).clone(false);
			jQuery(myerror).attr('aria-hidden', 'true');
			jQuery(myerror).attr('id', secondErrorElementId);
			jQuery(myerror).attr('class', 'failure');
			myerror.insertAfter('#' + name + '-achor');		
		}
		error.appendTo('#' + name + 'Legend');

		jQuery(error).addClass('visually-hidden');	
	}
	else {
		error.insertAfter(element);
	}
}
/*invalidHandler: function (e, validator) {
	//https://stackoverflow.com/questions/11640189/jquery-validation-get-list-of-erroneous-fields-in-invalidhandler
	//validator.errorMap is an object mapping input names -> error messages
	for (var i in validator.errorMap) {
		alert(i);
		$('#' + i).focus();
	  break;
	  //console.log(i, ":", validator.errorMap[i]);
	}	
},*/

var fb_SummaryObject = {	
};

var getAllValuesForSummary = function() {
	Object.values(fb_SummaryObject).map(function(value) {
		if(typeof value === 'function') {
			value.call();
		}
	});
}

var defaultValidationSetting = {
	errorElement: 'span', //accessbility , normal label but that's not ok
	onfocusout: false,
	groups: { DateOfBirthGroup: "date-of-birth-day date-of-birth-month date-of-birth-year", DateOfDepartureGroup: "date-of-departure-day date-of-departure-month date-of-departure-year" },
	errorPlacement: defaultErrorPlacement,
	highlight: defaultHighlightHandler,
	success: defaultSuccessHandler,
	submitHandler: defaultSubmitHandler,
	invalidHandler: defaultInvalidHandler,
	ignore: ":hidden:not('.validated_hiddens')"
}

var getjQueryDateOfValueArray = function(name) {
	return [jQuery('#date-of-' + name + '-day').val(), jQuery('#date-of-' + name + '-month').val(), jQuery('#date-of-' + name +'-year').val()];
}

var getIndexDateOfValueArrayByLabel = function(label) {
	if (label.indexOf('-day') >= 0) return 0;
	if (label.indexOf('-month') >= 0) return 1;
	if (label.indexOf('-year') >= 0) return 2;
}

var toggleSummaryFieldValue = function(label, value, render = 'text') {
	//remark that for combine lines (adres en medication) this logic is not sufficient (on 1 line) but because the fields there are  all mantedory its fine now
	var showCompount = false;
	if (Array.isArray(value)) {
		if (!value.every(function(value) {if(!value) return true; return false;})) {
			//still show line even with empty value
			showCompount = true;
		}
		value = value[getIndexDateOfValueArrayByLabel(label)];
		if (!value) {
			value = '';
		}
	}
	if (value || showCompount)  {
		jQuery('#fb_' + label).closest('dd').show().prev('dt').show();
		if (render == 'text') {
			jQuery('#fb_' + label).text(value);
		} else if (render == 'img') {
			jQuery('#fb_' + label).attr('src', value);
		}
		else {
			jQuery('#fb_' + label).html(value);
		}
	}
	else {
		if (render == 'img') {
			jQuery('#fb_' + label).attr('src', ''); //pre-empty just to be sure
		} else {
			jQuery('#fb_' + label).text(''); //pre-empty just to be sure
		}
		jQuery('#fb_' + label).closest('dd').hide().prev('dt').hide();		
	}
}

var viewSummaryUpdate = function(fieldblockValue) {
	var viewSummary = atob(jQuery('input[name="frm_settings\\[viewSummary\\]"]').val());
	arrayViewSummary = [];
	if (viewSummary) {
		arrayViewSummary = viewSummary.split(",");
	}

	if (jQuery.inArray(fieldblockValue, arrayViewSummary) < 0) {
		arrayViewSummary.push(fieldblockValue);
	}

	viewSummary = btoa(arrayViewSummary.join(",").trim()); 

	jQuery('input[name="frm_settings\\[viewSummary\\]"]').val(viewSummary);
}

var disableDynamicFieldBlock = function(ph_form, fieldBlockNameArray) {
	for (i = 0; i < fieldBlockNameArray.length; i++) {
        //hide/skip dynamic fieldblocks
        //dan specificiek skippen
		//it is possible that certain fieldBlockName does not exitst anymore by merging modifictions and wijzigen, so check explicity check it
		if (jQuery(ph_form).find('div[name="fieldblock_' + fieldBlockNameArray[i] + '"]').length) {
        	jQuery(ph_form).find('div[name="fieldblock_' + fieldBlockNameArray[i] + '"]').attr('skip', 'true');
        	jQuery(ph_form).find('div[name="summary_' + fieldBlockNameArray[i] + '"]').hide();
        	jQuery(ph_form).find('input[name="skip\\['+ fieldBlockNameArray[i] + '\\]"]').val(true);
		}
    }	
}

var enableDynamicFieldBlock = function(ph_form, fieldBlockNameArray) {
	for (i = 0; i < fieldBlockNameArray.length; i++) {
        //hide/skip dynamic fieldblocks
        //dan specificiek skippen
		//it is possible that certain fieldBlockName does not exitst anymore by merging modifictions and wijzigen, so check explicity check it
		if (jQuery(ph_form).find('div[name="fieldblock_' + fieldBlockNameArray[i] + '"]').length) {
        	jQuery(ph_form).find('div[name="fieldblock_' + fieldBlockNameArray[i] + '"]').removeAttr('skip')
        	jQuery(ph_form).find('div[name="summary_' + fieldBlockNameArray[i] + '"]').show();
        	jQuery(ph_form).find('input[name="skip\\['+ fieldBlockNameArray[i] + '\\]"]').val(false);
		}
    }	
}


var changePagination = function (ph_form) {
	var nrSteps = jQuery(ph_form).find('div[name^="fieldblock_"][skip!="true"]').length;
	
	jQuery(ph_form).find('div[name^="fieldblock_"][skip!="true"]').each(function(index){
		var paginationObject = jQuery(this).find('span.paginationForm__step');
		
		var paginationText = paginationObject.text().trim().replace(/(\d+)(\D+)(\d+)/, (index+1) + '$2' + nrSteps );
 
		jQuery(this).find('span.paginationForm__step').text(paginationText);
 
	 });
}

var formInitAtReady = function (ph_form, disabledDynamicFieldBlockArray = [], validationSettings = defaultValidationSetting) {
	//hide all fields
    jQuery(ph_form).find('div[name^="fieldblock_"]').hide();

	if (disabledDynamicFieldBlockArray.length > 0) {
		//dynamic fieldblock zijn niet zichtbaar (geskipped) bij begin
		disableDynamicFieldBlock(ph_form, disabledDynamicFieldBlockArray);
    
		//pagination aanpassen
		changePagination(ph_form);
	}
	
   
    //eerste blok tonen en de previous button removen (dat is blijkbaar belangrijk wat bij hiden gaat dit niet goed!)
    jQuery(ph_form).find('div[name^="fieldblock_"][skip!="true"]').first().show().find('.ph-btn-previous').remove();
    
	//de validation on the form
	jQuery(ph_form).validate(validationSettings); 
}

var startLoadingForms = function(selector) {
    jQuery().Loading('start', {
        'target': '.spinner',
	    'startOnTimeout': false,
	    'showSpinner': true,
	    'spinnerPlacement': 'append',
	    'spinnerClass': 'loadingSpinner loadingSpinner-sm loadingSpinner-black',
	    'spinnerWrapperClass': 'loadingSpinnerWrapper-inline'
    });
}

var stopLoadingForms = function() {
    jQuery().Loading('stop', {
        'target': '.spinner',
        'overlayClass': 'loadingOverlay loadingOverlay-floated loadingOverlay-white',
    });
}

var doFocusFirstElementFromFieldBlock = function(fieldBlockObject) {
	jQuery(fieldBlockObject).find('input[type="text"],input[type="radio"],input[type="checkbox"],textarea,select').first().trigger('focus');
}

var signature = {};
var signature_sec = {};
var resetLSP = function () {
	if (jQuery('input[name="permitlsp"]').length) {
		if (!jQuery('input[name="permitlsp"]').is(":visible")) {
			jQuery('input[name="permitlsp"]').prop('checked', false);
			
			signature.clearCanvas();
			jQuery('#sigBlock').find('input[name="sig-dataUrl"]').removeAttr("aria-required data-rule-required");
			jQuery('#sigBlock').find('input[name="sig-dataUrl"]').removeClass('validated_hiddens');
			jQuery("#sigBlock").hide();

			signature_sec.clearCanvas();
			jQuery('#sigsecBlock').find('input[name="sigsec-dataUrl"]').removeAttr("aria-required data-rule-checksigsec");
			jQuery('#sigsecBlock').find('input[name="sigsec-dataUrl"]').removeClass('validated_hiddens');
			jQuery("#sigsecBlock").hide();
		}
	}
}