ajax-submission.js
2 years ago
ajax-submission.min.js
2 years ago
everest-forms.js
2 years ago
everest-forms.min.js
2 years ago
text-limit.js
6 years ago
text-limit.min.js
4 years ago
everest-forms.js
784 lines
| 1 | /* eslint-disable max-len */ |
| 2 | /* global everest_forms_params */ |
| 3 | jQuery( function ( $ ) { |
| 4 | 'use strict'; |
| 5 | |
| 6 | // everest_forms_params is required to continue, ensure the object exists. |
| 7 | if ( typeof everest_forms_params === 'undefined' ) { |
| 8 | return false; |
| 9 | } |
| 10 | |
| 11 | var getEnhancedSelectFormatString = function() { |
| 12 | return { |
| 13 | 'language': { |
| 14 | noResults: function() { |
| 15 | return everest_forms_params.i18n_no_matches; |
| 16 | } |
| 17 | } |
| 18 | }; |
| 19 | }; |
| 20 | |
| 21 | var everest_forms = { |
| 22 | $everest_form: $( 'form.everest-form' ), |
| 23 | init: function() { |
| 24 | this.init_inputMask(); |
| 25 | this.init_mailcheck(); |
| 26 | this.init_datepicker(); |
| 27 | this.init_datedropdown(); |
| 28 | this.load_validation(); |
| 29 | this.submission_scroll(); |
| 30 | this.randomize_elements(); |
| 31 | this.init_enhanced_select(); |
| 32 | this.checkUncheckAllcheckbox(); |
| 33 | this.validateMinimumWordLength(); |
| 34 | |
| 35 | // Inline validation. |
| 36 | this.$everest_form.on( 'input validate change', '.input-text, select, input:checkbox, input:radio', this.validate_field ); |
| 37 | |
| 38 | // Notify plugins that the core was loaded. |
| 39 | $( document.body ).trigger( 'everest_forms_loaded' ); |
| 40 | }, |
| 41 | init_inputMask: function() { |
| 42 | // Only load if jQuery inputMask library exists. |
| 43 | if ( typeof $.fn.inputmask !== 'undefined' ) { |
| 44 | $( '.evf-masked-input' ).inputmask(); |
| 45 | } |
| 46 | }, |
| 47 | init_mailcheck: function() { |
| 48 | // Only load if Mailcheck library exists and enabled. |
| 49 | if ( typeof $.fn.mailcheck === 'undefined' || ! everest_forms_params.mailcheck_enabled ) { |
| 50 | return; |
| 51 | } |
| 52 | |
| 53 | // Setup default domains for Mailcheck. |
| 54 | if ( everest_forms_params.mailcheck_domains.length > 0 ) { |
| 55 | Mailcheck.defaultDomains = Mailcheck.defaultDomains.concat( everest_forms_params.mailcheck_domains ); |
| 56 | } |
| 57 | |
| 58 | // Setup default top level domains for Mailcheck. |
| 59 | if ( everest_forms_params.mailcheck_toplevel_domains.length > 0 ) { |
| 60 | Mailcheck.defaultTopLevelDomains = Mailcheck.defaultTopLevelDomains.concat( everest_forms_params.mailcheck_toplevel_domains ); |
| 61 | } |
| 62 | |
| 63 | // Mailcheck suggestion. |
| 64 | $( document ).on( 'blur', '.evf-field-email input', function() { |
| 65 | var $el = $( this ), |
| 66 | id = $el.attr( 'id' ); |
| 67 | |
| 68 | $el.mailcheck( { |
| 69 | suggested: function( el, suggestion ) { |
| 70 | $( '#' + id + '_suggestion' ).remove(); |
| 71 | var suggestion_msg = everest_forms_params.i18n_messages_email_suggestion.replace( '{suggestion}', '<a href="#" class="mailcheck-suggestion" data-id="' + id + '" title="' + everest_forms_params.i18n_messages_email_suggestion_title + '">' + suggestion.full + '</a>' ); |
| 72 | if( el.parents( 'span.input-wrapper' ).length ) { |
| 73 | $( el ).parents( 'span.input-wrapper' ).after( '<label class="evf-error mailcheck-error" id="' + id + '_suggestion">' + suggestion_msg + '</label>' ); |
| 74 | }else { |
| 75 | $( el ).after( '<label class="evf-error mailcheck-error" id="' + id + '_suggestion">' + suggestion_msg + '</label>' ); |
| 76 | } |
| 77 | }, |
| 78 | empty: function() { |
| 79 | $( '#' + id + '_suggestion' ).remove(); |
| 80 | }, |
| 81 | } ); |
| 82 | } ); |
| 83 | |
| 84 | // Apply Mailcheck suggestion. |
| 85 | $( document ).on( 'click', '.evf-field-email .mailcheck-suggestion', function( e ) { |
| 86 | var $el = $( this ), |
| 87 | id = $el.attr( 'data-id' ); |
| 88 | e.preventDefault(); |
| 89 | $( '#' + id ).val( $el.text() ); |
| 90 | $el.parent().remove(); |
| 91 | } ); |
| 92 | }, |
| 93 | init_datepicker: function () { |
| 94 | var evfDateField = $( '.evf-field-date-time' ); |
| 95 | if ( evfDateField.length && evfDateField.find( '.flatpickr-field' ).length ) { |
| 96 | evfDateField.find( '.flatpickr-field' ).each( function () { |
| 97 | var timeInterval = 5, |
| 98 | inputData = $( this ).data(), |
| 99 | disableDates = []; |
| 100 | |
| 101 | var minDateRange = ''; |
| 102 | if( inputData.minDateRange ) { |
| 103 | minDateRange = 'today'; |
| 104 | if( 'today' === inputData.minDateRange ) { |
| 105 | minDateRange = minDateRange |
| 106 | } else if ( /^\s*[-+]?\d+\s*d/i.test( inputData.minDateRange ) ) { |
| 107 | minDateRange = inputData.minDateRange.match( /^\s*[-+]?\d+\s*d/i )[0].replace( 'd', '' ); |
| 108 | minDateRange = new Date().fp_incr( minDateRange ); |
| 109 | } else { |
| 110 | minDateRange = 'today'; |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | var maxDateRange = ''; |
| 115 | if( inputData.maxDateRange ) { |
| 116 | maxDateRange = 'today'; |
| 117 | if( 'today' === inputData.maxDateRange ) { |
| 118 | maxDateRange = maxDateRange |
| 119 | } else if ( /^\s*[-+]?\d+\s*d/i.test( inputData.maxDateRange ) ) { |
| 120 | maxDateRange = inputData.maxDateRange.match( /^\s*[-+]?\d+\s*d/i )[0].replace( 'd', '' ); |
| 121 | maxDateRange = new Date().fp_incr( maxDateRange ); |
| 122 | } else { |
| 123 | maxDateRange = ''; |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | // Extract list of disabled dates. |
| 128 | if ( inputData.disableDates ) { |
| 129 | disableDates = inputData.disableDates.split( ',' ); |
| 130 | } |
| 131 | |
| 132 | if(inputData.pastDisableDate){ |
| 133 | var pastDisableDate = inputData.pastDisableDate; |
| 134 | } else { |
| 135 | var pastDisableDate = ''; |
| 136 | } |
| 137 | |
| 138 | switch( inputData.dateTime ) { |
| 139 | case 'date': |
| 140 | // Apply flatpicker to field. |
| 141 | $( this ).flatpickr({ |
| 142 | disableMobile : true, |
| 143 | mode : inputData.mode, |
| 144 | minDate : minDateRange ? minDateRange : ( inputData.minDate ? inputData.minDate : pastDisableDate ), |
| 145 | maxDate : maxDateRange ? maxDateRange : inputData.maxDate, |
| 146 | dateFormat : inputData.dateFormat, |
| 147 | disable : disableDates, |
| 148 | }); |
| 149 | break; |
| 150 | case 'time': |
| 151 | if ( undefined !== inputData.timeInterval ) { |
| 152 | timeInterval = parseInt( inputData.timeInterval, 10 ); |
| 153 | } |
| 154 | |
| 155 | // Apply flatpicker to field. |
| 156 | $( this ).flatpickr({ |
| 157 | enableTime : true, |
| 158 | noCalendar : true, |
| 159 | minuteIncrement : timeInterval, |
| 160 | dateFormat : inputData.dateFormat, |
| 161 | disableMobile : true, |
| 162 | time_24hr : inputData.dateFormat.includes('H:i') |
| 163 | }); |
| 164 | break; |
| 165 | case 'date-time': |
| 166 | if ( undefined !== inputData.timeInterval ) { |
| 167 | timeInterval = parseInt( inputData.timeInterval, 10 ); |
| 168 | } |
| 169 | |
| 170 | // Apply flatpicker to field. |
| 171 | $( this ).flatpickr({ |
| 172 | enableTime : true, |
| 173 | noCalendar : false, |
| 174 | disableMobile : true, |
| 175 | mode : inputData.mode, |
| 176 | minDate : minDateRange ? minDateRange : ( inputData.minDate ? inputData.minDate : pastDisableDate ), |
| 177 | maxDate : maxDateRange ? maxDateRange : inputData.maxDate, |
| 178 | minuteIncrement : timeInterval, |
| 179 | dateFormat : inputData.dateFormat, |
| 180 | time_24hr : inputData.dateFormat.includes( 'H:i' ), |
| 181 | disable : disableDates, |
| 182 | }); |
| 183 | break; |
| 184 | default: |
| 185 | } |
| 186 | } ); |
| 187 | } |
| 188 | $(document).find(".evf-field-date-time input").on('change', function (event) { |
| 189 | var slotBooking = $(this).data('slot-booking'), |
| 190 | targetLabel = $(this).parent(), |
| 191 | errorLabel = $(this).parent().find('label.evf-error'); |
| 192 | if(slotBooking === 1) { |
| 193 | var dataTimeValue = $(this).val(), |
| 194 | dateFormat = $(this).data('date-format'), |
| 195 | dateTimeFormat = $(this).data('date-time'), |
| 196 | mode = $(this).data('mode'), |
| 197 | form_id = $(this).data('form-id'), |
| 198 | time_interval = $(this).data('time-interval'), |
| 199 | data = {'action':'everest_forms_slot_booking', 'data-time-value':dataTimeValue, 'data-format': dateFormat, 'data-time-format': dateTimeFormat, 'mode': mode, 'form-id': form_id, 'time-interval':time_interval, 'security': everest_forms_params.everest_forms_slot_booking}; |
| 200 | |
| 201 | $.ajax({ |
| 202 | url:everest_forms_params.ajax_url, |
| 203 | data: data, |
| 204 | type: 'POST', |
| 205 | beforeSend: function () { |
| 206 | var submitButton = $(document).find('.evf-submit-container button'); |
| 207 | $(submitButton).prop('disabled', true); |
| 208 | }, |
| 209 | success: function (res) { |
| 210 | if($(errorLabel).length) { |
| 211 | $(errorLabel).remove(); |
| 212 | } |
| 213 | if(res.success === true) { |
| 214 | var message = res.data.message; |
| 215 | $(targetLabel).append('<label class="evf-error">'+message+'</label>'); |
| 216 | var submitButton = $(document).find('.evf-submit-container button'); |
| 217 | $(submitButton).prop('disabled', true); |
| 218 | } else { |
| 219 | var submitButton = $(document).find('.evf-submit-container button'); |
| 220 | $(submitButton).prop('disabled', false); |
| 221 | } |
| 222 | } |
| 223 | }); |
| 224 | } |
| 225 | }) |
| 226 | |
| 227 | }, |
| 228 | init_datedropdown: function () { |
| 229 | //Dropdown logic here |
| 230 | $( '.date-dropdown-field' ).each( function() { |
| 231 | var $this = $ (this ); |
| 232 | $this.hide(); |
| 233 | everest_forms.change_minutes( $this ); |
| 234 | }); |
| 235 | |
| 236 | $( 'body' ).on( 'change', '.date-time-container [id*=hour-select]', function() { |
| 237 | var $this = $( this ).siblings( 'input.date-dropdown-field' ); |
| 238 | everest_forms.change_minutes( $this ); |
| 239 | }) |
| 240 | |
| 241 | $( 'body' ).on( 'change', '.date-time-container [id*=-select]', function() { |
| 242 | var $this = $( this ).siblings( 'input.date-dropdown-field' ); |
| 243 | $this.val( everest_forms.format_dropdown_date( $this ) ); |
| 244 | }) |
| 245 | }, |
| 246 | change_minutes: function( $this ) { |
| 247 | //Changes minutes as per hours selected, Time limit option. |
| 248 | var id = $this.attr( 'id' ); |
| 249 | if( typeof( $this.siblings( '#minute-select-' + id ).attr( 'id' ) ) != 'undefined' ) { |
| 250 | var max_hour = $this.attr( 'data-max-hour' ); |
| 251 | var min_hour = $this.attr( 'data-min-hour' ); |
| 252 | var max_minute = $this.attr( 'data-max-minute' ); |
| 253 | var min_minute = $this.attr( 'data-min-minute' ); |
| 254 | if( typeof( min_hour ) == 'undefined' || min_hour == '' ) { |
| 255 | min_hour = 0; |
| 256 | } |
| 257 | if( typeof (max_hour ) == 'undefined' || max_hour == '' ) { |
| 258 | min_hour = 23; |
| 259 | } |
| 260 | if( typeof( min_minute ) == 'undefined' || min_minute == '' ) { |
| 261 | min_minute = 0; |
| 262 | } |
| 263 | if( typeof( max_minute ) == 'undefined' || max_minute == '' ) { |
| 264 | max_minute = 59; |
| 265 | } |
| 266 | var options = ''; |
| 267 | for( var i = 0; i<= 59; i++ ) { |
| 268 | if( $this.siblings( '#hour-select-' + id ).val() == min_hour && i < min_minute ) { |
| 269 | continue; |
| 270 | } |
| 271 | if( $this.siblings( '#hour-select-' + id ).val() == max_hour && i > max_minute ) { |
| 272 | break; |
| 273 | } |
| 274 | options += '<option value = "' + i + '"> ' + ( ( i< 10 ) ? '0' + i : i ) + '</option>'; |
| 275 | } |
| 276 | |
| 277 | $this.siblings( '#minute-select-'+id ).html( options ); |
| 278 | $this.siblings( '#minute-select-'+id ).attr('value', $this.siblings( '#minute-select-'+id ).find('option:first').val()); |
| 279 | } |
| 280 | $this.val( everest_forms.format_dropdown_date( $this ) ); |
| 281 | }, |
| 282 | format_dropdown_date: function ( $this ) { |
| 283 | var id = $this.attr( 'id' ); |
| 284 | var selectd_date = { |
| 285 | selected_year: $this.siblings( '#year-select-' + id ).val(), |
| 286 | selected_month: $this.siblings( '#month-select-' + id ).val(), |
| 287 | selected_day: $this.siblings( '#day-select-' + id ).val(), |
| 288 | selected_hour: $this.siblings( '#hour-select-' + id ).val(), |
| 289 | selected_minute: $this.siblings( '#minute-select-' + id ).val() |
| 290 | } |
| 291 | var setting = { |
| 292 | date_format: $this.attr( 'data-date-format' ), |
| 293 | date_time: $this.attr( 'data-date-time' ) |
| 294 | } |
| 295 | var list_months = [ |
| 296 | 'January', |
| 297 | 'Febuary', |
| 298 | 'March', |
| 299 | 'April', |
| 300 | 'May', |
| 301 | 'June', |
| 302 | 'July', |
| 303 | 'August', |
| 304 | 'September', |
| 305 | 'October', |
| 306 | 'November', |
| 307 | 'December' |
| 308 | ]; |
| 309 | var formatted_date = ''; |
| 310 | if( setting.date_time == 'date' || setting.date_time == 'date-time' ) { |
| 311 | selectd_date.selected_day = (selectd_date.selected_day < 10 ) ? '0' + selectd_date.selected_day : selectd_date.selected_day; |
| 312 | if ( setting.date_format.match( /F j, Y/ ) ) { |
| 313 | formatted_date = list_months[ parseInt( selectd_date.selected_month ) - 1 ] + ' ' + selectd_date.selected_day + ', ' + selectd_date.selected_year; |
| 314 | } else { |
| 315 | selectd_date.selected_month = (selectd_date.selected_month < 10 ) ? '0' + selectd_date.selected_month : selectd_date.selected_month; |
| 316 | if(setting.date_format.match( /Y-m-d/ ) ) { |
| 317 | formatted_date = selectd_date.selected_year + '-' + selectd_date.selected_month + '-' + selectd_date.selected_day; |
| 318 | } else if ( setting.date_format.match( /m\/d\/Y/ ) ) { |
| 319 | formatted_date = selectd_date.selected_month + '/' + selectd_date.selected_day + '/' + selectd_date.selected_year; |
| 320 | } else { |
| 321 | formatted_date = selectd_date.selected_day + '/' + selectd_date.selected_month + '/' + selectd_date.selected_year; |
| 322 | } |
| 323 | } |
| 324 | } |
| 325 | if( setting.date_time == 'time' || setting.date_time == 'date-time' ) { |
| 326 | selectd_date.selected_minute = ( selectd_date.selected_minute < 10) ? '0' + selectd_date.selected_minute : selectd_date.selected_minute; |
| 327 | if( setting.date_format.match( /H:i/ ) ) { |
| 328 | selectd_date.selected_hour = ( selectd_date.selected_hour < 10 ) ? '0' + selectd_date.selected_hour : selectd_date.selected_hour; |
| 329 | formatted_date += ' ' + selectd_date.selected_hour + ":" + selectd_date.selected_minute; |
| 330 | } else { |
| 331 | var period = 'PM'; |
| 332 | if( selectd_date.selected_hour < 12 ) { |
| 333 | period = 'AM' |
| 334 | if( selectd_date.selected_hour == 0 ){ |
| 335 | selectd_date.selected_hour = 12; |
| 336 | } |
| 337 | } else if ( selectd_date.selected_hour > 12 ) { |
| 338 | selectd_date.selected_hour = selectd_date.selected_hour - 12; |
| 339 | } |
| 340 | |
| 341 | formatted_date += ' ' + selectd_date.selected_hour + ":" + selectd_date.selected_minute + ' ' + period; |
| 342 | } |
| 343 | } |
| 344 | return formatted_date.trim(); |
| 345 | }, |
| 346 | load_validation: function() { |
| 347 | if ( typeof $.fn.validate === 'undefined' ) { |
| 348 | return false; |
| 349 | } |
| 350 | |
| 351 | // Prepend URL field contents with http:// if user input doesn't contain a schema. |
| 352 | $( '.evf-field-url input[type=url]' ).on( 'change', function () { |
| 353 | var url = $( this ).val(); |
| 354 | if ( ! url ) { |
| 355 | return false; |
| 356 | } |
| 357 | if ( url.substr( 0, 7 ) !== 'http://' && url.substr( 0, 8 ) !== 'https://' ) { |
| 358 | $( this ).val( 'http://' + url ); |
| 359 | } |
| 360 | }); |
| 361 | |
| 362 | // Validator messages. |
| 363 | $.extend( $.validator.messages, { |
| 364 | required: everest_forms_params.i18n_messages_required, |
| 365 | url: everest_forms_params.i18n_messages_url, |
| 366 | email: everest_forms_params.i18n_messages_email, |
| 367 | number: everest_forms_params.i18n_messages_number |
| 368 | }); |
| 369 | |
| 370 | // Validate email addresses. |
| 371 | $.validator.methods.email = function( value, element ) { |
| 372 | /* https://stackoverflow.com/questions/2855865/jquery-validate-e-mail-address-regex */ |
| 373 | var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i); |
| 374 | return this.optional( element ) || pattern.test( value ); |
| 375 | }; |
| 376 | |
| 377 | // Validate confirmations. |
| 378 | $.validator.addMethod( 'confirm', function( value, element, param ) { |
| 379 | return $.validator.methods.equalTo.call( this, value, element, param ); |
| 380 | }, everest_forms_params.i18n_messages_confirm ); |
| 381 | |
| 382 | // Validate checkbox choice limit. |
| 383 | $.validator.addMethod( 'check-limit', function( value, element ) { |
| 384 | var $ul = $( element ).closest( 'ul' ), |
| 385 | $checked = $ul.find( 'input[type="checkbox"]:checked' ), |
| 386 | choiceLimit = parseInt( $ul.attr( 'data-choice-limit' ) || 0, 10 ); |
| 387 | |
| 388 | if ( 0 === choiceLimit ) { |
| 389 | return true; |
| 390 | } |
| 391 | |
| 392 | return $checked.length <= choiceLimit; |
| 393 | }, function( params, element ) { |
| 394 | var choiceLimit = parseInt( $( element ).closest( 'ul' ).attr( 'data-choice-limit' ) || 0, 10 ); |
| 395 | return everest_forms_params.i18n_messages_check_limit.replace( '{#}', choiceLimit ); |
| 396 | } ); |
| 397 | |
| 398 | this.$everest_form.each( function() { |
| 399 | var $this = $( this ); |
| 400 | |
| 401 | // List messages to show for required fields. Use name of the field as key. |
| 402 | var error_messages = {}; |
| 403 | $( '.evf-field' ).each( function() { |
| 404 | var form_id = $( this ).closest( 'form' ).data( 'formid' ); |
| 405 | var field_id = $( this ).data( 'field-id' ); |
| 406 | var error_message = $( this ).data( 'required-field-message' ); |
| 407 | var key = 'everest_forms[form_fields][' + field_id + ']'; // Name of the input field is used as a key. |
| 408 | |
| 409 | if ( $( this ).is( '.evf-field-payment-single' ) ) { |
| 410 | if ( ! $( this ).find('.evf-payment-price').is( '.evf-payment-user-input' ) ) { |
| 411 | $( this ).find('.evf-payment-price').attr( 'required', false ); |
| 412 | error_message = null; |
| 413 | } |
| 414 | } else if ( $( this ).is( '.evf-field-checkbox, .evf-field-payment-checkbox' ) ) { |
| 415 | key = key + '[]'; |
| 416 | } else if ( $( this ).is( '.evf-field-image-upload' ) ) { |
| 417 | key = 'evf_' + form_id + '_' + field_id; |
| 418 | } else if ( $( this ).is( '.evf-field-signature' ) ) { |
| 419 | key = 'everest_forms[form_fields][' + field_id + '][signature_image]'; |
| 420 | } else if ( $( this ).is( '.evf-field-phone' ) ) { |
| 421 | key = key + '[phone_field]'; |
| 422 | } else if ( $( this ).is( '.evf-field-email' ) || $( this ).is( '.evf-field-password' ) ) { |
| 423 | // For when the confirm is disabled. |
| 424 | key = 'everest_forms[form_fields][' + field_id + ']'; |
| 425 | error_messages[ key ] = { |
| 426 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 427 | }; |
| 428 | |
| 429 | // For when the confirm is enabled. |
| 430 | key = 'everest_forms[form_fields][' + field_id + '][primary]'; |
| 431 | error_messages[ key ] = { |
| 432 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 433 | }; |
| 434 | key = 'everest_forms[form_fields][' + field_id + '][secondary]'; |
| 435 | error_messages[ key ] = { |
| 436 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 437 | }; |
| 438 | error_message = null; |
| 439 | } else if ( $( this ).is( '.evf-field-address' ) ) { |
| 440 | var sub_field_error_messages = { |
| 441 | 'address1': $( this ).data( 'required-field-message-address1' ), |
| 442 | 'city' : $( this ).data( 'required-field-message-city' ), |
| 443 | 'state' : $( this ).data( 'required-field-message-state' ), |
| 444 | 'postal' : $( this ).data( 'required-field-message-postal' ), |
| 445 | 'country' : $( this ).data( 'required-field-message-country' ), |
| 446 | } |
| 447 | |
| 448 | var sub_field_types = Object.keys( sub_field_error_messages ); |
| 449 | for ( var i = 0; i < sub_field_types.length; i++ ) { |
| 450 | var sub_field_type = sub_field_types[i], |
| 451 | error_message = sub_field_error_messages[ sub_field_types[i] ]; |
| 452 | |
| 453 | key = 'everest_forms[form_fields][' + field_id + '][' + sub_field_type + ']'; |
| 454 | error_messages[ key ] = { |
| 455 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 456 | }; |
| 457 | } |
| 458 | error_message = null; |
| 459 | } else if ( $( this ).is( '.evf-field-likert' ) ) { |
| 460 | var row_keys = $( this ).data( 'row-keys' ); |
| 461 | var sub_field_error_messages = {}; |
| 462 | |
| 463 | if ( row_keys && Array.isArray( row_keys ) ) { |
| 464 | for ( var i = 0; i < row_keys.length; i++ ) { |
| 465 | var row_key = row_keys[i]; |
| 466 | sub_field_error_messages[ row_key ] = $( this ).data( 'required-field-message-' + row_key ); |
| 467 | } |
| 468 | for ( var i = 0; i < row_keys.length; i++ ) { |
| 469 | error_message = sub_field_error_messages[ row_keys[i] ]; |
| 470 | key = 'everest_forms[form_fields][' + field_id + '][' + row_keys[i] + ']'; |
| 471 | error_messages[ key ] = { |
| 472 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 473 | }; |
| 474 | } |
| 475 | } |
| 476 | error_message = null; |
| 477 | } else if ( $( this ).is( '.evf-field-file-upload' ) ) { |
| 478 | key = 'everest_forms_' + form_id + '_' + field_id; |
| 479 | } |
| 480 | |
| 481 | /** |
| 482 | * Check if the error message has been already set (null value in error_message variable |
| 483 | * should indicate that the message has already been set). |
| 484 | */ |
| 485 | if ( error_message ) { |
| 486 | error_messages[ key ] = { |
| 487 | required: error_message, // Set message using 'required' key to avoid conflicts with other validations. |
| 488 | }; |
| 489 | } |
| 490 | }); |
| 491 | |
| 492 | $this.validate({ |
| 493 | messages: error_messages, |
| 494 | ignore: '', |
| 495 | errorClass: 'evf-error', |
| 496 | validClass: 'evf-valid', |
| 497 | errorPlacement: function( error, element ) { |
| 498 | if ( element.closest( '.evf-field' ).is( '.evf-field-privacy-policy' ) ) { |
| 499 | element.closest( '.evf-field' ).append( error ); |
| 500 | } else if ( element.closest( '.evf-field' ).is( '.evf-field-range-slider' ) ) { |
| 501 | if ( element.closest( '.evf-field' ).find( '.evf-field-description' ).length ) { |
| 502 | element.closest( '.evf-field' ).find( '.evf-field-description' ).before( error ); |
| 503 | } else { |
| 504 | element.closest( '.evf-field' ).append( error ); |
| 505 | } |
| 506 | } else if ( element.closest( '.evf-field' ).is( '.evf-field-scale-rating' ) ) { |
| 507 | element.closest( '.evf-field' ).find( '.everest-forms-field-scale-rating' ).after( error ); |
| 508 | } else if ( 'radio' === element.attr( 'type' ) || 'checkbox' === element.attr( 'type' ) ) { |
| 509 | if ( element.hasClass( 'everest-forms-likert-field-option' ) ) { |
| 510 | element.closest( 'tr' ).children( 'th' ).append( error ); |
| 511 | } else { |
| 512 | element.closest( '.evf-field-checkbox' ).find( 'label.evf-error' ).remove(); |
| 513 | element.parent().parent().parent().append( error ); |
| 514 | } |
| 515 | } else if ( element.is( 'select' ) && element.attr( 'class' ).match( /date-month|date-day|date-year/ ) ) { |
| 516 | if ( element.parent().find( 'label.evf-error:visible' ).length === 0 ) { |
| 517 | element.parent().find( 'select:last' ).after( error ); |
| 518 | } |
| 519 | } else if ( element.is( 'select' ) && element.hasClass( 'evf-enhanced-select' ) ) { |
| 520 | if ( element.parent().find( 'label.evf-error:visible' ).length === 0 ) { |
| 521 | element.parent().find( '.select2' ).after( error ); |
| 522 | } |
| 523 | } else if ( element.hasClass( 'evf-smart-phone-field' ) || element.hasClass( 'everest-forms-field-password-primary' ) || element.hasClass( 'everest-forms-field-password-secondary' ) ) { |
| 524 | if( element.parents('span.input-wrapper').length ) { |
| 525 | element.parents('span.input-wrapper').after( error ); |
| 526 | } else { |
| 527 | element.parent().after( error ); |
| 528 | } |
| 529 | } else { |
| 530 | if( element.parents('span.input-wrapper').length ) { |
| 531 | element.parents('span.input-wrapper').after( error ); |
| 532 | } else { |
| 533 | error.insertAfter( element ); |
| 534 | } |
| 535 | } |
| 536 | }, |
| 537 | highlight: function( element, errorClass, validClass ) { |
| 538 | var $element = $( element ), |
| 539 | $parent = $element.closest( '.form-row' ), |
| 540 | inputName = $element.attr( 'name' ); |
| 541 | |
| 542 | if ( $element.attr( 'type' ) === 'radio' || $element.attr( 'type' ) === 'checkbox' ) { |
| 543 | $parent.find( 'input[name="' + inputName + '"]' ).addClass( errorClass ).removeClass( validClass ); |
| 544 | } else { |
| 545 | $element.addClass( errorClass ).removeClass( validClass ); |
| 546 | } |
| 547 | |
| 548 | $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid evf-has-error' ); |
| 549 | }, |
| 550 | unhighlight: function( element, errorClass, validClass ) { |
| 551 | var $element = $( element ), |
| 552 | $parent = $element.closest( '.form-row' ), |
| 553 | inputName = $element.attr( 'name' ); |
| 554 | |
| 555 | if ( $element.attr( 'type' ) === 'radio' || $element.attr( 'type' ) === 'checkbox' ) { |
| 556 | $parent.find( 'input[name="' + inputName + '"]' ).addClass( validClass ).removeClass( errorClass ); |
| 557 | } else { |
| 558 | $element.addClass( validClass ).removeClass( errorClass ); |
| 559 | } |
| 560 | |
| 561 | $parent.removeClass( 'evf-has-error' ); |
| 562 | }, |
| 563 | submitHandler: function( form ) { |
| 564 | var $form = $( form ), |
| 565 | $submit = $form.find( '.evf-submit' ), |
| 566 | processText = $submit.data( 'process-text' ); |
| 567 | var recaptchaID = $submit.get( 0 ).recaptchaID; |
| 568 | var razorpayForms = $form.find( "[data-gateway='razorpay']" ); |
| 569 | var stripeForms = $form.find( "[data-gateway*='stripe']" ); |
| 570 | // Process form. |
| 571 | if ( processText ) { |
| 572 | $submit.text( processText ).prop( 'disabled', true ); |
| 573 | } |
| 574 | |
| 575 | if ( recaptchaID === 0 ) { |
| 576 | grecaptcha.execute( recaptchaID ); |
| 577 | return false; |
| 578 | } |
| 579 | |
| 580 | if( razorpayForms.length > 0 ){ |
| 581 | return; |
| 582 | } |
| 583 | |
| 584 | if ( 1 !== $form.data( 'ajax_submission' ) || (stripeForms.length < 0 && 0 !== stripeForms.children.length) ) { |
| 585 | form.submit(); |
| 586 | } else { |
| 587 | return; |
| 588 | } |
| 589 | }, |
| 590 | onkeyup: function( element, event ) { |
| 591 | // This code is copied from JQuery Validate 'onkeyup' method with only one change: 'everest-forms-novalidate-onkeyup' class check. |
| 592 | var excludedKeys = [ 16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225 ]; |
| 593 | |
| 594 | // Disable onkeyup validation for some elements (e.g. remote calls). |
| 595 | if ( $( element ).hasClass( 'everest-forms-novalidate-onkeyup' ) ) { |
| 596 | return; |
| 597 | } |
| 598 | |
| 599 | if ( 9 === event.which && '' === this.elementValue( element ) || -1 !== $.inArray( event.keyCode, excludedKeys ) ) { |
| 600 | return; |
| 601 | } else if ( element.name in this.submitted || element.name in this.invalid ) { |
| 602 | this.element( element ); |
| 603 | } |
| 604 | }, |
| 605 | onfocusout: function( element ) { |
| 606 | // This code is copied from JQuery Validate 'onfocusout' method with only one change: 'everest-forms-novalidate-onkeyup' class check. |
| 607 | var validate = false; |
| 608 | |
| 609 | // Empty value error handling for elements with onkeyup validation disabled. |
| 610 | if ( $( element ).hasClass( 'everest-forms-novalidate-onkeyup' ) && ! element.value ) { |
| 611 | validate = true; |
| 612 | } |
| 613 | |
| 614 | if ( ! this.checkable( element ) && ( element.name in this.submitted || ! this.optional( element ) ) ) { |
| 615 | validate = true; |
| 616 | } |
| 617 | |
| 618 | if ( validate ) { |
| 619 | this.element( element ); |
| 620 | } |
| 621 | }, |
| 622 | onclick: function( element ) { |
| 623 | var validate = false, |
| 624 | type = ( element || {} ).type, |
| 625 | $el = $( element ); |
| 626 | |
| 627 | if ( 'checkbox' === type ) { |
| 628 | $el.closest( '.evf-field-checkbox' ).find( 'label.evf-error' ).remove(); |
| 629 | validate = true; |
| 630 | } else if ( ! 'select-multiple' === type ) { |
| 631 | $( element ).valid(); |
| 632 | } |
| 633 | |
| 634 | if ( validate ) { |
| 635 | this.element( element ); |
| 636 | } |
| 637 | } |
| 638 | }); |
| 639 | }); |
| 640 | }, |
| 641 | validate_field: function ( e ) { |
| 642 | var $this = $( this ), |
| 643 | $body = $( 'body' ), |
| 644 | $parent = $this.closest( '.form-row' ), |
| 645 | validated = true, |
| 646 | validate_required = $parent.is( '.validate-required' ), |
| 647 | validate_email = $parent.is( '.validate-email' ), |
| 648 | event_type = e.type; |
| 649 | |
| 650 | if ( $body.hasClass( 'everest-forms-is-offline' ) ) { |
| 651 | $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email everest-forms-validated' ); |
| 652 | } else if ( $parent.hasClass( 'evf-field-address' ) || $parent.hasClass( 'evf-field-payment-single' ) || $( 'body' ).hasClass( 'everest-forms-is-offline' ) ) { |
| 653 | if ( 0 === $parent.find( 'input.evf-error' ).length ) { |
| 654 | $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email' ).addClass( 'everest-forms-validated' ); |
| 655 | } |
| 656 | } else { |
| 657 | if ( 'input' === event_type ) { |
| 658 | $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email everest-forms-validated' ); |
| 659 | } |
| 660 | |
| 661 | if ( 'validate' === event_type || 'change' === event_type ) { |
| 662 | if ( validate_required ) { |
| 663 | if ( $this.hasClass( 'everest-forms-likert-field-option' ) ) { |
| 664 | if ( $parent.find( 'input.evf-error' ).length > 0 ) { |
| 665 | $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' ); |
| 666 | validated = false; |
| 667 | } |
| 668 | } else if ( 'checkbox' === $this.attr( 'type' ) && 0 === $parent.find( 'input:checked' ).length ) { |
| 669 | $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' ); |
| 670 | validated = false; |
| 671 | } else if ( '' === $this.val() ) { |
| 672 | $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-required-field' ); |
| 673 | validated = false; |
| 674 | } |
| 675 | } |
| 676 | |
| 677 | if ( validate_email ) { |
| 678 | if ( $this.val() ) { |
| 679 | /* https://stackoverflow.com/questions/2855865/jquery-validate-e-mail-address-regex */ |
| 680 | var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i); // eslint-disable-line max-len |
| 681 | |
| 682 | if ( ! pattern.test( $this.val() ) ) { |
| 683 | $parent.removeClass( 'everest-forms-validated' ).addClass( 'everest-forms-invalid everest-forms-invalid-email' ); |
| 684 | validated = false; |
| 685 | } |
| 686 | } |
| 687 | } |
| 688 | if ( validated ) { |
| 689 | $parent.removeClass( 'everest-forms-invalid everest-forms-invalid-required-field everest-forms-invalid-email' ).addClass( 'everest-forms-validated' ); |
| 690 | } |
| 691 | } |
| 692 | } |
| 693 | }, |
| 694 | submission_scroll: function(){ |
| 695 | if ( $( 'div.everest-forms-submission-scroll' ).length ) { |
| 696 | $( 'html,body' ).animate( { |
| 697 | scrollTop: ( $( 'div.everest-forms-submission-scroll' ).offset().top ) - 100 |
| 698 | }, 1000 ); |
| 699 | } |
| 700 | }, |
| 701 | randomize_elements: function() { |
| 702 | $( '.everest-forms-randomize' ).each( function() { |
| 703 | var $list = $( this ), |
| 704 | $listItems = $list.children(); |
| 705 | |
| 706 | while ( $listItems.length ) { |
| 707 | $list.append( $listItems.splice( Math.floor( Math.random() * $listItems.length ), 1 )[0] ); |
| 708 | } |
| 709 | } ); |
| 710 | }, |
| 711 | init_enhanced_select: function() { |
| 712 | // Only continue if SelectWoo library exists. |
| 713 | try { |
| 714 | $( document.body ).on( 'evf-frontend-enhanced-select-init', function() { |
| 715 | if ( 'undefined' !== typeof $.fn.selectWoo ) { |
| 716 | $( 'select.evf-enhanced-select:visible' ).filter( ':not(.evf-enhanced)' ).each( function() { |
| 717 | var select2_args = $.extend({ |
| 718 | minimumResultsForSearch: 10 < $( this ).find( 'option' ).length ? 10 : null, |
| 719 | placeholder: $( this ).attr( 'placeholder' ) || '', |
| 720 | allowClear: $( this ).prop( 'multiple' ) ? false : true, |
| 721 | }, getEnhancedSelectFormatString() ); |
| 722 | |
| 723 | $( this ).selectWoo( select2_args ).addClass( 'evf-enhanced' ); |
| 724 | }); |
| 725 | } |
| 726 | }).trigger( 'evf-frontend-enhanced-select-init' ); |
| 727 | } catch( err ) { |
| 728 | // If select2 failed (conflict?) log the error but don't stop other scripts breaking. |
| 729 | window.console.log( err ); |
| 730 | } |
| 731 | }, |
| 732 | checkUncheckAllcheckbox: function () { |
| 733 | // To check and uncheck all the option in checkbox. |
| 734 | var all_select_all_chk = $('form.everest-form').find('.evf-field, .evf-field-checkbox, .form-row').find('ul').find('li.evf-select-all-checkbox-li').find('#evfCheckAll'); |
| 735 | if (all_select_all_chk.length){ |
| 736 | |
| 737 | all_select_all_chk.each(function () { |
| 738 | var $this = $(this); |
| 739 | |
| 740 | $this.on('click', function () { |
| 741 | if($(this).prop("checked") == true){ |
| 742 | $this.parent().parent().find('li').find('input:checkbox').not($this).prop('checked', true); |
| 743 | }else if($(this).prop("checked") == false){ |
| 744 | $this.parent().parent().find('li').find('input:checkbox').not($this).prop('checked', false); |
| 745 | } |
| 746 | }); |
| 747 | |
| 748 | $this.parent().parent().find('li').find('input:checkbox').not($this).on('change', function () { |
| 749 | var checked = ($this.parent().parent().find('li').find('input:checkbox:checked').not($this)).length; |
| 750 | var chck_len = ($this.parent().parent().find('li').find('input:checkbox').not($this)).length; |
| 751 | |
| 752 | if (checked === chck_len) { |
| 753 | $this.prop('checked', true); |
| 754 | } else if (checked < chck_len) { |
| 755 | $this.prop('checked', false); |
| 756 | } |
| 757 | }); |
| 758 | }); |
| 759 | } |
| 760 | }, |
| 761 | validateMinimumWordLength: function() { |
| 762 | Array.prototype.slice.call( document.querySelectorAll( '.everest-forms-min-words-length-enabled' ) ).map( function( event ) { |
| 763 | var minWords = parseInt( event.dataset.textMinLength, 10 ) || 0; |
| 764 | |
| 765 | // Add the custom validation method. |
| 766 | jQuery.validator.addMethod( 'minWordLength', |
| 767 | function(value, element, params) { |
| 768 | var wordsCount = value.trim().split( /\s+/ ).length; |
| 769 | return wordsCount >= params[0]; |
| 770 | }, everest_forms_params.il8n_min_word_length_err_msg |
| 771 | ); |
| 772 | |
| 773 | jQuery( '#'+event.id ).each( function() { |
| 774 | jQuery( this ).rules( 'add', { minWordLength: [minWords] }); |
| 775 | }); |
| 776 | |
| 777 | } ); |
| 778 | }, |
| 779 | }; |
| 780 | |
| 781 | everest_forms.init(); |
| 782 | |
| 783 | }); |
| 784 |