PageSourceSearch

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

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

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.