");jQuery.ajax({type:"POST",url:getUrlForInPlaceEdit(),dataType:"html",data:{action:"frm_entries_edit_entry_ajax",post_id:postId,entry_id:entryId,id:formId,nonce:frm_js.nonce,fields:fields,exclude_fields:excludeFields,start_page:startPage},success:function(html){$cont.children(".frm-loading-img").replaceWith(html);$edit.removeClass("frm_inplace_edit").addClass("frm_cancel_edit");$edit.html(cancel);checkConditionalLogic("editInPlace");
if(typeof frmFrontForm.fieldValueChanged==="function")jQuery(document).on("change",'.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]',frmFrontForm.fieldValueChanged);checkFieldsOnPage(prefix+entryId);triggerEvent(document,"frmInPlaceEdit")}});return false}function getUrlForInPlaceEdit(){var url=frm_js.ajax_url,queryParams=getQueryParamsForInPlaceEdit();Array.prototype.forEach.call(Object.keys(queryParams),function(queryParamKey){url+=
-1===url.indexOf("?")?"?":"&";url+=queryParamKey+"="+queryParams[queryParamKey]});return url}function getQueryParamsForInPlaceEdit(){var queryParams,queryString,pairs,keysToSkip,length,i,pair,key,value;queryParams={};queryString=window.location.search.substring(1);pairs=queryString.split("&");keysToSkip=["action","start_page","nonce","post_id","entry_id","id","fields","doing_wp_cron"];length=pairs.length;for(i=0;i');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_destroy",
entry:entryId,nonce:frm_js.nonce},success:function(html){if(html.replace(/^\s+|\s+$/g,"")==="success"){var container=jQuery(document.getElementById(prefix+entryId));container.fadeOut("slow",function(){container.remove()});jQuery(document.getElementById("frm_delete_"+entryId)).fadeOut("slow");jQuery(document).trigger("frmEntryDeleted",[entryId])}else jQuery(document.getElementById("frm_delete_"+entryId)).replaceWith(html)}})}return false}function doEditInPlaceCleanUp(form){var entryIdField=jQuery(form).find('input[name="id"]');
if(entryIdField.length){var link=document.getElementById("frm_edit_"+entryIdField.val());if(isCancelLink(link))switchCancelToEdit(jQuery(link))}}function isCancelLink(link){return link!==null&&link.className.indexOf("frm_cancel_edit")>-1}function loadUniqueTimeFields(){var timeFields,i,dateField;if(typeof __frmUniqueTimes==="undefined")return;timeFields=__frmUniqueTimes;for(i=0;i0;i--)if(stars[i].matches("."+starClass)){stars[i].classList.remove("star-rating-hover");if(isSelected===""&&typeof selected!=="undefined"&&stars[i].getAttribute("for")==selected)isSelected=" star-rating-on";if(isSelected!=="")stars[i].className+=isSelected}}function clearStars(starGroup,noClearInput){var labels,input;labels=starGroup.querySelectorAll(".star-rating-on");if(labels&&labels.length)labels.forEach(function(el){el.classList.remove("star-rating-on")});
if(!noClearInput){input=starGroup.querySelector('input[type="radio"]:checked');if(input)input.checked=false}}function handleSliderEvent(){var i,c,fieldKey,currency;c=this.parentNode.children;for(i=0;i1)input=input.eq(0);input.trigger({type:"change",selfTriggered:true,frmTriggered:fieldKey})}function loadCustomInputMasks(){if(typeof __frmMasks==="undefined")return;var maskFields=__frmMasks;for(var i=0;i=0}function checkPasswordField(){var fieldId,fieldIdSplit,checks,
split,suffix,check,span;if(this.className.indexOf("frm_strength_meter")>-1){fieldId=this.name.substr(this.name.indexOf("[")+1).replace(/\]\[\d\]\[/,"-");if(fieldId[fieldId.length-1]==="]")fieldId=fieldId.substr(0,fieldId.length-1);fieldIdSplit=fieldId.split("-");if(fieldIdSplit.length===2)fieldId=fieldIdSplit[1]+"-"+fieldIdSplit[0];checks=passwordChecks();split=this.id.split("-");suffix=split.length>1&&!isNaN(split[split.length-1])?"-"+split[split.length-1]:"";for(check in checks){span=document.getElementById("frm-pass-"+
check+"-"+fieldId+suffix);addOrRemoveVerifyPass(checks[check],this.value,span)}}}function passwordChecks(){return{"eight-char":/^.{8,}$/,number:/\d/,uppercase:/[A-Z]/,lowercase:/[a-z]/,"special-char":/(?=.*[^a-zA-Z0-9])/}}function addOrRemoveVerifyPass(regEx,password,span){if(span!==null){var remove=regEx.test(password);if(remove)maybeRemovePassReq(span);else maybeRemovePassVerified(span)}}function maybeRemovePassReq(span){if(span.classList.contains("frm-pass-req")){span.classList.remove("frm-pass-req");
span.classList.add("frm-pass-verified")}}function maybeRemovePassVerified(span){if(span.classList.contains("frm-pass-verified")){span.classList.remove("frm-pass-verified");span.classList.add("frm-pass-req")}}function checkCheckboxSelectionLimit(){var limit=parseInt(this.getAttribute("data-frmlimit")),checked=this.checked;if(!limit)return;var allBoxes=jQuery(this).parents(".frm_opt_container").find('input[type="checkbox"]');if(limit>=allBoxes.length)return;var checkedBoxes=allBoxes.filter(function(){return this.checked});
if(checked){if(checkedBoxes.length>=limit)allBoxes.filter(function(){return!this.checked}).attr("disabled","disabled")}else allBoxes.prop("disabled",false)}function addTopAddRowBtnForRepeater(){jQuery('.frm_section_heading:has(div[class*="frm_repeat_"])').each(function(){var firstRepeatedSection=jQuery(this).find('div[class*="frm_repeat_"]').first()[0];var addButtonWrapper=document.createElement("div");addButtonWrapper.classList.add("frm_form_field","frm_hidden_container","frm_repeat_buttons","frm_hidden");
addButtonWrapper.append(firstRepeatedSection.querySelector(".frm_add_form_row").cloneNode(true));firstRepeatedSection.parentNode.insertBefore(addButtonWrapper,firstRepeatedSection)})}function maybeDisableCheckboxesWithLimit(){jQuery('input[type="checkbox"][data-frmlimit]:not(:checked)').each(function(){var limit=parseInt(this.getAttribute("data-frmlimit"));if(!limit)return;var allBoxes=jQuery(this).parents(".frm_opt_container").find('input[type="checkbox"]');if(limit>=allBoxes.length)return;var checkedBoxes=
allBoxes.filter(function(){return this.checked});if(limit>checkedBoxes.length)return;this.setAttribute("disabled","disabled")})}function checkQuantityFieldMinMax(input){var val=parseFloat(input.value?input.value.trim():0),max=input.hasAttribute("max")?parseFloat(input.getAttribute("max")):0,min=input.hasAttribute("min")?parseFloat(input.getAttribute("min")):0;if(isNaN(val))return 0;max=isNaN(max)?0:max;min=isNaN(min)?0:min<0?0:min;if(valmax){input.value=
max;return max}return val}function setHiddenProduct(input){input.setAttribute("data-frmhidden","1");triggerChange(jQuery(input))}function setHiddenProductContainer(container){if(container.innerHTML.indexOf("data-frmprice")!==-1)jQuery(container).find("input[data-frmprice], select:has([data-frmprice])").attr("data-frmhidden","1")}function setShownProduct(input){var wasHidden=input.getAttribute("data-frmhidden");if(wasHidden!==null){input.removeAttribute("data-frmhidden");triggerChange(jQuery(input))}}
function calcProductsTotal(e){var formTotals=[],totalFields;if(typeof __FRMCURR==="undefined")return;if(undefined!==e&&"undefined"!==typeof e.target&&("keyup"===e.type||"change"===e.type)){var el=e.target;if(el.hasAttribute("data-frmprice")&&el instanceof HTMLInputElement&&"text"===el.type)el.setAttribute("data-frmprice",el.value.trim())}totalFields=jQuery("[data-frmtotal]");if(!totalFields.length)return;totalFields.each(function(){var currency,formId,formatted,total=0,totalField=jQuery(this),$form=
totalField.closest("form"),isRepeatingTotal=isRepeatingFieldByName(this.name);if(!$form.length)return;formId=$form.find('input[name="form_id"]').val();currency=getCurrency(formId);if(typeof formTotals[formId]!=="undefined"&&!isRepeatingTotal)total=formTotals[formId];else{$form.find("input[data-frmprice],select:has([data-frmprice])").each(function(){var quantity,$this,price=0,isUserDef=false,isSingle=false;if(isRepeatingTotal&&!isRepeatingWithTotal(this,totalField[0]))return;if(this.hasAttribute("data-frmhigherpg")||
isProductFieldHidden(this))return;if(this.tagName==="SELECT"){if(this.selectedIndex!==-1)price=this.options[this.selectedIndex].getAttribute("data-frmprice")}else{isUserDef="text"===this.type;isSingle="hidden"===this.type;$this=jQuery(this);if(!isUserDef&&!isSingle&&!$this.is(":checked"))return;price=this.getAttribute("data-frmprice")}if(!price)price=0;else{price=preparePrice(price,currency);quantity=getQuantity(isUserDef,this);price=parseFloat(quantity)*parseFloat(price)}total+=price});if(!isRepeatingTotal)formTotals[formId]=
total}total=isNaN(total)?0:total;currency.decimal_separator=currency.decimal_separator.trim();if(!currency.decimal_separator.length)currency.decimal_separator=".";total=normalizeTotal(total,currency);totalField.val(total);triggerChange(totalField);total=formatCurrency(total,currency);formatted=totalField.prev(".frm_total_formatted");if(formatted.length<1)formatted=totalField.closest(".frm_form_field").find(".frm_total_formatted");if(formatted.length)formatted.html(total)})}function normalizeTotal(total,
currency){total=currency.decimals>0?Math.round10(total,currency.decimals):Math.ceil(total);return maybeAddTrailingZeroToPrice(total,currency)}function formatCurrency(total,currency){var leftSymbol,rightSymbol;total=maybeAddTrailingZeroToPrice(total,currency);total=maybeRemoveTrailingZerosFromPrice(total,currency);total=addThousands(total,currency);leftSymbol=currency.symbol_left+currency.symbol_padding;rightSymbol=currency.symbol_padding+currency.symbol_right;return leftSymbol+total+rightSymbol}function maybeRemoveTrailingZerosFromPrice(total,
currency){var split=total.split(currency.decimal_separator);if(2!==split.length||split[1].length<=currency.decimals)return total;if(0===currency.decimals)return split[0];return split[0]+currency.decimal_separator+split[1].substr(0,currency.decimals)}function addRteRequiredMessages(){var keys,length,index,key,field;if("undefined"===typeof __FRMRTEREQMESSAGES)return;keys=Object.keys(__FRMRTEREQMESSAGES);length=keys.length;for(index=0;index-1){quantity=this;return false}});return quantity}function getQuantityFields(elementObj,isRepeating){var quantityFields;if(isRepeating)quantityFields=elementObj.closest("form").find('[name^="'+elementObj.nameMatch+'"]'+"[data-frmproduct]");else quantityFields=elementObj.closest("form").find('[data-frmproduct]:not([id*="-"])');return quantityFields}function preparePrice(price,currency){var matches;if(!price)return 0;price=price+"";matches=price.match(/[0-9,.]*\.?,?[0-9]+/g);
if(null===matches)return 0;price=matches.length?matches[matches.length-1]:0;if(price){price=maybeUseDecimal(price,currency);price=price.replace(currency.thousand_separator,"").replace(currency.decimal_separator,".")}return price}function maybeUseDecimal(amount,currency){var usedForDecimal,amountParts;if(currency.thousand_separator=="."){amountParts=amount.split(".");usedForDecimal=2==amountParts.length&&2==amountParts[1].length;if(usedForDecimal)amount=amount.replace(".",currency.decimal_separator)}return amount}
function maybeAddTrailingZeroToPrice(price,currency){if("number"!==typeof price)return price;price+="";var pos=price.indexOf(".");if(pos===-1)price=price+".00";else if(price.substring(pos+1).length<2)price+="0";return price.replace(".",currency.decimal_separator)}function addThousands(total,currency){if(currency.thousand_separator)total=total.toString().replace(/\B(?=(\d{3})+(?!\d))/g,currency.thousand_separator);return total}function setAutoHeightForTextArea(){document.querySelectorAll(".frm-show-form textarea").forEach(function(element){var minHeight,
callback;if(typeof element.dataset.autoGrow==="undefined"||element.getAttribute("frm-autogrow"))return;minHeight=getElementHeight(element);element.style.overflowY="hidden";element.style.transition="none";callback=function(){adjustHeight(element,minHeight)};callback();element.addEventListener("input",callback);window.addEventListener("resize",callback);document.addEventListener("frmShowField",callback);element.setAttribute("frm-autogrow",1)})}function getElementHeight(element){var clone,container,
height;clone=element.cloneNode(true);clone.style.position="absolute";clone.style.left="-10000px";clone.style.top="-10000px";container=jQuery(element).closest(".frm_forms").get(0);container.appendChild(clone);height=clone.clientHeight;container.removeChild(clone);return height}function adjustHeight(el,minHeight){if(minHeight>=el.scrollHeight)return;el.style.height=0;el.style.height=Math.max(minHeight,el.scrollHeight)+"px"}function updateContentLength(){function onChange(e){var length,max,type,messageEl=
e.target.nextElementSibling,countEl=messageEl.querySelector("span");if(!countEl)return;type=messageEl.getAttribute("data-max-type");max=parseInt(messageEl.getAttribute("data-max"));if("word"===type)length=e.target.value.split(/\s+/).filter(function(word){return word}).length;else length=e.target.value.length;countEl.innerText=length;messageEl.classList.toggle("frm_limit_error",length>max)}document.addEventListener("input",function(e){var target;for(target=e.target;target&&target!=this;target=target.parentNode)if(target.matches("textarea")&&
target.nextElementSibling&&target.nextElementSibling.matches(".frm_pro_max_limit_desc")){onChange(e);break}},false)}function triggerEvent(element,eventType,data){var event;if("function"===typeof frmFrontForm.triggerCustomEvent){frmFrontForm.triggerCustomEvent(element,eventType,data);return}if(typeof window.CustomEvent==="function")event=new CustomEvent(eventType);else if(document.createEvent){event=document.createEvent("HTMLEvents");event.initEvent(eventType,false,true)}else return;event.frmData=
data;element.dispatchEvent(event)}function startOverButton(){function getInputs(formEl){return getInputsInFieldOnPage(formEl)}function resetInputs(formEl){var inputs=getInputs(formEl);function resetRepeater(repeatBtns){var repeater,items;repeater=repeatBtns.parentElement;items=repeater.querySelectorAll(".frm_repeat_sec, .frm_repeat_inline, .frm_repeat_grid");if(!items.length){currentlyAddingRow=false;repeatBtns.querySelector(".frm_add_form_row").click()}else if(items.length>1)items.forEach(function(item,
index){if(index)item.parentElement.removeChild(item)})}formEl.querySelectorAll(".frm_section_heading > .frm_repeat_buttons").forEach(resetRepeater);clearValueForInputs(inputs,"",true);inputs.forEach(function(input){if(input.disabled&&input.getAttribute("data-frmlimit"))input.removeAttribute("disabled")})}function isMultiPagesForm(formId){return document.getElementById("frm_page_order_"+formId)||document.querySelector("#frm_form_"+formId+'_container input[name="frm_next_page"]')}function reloadForm(formId,
formEl){formEl.classList.add("frm_loading_form");postToAjaxUrl(formEl,{action:"frm_load_form",form:formId,_ajax_nonce:frm_js.nonce},function(response){var idValueMapping;if(!response.success){console.log(response);return}idValueMapping=getDefaultValuesFromForm(formEl);jQuery(formEl.closest(".frm_forms")).replaceWith(response.data);setDefaultValues(idValueMapping);maybeShowMoreStepsButton();if("undefined"!==typeof __frmAjaxDropzone)window.__frmDropzone=__frmAjaxDropzone;checkConditionalLogic("pageLoad");
checkFieldsOnPage("frm_form_"+formId+"_container");triggerCompletedEvent(formId)},function(response){console.log(response)})}function getDefaultValuesFromForm(formEl){var inputs,values={};inputs=formEl.querySelectorAll("[data-frmval]");inputs.forEach(function(input){values[input.id]=input.getAttribute("data-frmval")});return values}function setDefaultValues(idValueMapping){Object.keys(idValueMapping).forEach(function(id){var input=document.getElementById(id);if(!input)return;input.setAttribute("data-frmval",
idValueMapping[id]);if("checkbox"===input.type||"radio"===input.type){if(input.value===idValueMapping[id])input.checked=true;return}input.value=idValueMapping[id]})}function hasSaveDraft(formEl){return!!formEl.querySelector(".frm_save_draft")}function deleteDraft(formId,formEl){postToAjaxUrl(formEl,{action:"frm_delete_draft_entry",form:formId,_ajax_nonce:frm_js.nonce})}function onClickStartOver(e){e.preventDefault();var formEl,formId,draftIdInput;formEl=e.target.closest("form");if(!formEl)return;
formId=formEl.querySelector('input[name="form_id"]').value;if(hasSaveDraft(formEl)){deleteDraft(formId,formEl);draftIdInput=formEl.querySelector('input[name="id"]');if(draftIdInput)draftIdInput.remove();formEl.querySelector('input[name="frm_action"]').value="create"}if(isMultiPagesForm(formId))reloadForm(formId,formEl);else{resetInputs(formEl);triggerCompletedEvent(formId)}}function triggerCompletedEvent(formId){triggerEvent(document,"frm_after_start_over",{formId:formId})}document.addEventListener("click",
function(e){var target;for(target=e.target;target&&target!=this;target=target.parentNode)if(target.matches(".frm_start_over")){onClickStartOver.call(target,e);break}},false)}function maybeShowMoreStepsButton(){var i,listWrappers,listWrapper,rootlineSteps,wrappingElementsCount,startIndex,hiddenSteps,showMoreButtonLi,showMoreButton,hiddenStepsWrapper,oldIE;listWrappers=document.getElementsByClassName("frm_rootline");copyRootlines(listWrappers);oldIE=isOldIEVersion(10);for(i=0;i1?rootlineSteps.length-wrappingElementsCount-3:0;hiddenSteps=[].slice.call(rootlineSteps,Math.max(startIndex,1),rootlineSteps.length-2);hiddenStepsWrapper=showMoreButtonLi.querySelector(".frm_rootline_hidden_steps");hiddenSteps.forEach(function(hiddenStep){hiddenStepsWrapper.appendChild(hiddenStep)});moveRootlineTitles(hiddenStepsWrapper,listWrapper,showMoreButton);listWrapper.insertBefore(showMoreButtonLi,listWrapper.children[listWrapper.children.length-1]);if(listWrapper.children[listWrapper.children.length-
1].className.indexOf("frm_current_page")!==-1)updateRootlineStyle(hiddenStepsWrapper)}}function isOldIEVersion(max){var version,myNav=navigator.userAgent.toLowerCase();version=myNav.indexOf("msie")!==-1?parseInt(myNav.split("msie")[1]):false;return version!==false&&max>=version}function countOverflowPages(rootlineSteps){var j,wrappingElementsCount=0;for(j=0;j-1)hiddenStepsWrapper.className=hiddenStepsWrapper.className.replace(" frm_hidden","");else hiddenStepsWrapper.className+=" frm_hidden"}function validateFieldValue(){document.addEventListener("frm_validate_field_value",function(event){if("object"!==typeof event.frmData.field||"object"!==typeof event.frmData.errors)return;if("password"===
event.frmData.field.type)validatePasswordStrength(event.frmData.field,event.frmData.errors)})}function validatePasswordStrength(field,errors){var check,regex,checks;if("object"!==typeof window.frm_password_checks)return;if(-1===field.className.indexOf("frm_strong_pass")||0===field.id.indexOf("field_conf_"))return;checks=window.frm_password_checks;for(check in checks){regex=checks[check].regex.slice(1,checks[check].regex.length-1);regex=new RegExp(regex);if(!regex.test(field.value)){errors[frmFrontForm.getFieldId(field)]=
checks[check].message;return}}}function maybeTriggerCalc(event){if(event.persisted||window.performance&&window.performance.getEntriesByType("navigation")[0].type==="back_forward")triggerCalc()}function showMoreStepsButtonEvents(){var timeout;window.addEventListener("resize",function(){var i,listWrappers,listWrapper,form;listWrappers=document.getElementsByClassName("frm_rootline");for(i=0;i-1){hidePreviouslyHiddenSubmitButton(hiddenFields[i]);
continue}}if(container!==null){container.style.display="none";setHiddenProductContainer(container)}}},submitAllowed:function(object){var formElementId=object.getAttribute("id");if(!isSubmitButtonOnPage(formElementId+" .frm_final_submit")||goingToPrevPage(object)||savingDraftEntry(object))return true;var formKey=getFormKeyFromFormElementID(formElementId);return!isOnPageSubmitButtonHidden(formKey)},checkDependentDynamicFields:function(ids){var len=ids.length,repeatArgs={repeatingSection:"",repeatRow:""};
for(var i=0,l=len;i0)for(var i=0,l=opts.length;i');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_update_field_ajax",entry_id:entryId,field_id:fieldId,value:value,nonce:frm_js.nonce},success:function(){if(message.replace(/^\s+|\s+$/g,"")==="")jQuery(document.getElementById("frm_update_field_"+entryId+
"_"+fieldId+"_"+num)).fadeOut("slow");else jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).replaceWith(message)}})};;
/**
* Observe how the user enters content into the comment form in order to determine whether it's a bot or not.
*
* Note that no actual input is being saved here, only counts and timings between events.
*/
( function() {
// Passive event listeners are guaranteed to never call e.preventDefault(),
// but they're not supported in all browsers. Use this feature detection
// to determine whether they're available for use.
var supportsPassive = false;
try {
var opts = Object.defineProperty( {}, 'passive', {
get : function() {
supportsPassive = true;
}
} );
window.addEventListener( 'testPassive', null, opts );
window.removeEventListener( 'testPassive', null, opts );
} catch ( e ) {}
function init() {
var input_begin = '';
var keydowns = {};
var lastKeyup = null;
var lastKeydown = null;
var keypresses = [];
var modifierKeys = [];
var correctionKeys = [];
var lastMouseup = null;
var lastMousedown = null;
var mouseclicks = [];
var mousemoveTimer = null;
var lastMousemoveX = null;
var lastMousemoveY = null;
var mousemoveStart = null;
var mousemoves = [];
var touchmoveCountTimer = null;
var touchmoveCount = 0;
var lastTouchEnd = null;
var lastTouchStart = null;
var touchEvents = [];
var scrollCountTimer = null;
var scrollCount = 0;
var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ];
var modifierKeyCodes = [ 'Shift', 'CapsLock' ];
var forms = document.querySelectorAll( 'form[method=post]' );
for ( var i = 0; i < forms.length; i++ ) {
var form = forms[i];
var formAction = form.getAttribute( 'action' );
// Ignore forms that POST directly to other domains; these could be things like payment forms.
if ( formAction ) {
// Check that the form is posting to an external URL, not a path.
if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) {
if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) {
continue;
}
}
}
form.addEventListener( 'submit', function () {
var ak_bkp = prepare_timestamp_array_for_request( keypresses );
var ak_bmc = prepare_timestamp_array_for_request( mouseclicks );
var ak_bte = prepare_timestamp_array_for_request( touchEvents );
var ak_bmm = prepare_timestamp_array_for_request( mousemoves );
var input_fields = {
// When did the user begin entering any input?
'bib': input_begin,
// When was the form submitted?
'bfs': Date.now(),
// How many keypresses did they make?
'bkpc': keypresses.length,
// How quickly did they press a sample of keys, and how long between them?
'bkp': ak_bkp,
// How quickly did they click the mouse, and how long between clicks?
'bmc': ak_bmc,
// How many mouseclicks did they make?
'bmcc': mouseclicks.length,
// When did they press modifier keys (like Shift or Capslock)?
'bmk': modifierKeys.join( ';' ),
// When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back
'bck': correctionKeys.join( ';' ),
// How many times did they move the mouse?
'bmmc': mousemoves.length,
// How many times did they move around using a touchscreen?
'btmc': touchmoveCount,
// How many times did they scroll?
'bsc': scrollCount,
// How quickly did they perform touch events, and how long between them?
'bte': ak_bte,
// How many touch events were there?
'btec' : touchEvents.length,
// How quickly did they move the mouse, and how long between moves?
'bmm' : ak_bmm
};
var akismet_field_prefix = 'ak_';
if ( this.getElementsByClassName ) {
// Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields.
var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' );
for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) {
var container = possible_akismet_containers.item( containerIndex );
if ( container.getAttribute( 'data-prefix' ) ) {
akismet_field_prefix = container.getAttribute( 'data-prefix' );
break;
}
}
}
for ( var field_name in input_fields ) {
var field = document.createElement( 'input' );
field.setAttribute( 'type', 'hidden' );
field.setAttribute( 'name', akismet_field_prefix + field_name );
field.setAttribute( 'value', input_fields[ field_name ] );
this.appendChild( field );
}
}, supportsPassive ? { passive: true } : false );
form.addEventListener( 'keydown', function ( e ) {
// If you hold a key down, some browsers send multiple keydown events in a row.
// Ignore any keydown events for a key that hasn't come back up yet.
if ( e.key in keydowns ) {
return;
}
var keydownTime = ( new Date() ).getTime();
keydowns[ e.key ] = [ keydownTime ];
if ( ! input_begin ) {
input_begin = keydownTime;
}
// In some situations, we don't want to record an interval since the last keypress -- for example,
// on the first keypress, or on a keypress after focus has changed to another element. Normally,
// we want to record the time between the last keyup and this keydown. But if they press a
// key while already pressing a key, we want to record the time between the two keydowns.
var lastKeyEvent = Math.max( lastKeydown, lastKeyup );
if ( lastKeyEvent ) {
keydowns[ e.key ].push( keydownTime - lastKeyEvent );
}
lastKeydown = keydownTime;
}, supportsPassive ? { passive: true } : false );
form.addEventListener( 'keyup', function ( e ) {
if ( ! ( e.key in keydowns ) ) {
// This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or...
return;
}
var keyupTime = ( new Date() ).getTime();
if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) {
if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) {
modifierKeys.push( keypresses.length - 1 );
} else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) {
correctionKeys.push( keypresses.length - 1 );
} else {
// ^ Don't record timings for keys like Shift or backspace, since they
// typically get held down for longer than regular typing.
var keydownTime = keydowns[ e.key ][0];
var keypress = [];
// Keypress duration.
keypress.push( keyupTime - keydownTime );
// Amount of time between this keypress and the previous keypress.
if ( keydowns[ e.key ].length > 1 ) {
keypress.push( keydowns[ e.key ][1] );
}
keypresses.push( keypress );
}
}
delete keydowns[ e.key ];
lastKeyup = keyupTime;
}, supportsPassive ? { passive: true } : false );
form.addEventListener( "focusin", function ( e ) {
lastKeydown = null;
lastKeyup = null;
keydowns = {};
}, supportsPassive ? { passive: true } : false );
form.addEventListener( "focusout", function ( e ) {
lastKeydown = null;
lastKeyup = null;
keydowns = {};
}, supportsPassive ? { passive: true } : false );
}
document.addEventListener( 'mousedown', function ( e ) {
lastMousedown = ( new Date() ).getTime();
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'mouseup', function ( e ) {
if ( ! lastMousedown ) {
// If the mousedown happened before this script was loaded, but the mouseup happened after...
return;
}
var now = ( new Date() ).getTime();
var mouseclick = [];
mouseclick.push( now - lastMousedown );
if ( lastMouseup ) {
mouseclick.push( lastMousedown - lastMouseup );
}
mouseclicks.push( mouseclick );
lastMouseup = now;
// If the mouse has been clicked, don't record this time as an interval between keypresses.
lastKeydown = null;
lastKeyup = null;
keydowns = {};
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'mousemove', function ( e ) {
if ( mousemoveTimer ) {
clearTimeout( mousemoveTimer );
mousemoveTimer = null;
}
else {
mousemoveStart = ( new Date() ).getTime();
lastMousemoveX = e.offsetX;
lastMousemoveY = e.offsetY;
}
mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) {
var now = ( new Date() ).getTime() - 500; // To account for the timer delay.
var mousemove = [];
mousemove.push( now - originalMousemoveStart );
mousemove.push(
Math.round(
Math.sqrt(
Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) +
Math.pow( theEvent.offsetY - lastMousemoveY, 2 )
)
)
);
if ( mousemove[1] > 0 ) {
// If there was no measurable distance, then it wasn't really a move.
mousemoves.push( mousemove );
}
mousemoveStart = null;
mousemoveTimer = null;
}, 500, e, mousemoveStart );
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'touchmove', function ( e ) {
if ( touchmoveCountTimer ) {
clearTimeout( touchmoveCountTimer );
}
touchmoveCountTimer = setTimeout( function () {
touchmoveCount++;
}, 500 );
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'touchstart', function ( e ) {
lastTouchStart = ( new Date() ).getTime();
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'touchend', function ( e ) {
if ( ! lastTouchStart ) {
// If the touchstart happened before this script was loaded, but the touchend happened after...
return;
}
var now = ( new Date() ).getTime();
var touchEvent = [];
touchEvent.push( now - lastTouchStart );
if ( lastTouchEnd ) {
touchEvent.push( lastTouchStart - lastTouchEnd );
}
touchEvents.push( touchEvent );
lastTouchEnd = now;
// Don't record this time as an interval between keypresses.
lastKeydown = null;
lastKeyup = null;
keydowns = {};
}, supportsPassive ? { passive: true } : false );
document.addEventListener( 'scroll', function ( e ) {
if ( scrollCountTimer ) {
clearTimeout( scrollCountTimer );
}
scrollCountTimer = setTimeout( function () {
scrollCount++;
}, 500 );
}, supportsPassive ? { passive: true } : false );
}
/**
* For the timestamp data that is collected, don't send more than `limit` data points in the request.
* Choose a random slice and send those.
*/
function prepare_timestamp_array_for_request( a, limit ) {
if ( ! limit ) {
limit = 100;
}
var rv = '';
if ( a.length > 0 ) {
var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) );
for ( var i = 0; i < limit && i < a.length; i++ ) {
rv += a[ random_starting_point + i ][0];
if ( a[ random_starting_point + i ].length >= 2 ) {
rv += "," + a[ random_starting_point + i ][1];
}
rv += ";";
}
}
return rv;
}
if ( document.readyState !== 'loading' ) {
init();
} else {
document.addEventListener( 'DOMContentLoaded', init );
}
})();;