PageSourceSearch

https://drjobitalia.it/wp-content/plugins/wp-job-board-pro/assets/js/main.js?ver=20131022

js drjobitalia.it collected 2026-10-08 07:46:45 UTC 111,830 bytes, 2,467 lines download raw bytes

1(function ($) {
2    "use strict";
3
4    if (!$.wjbpExtensions)
5        $.wjbpExtensions = {};
6    
7    function WJBPMainCore() {
8        var self = this;
9        self.init();
10    };
11
12    WJBPMainCore.prototype = {
13        /**
14         *  Initialize
15         */
16        init: function() {
17            var self = this;
18
19            self.fileUpload();
20
21            self.userLoginRegister();
22            self.userLoginRegisterNew();
23
24            self.userChangePass();
25            
26            self.removeJob();
27
28            self.fillJob();
29
30            self.applyEmail();
31            
32            self.recaptchaCallback();
33
34            self.applyInternal();
35
36            self.applicantsInit();
37
38            self.applicationMeeting();
39
40            self.addJobShortlist();
41
42            self.removeJobShortlist();
43
44            self.addCandidateShortlist();
45
46            self.removeCandidateShortlist();
47
48            self.reviewInit();
49
50            self.jobAlert();
51
52            self.candidateAlert();
53
54            self.jobSocialApply();
55
56            self.select2Init();
57
58            self.jobSubmission();
59
60            self.filterListing();
61
62            self.followEmployer();
63
64            self.employerAddEmployee();
65            
66            self.inviteCandidate();
67
68            self.mixesFn();
69
70            self.loadExtension();
71        },
72        loadExtension: function() {
73            var self = this;
74            
75            // if ($.wjbpExtensions.ajax_upload) {
76            //     $.wjbpExtensions.ajax_upload.call(self);
77            // }
78        },
79        fileUpload: function(){
80            
81            var imagesPreview = function(input, placeToInsertImagePreview) {
82                if (input.files) {
83                    var filesAmount = input.files.length;
84                    var i;
85                    for (i = 0; i < filesAmount; i++) {
86                        var reader = new FileReader();
87                        reader.onload = function(event) {
88                            $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);
89                        }
90                        reader.readAsDataURL(input.files[i]);
91                    }
92                }
93            };
94            var filesPreview = function(input, placeToInsertImagePreview) {
95                if (input.files) {
96                    var filesAmount = input.files.length;
97                    var i;
98                    for (i = 0; i < filesAmount; i++) {
99                        var html = $($.parseHTML('<div><code>'+ input.files[i].name +'</code></div>')).appendTo(placeToInsertImagePreview);
100                    }
101                }
102            };
103            $('.cmb-type-wp-job-board-pro-file').each(function(e){
104                var $e_this = $(this);
105                $(this).find('input[type="file"]:not(.wp-job-board-pro-file-upload)').on('change', function() {
106                    $e_this.find('.wp-job-board-pro-uploaded-files').html('');
107
108                    // Validate type
109                    var allowed_types = $(this).data('file_types');
110
111                    if ( allowed_types ) {
112                        var acceptFileTypes = new RegExp( '(\.|\/)(' + allowed_types + ')$', 'i' );
113                        if ( this.files[0].name.length && ! acceptFileTypes.test( this.files[0].name ) ) {
114                            alert(wp_job_board_pro_opts.not_allow);
115                            $(this).val(null);
116                            return false;
117                        }
118                    }
119
120                    var file = this.files[0];
121                    var fileType = file["type"];
122                    var validImageTypes = ["image/gif", "image/jpeg", "image/png"];
123                    if ($.inArray(fileType, validImageTypes) < 0) {
124                        filesPreview(this, $e_this.find('.wp-job-board-pro-uploaded-files'));
125                        $e_this.find('.wp-job-board-pro-uploaded-files').css("display","block");
126                    } else {
127                        imagesPreview(this, $e_this.find('.wp-job-board-pro-uploaded-files'));
128                        $e_this.find('.wp-job-board-pro-uploaded-files').css("display","block");
129                    }
130                });
131            });
132
133            $(document).on('change', '.upload-file-btn-wrapper input[type="file"]', function(){
134                var $e_this = $(this).closest('.upload-file-btn-wrapper');
135                var $text = $e_this.find('.upload-file-btn').data('text');
136                // Validate type
137                var allowed_types = $(this).data('file_types');
138
139                if( $(this).val() == '' ) {
140                    $e_this.find('.upload-file-btn span.text').html($text);
141                    $e_this.find('.label-can-drag').removeClass('has-file');
142                    return false;
143                }
144                if ( allowed_types ) {
145                    var acceptFileTypes = new RegExp( '(\.|\/)(' + allowed_types + ')$', 'i' );
146                    if ( this.files[0].name.length && ! acceptFileTypes.test( this.files[0].name ) ) {
147                        alert(wp_job_board_pro_opts.not_allow);
148                        $(this).val(null);
149                        $e_this.find('.upload-file-btn span.text').html($text);
150                        $e_this.find('.label-can-drag').removeClass('has-file');
151                        return false;
152                    }
153                }
154
155                if (this.files) {
156                    var filesAmount = this.files.length;
157                    var i;
158                     $e_this.find('.upload-file-btn span.text').html('');
159                    for (i = 0; i < filesAmount; i++) {
160                        var $file_html = $($.parseHTML('<span class="text-inner"><span>'+ this.files[i].name +'</span><span class="close">&times;</span></span>'));
161                        $e_this.find('.upload-file-btn span.text').append($file_html);
162                    }
163                    $e_this.find('.label-can-drag').addClass('has-file');
164                }
165            });
166
167            $(document).on('click', '.upload-file-btn-wrapper .upload-file-btn span.close', function(e){
168                e.preventDefault();
169                var $e_this = $(this).closest('.upload-file-btn-wrapper');
170                var $file_input = $e_this.find('input[type="file"]');
171                var $text = $e_this.find('.upload-file-btn').data('text');
172                
173                $file_input.val(null);
174                $e_this.find('.upload-file-btn span.text').html($text);
175                $e_this.find('.label-can-drag').removeClass('has-file');
176            });
177
178            var isAdvancedUpload = function() {
179                var div = document.createElement('div');
180                return (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;
181            }();
182
183            if (isAdvancedUpload) {
184
185                var droppedFiles = false;
186                $('.label-can-drag').each(function(){
187                    var label_self = $(this);
188                    label_self.on('drag dragstart dragend dragover dragenter dragleave drop', function(e) {
189                        e.preventDefault();
190                        e.stopPropagation();
191                    }).on('dragover dragenter', function() {
192                        label_self.addClass('is-dragover');
193                    }).on('dragleave dragend drop', function() {
194                        label_self.removeClass('is-dragover');
195                    }).on('drop', function(e) {
196                        droppedFiles = e.originalEvent.dataTransfer.files;
197                        label_self.parent().find('input[type="file"]').prop('files', droppedFiles).trigger('change');
198                    });
199                });
200            }
201            $(document).on('click', '.label-can-drag:not(.has-file)', function(){
202                $(this).parent().find('input[type="file"]').trigger('click');
203            });
204        },
205        userLoginRegisterNew: function() {
206            var self = this;
207
208            $(document).on('submit', 'form._employer_register_fields, form._candidate_register_fields', function(){
209                var $this = $(this);
210
211                if ( self.registerAjax ) {
212                    self.registerAjax.abort();
213                }
214
215                if ( $this.hasClass('loading') ) {
216                    return false;
217                }
218
219                var form_id = $(this).attr('id');
220                
221                
222                $this.find('.alert').remove();
223
224                $this.addClass('loading');
225                var form_data = new FormData( $('#' + form_id)[0] );
226                
227                self.registerAjax = $.ajax({
228                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_registernew&action=wp_job_board_pro_ajax_registernew' ),
229                    type:'POST',
230                    dataType: 'json',
231                    data: form_data,
232                    processData: false,
233                    contentType: false,
234                }).done(function(data) {
235                    $this.removeClass('loading');
236                    if ( data.status ) {
237                        $this.prepend( '<div class="alert alert-info">
237'+data.msg+'</div>' );
238                        if ( data.redirect ) {
239                            setTimeout(function(){
240                                if ( data.role == 'wp_job_board_pro_employer' ) {
241                                    window.location.href = wp_job_board_pro_opts.after_register_page_url;
242                                } else {
243                                    window.location.href = wp_job_board_pro_opts.after_register_page_candidate_url;
244                                }
245                            }, 500);
246                        }
247                    } else {
248                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
249                        if ( wp_job_board_pro_opts.recaptcha_enable ) {
250                            var recaptchas = document.getElementsByClassName("ga-recaptcha");
251                            for(var i=0; i<recaptchas.length; i++) {
252                                grecaptcha.reset(i);
253                            }
254                        }
255                    }
256
257                    self.registerAjax = false;
258                });
259                
260                return false;
261            });
262        },
263        userLoginRegister: function() {
264            var self = this;
265            
266            // sign in proccess
267            $('body').on('submit', 'form.login-form', function(){
268                var $this = $(this);
269                $('.alert', this).remove();
270                $this.addClass('loading');
271                $.ajax({
272                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_login' ),
273                    type:'POST',
274                    dataType: 'json',
275                    data:  $(this).serialize()+"&action=wp_job_board_pro_ajax_login"
276                }).done(function(data) {
277                    $this.removeClass('loading');
278                    if ( data.status ) {
279                        $this.prepend( '<div class="alert alert-info">' + data.msg + '</div>' );
280                        setTimeout(function(){
281                            if ( data.role == 'wp_job_board_pro_employer' ) {
282                                window.location.href = wp_job_board_pro_opts.after_login_page_url;
283                            } else {
284                                window.location.href = wp_job_board_pro_opts.after_login_page_candidate_url;
285                            }
286                            
287                        }, 500);
288                    } else {
289                        $this.prepend( '<div class="alert alert-warning">' + data.msg + '</div>' );
290                    }
291                });
292                return false; 
293            } );
294            $('body').on('click', '.back-link', function(e){
295                e.preventDefault();
296                var $con = $(this).closest('.login-form-wrapper');
297                $con.find('.form-container').hide();
298                $($(this).attr('href')).show(); 
299                return false;
300            } );
301
302             // lost password in proccess
303            $('body').on('submit', 'form.forgotpassword-form', function(){
304                var $this= $(this);
305                $('.alert', this).remove();
306                $this.addClass('loading');
307                $.ajax({
308                  url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_forgotpass' ),
309                  type:'POST',
310                  dataType: 'json',
311                  data:  $(this).serialize()+"&action=wp_job_board_pro_ajax_forgotpass"
312                }).done(function(data) {
313                     $this.removeClass('loading');
314                    if ( data.status ) {
315                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
316                        setTimeout(function(){
317                            window.location.reload(true);
318                        }, 500);
319                    } else {
320                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
321                    }
322                });
323                return false; 
324            } );
325            $('body').on('click', '#forgot-password-form-wrapper form .btn-cancel', function(e){
326                e.preventDefault();
327                $('#forgot-password-form-wrapper').hide();
328                $('#login-form-wrapper').show();
329            } );
330
331            // register
332            $('body').on('submit', 'form.register-form', function(){
333                var $this = $(this);
334                $('.alert', this).remove();
335                $this.addClass('loading');
336                $.ajax({
337                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_register' ),
338                    type:'POST',
339                    dataType: 'json',
340                    data:  $(this).serialize()+"&action=wp_job_board_pro_ajax_register"
341                }).done(function(data) {
342                    $this.removeClass('loading');
343                    if ( data.status ) {
344                        $this.prepend( '<div class="alert alert-info">
344'+data.msg+'</div>' );
345                        if ( data.redirect ) {
346                            setTimeout(function(){
347                                if ( data.role == 'wp_job_board_pro_employer' ) {
348                                    window.location.href = wp_job_board_pro_opts.after_register_page_url;
349                                } else {
350                                    window.location.href = wp_job_board_pro_opts.after_register_page_candidate_url;
351                                }
352                            }, 500);
353                        }
354                    } else {
355                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
356                        if ( wp_job_board_pro_opts.recaptcha_enable ) {
357                            var recaptchas = document.getElementsByClassName("ga-recaptcha");
358                            for(var i=0; i<recaptchas.length; i++) {
359                                grecaptcha.reset(i);
360                            }
361                        }
362                    }
363                });
364                return false;
365            } );
366
367            if ( $('form.register-form').length > 0 ) {
368                $('.role-tabs input[type=radio]').on('change', function() {
369                    var val = $(this).val();
370                    var container = $(this).closest('.register-form');
371                    if ( val == 'wp_job_board_pro_candidate' ) {
372                        container.find('.wp_job_board_pro_candidate_show').show();
373                        container.find('.wp_job_board_pro_employer_show').hide();
374                    } else {
375                        container.find('.wp_job_board_pro_candidate_show').hide();
376                        container.find('.wp_job_board_pro_employer_show').show();
377                    }
378                });
379                var val = $('.role-tabs input[type=radio]:checked').val();
380                var container = $('form.register-form').closest('.register-form');
381                if ( val == 'wp_job_board_pro_candidate' ) {
382                    container.find('.wp_job_board_pro_candidate_show').show();
383                    container.find('.wp_job_board_pro_employer_show').hide();
384                } else {
385                    container.find('.wp_job_board_pro_candidate_show').hide();
386                    container.find('.wp_job_board_pro_employer_show').show();
387                }
388            }
389            
390            // wp-job-board-pro-resend-approve-account-btn
391            $(document).on('click', '.wp-job-board-pro-resend-approve-account-btn', function(e) {
392                e.preventDefault();
393                var $this = $(this),
394                    $container = $(this).parent();
395                $this.addClass('loading');
396                $.ajax({
397                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_resend_approve_account' ),
398                    type:'POST',
399                    dataType: 'json',
400                    data: {
401                        action: 'wp_job_board_pro_ajax_resend_approve_account',
402                        login: $this.data('login'),
403                    }
404                }).done(function(data) {
405                    $this.removeClass('loading');
406                    if ( data.status ) {
407                        $container.html( data.msg );
408                    } else {
409                        $container.html( data.msg );
410                    }
411                });
412            });
413        },
414        userChangePass: function() {
415            var self = this;
416            $('body').on('submit', 'form.change-password-form', function(){
417                var $this = $(this);
418                $('.alert', this).remove();
419                $this.addClass('loading');
420                $.ajax({
421                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_change_password' ),
422                    type:'POST',
423                    dataType: 'json',
424                    data:  $(this).serialize()+"&action=wp_job_board_pro_ajax_change_password"
425                }).done(function(data) {
426                    $this.removeClass('loading');
427                    if ( data.status ) {
428                        $this.prepend( '<div class="alert alert-info">' + data.msg + '</div>' );
429                        setTimeout(function(){
430                            window.location.href = wp_job_board_pro_opts.login_register_url;
431                        }, 500);
432                    } else {
433                        $this.prepend( '<div class="alert alert-warning">' + data.msg + '</div>' );
434                    }
435                });
436                return false; 
437            } );
438        },
439        removeJob: function() {
440            var self = this;
441            $('.job-button-delete').on('click', function() {
442                var $this = $(this);
443                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
444                if ( r == true ) {
445                    $this.addClass('loading');
446                    var job_id = $(this).data('job_id');
447                    var nonce = $(this).data('nonce');
448                    $.ajax({
449                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_job' ),
450                        type:'POST',
451                        dataType: 'json',
452                        data: {
453                            'job_id': job_id,
454                            'nonce': nonce,
455                            'action': 'wp_job_board_pro_ajax_remove_job',
456                        }
457                    }).done(function(data) {
458                        $this.removeClass('loading');
459                        if ( data.status ) {
460                            $this.closest('tr').remove();
461                        }
462                        $(document).trigger( "after_remove_my_job", [$this, data] );
463
464                        self.showMessage(data.msg, data.status);
465                    });
466                }
467            });
468        },
469        fillJob: function() {
470            var self = this;
471            $(document).on('click', '.btn-action-icon.mark_filled', function() {
472                var $this = $(this);
473                $this.addClass('loading');
474                var job_id = $this.data('job_id');
475                var nonce = $this.data('nonce');
476                $.ajax({
477                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_mark_filled_job' ),
478                    type:'POST',
479                    dataType: 'json',
480                    data: {
481                        'job_id': job_id,
482                        'nonce': nonce,
483                        'action': 'wp_job_board_pro_ajax_mark_filled_job',
484                    }
485                }).done(function(data) {
486                    $this.removeClass('loading');
487                    if ( data.status ) {
488                        $this.attr('title', data.title);
489                        $this.data('nonce', data.nonce);
490                        $this.removeClass('mark_filled').addClass('mark_not_filled');
491                        $this.find('i').attr('class', data.icon_class);
492
493                        $this.closest('tr').find('.job-title-wrapper .application-status-label').remove();
494                        if ( data.label ) {
495                            $this.closest('tr').find('.job-title-wrapper').append(data.label);
496                        }
497                    }
498                    self.showMessage(data.msg, data.status);
499                });
500            });
501            $(document).on('click', '.btn-action-icon.mark_not_filled', function() {
502                var $this = $(this);
503                $this.addClass('loading');
504                var job_id = $this.data('job_id');
505                var nonce = $this.data('nonce');
506                $.ajax({
507                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_mark_not_filled_job' ),
508                    type:'POST',
509                    dataType: 'json',
510                    data: {
511                        'job_id': job_id,
512                        'nonce': nonce,
513                        'action': 'wp_job_board_pro_ajax_mark_not_filled_job',
514                    }
515                }).done(function(data) {
516                    $this.removeClass('loading');
517                    if ( data.status ) {
518                        $this.attr('title', data.title);
519                        $this.data('nonce', data.nonce);
520                        $this.removeClass('mark_not_filled').addClass('mark_filled');
521                        $this.find('i').attr('class', data.icon_class);
522
523                        $this.closest('tr').find('.job-title-wrapper .application-status-label').remove();
524                        if ( data.label ) {
525                            $this.closest('tr').find('.job-title-wrapper').append(data.label);
526                        }
527                    }
528                    self.showMessage(data.msg, data.status);
529                });
530            });
531        },
532        recaptchaCallback: function() {
533            if (!window.grecaptcha) {
534            } else {
535                setTimeout(function(){
536                    var recaptchas = document.getElementsByClassName("ga-recaptcha");
537                    for(var i=0; i<recaptchas.length; i++) {
538                        var recaptcha = recaptchas[i];
539                        var sitekey = recaptcha.dataset.sitekey;
540
541                        grecaptcha.render(recaptcha, {
542                            'sitekey' : sitekey
543                        });
544                    }
545                }, 500);
546            }
547        },
548        applyEmail: function() {
549            var self = this;
550
551            $('.btn-apply-job-email:not(.filled), .btn-apply-job-call:not(.filled)').magnificPopup({
552                mainClass: 'apus-mfp-zoom-in apus-mfp-zoom-call-in',
553                type:'inline',
554                midClick: true
555            });
556
557            $('.btn-apply-job-email:not(.filled)').magnificPopup({
558                mainClass: 'apus-mfp-zoom-in',
559                type:'inline',
560                midClick: true
561            });
562
563            $(document).on( 'click', '.btn-apply-job-email.filled', function(e){
564                e.preventDefault();
565                self.showMessage(wp_job_board_pro_opts.job_filled, false);
566            });
567
568            $(document).on('submit', 'form.job-apply-email-form', function(){
569                var $this = $(this);
570
571                if ( self.applyEmailAjax ) {
572                    self.applyEmailAjax.abort();
573                }
574
575                if ( $this.hasClass('loading') ) {
576                    return false;
577                }
578
579                var form_id = $(this).attr('id');
580                var error = false;
581
582                if ( wp_job_board_pro_opts.cv_required == 'on' ) {
583                    var cv_file = $this.find('input[name="cv_file"]');
584                    if (cv_file.length > 0 && cv_file.val() != '') {
585                        cv_file = cv_file.prop('files')[0];
586                        var file_size = cv_file.size;
587                        var file_type = cv_file.type;
588
589                        var allowed_types = wp_job_board_pro_opts.cv_file_types;
590                        var filesize_allow = wp_job_board_pro_opts.cv_file_size_allow;
591                        filesize_allow = parseInt(filesize_allow);
592
593                        if (file_size > filesize_allow) {
594                            alert(wp_job_board_pro_opts.cv_file_size_error);
595                            error = true;
596                        }
597                        if (allowed_types.indexOf(file_type) < 0) {
598                            alert(wp_job_board_pro_opts.cv_file_types_error);
599                            error = true;
600                        }
601                    }
602                }
603
604                if ( error == false ) {
605                    $this.find('.alert').remove();
606
607                    $this.addClass('loading');
608                    var form_data = new FormData( $('#' + form_id)[0] );
609
610                    var action = $(this).find('input[name=action]').val();
611                    self.applyEmailAjax = $.ajax({
612                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', action ),
613                        type:'POST',
614                        dataType: 'json',
615                        data: form_data,
616                        processData: false,
617                        contentType: false,
618                    }).done(function(data) {
619                        $this.removeClass('loading');
620                        
621                        if ( data.status ) {
622                            $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
623                        } else {
624                            $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
625                        }
626
627                        self.applyEmailAjax = false;
628                    });
629                } else {
630                    alert(wp_job_board_pro_opts.choose_a_cv);
631                }
632                return false;
633            });
634        },
635        applyInternal: function() {
636            var self = this;
637            $(document).on('click', '.btn-apply-job-internal-required:not(.filled)', function() {
638                var msg = $(this).parent().find('.job-apply-internal-required-wrapper .msg-inner').text();
639                self.showMessage(msg, false);
640            });
641            $('.btn-apply-job-internal:not(.filled), .btn-apply-job-internal-without-login:not(.filled)').magnificPopup({
642                mainClass: 'apus-mfp-zoom-in',
643                type:'inline',
644                midClick: true
645            });
646
647            $(document).on( 'click', '.btn-apply-job-internal.filled, .btn-apply-job-internal-without-login.filled, .btn-apply-job-internal-required.filled', function(e){
648                e.preventDefault();
649                self.showMessage(wp_job_board_pro_opts.job_filled, false);
650            });
651
652            $(document).on('submit', 'form.job-apply-internal-form', function(){
653                var $this = $(this);
654
655                if ( self.applyInternalAjax ) {
656                    self.applyInternalAjax.abort();
657                }
658
659                if ( $this.hasClass('loading') ) {
660                    return false;
661                }
662                var form_wrapper_id = $(this).closest('.job-apply-internal-form-wrapper').attr('id');
663                var form_id = $(this).attr('id');
664
665                
666                var error = true;
667                if ( $this.find('input.apply_cv_id:checked').val() ) {
668                    var error = false;
669                }
670
671                var cv_file = $this.find('input[name="cv_file"]');
672                if (cv_file.length > 0 && cv_file.val() != '') {
673                    var file_error = false;
674                    cv_file = cv_file.prop('files')[0];
675                    var file_size = cv_file.size;
676                    var file_type = cv_file.type;
677
678                    var allowed_types = wp_job_board_pro_opts.cv_file_types;
679                    var filesize_allow = wp_job_board_pro_opts.cv_file_size_allow;
680                    filesize_allow = parseInt(filesize_allow);
681
682                    if (file_size > filesize_allow) {
683                        alert(wp_job_board_pro_opts.cv_file_size_error);
684                        file_error = true;
685                    }
686                    if (allowed_types.indexOf(file_type) < 0) {
687                        alert(wp_job_board_pro_opts.cv_file_types_error);
688                        file_error = true;
689                    }
690
691                    if ( file_error == true ) {
692                        return false;
693                    }
694                    error = false;
695                }
696                
697                if ( wp_job_board_pro_opts.cv_required == 'on' ) {
698
699                } else {
700                    var error = false;
701                }
702
703                if ( error == false ) {
704                    $this.find('.alert').remove();
705
706                    $this.addClass('loading');
707                    var form_data = new FormData( $('#' + form_id)[0] );
708
709                    var action = $(this).find('input[name=action]').val();
710                    self.applyInternalAjax = $.ajax({
711                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', action ),
712                        type:'POST',
713                        dataType: 'json',
714                        data: form_data,
715                        processData: false,
716                        contentType: false,
717                    }).done(function(data) {
718                        $this.removeClass('loading');
719                        
720                        if ( data.status ) {
721                            $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
722                            if ( $('a[href="#'+form_wrapper_id+'"]').length ) {
723                                $('a[href="#'+form_wrapper_id+'"]').html(data.text).removeClass('btn-apply-job-internal').addClass('btn-applied-job-internal');
724                                setTimeout(function(){
725                                    $.magnificPopup.close();
726                                }, 2000);
727                            }
728                        } else {
729                            $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
730                        }
731
732                        self.applyInternalAjax = false;
733                    });
734                } else {
735                    alert(wp_job_board_pro_opts.choose_a_cv);
736                }
737                return false;
738            });
739
740            $(document).on('submit', 'form#_candidate_register_fields_apply', function(){
741                var $this = $(this);
742
743                if ( self.registerAjax ) {
744                    self.registerAjax.abort();
745                }
746
747                if ( $this.hasClass('loading') ) {
748                    return false;
749                }
750
751                var form_id = $(this).attr('id');
752                
753                
754                $this.find('.alert').remove();
755
756                $this.addClass('loading');
757                var form_data = new FormData( $('#' + form_id)[0] );
758                
759                self.registerAjax = $.ajax({
760                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_register_apply&action=wp_job_board_pro_ajax_register_apply' ),
761                    type:'POST',
762                    dataType: 'json',
763                    data: form_data,
764                    processData: false,
765                    contentType: false,
766                }).done(function(data) {
767                    $this.removeClass('loading');
768                    if ( data.status ) {
769                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
770                        setTimeout(function(){
771                            location.reload();
772                        }, 500);
773                    } else {
774                        $this.prepend( '<div class="alert alert-warning">
774'+data.msg+'</div>' );
775                        if ( wp_job_board_pro_opts.recaptcha_enable ) {
776                            var recaptchas = document.getElementsByClassName("ga-recaptcha");
777                            for(var i=0; i<recaptchas.length; i++) {
778                                grecaptcha.reset(i);
779                            }
780                        }
781                    }
782
783                    self.registerAjax = false;
784                });
785                
786                return false;
787            });
788        },
789        applicantsInit: function() {
790            var self = this;
791            $(document).on('click', '.btn-remove-job-applied', function(e) {
792                e.preventDefault();
793                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
794                if ( r == true ) {
795                    var $this = $(this);
796                    $this.addClass('loading');
797                    var applicant_id = $(this).data('applicant_id');
798                    var nonce = $(this).data('nonce');
799                    $.ajax({
800                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_applied' ),
801                        type:'POST',
802                        dataType: 'json',
803                        data: {
804                            'applicant_id': applicant_id,
805                            'nonce': nonce,
806                            'action': 'wp_job_board_pro_ajax_remove_applied',
807                        }
808                    }).done(function(data) {
809                        $this.removeClass('loading');
810                        if ( data.status ) {
811                            $this.closest('.job-applied-wrapper').remove();
812                            $this.closest('.job-applicant-wrapper').remove();
813                        }
814                        self.showMessage(data.msg, data.status);
815                    });
816                }
817            });
818
819            // reject applicant
820            $(document).on('click', '.btn-reject-job-applied', function(e) {
821                e.preventDefault();
822                var $this = $(this);
823                $this.addClass('loading');
824                var applicant_id = $(this).data('applicant_id');
825                var nonce = $(this).data('nonce');
826                $.ajax({
827                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_reject_applied' ),
828                    type:'POST',
829                    dataType: 'json',
830                    data: {
831                        'applicant_id': applicant_id,
832                        'nonce': nonce,
833                        'action': 'wp_job_board_pro_ajax_reject_applied',
834                    }
835                }).done(function(data) {
836                    $this.removeClass('loading');
837                    if ( data.status ) {
838                        var total_rej = parseInt($this.closest('.job-applicants').find('.rejected-applicants span').text()) + 1;
839                        $this.closest('.job-applicants').find('.rejected-applicants span').text(total_rej);
840
841                        if ( data.output ) {
842                            $this.closest('.job-applicant-wrapper').replaceWith(data.output);
843
844                            $('.btn-create-meeting-job-applied').magnificPopup({
845                                mainClass: 'apus-mfp-zoom-in',
846                                type:'inline',
847                                midClick: true,
848                                closeBtnInside:false,
849                            });
850                        }
851                    }
852                    self.showMessage(data.msg, data.status);
853                });
854            });
855
856            // undo reject applicant
857            $(document).on('click', '.btn-undo-reject-job-applied', function(e) {
858                e.preventDefault();
859                var $this = $(this);
860                $this.addClass('loading');
861                var applicant_id = $(this).data('applicant_id');
862                var nonce = $(this).data('nonce');
863                $.ajax({
864                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_undo_reject_applied' ),
865                    type:'POST',
866                    dataType: 'json',
867                    data: {
868                        'applicant_id': applicant_id,
869                        'nonce': nonce,
870                        'action': 'wp_job_board_pro_ajax_undo_reject_applied',
871                    }
872                }).done(function(data) {
873                    $this.removeClass('loading');
874                    if ( data.status ) {
875                        var total_rej = parseInt($this.closest('.job-applicants').find('.rejected-applicants span').text()) - 1;
876                        $this.closest('.job-applicants').find('.rejected-applicants span').text(total_rej);
877
878                        if ( $this.closest('.job-applicants').find('.rejected-applicants').hasClass('active') ) {
879                            
880                            $this.closest('.job-applied-wrapper').remove();
881                            $this.closest('.job-applicant-wrapper').remove();
882                        } else {
883                            if ( data.output ) {
884                                $this.closest('.job-applicant-wrapper').replaceWith(data.output);
885
886                                $('.btn-create-meeting-job-applied').magnificPopup({
887                                    mainClass: 'apus-mfp-zoom-in',
888                                    type:'inline',
889                                    midClick: true,
890                                    closeBtnInside:false,
891                                });
892                            }
893                        }
894                    }
895                    self.showMessage(data.msg, data.status);
896                });
897            });
898
899            // show reject applicants
900            $(document).on('click', '.show-rejected-applicants', function(e) {
901                e.preventDefault();
902                var $this = $(this),
903                    $con = $this.closest('.job-applicants');
904                
905                if ( $this.hasClass('active') || $this.hasClass('loading') ) {
906                    return false;
907                }
908
909                $this.addClass('loading');
910                var job_id = $(this).data('job_id');
911                var nonce = $(this).data('nonce');
912                $.ajax({
913                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_show_rejected_applicants' ),
914                    type:'POST',
915                    dataType: 'json',
916                    data: {
917                        'job_id': job_id,
918                        'nonce': nonce,
919                        'action': 'wp_job_board_pro_ajax_show_rejected_applicants'
920                    }
921                }).done(function(data) {
922                    $this.removeClass('loading');
923                    if ( data.status ) {
924                        $con.find('.applicants-wrapper').html(data.output);
925                        $con.find('.show-total-applicants').removeClass('active');
926                        $con.find('.show-approved-applicants').removeClass('active');
927                        $this.addClass('active');
928
929                        $('.btn-create-meeting-job-applied').magnificPopup({
930                            mainClass: 'apus-mfp-zoom-in',
931                            type:'inline',
932                            midClick: true,
933                            closeBtnInside:false,
934                        });
935                    }
936                    self.showMessage(data.msg, data.status);
937                });
938            });
939
940            // approve applicant
941            $(document).on('click', '.btn-approve-job-applied', function(e) {
942                e.preventDefault();
943                var $this = $(this);
944                $this.addClass('loading');
945                var applicant_id = $(this).data('applicant_id');
946                var nonce = $(this).data('nonce');
947                $.ajax({
948                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_approve_applied' ),
949                    type:'POST',
950                    dataType: 'json',
951                    data: {
952                        'applicant_id': applicant_id,
953                        'nonce': nonce,
954                        'action': 'wp_job_board_pro_ajax_approve_applied',
955                    }
956                }).done(function(data) {
957                    $this.removeClass('loading');
958                    if ( data.status ) {
959                        var total_app = parseInt($this.closest('.job-applicants').find('.approved-applicants span').text()) + 1;
960                        $this.closest('.job-applicants').find('.approved-applicants span').text(total_app);
961                        
962                        if ( data.output ) {
963                            $this.closest('.job-applicant-wrapper').replaceWith(data.output);
964
965                            $('.btn-create-meeting-job-applied').magnificPopup({
966                                mainClass: 'apus-mfp-zoom-in',
967                                type:'inline',
968                                midClick: true,
969                                closeBtnInside:false,
970                            });
971                        }
972
973                    }
974                    self.showMessage(data.msg, data.status);
975                });
976            });
977
978            // undo approved applicant
979            $(document).on('click', '.btn-undo-approve-job-applied', function(e) {
980                e.preventDefault();
981                var $this = $(this);
982                $this.addClass('loading');
983                var applicant_id = $(this).data('applicant_id');
984                var nonce = $(this).data('nonce');
985                $.ajax({
986                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_undo_approve_applied' ),
987                    type:'POST',
988                    dataType: 'json',
989                    data: {
990                        'applicant_id': applicant_id,
991                        'nonce': nonce,
992                        'action': 'wp_job_board_pro_ajax_undo_approve_applied',
993                    }
994                }).done(function(data) {
995                    $this.removeClass('loading');
996                    if ( data.status ) {
997
998                        var total_approve = parseInt($this.closest('.job-applicants').find('.approved-applicants span').text()) - 1;
999                        $this.closest('.job-applicants').find('.approved-applicants span').text(total_approve);
1000
1001                        if ( $this.closest('.job-applicants').find('.approved-applicants').hasClass('active') ) {
1002                            $this.closest('.job-applied-wrapper').remove();
1003                            $this.closest('.job-applicant-wrapper').remove();
1004                        } else {
1005                            if ( data.output ) {
1006                                $this.closest('.job-applicant-wrapper').replaceWith(data.output);
1007
1008                                $('.btn-create-meeting-job-applied').magnificPopup({
1009                                    mainClass: 'apus-mfp-zoom-in',
1010                                    type:'inline',
1011                                    midClick: true,
1012                                    closeBtnInside:false,
1013                                });
1014                            }
1015                        }
1016                    }
1017                    self.showMessage(data.msg, data.status);
1018                });
1019            });
1020
1021            // show approved applicants
1022            $(document).on('click', '.show-approved-applicants', function(e) {
1023                e.preventDefault();
1024                var $this = $(this),
1025                    $con = $this.closest('.job-applicants');
1026                
1027                if ( $this.hasClass('active') || $this.hasClass('loading') ) {
1028                    return false;
1029                }
1030
1031                $this.addClass('loading');
1032                var job_id = $(this).data('job_id');
1033                var nonce = $(this).data('nonce');
1034                $.ajax({
1035                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_show_approved_applicants' ),
1036                    type:'POST',
1037                    dataType: 'json',
1038                    data: {
1039                        'job_id': job_id,
1040                        'nonce': nonce,
1041                        'action': 'wp_job_board_pro_ajax_show_approved_applicants'
1042                    }
1043                }).done(function(data) {
1044                    $this.removeClass('loading');
1045                    if ( data.status ) {
1046                        $con.find('.applicants-wrapper').html(data.output);
1047                        $con.find('.show-total-applicants').removeClass('active');
1048                        $con.find('.show-rejected-applicants').removeClass('active');
1049                        $this.addClass('active');
1050
1051                        $('.btn-create-meeting-job-applied').magnificPopup({
1052                            mainClass: 'apus-mfp-zoom-in',
1053                            type:'inline',
1054                            midClick: true,
1055                            closeBtnInside:false,
1056                        });
1057                    }
1058                    self.showMessage(data.msg, data.status);
1059                });
1060            });
1061
1062            // show applicants
1063            $(document).on('click', '.show-total-applicants', function(e) {
1064                e.preventDefault();
1065                var $this = $(this),
1066                    $con = $this.closest('.job-applicants');
1067
1068                if ( $this.hasClass('active') || $this.hasClass('loading') ) {
1069                    return false;
1070                }
1071                $this.addClass('loading');
1072                var job_id = $(this).data('job_id');
1073                var nonce = $(this).data('nonce');
1074                $.ajax({
1075                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_show_applicants' ),
1076                    type:'POST',
1077                    dataType: 'json',
1078                    data: {
1079                        'job_id': job_id,
1080                        'nonce': nonce,
1081                        'action': 'wp_job_board_pro_ajax_show_applicants'
1082                    }
1083                }).done(function(data) {
1084                    $this.removeClass('loading');
1085                    if ( data.status ) {
1086                        $con.find('.applicants-wrapper').html(data.output);
1087                        $con.find('.show-rejected-applicants').removeClass('active');
1088                        $con.find('.show-approved-applicants').removeClass('active');
1089                        $this.addClass('active');
1090
1091                        $('.btn-create-meeting-job-applied').magnificPopup({
1092                            mainClass: 'apus-mfp-zoom-in',
1093                            type:'inline',
1094                            midClick: true,
1095                            closeBtnInside:false,
1096                        });
1097                    }
1098                    self.showMessage(data.msg, data.status);
1099                });
1100            });
1101
1102            // pagination
1103            $(document).on('submit', 'form.applicants-pagination-form', function(e){
1104                e.preventDefault();
1105                var $this = $(this);
1106                var $container = $(this).closest('.applicants-wrapper');
1107                if ( $this.hasClass('loading') ) {
1108                    return false;
1109                }
1110                $this.addClass('loading');
1111                $.ajax({
1112                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_applicants_pagination' ),
1113                    type:'POST',
1114                    dataType: 'json',
1115                    data: $this.serialize()
1116                }).done(function(data) {
1117                    $this.removeClass('loading');
1118                    if ( data.status ) {
1119                        $container.find('.applicants-inner').append(data.output);
1120                        if ( data.paged > 0 ) {
1121                            $this.find('input[name=paged]').val(data.paged);
1122                        } else {
1123                            $this.remove();
1124                        }
1125
1126                        $('.btn-create-meeting-job-applied').magnificPopup({
1127                            mainClass: 'apus-mfp-zoom-in',
1128                            type:'inline',
1129                            midClick: true,
1130                            closeBtnInside:false,
1131                        });
1132                    } else {
1133                        self.showMessage(data.msg, data.status);
1134                    }
1135                });
1136                return false;
1137            });
1138
1139        },
1140        applicationMeeting: function() {
1141            if ( $('input.datetimepicker-date').length ) {
1142                $( "input.datetimepicker-date" ).each(function(){
1143                    $(this).datepicker({
1144                        dateFormat: $(this).data('date_format'),
1145                        altField: $(this).data('id'),
1146                        altFormat: 'yy-mm-dd'
1147                    });
1148                });
1149            }
1150
1151            if ( $.isFunction( $.fn.select2 ) && typeof wp_job_board_pro_select2_opts !== 'undefined' ) {
1152                var select2_args = wp_job_board_pro_select2_opts;
1153                select2_args['allowClear']              = false;
1154                select2_args['minimumResultsForSearch'] = -1;
1155                select2_args['width'] = '100%';
1156                if ( typeof wp_job_board_pro_select2_opts.language_result !== 'undefined' ) {
1157                    select2_args['language'] = {
1158                        noResults: function (params) {
1159                            return wp_job_board_pro_select2_opts['language_result'];
1160                        }
1161                    }
1162                }
1163                $('select.select-time-hour').select2( select2_args );
1164            }
1165
1166
1167            $('.btn-create-meeting-job-applied, .btn-messages-job-meeting, .btn-reschedule-job-meeting, .employer-meeting-zoom-settings').magnificPopup({
1168                mainClass: 'apus-mfp-zoom-in',
1169                type:'inline',
1170                midClick: true,
1171                closeBtnInside:false,
1172            });
1173
1174            $(document).on('click', '.close-popup', function(){
1175                $.magnificPopup.close()
1176            });
1177
1178            $(document).on('submit', 'form.create-meeting-form', function(e){
1179                e.preventDefault();
1180                var $this = $(this);
1181
1182                if ( self.createMeetingAjax ) {
1183                    self.createMeetingAjax.abort();
1184                }
1185
1186                if ( $this.hasClass('loading') ) {
1187                    return false;
1188                }
1189                var form_id = $(this).attr('id');
1190                
1191                
1192                $this.find('.alert').remove();
1193
1194                $this.addClass('loading');
1195                var form_data = new FormData( $('#' + form_id)[0] );
1196
1197                var action = $(this).find('input[name=action]').val();
1198                self.createMeetingAjax = $.ajax({
1199                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', action ),
1200                    type:'POST',
1201                    dataType: 'json',
1202                    data: form_data,
1203                    processData: false,
1204                    contentType: false,
1205                }).done(function(data) {
1206                    $this.removeClass('loading');
1207                    
1208                    if ( data.status ) {
1209                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
1210
1211                        setTimeout(function(){
1212                            $.magnificPopup.close();
1213                        }, 2000);
1214
1215                    } else {
1216                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
1217                    }
1218
1219                    self.createMeetingAjax = false;
1220                });
1221                
1222            });
1223
1224            $(document).on('submit', 'form.reschedule-meeting-form', function(e){
1225                e.preventDefault();
1226                var $this = $(this);
1227
1228                if ( self.rescheduleMeetingAjax ) {
1229                    self.rescheduleMeetingAjax.abort();
1230                }
1231
1232                if ( $this.hasClass('loading') ) {
1233                    return false;
1234                }
1235                var form_id = $(this).attr('id');
1236                
1237                
1238                $this.find('.alert').remove();
1239
1240                $this.addClass('loading');
1241                var form_data = new FormData( $('#' + form_id)[0] );
1242
1243                var action = $(this).find('input[name=action]').val();
1244                self.rescheduleMeetingAjax = $.ajax({
1245                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', action ),
1246                    type:'POST',
1247                    dataType: 'json',
1248                    data: form_data,
1249                    processData: false,
1250                    contentType: false,
1251                }).done(function(data) {
1252                    $this.removeClass('loading');
1253                    
1254                    if ( data.status ) {
1255                        $this.prepend( '<div class="alert alert-info">
1255'+data.msg+'</div>' );
1256                        location.reload();
1257                        setTimeout(function(){
1258                            $.magnificPopup.close();
1259                        }, 2000);
1260
1261                    } else {
1262                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
1263                    }
1264
1265                    self.rescheduleMeetingAjax = false;
1266                });
1267                
1268            });
1269
1270            $(document).on('click', '.btn-remove-job-meeting', function(e){
1271                e.preventDefault();
1272                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1273                if ( r == true ) {
1274                    var $this = $(this),
1275                        $con = $this.closest('.meetings-list-inner');
1276
1277                    if ( $this.hasClass('loading') ) {
1278                        return false;
1279                    }
1280                    $this.addClass('loading');
1281                    var meeting_id = $(this).data('meeting_id');
1282                    var nonce = $(this).data('nonce');
1283                    $.ajax({
1284                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_meeting' ),
1285                        type:'POST',
1286                        dataType: 'json',
1287                        data: {
1288                            'meeting_id': meeting_id,
1289                            'nonce': nonce
1290                        }
1291                    }).done(function(data) {
1292                        $this.removeClass('loading');
1293                        if ( data.status ) {
1294                            if ( $con.find('.meeting-wrapper').length > 1 ) {
1295                                $this.closest('.meeting-wrapper').remove();
1296                            } else {
1297                                location.reload();
1298                            }
1299                        }
1300                        self.showMessage(data.msg, data.status);
1301                    });
1302                }
1303            });
1304
1305            $(document).on('click', '.btn-cancel-job-meeting', function(e){
1306                e.preventDefault();
1307                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1308                if ( r == true ) {
1309                    var $this = $(this),
1310                        $con = $this.closest('.meetings-list-inner');
1311
1312                    if ( $this.hasClass('loading') ) {
1313                        return false;
1314                    }
1315                    $this.addClass('loading');
1316                    var meeting_id = $(this).data('meeting_id');
1317                    var nonce = $(this).data('nonce');
1318                    $.ajax({
1319                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_cancel_meeting' ),
1320                        type:'POST',
1321                        dataType: 'json',
1322                        data: {
1323                            'meeting_id': meeting_id,
1324                            'nonce': nonce
1325                        }
1326                    }).done(function(data) {
1327                        $this.removeClass('loading');
1328                        if ( data.status ) {
1329                            location.reload();
1330                        }
1331                        self.showMessage(data.msg, data.status);
1332                    });
1333                }
1334            });
1335
1336            // zoom settings
1337            $(document).on('submit', 'form.zoom-meeting-settings-form', function(e){
1338                e.preventDefault();
1339
1340                var $this = $(this);
1341
1342                if ( self.zoomSettingAjax ) {
1343                    self.zoomSettingAjax.abort();
1344                }
1345
1346                if ( $this.hasClass('loading') ) {
1347                    return false;
1348                }
1349                var form_id = $(this).attr('id');
1350                
1351                
1352                $this.find('.alert').remove();
1353
1354                $this.addClass('loading');
1355                var form_data = new FormData( $('#' + form_id)[0] );
1356
1357                var action = $(this).find('input[name=action]').val();
1358                self.zoomSettingAjax = $.ajax({
1359                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', action ),
1360                    type:'POST',
1361                    dataType: 'json',
1362                    data: form_data,
1363                    processData: false,
1364                    contentType: false,
1365                }).done(function(data) {
1366                    $this.removeClass('loading');
1367                    
1368                    // if ( data.status ) {
1369                        $this.prepend( '<div class="data">'+data.html+'</div>' );
1370                        
1371                        // setTimeout(function(){
1372                        //     $.magnificPopup.close();
1373                        // }, 2000);
1374
1375                    // } else {
1376                    //     $this.prepend( '<div class="alert alert-warning">'+data.html+'</div>' );
1377                    // }
1378
1379                    self.zoomSettingAjax = false;
1380                });
1381            });
1382        },
1383        addJobShortlist: function() {
1384            var self = this;
1385            $(document).on('click', '.btn-add-job-shortlist', function() {
1386                var $this = $(this);
1387                $this.addClass('loading');
1388                var job_id = $(this).data('job_id');
1389                var nonce = $(this).data('nonce');
1390                $.ajax({
1391                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_add_job_shortlist' ),
1392                    type:'POST',
1393                    dataType: 'json',
1394                    data: {
1395                        'job_id': job_id,
1396                        'nonce': nonce,
1397                        'action': 'wp_job_board_pro_ajax_add_job_shortlist',
1398                    }
1399                }).done(function(data) {
1400                    $this.removeClass('loading');
1401                    if ( data.status ) {
1402                        $this.replaceWith(data.html);
1403                        $(document).trigger( "after_add_shortlist", [$this, data] );
1404                    }
1405                    self.showMessage(data.msg, data.status);
1406                });
1407            });
1408        },
1409        removeJobShortlist: function() {
1410            var self = this;
1411            $(document).on('click', '.btn-added-job-shortlist', function() {
1412                var $this = $(this);
1413                
1414                $this.addClass('loading');
1415                var job_id = $(this).data('job_id');
1416                var nonce = $(this).data('nonce');
1417                $.ajax({
1418                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_job_shortlist' ),
1419                    type:'POST',
1420                    dataType: 'json',
1421                    data: {
1422                        'job_id': job_id,
1423                        'nonce': nonce,
1424                        'action': 'wp_job_board_pro_ajax_remove_job_shortlist',
1425                    }
1426                }).done(function(data) {
1427                    $this.removeClass('loading');
1428                    if ( data.status ) {
1429                        $this.replaceWith(data.html);
1430                        $(document).trigger( "after_remove_shortlist", [$this, data] );
1431                    }
1432                    self.showMessage(data.msg, data.status);
1433                });
1434
1435            });
1436
1437            $('.btn-remove-job-shortlist').on('click', function() {
1438                var $this = $(this);
1439                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1440                if ( r == true ) {
1441                    $this.addClass('loading');
1442                    var job_id = $(this).data('job_id');
1443                    var nonce = $(this).data('nonce');
1444                    $.ajax({
1445                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_job_shortlist' ),
1446                        type:'POST',
1447                        dataType: 'json',
1448                        data: {
1449                            'job_id': job_id,
1450                            'nonce': nonce,
1451                            'action': 'wp_job_board_pro_ajax_remove_job_shortlist',
1452                        }
1453                    }).done(function(data) {
1454                        $this.removeClass('loading');
1455                        if ( data.status ) {
1456                            $this.closest('.job-shortlist-wrapper').remove();
1457                        }
1458                        self.showMessage(data.msg, data.status);
1459                    });
1460                }
1461            });
1462        },
1463        addCandidateShortlist: function() {
1464            var self = this;
1465            $(document).on('click', '.btn-add-candidate-shortlist', function() {
1466                var $this = $(this);
1467                $this.addClass('loading');
1468                var candidate_id = $(this).data('candidate_id');
1469                var nonce = $(this).data('nonce');
1470                $.ajax({
1471                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_add_candidate_shortlist' ),
1472                    type:'POST',
1473                    dataType: 'json',
1474                    data: {
1475                        'candidate_id': candidate_id,
1476                        'nonce': nonce,
1477                        'action': 'wp_job_board_pro_ajax_add_candidate_shortlist',
1478                    }
1479                }).done(function(data) {
1480                    $this.removeClass('loading');
1481                    if ( data.status ) {
1482                        $this.replaceWith(data.html);
1483                        $(document).trigger( "after_add_candidate_shortlist", [$this, data] );
1484                    }
1485                    self.showMessage(data.msg, data.status);
1486                });
1487            });
1488        },
1489        removeCandidateShortlist: function() {
1490            var self = this;
1491            $(document).on('click', '.btn-added-candidate-shortlist', function() {
1492                var $this = $(this);
1493                $this.addClass('loading');
1494                var candidate_id = $(this).data('candidate_id');
1495                var nonce = $(this).data('nonce');
1496                $.ajax({
1497                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_candidate_shortlist' ),
1498                    type:'POST',
1499                    dataType: 'json',
1500                    data: {
1501                        'candidate_id': candidate_id,
1502                        'nonce': nonce,
1503                        'action': 'wp_job_board_pro_ajax_remove_candidate_shortlist',
1504                    }
1505                }).done(function(data) {
1506                    $this.removeClass('loading');
1507                    if ( data.status ) {
1508                        $this.replaceWith(data.html);
1509                        $(document).trigger( "after_remove_candidate_shortlist", [$this, data] );
1510                    }
1511
1512                    self.showMessage(data.msg, data.status);
1513                });
1514            });
1515
1516            $(document).on('click', '.btn-remove-candidate-shortlist', function() {
1517                var $this = $(this);
1518                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1519                if ( r == true ) {
1520                    $this.addClass('loading');
1521                    var candidate_id = $(this).data('candidate_id');
1522                    var nonce = $(this).data('nonce');
1523                    $.ajax({
1524                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_candidate_shortlist' ),
1525                        type:'POST',
1526                        dataType: 'json',
1527                        data: {
1528                            'candidate_id': candidate_id,
1529                            'nonce': nonce,
1530                            'action': 'wp_job_board_pro_ajax_remove_candidate_shortlist',
1531                        }
1532                    }).done(function(data) {
1533                        $this.removeClass('loading');
1534                        if ( data.status ) {
1535                            $this.closest('.candidate-shortlist-wrapper').remove();
1536                        }
1537                        self.showMessage(data.msg, data.status);
1538                    });
1539                }
1540            });
1541        },
1542        followEmployer: function() {
1543            var self = this;
1544            $(document).on('click', '.btn-follow-employer', function() {
1545                var $this = $(this);
1546                $this.addClass('loading');
1547                var employer_id = $(this).data('employer_id');
1548                var nonce = $(this).data('nonce');
1549                $.ajax({
1550                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_follow_employer' ),
1551                    type:'POST',
1552                    dataType: 'json',
1553                    data: {
1554                        'employer_id': employer_id,
1555                        'nonce': nonce,
1556                        'action': 'wp_job_board_pro_ajax_follow_employer',
1557                    }
1558                }).done(function(data) {
1559                    $this.removeClass('loading');
1560                    if ( data.status ) {
1561                        $this.removeClass('btn-follow-employer').addClass('btn-u
1561nfollow-employer');
1562                        $this.data('nonce', data.nonce);
1563                        $this.find('span').text(data.text);
1564                        $(document).trigger( "after_follow_employer", [$this, data] );
1565                    }
1566                    self.showMessage(data.msg, data.status);
1567                });
1568            });
1569
1570            // unfollow
1571            $(document).on('click', '.btn-unfollow-employer', function() {
1572                var $this = $(this);
1573                $this.addClass('loading');
1574                var employer_id = $(this).data('employer_id');
1575                var nonce = $(this).data('nonce');
1576                $.ajax({
1577                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_unfollow_employer' ),
1578                    type:'POST',
1579                    dataType: 'json',
1580                    data: {
1581                        'employer_id': employer_id,
1582                        'nonce': nonce,
1583                        'action': 'wp_job_board_pro_ajax_unfollow_employer',
1584                    }
1585                }).done(function(data) {
1586                    $this.removeClass('loading');
1587                    if ( data.status ) {
1588                        if ( $this.closest('.following-employer-wrapper').length > 0 ) {
1589                            if ( $('.following-employer-wrapper').length <= 1 ) {
1590                                location.reload();
1591                            } else {
1592                                $this.closest('.following-employer-wrapper').remove();
1593                            }
1594                        } else {
1595                            $this.removeClass('btn-unfollow-employer').addClass('btn-follow-employer');
1596                            $this.data('nonce', data.nonce);
1597                            $this.find('span').text(data.text);
1598                            $(document).trigger( "after_unfollow_employer", [$this, data] );
1599                        }
1600                    }
1601                    self.showMessage(data.msg, data.status);
1602                });
1603            });
1604        },
1605        reviewInit: function() {
1606            var self = this;
1607            if ( $('.comment-form-rating').length > 0 ) {
1608                var $star = $('.comment-form-rating .filled');
1609                var $review = $('#_input_rating');
1610                $star.find('li').on('mouseover', function () {
1611                    $(this).nextAll().addClass('active');
1612                    $(this).prevAll().removeClass('active');
1613                    $(this).removeClass('active');
1614                });
1615                $star.on('mouseout', function(){
1616                    var current = $review.val() - 1;
1617                    var current_e = $star.find('li').eq(current);
1618
1619                    current_e.nextAll().addClass('active');
1620                    current_e.prevAll().removeClass('active');
1621                    current_e.removeClass('active');
1622                });
1623                $star.find('li').on('click', function () {
1624                    $(this).nextAll().addClass('active');
1625                    $(this).prevAll().removeClass('active');
1626                    $(this).removeClass('active');
1627                    
1628                    $review.val($(this).index() + 1);
1629                } );
1630            }
1631        },
1632        jobAlert: function() {
1633            var self = this;
1634            $(document).on('click', '.btn-job-alert', function() {
1635                var form_html = $('.job-alert-form-wrapper').html();
1636                $.magnificPopup.open({
1637                    mainClass: 'wp-job-board-pro-mfp-container',
1638                    items    : {
1639                        src : form_html,
1640                        type: 'inline'
1641                    }
1642                });
1643            });
1644            $(document).on('submit', 'form.job-alert-form', function() {
1645                var $this = $(this);
1646                $this.addClass('loading');
1647                $this.find('.alert').remove();
1648                var url_vars = self.getUrlVars();
1649                $.ajax({
1650                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_add_job_alert' ),
1651                    type:'POST',
1652                    dataType: 'json',
1653                    data: $this.serialize() + '&action=wp_job_board_pro_ajax_add_job_alert' + url_vars
1654                }).done(function(data) {
1655                    $this.removeClass('loading');
1656                    if ( data.status ) {
1657                        $this.prepend( '<div class="alert alert-info">
1657'+data.msg+'</div>' );
1658                        setTimeout(function(){
1659                            $.magnificPopup.close();
1660                        }, 1500);
1661                    } else {
1662                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
1663                    }
1664                });
1665
1666                return false;
1667            });
1668
1669            // Remove job alert
1670            $(document).on('click', '.btn-remove-job-alert', function() {
1671                var $this = $(this);
1672                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1673                if ( r == true ) {
1674                    $this.addClass('loading');
1675                    var alert_id = $(this).data('alert_id');
1676                    var nonce = $(this).data('nonce');
1677                    $.ajax({
1678                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_job_alert' ),
1679                        type:'POST',
1680                        dataType: 'json',
1681                        data: {
1682                            'alert_id': alert_id,
1683                            'nonce': nonce,
1684                            'action': 'wp_job_board_pro_ajax_remove_job_alert',
1685                        }
1686                    }).done(function(data) {
1687                        $this.removeClass('loading');
1688                        if ( data.status ) {
1689                            $this.closest('.job-alert-wrapper').remove();
1690                        }
1691                        self.showMessage(data.msg, data.status);
1692                    });
1693                }
1694            });
1695        },
1696        candidateAlert: function() {
1697            var self = this;
1698            $(document).on('click', '.btn-candidate-alert', function() {
1699                var form_html = $('.candidate-alert-form-wrapper').html();
1700                $.magnificPopup.open({
1701                    mainClass: 'wp-job-board-pro-mfp-container',
1702                    items    : {
1703                        src : form_html,
1704                        type: 'inline'
1705                    }
1706                });
1707            });
1708            $(document).on('submit', 'form.candidate-alert-form', function() {
1709                var $this = $(this);
1710                $this.addClass('loading');
1711                var url_vars = self.getUrlVars();
1712                $.ajax({
1713                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_add_candidate_alert' ),
1714                    type:'POST',
1715                    dataType: 'json',
1716                    data: $this.serialize() + '&action=wp_job_board_pro_ajax_add_candidate_alert' + url_vars
1717                }).done(function(data) {
1718                    $this.removeClass('loading');
1719                    if ( data.status ) {
1720                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
1721                        setTimeout(function(){
1722                            $.magnificPopup.close();
1723                        }, 1500);
1724                    } else {
1725                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
1726                    }
1727                });
1728
1729                return false;
1730            });
1731
1732            // Remove candidate alert
1733            $(document).on('click', '.btn-remove-candidate-alert', function() {
1734                var $this = $(this);
1735                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
1736                if ( r == true ) {
1737                    $this.addClass('loading');
1738                    var alert_id = $(this).data('alert_id');
1739                    var nonce = $(this).data('nonce');
1740                    $.ajax({
1741                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_candidate_alert' ),
1742                        type:'POST',
1743                        dataType: 'json',
1744                        data: {
1745                            'alert_id': alert_id,
1746                            'nonce': nonce,
1747                            'action': 'wp_job_board_pro_ajax_remove_candidate_alert',
1748                        }
1749                    }).done(function(data) {
1750                        $this.removeClass('loading');
1751                        if ( data.status ) {
1752                            $this.closest('.candidate-alert-wrapper').remove();
1753                        }
1754                        self.showMessage(data.msg, data.status);
1755                    });
1756                }
1757            });
1758        },
1759        getUrlVars: function() {
1760            var self = this;
1761            var vars = '';
1762            var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
1763            for(var i = 0; i < hashes.length; i++) {
1764                vars += '&' +hashes[i];
1765            }
1766            return vars;
1767        },
1768        jobSocialApply: function() {
1769            var self = this;
1770            $('.facebook-apply-btn').on('click', function(){
1771                var job_id = $(this).data('job_id');
1772                var facebook_login_url = $(this).attr('href');
1773                self.setCookie('wp_job_board_pro_facebook_job_id', job_id, 1);
1774                window.location.href = facebook_login_url;
1775            });
1776            
1777            // google
1778            $('.google-apply-btn').on('click', function(){
1779                var job_id = $(this).data('job_id');
1780                var google_login_url = $(this).attr('href');
1781                self.setCookie('wp_job_board_pro_google_job_id', job_id, 1);
1782                window.location.href = google_login_url;
1783            });
1784
1785            // linkedin
1786            $('.linkedin-apply-btn').on('click', function(){
1787                var job_id = $(this).data('job_id');
1788                var linkedin_login_url = $(this).attr('href');
1789                self.setCookie('wp_job_board_pro_linkedin_job_id', job_id, 1);
1790                window.location.href = linkedin_login_url;
1791            });
1792
1793            // twitter
1794            $('.twitter-apply-btn').on('click', function(){
1795                var job_id = $(this).data('job_id');
1796                var twitter_login_url = $(this).attr('href');
1797                self.setCookie('wp_job_board_pro_twitter_job_id', job_id, 1);
1798                window.location.href = twitter_login_url;
1799            });
1800        },
1801        select2Init: function() {
1802            var self = this;
1803            if ( $.isFunction( $.fn.select2 ) && typeof wp_job_board_pro_select2_opts !== 'undefined' ) {
1804                var select2_args = wp_job_board_pro_select2_opts;
1805                select2_args['allowClear']              = false;
1806                select2_args['minimumResultsForSearch'] = 10;
1807                select2_args['width'] = 'auto';
1808                if ( typeof wp_job_board_pro_select2_opts.language_result !== 'undefined' ) {
1809                    select2_args['language'] = {
1810                        noResults: function (params) {
1811                            return wp_job_board_pro_select2_opts['language_result'];
1812                        }
1813                    }
1814                }
1815                if( $('.woocommerce-ordering select.orderby').length ){
1816                    var woo_select2_args = select2_args;
1817                    woo_select2_args.theme = 'default orderby';
1818                    $('.woocommerce-ordering select.orderby').select2( woo_select2_args );
1819                }
1820                $('select.orderby').select2( select2_args );
1821                $('select.job_id').select2( select2_args );
1822            }
1823        },
1824        jobSubmission: function() {
1825            var self = this;
1826            // select2
1827            if ( $.isFunction( $.fn.select2 ) && typeof wp_job_board_pro_select2_opts !== 'undefined' ) {
1828                var select2_args = wp_job_board_pro_select2_opts;
1829                select2_args['allowClear']              = false;
1830                if ( typeof wp_job_board_pro_select2_opts.language_result !== 'undefined' ) {
1831                    select2_args['language'] = {
1832                        noResults: function (params) {
1833                            return select2_args['language_result'];
1834                        }
1835                    }
1836                }
1837                select2_args['minimumResultsForSearch'] = 10;
1838                
1839                $( 'select.cmb2_select' ).select2( select2_args );
1840            }
1841
1842            $('.cmb-repeatable-group').on('cmb2_add_group_row_start', function (event, instance) {
1843                var $table = $(document.getElementById($(instance).data('selector')));
1844                var $oldRow = $table.find('.cmb-repeatable-grouping').last();
1845
1846                $oldRow.find('select.cmb2_select').each(function () {
1847                    $(this).select2('destroy');
1848                });
1849            });
1850
1851            $('.cmb-repeatable-group').on('cmb2_add_row', function (event, newRow) {
1852                $(newRow).find('select.cmb2_select').each(function () {
1853                    $('option:selected', this).removeAttr("selected");
1854                    $(this).select2(select2_args);
1855                });
1856
1857                // Reinitialise the field we previously destroyed
1858                $(newRow).prev().find('select.cmb2_select').each(function () {
1859                    $(this).select2(select2_args);
1860                });
1861            });
1862            
1863            ///
1864            $('.cmb-add-row-button').on('click', function (event) {
1865                var $table = $(document.getElementById($(event.target).data('selector')));
1866                var $oldRow = $table.find('.cmb-row').last();
1867
1868                $oldRow.find('select.cmb2_select').each(function () {
1869                    $(this).select2('destroy');
1870                });
1871            });
1872
1873            $('.cmb-repeat-table').on('cmb2_add_row', function (event, newRow) {
1874                // Reinitialise the field we previously destroyed
1875                $(newRow).prev().find('select.cmb2_select').each(function () {
1876                    $('option:selected', this).removeAttr("selected");
1877                    $(this).select2(select2_args);
1878                });
1879            });
1880
1881            //
1882            var apply_type = $('#_job_apply_type').val();
1883            if ( apply_type == 'internal' ) {
1884                $('.cmb2-id--job-apply-url').hide();
1885                $('.cmb2-id--job-apply-email').hide();
1886                $('.cmb2-id--job-phone').hide();
1887            } else if ( apply_type == 'external' ) {
1888                $('.cmb2-id--job-apply-url').show();
1889                $('.cmb2-id--job-apply-email').hide();
1890                $('.cmb2-id--job-phone').hide();
1891            } else if ( apply_type == 'with_email' ) {
1892                $('.cmb2-id--job-apply-url').hide();
1893                $('.cmb2-id--job-phone').hide();
1894                $('.cmb2-id--job-apply-email').show();
1895            } else if ( apply_type == 'call' ) {
1896                $('.cmb2-id--job-apply-url').hide();
1897                $('.cmb2-id--job-apply-email').hide();
1898                $('.cmb2-id--job-phone').show();
1899            }
1900            $('#_job_apply_type').change(function(){
1901                var apply_type = $('#_job_apply_type').val();
1902                if ( apply_type == 'internal' ) {
1903                    $('.cmb2-id--job-apply-url').hide();
1904                    $('.cmb2-id--job-apply-email').hide();
1905                    $('.cmb2-id--job-phone').hide();
1906                } else if ( apply_type == 'external' ) {
1907                    $('.cmb2-id--job-apply-url').show();
1908                    $('.cmb2-id--job-apply-email').hide();
1909                    $('.cmb2-id--job-phone').hide();
1910                } else if ( apply_type == 'with_email' ) {
1911                    $('.cmb2-id--job-apply-url').hide();
1912                    $('.cmb2-id--job-phone').hide();
1913                    $('.cmb2-id--job-apply-email').show();
1914                } else if ( apply_type == 'call' ) {
1915                    $('.cmb2-id--job-apply-url').hide();
1916                    $('.cmb2-id--job-apply-email').hide();
1917                    $('.cmb2-id--job-phone').show();
1918                }
1919            });
1920        },
1921        filterListing: function() {
1922            var self = this;
1923
1924            $(document).on('click', 'form .toggle-field .heading-label', function(){
1925                var container = $(this).closest('.form-group');
1926                container.find('.form-group-inner').slideToggle();
1927                if ( container.hasClass('hide-content') ) {
1928                    container.removeClass('hide-content');
1929                } else {
1930                    container.addClass('hide-content');
1931                }
1932            });
1933            $(document).on('click', '.toggle-filter-list', function() {
1934                var $this = $(this);
1935                var container = $(this).closest('.form-group');
1936                container.find('.terms-list .more-fields').each(function(){
1937                    if ( $(this).hasClass('active') ) {
1938                        $(this).removeClass('active');
1939                        $this.find('.text').text(wp_job_board_pro_opts.show_more);
1940                    } else {
1941                        $(this).addClass('active');
1942                        $this.find('.text').text(wp_job_board_pro_opts.show_less);
1943                    }
1944                });
1945            });
1946
1947            if ( $.isFunction( $.fn.slider ) ) {
1948                $('.search-distance-slider').each(function(){
1949                    var $this = $(this);
1950                    var search_distance = $this.closest('.search-distance-wrapper').find('input[name^=filter-distance]');
1951                    var search_wrap = $this.closest('.search_distance_wrapper');
1952                    $(this).slider({
1953                        range: "min",
1954                        value: search_distance.val(),
1955                        min: 0,
1956                        max: 100,
1957                        slide: function( event, ui ) {
1958                            search_distance.val( ui.value );
1959                            $('.text-distance', search_wrap).text( ui.value );
1960                            $('.distance-custom-handle', $this).attr( "data-value", ui.value );
1961                            search_distance.trigger('change');
1962                        },
1963                        create: function() {
1964                            $('.distance-custom-handle', $this).attr( "data-value", $( this ).slider( "value" ) );
1965                        }
1966                    } );
1967                } );
1968
1969                $('.main-range-slider').each(function(){
1970                    var $this = $(this);
1971                    $this.slider({
1972                        range: true,
1973                        min: $this.data('min'),
1974                        max: $this.data('max'),
1975                        values: [ $this.parent().find('.filter-from').val(), $this.parent().find('.filter-to').val() ],
1976                        slide: function( event, ui ) {
1977                            $this.parent().find('.from-text').text( ui.values[ 0 ] );
1978                            $this.parent().find('.filter-from').val( ui.values[ 0 ] )
1979                            $this.parent().find('.to-text').text( ui.values[ 1 ] );
1980                            $this.parent().find('.filter-to').val( ui.values[ 1 ] );
1981                            $this.parent().find('.filter-to').trigger('change');
1982                        }
1983                    } );
1984                });
1985
1986                $('.salary-range-slider').each(function(){
1987                    var $this = $(this);
1988                    $this.slider({
1989                        range: true,
1990                        min: $this.data('min'),
1991                        max: $this.data('max'),
1992                        values: [ $this.parent().find('.filter-from').val(), $this.parent().find('.filter-to').val() ],
1993                        slide: function( event, ui ) {
1994                            $this.parent().find('.from-text .price-text').text( self.addCommas(ui.values[ 0 ]) );
1995                            $this.parent().find('.filter-from').val( ui.values[ 0 ] )
1996                            $this.parent().find('.to-text .price-text').text( self.addCommas(ui.values[ 1 ]) );
1997                            $this.parent().find('.filter-to').val( ui.values[ 1 ] );
1998                            $this.parent().find('.filter-to').trigger('change');
1999                        }
2000                    } );
2001                });
2002            }
2003
2004            $('.find-me').on('click', function() {
2005                $(this).addClass('loading');
2006                var this_e = $(this);
2007                var container = $(this).closest('.form-group');
2008
2009                navigator.geolocation.getCurrentPosition(function (position) {
2010                    container.find('input[name="filter-center-latitude"]').val(position.coords.latitude);
2011                    container.find('input[name="filter-center-longitude"]').val(position.coords.longitude);
2012                    container.find('input[name="filter-center-location"]').val('Location');
2013                    container.find('.clear-location').removeClass('hidden');
2014                    container.find('.leaflet-geocode-container').html('').removeClass('active');
2015                    var position = [position.coords.latitude, position.coords.longitude];
2016
2017                    if ( typeof L.esri.Geocoding.geocodeService != 'undefined' ) {
2018                    
2019                        var geocodeService = L.esri.Geocoding.geocodeService();
2020                        geocodeService.reverse().latlng(position).run(function(error, result) {
2021                            container.find('input[name="filter-center-location"]').val(result.address.Match_addr);
2022                        });
2023                    }
2024
2025                    return this_e.removeClass('loading');
2026                }, function (e) {
2027                    return this_e.removeClass('loading');
2028                }, {
2029                    enableHighAccuracy: true
2030                });
2031            });
2032
2033            $('.clear-location').on('click', function() {
2034                var container = $(this).closest('.form-group');
2035
2036                container.find('input[name="filter-center-latitude"]').val('');
2037                container.find('input[name="filter-center-longitude"]').val('');
2038                container.find('input[name="filter-center-location"]').val('').trigger('keyup');
2039                container.find('.clear-location').addClass('hidden');
2040            });
2041            $('input[name="filter-center-location"]').on('keyup', function(){
2042                var container = $(this).closest('.form-group');
2043                var val = $(this).val();
2044                if ( $(this).val() !== '' ) {
2045                    container.find('.clear-location').removeClass('hidden');
2046                } else {
2047                    container.find('.clear-location').removeClass('hidden').addClass('hidden');
2048                }
2049            });
2050            
2051            // search autocomplete location
2052            if ( wp_job_board_pro_opts.map_service == 'google-map' ) {
2053                if (typeof google === 'object' && typeof google.maps === 'object') {
2054                    function search_location_initialize() {
2055                        
2056                        $('input[name="filter-center-location"]').each(function(){
2057                            var $id = $(this).attr('id');
2058                            
2059                            if ( typeof $id !== 'undefined' ) {
2060                                var container = $('#'+$id).closest('.form-group-inner');
2061                                var input = document.getElementById($id);
2062                                var autocomplete = new google.maps.places.Autocomplete(input);
2063                                autocomplete.setTypes([]);
2064
2065                                if ( wp_job_board_pro_opts.geocoder_country ) {
2066                                    autocomplete.setComponentRestrictions({
2067                                        country: [wp_job_board_pro_opts.geocoder_country],
2068                                    });
2069                                }
2070
2071                                autocomplete.addListener( 'place_changed', function () {
2072                                    var place = autocomplete.getPlace();
2073                                    place.toString();
2074
2075                                    if (!place.geometry) {
2076                                        window.alert("No details available for input: '" + place.name + "'");
2077                                        return;
2078                                    }
2079
2080                                    container.find('input[name=filter-center-latitude]').val(place.geometry.location.lat());
2081                                    container.find('input[name=filter-center-longitude]').val(place.geometry.location.lng());
2082                                    
2083                                });
2084                            }
2085                        });
2086                    }
2087                    google.maps.event.addDomListener(window, 'load', search_location_initialize);
2088                }
2089            } else {
2090                if ( typeof L.Control.Geocoder.Nominatim != 'undefined' ) {
2091                    if ( wp_job_board_pro_opts.geocoder_country ) {
2092                        var geocoder = new L.Control.Geocoder.Nominatim({
2093                            geocodingQueryParams: {countrycodes: wp_job_board_pro_opts.geocoder_country, lang: wp_job_board_pro_opts.geocoder_country}
2094                        });
2095                    } else {
2096                        var geocoder = new L.Control.Geocoder.Nominatim();
2097                    }
2098
2099                    function delay(fn, ms) {
2100                        let timer = 0
2101                        return function(...args) {
2102                            clearTimeout(timer)
2103                            timer = setTimeout(fn.bind(this, ...args), ms || 0)
2104                        }
2105                    }
2106
2107                    $("input[name=filter-center-location]").attr('autocomplete', 'off').after('<div class="leaflet-geocode
2107-container"></div>');
2108                    $("input[name=filter-center-location]").on("keyup", delay(function (e) {
2109                        var s = $(this).val(), $this = $(this), container = $(this).closest('.form-group-inner');
2110                        if (s && s.length >= 3) {
2111                            
2112                            $this.parent().addClass('loading');
2113                            geocoder.geocode(s, function(results) {
2114                                var output_html = '';
2115                                for (var i = 0; i < results.length; i++) {
2116                                    output_html += '<li class="result-item" data-latitude="'+results[i].center.lat+'" data-longitude="'+results[i].center.lng+'" ><i class="fa fa-map-marker" aria-hidden="true"></i> '+results[i].name+'</li>';
2117                                }
2118                                if ( output_html ) {
2119                                    output_html = '<ul>'+ output_html +'</ul>';
2120                                }
2121
2122                                container.find('.leaflet-geocode-container').html(output_html).addClass('active');
2123
2124                                var highlight_texts = s.split(' ');
2125
2126                                highlight_texts.forEach(function (item) {
2127                                    container.find('.leaflet-geocode-container').highlight(item);
2128                                });
2129
2130                                $this.parent().removeClass('loading');
2131                            });
2132                        } else {
2133                            container.find('.leaflet-geocode-container').html('').removeClass('active');
2134                        }
2135                    }, 500));
2136                    $('.form-group-inner').on('click', '.leaflet-geocode-container ul li', function() {
2137                        var container = $(this).closest('.form-group-inner');
2138                        container.find('input[name=filter-center-latitude]').val($(this).data('latitude'));
2139                        container.find('input[name=filter-center-longitude]').val($(this).data('longitude'));
2140                        container.find('input[name=filter-center-location]').val($(this).text());
2141                        container.find('.leaflet-geocode-container').removeClass('active').html('');
2142                    });
2143                }
2144            }
2145
2146        },
2147        employerAddEmployee: function() {
2148            var self = this;
2149            
2150            // add
2151            $(document).on('submit', 'form.employer-add-employees-form', function(e) {
2152                e.preventDefault();
2153                var $this = $(this);
2154                if ( $this.hasClass('loading') ) {
2155                    return false;
2156                }
2157                $this.addClass('loading');
2158                $.ajax({
2159                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_employer_add_employee' ),
2160                    type:'POST',
2161                    dataType: 'json',
2162                    data: $this.serialize() + '&action=wp_job_board_pro_ajax_employer_add_employee'
2163                }).done(function(data) {
2164                    $this.removeClass('loading');
2165                    if ( data.status ) {
2166                        $('.employer-employees-list-inner').prepend(data.html);
2167                        if ( $('.employer-employees-list-inner .not-found').length ) {
2168                            $('.employer-employees-list-inner .not-found').remove();
2169                        }
2170                        $this.find('.team-employee-inner').remove();
2171                    }
2172                    self.showMessage(data.msg, data.status);
2173                });
2174                return false;
2175            });
2176            // remove
2177            $(document).on('click', '.btn-employer-remove-employee', function() {
2178                var $this = $(this);
2179                var r = confirm( wp_job_board_pro_opts.rm_item_txt );
2180                if ( r == true ) {
2181                    $this.addClass('loading');
2182                    var employee_id = $(this).data('employee_id');
2183                    var nonce = $(this).data('nonce');
2184                    $.ajax({
2185                        url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_employer_remove_employee' ),
2186                        type:'POST',
2187                        dataType: 'json',
2188                        data: {
2189                            'employee_id': employee_id,
2190                            'nonce': nonce,
2191                            'action': 'wp_job_board_pro_ajax_employer_remove_employee',
2192                        }
2193                    }).done(function(data) {
2194                        $this.removeClass('loading');
2195                        if ( data.status ) {
2196                            $this.closest('article.employee-team-wrapper').remove();
2197                        }
2198                        self.showMessage(data.msg, data.status);
2199                    });
2200                }
2201            });
2202        },
2203        inviteCandidate: function() {
2204            var self = this;
2205            
2206            $(document).on('click', '.cannot-download-cv-btn', function() {
2207                var msg = $(this).data('msg');
2208                self.showMessage(msg, false);
2209            });
2210            $('.btn-invite-candidate:not(.cannot-download-cv-btn)').magnificPopup({
2211                mainClass: 'apus-mfp-zoom-in',
2212                type:'inline',
2213                midClick: true
2214            });
2215
2216            // add
2217            $(document).on('submit', 'form.invite-candidate-form', function(e) {
2218                e.preventDefault();
2219                var $this = $(this);
2220                if ( $this.hasClass('loading') ) {
2221                    return false;
2222                }
2223                if ( self.inviteAjax ) {
2224                    self.inviteAjax.abort();
2225                }
2226
2227                $this.find('.alert').remove();
2228                $this.addClass('loading');
2229                self.inviteAjax = $.ajax({
2230                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_invite_candidate' ),
2231                    type:'POST',
2232                    dataType: 'json',
2233                    data: $this.serialize()
2234                }).done(function(data) {
2235                    $this.removeClass('loading');
2236
2237                    if ( data.status ) {
2238                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
2239                    } else {
2240                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
2241                    }
2242
2243                    self.inviteAjax = false;
2244                });
2245                return false;
2246            });
2247        },
2248        mixesFn: function() {
2249            var self = this;
2250            
2251            $( '.my-jobs-ordering' ).on( 'change', 'select.orderby', function() {
2252                $( this ).closest( 'form' ).submit();
2253            });
2254
2255            $('.contact-form-wrapper').on('submit', function(){
2256                var $this = $(this);
2257                $this.find('.alert').remove();
2258                $this.addClass('loading');
2259                $.ajax({
2260                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_contact_form' ),
2261                    type:'POST',
2262                    dataType: 'json',
2263                    data: $this.serialize() + '&action=wp_job_board_pro_ajax_contact_form'
2264                }).done(function(data) {
2265                    $this.removeClass('loading');
2266                    if ( data.status ) {
2267                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
2268                    } else {
2269                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
2270                    }
2271                });
2272
2273                return false;
2274            });
2275
2276            $(document).on( 'submit', 'form.delete-profile-form', function() {
2277                var $this = $(this);
2278                $this.addClass('loading');
2279                $(this).find('.alert').remove();
2280                $.ajax({
2281                    url: wp_job_board_pro_opts.ajaxurl,
2282                    type:'POST',
2283                    dataType: 'json',
2284                    data: $this.serialize() + '&action=wp_job_board_pro_ajax_delete_profile'
2285                }).done(function(data) {
2286                    $this.removeClass('loading');
2287                    if ( data.status ) {
2288                        $this.prepend( '<div class="alert alert-info">'+data.msg+'</div>' );
2289                        window.location.href = wp_job_board_pro_opts.home_url;
2290                    } else {
2291                        $this.prepend( '<div class="alert alert-warning">'+data.msg+'</div>' );
2292                    }
2293                });
2294
2295                return false;
2296            });
2297
2298            $('.cannot-download-cv-btn').on('click', function(e) {
2299                e.preventDefault();
2300                self.showMessage($(this).data('msg'), false);
2301            });
2302
2303            // Location Change
2304            $('body').on('change', 'select.select-field-region', function(){
2305                var val = $(this).val();
2306                var next = $(this).data('next');
2307                var hide_empty = $(this).data('hide_empty');
2308                var main_select = 'select.select-field-region' + next;
2309                if ( $(main_select).length > 0 ) {
2310                    
2311                    var select2_args = wp_job_board_pro_select2_opts;
2312                        select2_args['allowClear'] = true;
2313                        select2_args['minimumResultsForSearch'] = 10;
2314                        select2_args['width'] = '100%';
2315
2316                    if ( typeof wp_job_board_pro_select2_opts.language_result !== 'undefined' ) {
2317                        select2_args['language'] = {
2318                            noResults: function(){
2319                                return wp_job_board_pro_select2_opts.language_result;
2320                            }
2321                        };
2322                    }
2323
2324                    $(main_select).prop('disabled', true);
2325                    $(main_select).val('').trigger('change');
2326
2327                    if ( val ) {
2328                        $(main_select).parent().addClass('loading');
2329                        $.ajax({
2330                            url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wpjb_process_change_location' ),
2331                            type:'POST',
2332                            dataType: 'json',
2333                            data:{
2334                                'action': 'wpjb_process_change_location',
2335                                'parent': val,
2336                                'hide_empty': hide_empty,
2337                                'taxonomy': $(main_select).data('taxonomy'),
2338                                'security': wp_job_board_pro_opts.ajax_nonce,
2339                            }
2340                        }).done(function(data) {
2341                            $(main_select).parent().removeClass('loading');
2342                            
2343                            $(main_select).find('option').remove();
2344                            if ( data ) {
2345                                $.each(data, function(i, item) {
2346                                    var option = new Option(item.name, item.id, true, true);
2347                                    $(main_select).append(option);
2348                                });
2349                            }
2350                            $(main_select).prop("disabled", false);
2351                            $(main_select).val(null).select2("destroy").select2(select2_args);
2352                        });
2353                    } else {
2354                        $(main_select).find('option').remove();
2355                        $(main_select).prop("disabled", false);
2356                        $(main_select).val(null).select2("destroy").select2(select2_args);
2357                    }
2358                }
2359            });
2360
2361            // remove notify
2362            $('.notifications-wrapper').on('click', '.remove-notify-btn', function(e) {
2363                e.stopPropagation();
2364                var $this = $(this);
2365                
2366                $this.addClass('loading');
2367                var unique_id = $(this).data('id');
2368                var nonce = $(this).data('nonce');
2369                $.ajax({
2370                    url: wp_job_board_pro_opts.ajaxurl_endpoint.toString().replace( '%%endpoint%%', 'wp_job_board_pro_ajax_remove_notify' ),
2371                    type:'POST',
2372                    dataType: 'json',
2373                    data: {
2374                        'unique_id': unique_id,
2375                        'nonce': nonce,
2376                    }
2377                }).done(function(data) {
2378                    $this.removeClass('loading');
2379                    if ( data.status ) {
2380                        if ( $this.closest('ul').find('li').length > 1 ) {
2381                            $this.closest('li').remove();
2382                        } else {
2383                            window.location.reload(true);
2384                        }
2385                    }
2386                    self.showMessage(data.msg, data.status);
2387                });
2388
2389            });
2390
2391            // currencies
2392            $('body').on('change', '.jobs-currencies input', function(){
2393                $(this).closest('form').trigger('submit');
2394            });
2395        },
2396        addCommas: function(str) {
2397            var parts = (str + "").split("."),
2398                main = parts[0],
2399                len = main.length,
2400                output = "",
2401                first = main.charAt(0),
2402                i;
2403            
2404            if (first === '-') {
2405                main = main.slice(1);
2406                len = main.length;    
2407            } else {
2408                first = "";
2409            }
2410            i = len - 1;
2411            while(i >= 0) {
2412                output = main.charAt(i) + output;
2413                if ((len - i) % 3 === 0 && i > 0) {
2414                    output = wp_job_board_pro_opts.money_thousands_separator + output;
2415                }
2416                --i;
2417            }
2418            // put sign back
2419            output = first + output;
2420            // put decimal part back
2421            if (parts.length > 1) {
2422                output += wp_job_board_pro_opts.money_dec_point + parts[1];
2423            }
2424            return output;
2425        },
2426        showMessage: function(msg, status) {
2427            if ( msg ) {
2428                var classes = 'alert bg-warning';
2429                if ( status ) {
2430                    classes = 'alert bg-info';
2431                }
2432                var $html = '<div id="wp-job-board-pro-popup-message" class="animated fadeInRight"><div class="message-inner '+ classes +'">'+ msg +'</div></div>';
2433                $('body').find('#wp-job-board-pro-popup-message').remove();
2434                $('body').append($html).fadeIn(500);
2435                setTimeout(function() {
2436                    $('body').find('#wp-job-board-pro-popup-message').removeClass('fadeInRight').addClass('delay-2s fadeOutRight');
2437                }, 2500);
2438            }
2439        },
2440        setCookie: function(cname, cvalue, exdays) {
2441            var d = new Date();
2442            d.setTime(d.getTime() + (exdays*24*60*60*1000));
2443            var expires = "expires="+d.toUTCString();
2444            document.cookie = cname + "=" + cvalue + "; " + expires+";path=/";
2445        },
2446        getCookie: function(cname) {
2447            var name = cname + "=";
2448            var ca = document.cookie.split(';');
2449            for(var i=0; i<ca.length; i++) {
2450                var c = ca[i];
2451                while (c.charAt(0)==' ') c = c.substring(1);
2452                if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
2453            }
2454            return "";
2455        },
2456    }
2457
2458    $.wjbpMainCore = WJBPMainCore.prototype;
2459    
2460    $(document).ready(function() {
2461        // Initialize script
2462        new WJBPMainCore();
2463
2464    });
2465    
2466})(jQuery);
2467

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.