// source --> https://bhm-personal.de/wp-content/plugins/zvoove-recruit-jobboard/public/js/recruit-jobboard-public.js?ver=2.12.0 
(function($){
    'use strict';

    /**
     * All of the code for your public-facing JavaScript source
     * should reside in this file.
     *
     * Note: It has been assumed you will write jQuery code here, so the
     * $ function reference has been prepared for usage within the scope
     * of this function.
     *
     * This enables you to define handlers, for when the DOM is ready:
     *
     * $(function(){
     *
     * });
     *
     * When the window is loaded:
     *
     * $(window).on('load', function(){
     *
     * });
     *
     * ...and/or other possibilities.
     *
     * Ideally, it is not considered best practise to attach more than a
     * single DOM-ready or window-load handler for a particular page.
     * Although scripts in the WordPress core, Plugins and Themes may be
     * practising this, we should strive to set a better example in our own work.
     */

    $(function(){

        $.fn.select2.defaults.set('language', {
            "searching": function(){
                return "Suche...";
            },
            "noResults": function(){
                return "Keine Übereinstimmungen gefunden";
            },
            "inputTooShort": function(){
                return "Bitte mind. 2 Zeichen eingeben.";
            },
            "inputTooLong": function(){
                return "Bitte weniger Zeichen eingeben.";
            },
			"errorLoading": function () {
				return 'Die Ergebnisse konnten nicht geladen werden.';
			}
        });


        // ======================================================================================
        // Anpassung an WPML:
        // - Den URLs der Language-Menü-Items den Stellen-Slug und die StelleUuid mitgeben
        // ======================================================================================

        var $wpml_ls_items	= $(".menu-item.wpml-ls-item.wpml-ls-menu-item.menu-item-type-wpml_ls_menu_item");
        if ($wpml_ls_items.length > 0) {
            var pathname = new URL(window.location.href).pathname;
            var match = pathname.match(/[^\/]+\/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\/?/);
            if (match) {
                var child;
                for (var idx = 0; idx < $wpml_ls_items.length; idx++) {
                    child = $wpml_ls_items[idx].firstElementChild;
                    if (child.tagName.toUpperCase() == 'A') {
                        child.href += match[0];
                    }
                }
            }
        }

        // ======================================================================================
        // Sobald die Seite komplett geladen ist
        // ======================================================================================

        $(window).on('load', function() {

            // Die Jobbezeichnung als Titel verwenden
            var jobDescription = $('#zrjb-job-detail-title')[0]?.outerText;
            if (jobDescription?.length > 0) {
                document.title = jobDescription;

                var metaDescription = $('#zrjb-stelle-meta-description').val();

                // Meta-Tags für SEO hinzufügen
                const metaTags = [
                    { property: 'og:title', content: jobDescription },
                    { property: 'og:description', content: metaDescription },
                    { property: 'og:url', content: $('#zrjb-stelle-url').val() },
                    { property: 'og:image', content: $('#zrjb-image-url').val() },
                    { property: 'og:type', content: 'article' },
                    { property: 'article:published_time', content: $('#zrjb-stelle-datum-ab').val()?.substr(0, 10) },
                    { name: "twitter:card", content: 'summary_large_image' },
                    { name: "twitter:title", content: jobDescription },
                    { name: "twitter:description", content: metaDescription },
                    { name: 'twitter:image', content: $('#zrjb-image-url').val() },
                ];
                metaTags.forEach(tagData => {
                    let meta = document.createElement('meta');
                    if (tagData.name) {
                        meta.setAttribute('name', tagData.name);
                    }
                    if (tagData.property) {
                        meta.setAttribute('property', tagData.property);
                    }
                    meta.setAttribute('content', tagData.content);
                    document.head.appendChild(meta);
                });
            }

            // Buttonlink nach Zurücknavigieren wieder herstellen
            if(isSearchboxFormRequest && $('#zrjb-filter-keywords').val() != null){
                searchboxJoblistLink[0].href = generateJobListUrl();
            }

            // URL-Parameter an iframe src-URL weiterreichen
            var iframe = document.getElementById("zrjb-profile-iframe");
            if (document.contains(iframe)) {
                var loc = window.location.toString();
                var params = loc.split('?uuid=')[1];
                var newsrc = iframe.src + params;
                $('#zrjb-profile-iframe').attr('src', newsrc);
            }

            // Redirect bei nicht vorhandenen bzw. nicht veröffentlichten Stellen
            var redirectUrl = document.getElementById("zrjb-detail-redirect-url") && document.getElementById("zrjb-detail-redirect-url").value;
            if ( redirectUrl ){
                window.location.href = redirectUrl + '/?jobnotfound';
            }
        });


        // ======================================================================================
        // Formular Suche
        // ======================================================================================

        var currentUrl = new URL(window.location.href);

        var geoserviceCountryCode = $('#zrjb-geoservice-country-code').val();
        var geoserviceBaseUrl = geoserviceCountryCode === 'de+at' ? 'https://prosoftinternalsapi.azurewebsites.net/' : 'https://de-zvoove-addresses.azurewebsites.net/';
        var locationSearchEndpoint = geoserviceCountryCode === 'de+at' ? 'api/geodaten/searchExtended' : 'api/address/SearchLocationText/';
        var geoserviceUrl = geoserviceBaseUrl + locationSearchEndpoint;

        var extendedFilters = $('#zrjb-filter-extended-filters').val() ? $('#zrjb-filter-extended-filters').val().split(',') : [];
        var sandp = ['GNqA27Zk', '5EpV'];

        var isSearchboxFormRequest = $('#zrjb-searchbox-form').length > 0;
        var searchboxJoblistLink = $('#zrjb-searchbox-joblist-link');

        // --------------------------------------------------------------------------------------
        // Suchbox Filter reset
        // --------------------------------------------------------------------------------------
        $('#zrjb-searchbox-filter-reset-button').click(function() {
            $('#zrjb-filter-keywords').val("").trigger("change");
            $('#zrjb-select-location').val("").trigger("change");
            $('#zrjb-location-text').val("").trigger("change");
            $('#zrjb-location-lat').val(null).trigger("change");
            $('#zrjb-location-lon').val(null).trigger("change");
            $('#zrjb-select-radius').val($('#zrjb-filter-circular-radius-init').val()).trigger("change");
            $('#zrjb-select-abteilungen').val("").trigger("change");
            $('#zrjb-select-vertragsarten').val("").trigger("change");
            submitSearchForm();
        });


        // --------------------------------------------------------------------------------------
        // Keywords: Submit on ENTER
        // --------------------------------------------------------------------------------------
        $('#zrjb-filter-keywords').keyup(function(event) {
            if (isSearchboxFormRequest && event.which === 13) {
                    window.location.href = generateJobListUrl();
            } else {
                submitSearchForm();
            }
        });


        // --------------------------------------------------------------------------------------
        // Umkreissuche
        // --------------------------------------------------------------------------------------
        if (extendedFilters.indexOf('umkreis') >= 0  ) {

            // --------------------------------------------------------------------------------------
            // Location
            // --------------------------------------------------------------------------------------
            var $select_location = $('#zrjb-select-location');
            var $radius_selectbox_show = (typeof $('#zrjb-searchbox-radius-selectbox-show').val()) !== 'undefined' ? 
                $('#zrjb-searchbox-radius-selectbox-show').val() : 'checked';
            var ajaxHeaders = {
                'Access-Control-Allow-Origin': '*',
                'X-ApiKey': getApiKey('dLpX7rat', '5RBuUPd9u80C'),
            };

            // Vorhandene Url-Parameter aus GET-Request (Browser-Adresszeile) verarbeiten
            var loc = currentUrl.searchParams.get("loc");
            var location = loc && loc.length > 0 ? loc.split(' ') : [];
            isNumeric(location[0]) ? location.shift() : location;
            var locationSelectWidth = '100%';
            var radiusSelectBoxDisplay = 'none';
            if ($radius_selectbox_show && (location.length > 0 || isSearchboxFormRequest)) {
                locationSelectWidth = '70%';
                radiusSelectBoxDisplay = 'contents';
            }
            if (location.length > 0) {
                // Ajax-Objekt je nach ausgewähltem Gebiet (de+at oder ch) zusammenbauen
                if(geoserviceCountryCode === 'de+at') {
                    $.ajax({
                        type: 'GET',
                        url: geoserviceUrl + '?searchterm=' + encodeURI(location.join(' ')),
                    }).then(function (data) {
                        var option = new Option(loc, data.items[0].uuid, true, true);
                        $select_location.append(option).trigger('change');
                    });
                } else {
                    var url = geoserviceUrl;
                    if (geoserviceCountryCode === 'at' || geoserviceCountryCode === 'ch') {
                        url = url + geoserviceCountryCode + '/?text=';
                    } else {
                        url = url + '?text=';
                    }
                    $.ajax({
                        type: 'GET',
                        url: url + encodeURI(location.join(' ')),
                        headers: ajaxHeaders,
                        dataType: 'json',
                    }).then(function (data) {
                        var option = new Option(loc);
                        $select_location.append(option).trigger('change');
                    });
                }
            }

            $select_location.select2({
                placeholder: 'PLZ oder Ort',
                allowClear: true,
                width: locationSelectWidth,
                minimumInputLength: 2,
                ajax: getAjaxForSelect(),
            });

            $select_location.on('select2:select', function (e) {
                $('#zrjb-location-text').val(e.params.data.text);
                if( geoserviceCountryCode === 'de+at' ) {
                    $('#zrjb-location-lat').val(e.params.data.lat);
                    $('#zrjb-location-lon').val(e.params.data.lon);
                    submitSearchForm();
                } else {
                    var url = geoserviceBaseUrl + 'api/address/getLocationCoordinates/' + e.params.data.id;
                    $.ajax({
                        type: 'GET',
                        headers: ajaxHeaders,
                        dataType: 'json',
                        url: url,
                    }).then(function (data) {
                        $('#zrjb-location-lat').val(data.Latitude);
                        $('#zrjb-location-lon').val(data.Longitude);
                        submitSearchForm();
                    });
                }
            });

            $select_location.on('select2:unselect', function (e) {
                $('#zrjb-location-text').val('');
                $('#zrjb-location-lat').val('');
                $('#zrjb-location-lon').val('');
                submitSearchForm();
            });

            // --------------------------------------------------------------------------------------
            // Umkreis
            // --------------------------------------------------------------------------------------
            var $select_radius = $('#zrjb-select-radius');
            if ($select_radius.length > 0) {
                var radiusInit = $('#zrjb-filter-circular-radius-init').val();
                var radien = $('#zrjb-filter-circular-radii').val().split(',');
                var radiusData = [];
                radien.forEach(function(e) {
                    radiusData.push({
                        id: e,
                        text: e + ' km'
                    })
                });
                radiusData.push({
                    id: 99999,
                    text: '> ' + radien[radien.length-1] + ' km'
                })
    
                $select_radius.select2({
                    placeholder: 'Umkreis',
                    width: '30%',
                    data: radiusData,
                });
    
                var rad = currentUrl.searchParams.get("rad");
                $select_radius.val(!rad || isNaN(rad) || rad <= 0 || rad > 99999 ? rad = radiusInit : rad);
                $select_radius.trigger('change');
                $('#zrjb-radius-select-box')[0].style.display = radiusSelectBoxDisplay;
    
                $select_radius.on('select2:select', function (e) {
                    submitSearchForm();
                });
            }

        }

        // --------------------------------------------------------------------------------------
        // Unternehmensbereich/Abteilung
        // --------------------------------------------------------------------------------------
        if (extendedFilters.indexOf('abteilung') >= 0  ) {

            var $select_abteilungen = $('#zrjb-select-abteilungen');
            var abtUrl = getPublicApiUrl('katalog/GetByRelationName?entityName=StelleAbteilung&relationName=Abteilung');
            var abt = currentUrl.searchParams.get("abt");
            var abtUuids = abt && abt.length > 0 ? abt.split('|') : [];
            if (abtUuids.length) {
                $.ajax({
                    type: 'GET',
                    url: abtUrl
                }).then(function (data) {
                    data.Items.forEach(item => {
                        if(abtUuids.includes(item.ObjectUuid)) {
                            var option = new Option(item.Bezeichnung, item.ObjectUuid, true, true);
                            $select_abteilungen.append(option).trigger('change');
                        }
                    });
                });
            }

            $select_abteilungen.select2({
                placeholder: 'Unternehmensbereich/Abteilung',
                multiple: true,
                width: '100%',
                ajax: {
                    url: abtUrl,
                    dataType: 'json',
                    data: function (params) {
                        var query = {
                            nameproperty: "Bezeichnung",
                            searchText: params.term
                        }
                        return query;
                    },
                    processResults: function (data) {
                        var abteilungen = [];
                        data.Items.forEach(item => {
                            abteilungen.push({ id: item.ObjectUuid, text: item.Bezeichnung });
                        });
                        return {
                            results: abteilungen
                        };
                    }
                },
            });

            $select_abteilungen.on('select2:select', function (e) {
                abtUuids.push(e.params.data.id);
                $('#zrjb-abt-uuids').val(abtUuids.join('|'));
                submitSearchForm();
            });

            $select_abteilungen.on('select2:unselect', function (e) {
                var idx = abtUuids.indexOf(e.params.data.id);
                if (idx >= 0) {
                    abtUuids.splice(idx, 1);
                }
                $('#zrjb-abt-uuids').val(abtUuids.join('|'));
                submitSearchForm();
            });

        }

        // --------------------------------------------------------------------------------------
        // Vertragsarten
        // --------------------------------------------------------------------------------------
        if (extendedFilters.indexOf('vertragsart') >= 0  ) {

            var $select_vertragsarten = $('#zrjb-select-vertragsarten');
            var vaUrl = getPublicApiUrl('katalog/GetByRelationName?entityName=StelleVertragsart&relationName=ChildEntity');
            var va = currentUrl.searchParams.get("va");
            var vaUuids = va && va.length > 0 ? va.split('|') : [];
            if (vaUuids.length) {
                $.ajax({
                    type: 'GET',
                    url: vaUrl
                }).then(function (data) {
                    data.Items.forEach(item => {
                        if(vaUuids.includes(item.ObjectUuid)) {
                            var option = new Option(item.Bezeichnung, item.ObjectUuid, true, true);
                            $select_vertragsarten.append(option).trigger('change');
                        }
                    });
                });
            }

            $select_vertragsarten.select2({
                placeholder: 'Art der Anstellung',
                multiple: true,
                width: '100%',
                ajax: {
                    url: vaUrl,
                    dataType: 'json',
                    data: function (params) {
                        var query = {
                            nameproperty: "Bezeichnung",
                            searchText: params.term
                        }
                        return query;
                    },
                    processResults: function (data) {
                        var vertragsarten = [];
                        data.Items.forEach(item => {
                            vertragsarten.push({ id: item.ObjectUuid, text: item.Bezeichnung });
                        });
                        return {
                            results: vertragsarten
                        };
                    }
                },
            });

            $select_vertragsarten.on('select2:select', function (e) {
                vaUuids.push(e.params.data.id);
                $('#zrjb-va-uuids').val(vaUuids.join('|'));
                submitSearchForm();
            });

            $select_vertragsarten.on('select2:unselect', function (e) {
                var idx = vaUuids.indexOf(e.params.data.id);
                if (idx >= 0) {
                    vaUuids.splice(idx, 1);
                }
                $('#zrjb-va-uuids').val(vaUuids.join('|'));
                submitSearchForm();
            });
        }

        // ======================================================================================
        // Pagination
        // ======================================================================================

        $('.zrjb-pagination-submit').on('click', function(ev){
            $('#zrjb-pagination-pageno').val(ev.currentTarget.value);
            $('#zrjb-pagination-form').trigger('submit');
        });


        // ======================================================================================
        // Formular Bewerbung - Validierung
        // ======================================================================================

        var messages 				= [];
        var files					= [];
        var file_count 				= 0;
        var total_file_size 		= 0;
        var accepted_file_types		= $('#zrjb-accepted-file-types').val();
        var max_file_count      	= parseInt($("#zrjb-upload-file-count").val());
        var max_file_size       	= parseInt($("#zrjb-upload-file-size").val());
        var max_total_size    	 	= parseInt($("#zrjb-upload-total-size").val());
        var total_upload_size		= $("#zrjb-total-upload-size");
        var lang           			= $('#zrjb-language').val();
        var $vorname				= $('#zrjb-vorname');
        var $nachname				= $('#zrjb-nachname');
        var $email					= $('#zrjb-email');
        var $telefon                = $('#zrjb-telefon');
        var $mobil                  = $('#zrjb-mobil');
        var $datenschutz_ok			= $('#zrjb-datenschutz-ok');
        var $file_upload_button 	= $("#zrjb-file-upload-button");
        var $send_form_button		= $("#zrjb-send-form-button");
        var $file_upload_container	= $(".zrjb-file-upload-container");
        var $mesage_container		= $('#zrjb-message-container');
        var new_input 				= '<input type="file" class="zrjb-select-file-input" name="zrjb-files[]" accept="' + accepted_file_types + '" />';
        var delete_icon             = '<svg width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></svg>';
        var $spinner                = $('#zrjb-sending-spinner');

        // --------------------------------------------------------------------------------------
        // Datei hinzufügen
        // --------------------------------------------------------------------------------------
        $file_upload_button.on('click', function(ev){
            if(ev.target.id !== 'zrjb-file-upload-button'){
                return;
            }
            if (max_file_count === 0 || (max_file_count > 0 && file_count < max_file_count)){
                $file_upload_button.find(".zrjb-select-file-input").trigger("click");
            } else {
                $file_upload_button.hide();
            }
        });
        $file_upload_button.on('change', '.zrjb-select-file-input', function(ev){
            var $input = $(this);
            if(this.files.length && validateUpload(this.files)){
                $file_upload_container.append('<p class="zrjb-attachment-line"><span class="filename">' + $input["0"].files["0"].name +
                    '</span> <a href="#" class="remove_file"><span class="zrjb-remove-file-icon">' + delete_icon + '</span></a></p>');
                $input.appendTo('.zrjb-file-upload-container');
                $(new_input).appendTo($file_upload_button);
            }
            getTotalUploadSize();
        });

        // --------------------------------------------------------------------------------------
        // Datei entfernen
        // --------------------------------------------------------------------------------------
        $file_upload_container.on('click', '.remove_file', function(ev){
            ev.preventDefault();
            var $filename = $(this).prev('span').text();
            $(this).parent('p').remove();
            var found = false;
            $file_upload_container.find('input[type=file],select').each(function(i,obj){
                if (!found && obj.parentElement.className === 'zrjb-file-upload-container' && obj.files.length > 0){
                    if($filename == obj.files["0"].name){
                        obj.remove();
                        found = true;
                        return;
                    }
                }
            });
            $file_upload_button.find(".zrjb-select-file-input").val('');
            removeMessages();
            getTotalUploadSize();
        })

        // --------------------------------------------------------------------------------------
        // Formularfelder validieren
        // --------------------------------------------------------------------------------------
        $send_form_button.on('click', function(ev){
            ev.preventDefault();

            removeMessages();

            $vorname.removeClass("zrjb-input-error");
            if($vorname.val() === '') {
                $vorname.addClass("zrjb-input-error");
                messages.push(lang === 'en' ? 'Please enter your first name.' : 'Bitte den Vornamen eingeben.');
            } else if ($vorname.val().length > 100) {
                $vorname.addClass("zrjb-input-error");
                messages.push(lang === 'en' ? 'The first name is too long (max. 100 characters).' : 'Der Vorname ist zu lang (max. 100 Zeichen).');
            }

            $nachname.removeClass("zrjb-input-error");
            if($nachname.val() === '') {
                $nachname.addClass("zrjb-input-error");
                messages.push(lang === 'en' ? 'Please enter your last name.' : 'Bitte den Nachnamen eingeben.');
            } else if ($nachname.val().length > 100) {
                $nachname.addClass("zrjb-input-error");
                messages.push(lang === 'en' ? 'The last name is too long (max. 100 characters).' : 'Der Nachname ist zu lang (max. 100 Zeichen).');
            }

            $email.removeClass("zrjb-input-error");
            if(!isEmail($email.val())) {
                $email.addClass("zrjb-input-error");
                messages.push(lang === 'en' ? 'Please enter a valid email address.' : 'Bitte eine gültige Email-Adresse eingeben.');
            }

            $telefon.removeClass("zrjb-input-error");
            validatePhoneNumber($telefon, messages, lang === 'en' ? 'phone number' : 'Telefonnummer');

            $mobil.removeClass("zrjb-input-error");
            validatePhoneNumber($mobil, messages, 'mobil nummer');

            if(!$datenschutz_ok.is(':checked')) {
                messages.push(lang === 'en' ? 'Please accept the privacy policy.' : 'Bitte die Datenschutzerklärung akzeptieren.');
            }

            if(messages.length > 0){
                showMessages(messages);
                return;
            }

            $file_upload_button.prop( 'disabled', true );
            $file_upload_button.css('cursor', 'progress');
            $send_form_button.prop( 'disabled', true );
            $send_form_button.css('cursor', 'progress');

            // Wenn eine Bestätigunsseite in Wordpress definiert ist, dann Ajax-Request, sonst PHP submit
            if (zrjb_public_script_vars.form_confirmation_page_slug != "") {
                sendApplication();
            } else {
                this.form.submit();
            }
        });


        // --------------------------------------------------------------------------------------
        // Funktionen
        // --------------------------------------------------------------------------------------

        function isNumeric(n) {
            return !isNaN(parseFloat(n)) && isFinite(n);
        }

        function getApiUrl( endPoint ) {
            return zrjb_public_script_vars.apiBaseUrl + 'api/v1/' + endPoint;
        }

        function getPublicApiUrl( endPoint ) {
            return zrjb_public_script_vars.apiBaseUrl + 'api/public/v1/' + endPoint;
        }
        
        function submitSearchForm() {
            // Wenn der Request aus der separaten Searchbox kommt, Link zur Stellenliste generieren
            if (isSearchboxFormRequest) {
                searchboxJoblistLink[0].href = generateJobListUrl(); 
            }
            // Sonst Suchformular automatisch submitten, aber nur wenn kein Submit-Button verwendet wird
            else if ($('#zrjb-filter-submit-button').val() !== 'checked') {
                $('#zrjb-item-search-form').trigger('submit');
            }
        }

        // Link zur Stellenliste generieren
        function generateJobListUrl() {
            var joblistUrl = $('#zrjb-home-url').val() + $('#zrjb-searchbox-listepage-slug').val() + '/?';
            joblistUrl += 'keywords='  + (($('#zrjb-filter-keywords').val() != null) ? $('#zrjb-filter-keywords').val().replaceAll(' ', '+') : '');
            joblistUrl += ($('#zrjb-location-text').val() != null) ? '&loc=' + $('#zrjb-location-text').val().replaceAll(' ', '+') : '';
            joblistUrl += ($('#zrjb-location-lat').val() != null) ? '&lat=' + $('#zrjb-location-lat').val() : '';
            joblistUrl += ($('#zrjb-location-lon').val() != null) ? '&lon=' + $('#zrjb-location-lon').val() : '';
            joblistUrl += ($('#zrjb-select-radius').val() != null) ? '&rad=' + $('#zrjb-select-radius').val() : '&rad=' + $('#zrjb-filter-circular-radius-init').val();
            joblistUrl += ($('#zrjb-abt-uuids').val() != null) ? '&abt=' + $('#zrjb-abt-uuids').val() : '';
            joblistUrl += ($('#zrjb-va-uuids').val() != null) ? '&va=' + $('#zrjb-va-uuids').val() : '';
            joblistUrl += '#zrjb-joblist-container';
            return encodeURI(joblistUrl);
        }

        // Bewerbung senden via WP Ajax (wp-admin/admin-ajax.php)
        function sendApplication(){
            $spinner.show();

            var formData = new FormData();
            formData.append('action', 'zrjb_send_application');
            formData.append('security', zrjb_public_script_vars.nonce);
            formData.append('bewerbung', createJson());
            $file_upload_container.find('input[type=file],select').each(function(i,obj){
                if (obj.files.length > 0) {
                    formData.append('files[]', obj.files[0], obj.files["0"].name);
                }
            });

            $.ajax({
                url: zrjb_public_script_vars.ajaxUrl,
                type: 'POST',
                data: formData,
                contentType:false,
                processData:false
            })
                .done( function(data) {
                    if( data.success ) {
                        window.location.href = zrjb_public_script_vars.redirectToUrl;
                    }
                    else {
                        errorMessage();
                    }
                })
                .fail( function() {
                    errorMessage();
                })
                .always( function() {
                    $file_upload_button.prop( 'disabled', false );
                    $file_upload_button.css('cursor', 'pointer');
                    $send_form_button.prop( 'disabled', false );
                    $send_form_button.css('cursor', 'pointer');
                    $spinner.hide();
                });
        }

        // JSON aus Formulardaten erzeugen
        function createJson() {

            var anredeId = $("#zrjb-anrede-uuid").val();

            var kommunikationsmittel = [
                {
                    "Beschreibung": "EMail",
                    "Typ": 4,
                    "Wert": $("#zrjb-email").val()
                }
            ]
            if( $("#zrjb-telefon").val() ) {
                kommunikationsmittel.push(
                    {
                        "Beschreibung": "Telefon",
                        "Typ": 1,
                        "Wert": $("#zrjb-telefon").val()
                    },
                )
            }
            if( $("#zrjb-mobil").val() ) {
                kommunikationsmittel.push(
                    {
                        "Beschreibung": "Mobiltelefon",
                        "Typ": 2,
                        "Wert": $("#zrjb-mobil").val()
                    },
                )
            }

            var mitarbeiter = {
                Anrede: anredeId !== '' ? { ObjectUuid: anredeId } : null,
                Vorname: $("#zrjb-vorname").val(),
                Nachname: $("#zrjb-nachname").val(),
                Kommunikationsmittel: kommunikationsmittel,
            }

            var bewerbung;
            if($("#zrjb-is-initiativ").val() == true) {
                bewerbung = {
                    IstInitiativ: true,
                    Bewerbungsdatum: new Date(Date.now()),
                    Mandant: {
                        ObjectUuid: $("#zrjb-initiativ-mandant-uuid").val()
                    }
                };
            } else {
                bewerbung = {
                    IstInitiativ: false,
                    Bewerbungsdatum: new Date(Date.now()),
                    Mandant: {
                        ObjectUuid: $("#zrjb-mandant-uuid").val()
                    },
                    Stelle: {
                        ObjectUuid: $("#zrjb-stelle-uuid").val(),
                    }
                };
            }

            var json = JSON.stringify({
                    Mitarbeiter: mitarbeiter,
                    Bewerbung: bewerbung,
                });

            return json;
        }

        // Validierung Email
        function isEmail(email){
            // TODO: Diese Validierung wird aktuell auch im recruiting verwendet. Falls sich also dort etwas ändert, das auch hier anpassen.
            var regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
            return regex.test(email);
        }

        // Validierung Telefonnummer
        function validatePhoneNumber(phoneNumber, messages, bezeichnung) {
            var url = getApiUrl('GenericValidation/ValidatePhoneNumber?phonenumber=' + phoneNumber.val() );
            $.ajax({
                type: 'GET',
                url: url,
                async: false
            })
            .done(function (data) {
                if(!data.Success) {
                    phoneNumber.addClass("zrjb-input-error");
                    messages.push(lang === 'en' ? 'The ' + bezeichnung + ' is invalid.' : 'Die ' + bezeichnung + ' ist ungültig.');
                }
                return messages;
            });
        }

        // Validierung File
        function validateUpload(file){

            removeMessages();

            if (file.length > 0){
                var extension = '.' + file[0].name.split('.').pop().toLowerCase();
                if (!accepted_file_types.split(', ').includes(extension)) {
                    messages.push("Ungültige Datei \"" + file[0].name + "\". Es können nur Dateien der Typen " + accepted_file_types + " angehängt werden.");
                } else if (file[0].size > (max_file_size * 1024 * 1024)){
                    messages.push("Die Datei \"" + file[0].name + "\" hat eine Größe von " + bytesToBestSize(file[0].size) +
                        ", darf aber nur max. " + max_file_size + " MB groß sein. Die Datei wurde nicht angehängt.");
                } else if ((total_file_size + file[0].size) > (max_total_size * 1024 * 1024)){
                    messages.push("Die Gesamtmenge der Anhänge würde jetzt mehr als " + bytesToBestSize(total_file_size + file[0].size) +
                        " betragen und überschreitet damit die max. Menge von " +
                        max_total_size + " MB. Die Datei wurde nicht angehängt.");
                }
            }

            if (messages.length > 0){
                showMessages();
                return false;
            }

            return true;
        }

        // Gesamtgröße ermitteln
        function getTotalUploadSize(){

            files = [];
            total_file_size = 0;
            $('.zrjb-select-file-input').each(function(i,obj){
                if (obj.parentElement.className === 'zrjb-file-upload-container' && obj.files.length > 0){
                    total_file_size += obj.files["0"].size;
                    files.push(obj.files["0"].name);
                }
            });
            file_count = files.length;

            if (max_file_count === 0 || (max_file_count > 0 && file_count < max_file_count)){
                $file_upload_button.show();
            } else {
                $file_upload_button.hide();
            }

            $(total_upload_size).text(total_file_size > 0 ? "(" + bytesToBestSize(total_file_size) + ")" : '');
        }

        // Messages ausgeben
        function showMessages(){
            for (var i = 0; i < messages.length; i++){
                 $mesage_container.append('<div class="zrjb-message-line">' + messages[i] + '</div>');
            }
            $mesage_container.show();
            messages = [];
        }

        // Messages removen
        function removeMessages(){
            $('.zrjb-message-line').remove();
            $mesage_container.hide();
        }

        // Fehlermeldung ausgeben
        function errorMessage() {
            messages.push("Die Bewerbung konnte wegen eines Fehlers nicht gesendet werden.");
            showMessages();
        }

        // Dateigrößen umrechnen
        function bytesToBestSize(bytes){
            var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
            if (bytes == 0){
                return '';
            }
            var idx = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
            if (idx == 0){
                return bytes + ' ' + sizes[idx];
            }
            return (bytes / Math.pow(1024, idx)).toFixed(1) + ' ' + sizes[idx];
        };

        // API-Key erzeugen
        function getApiKey(current, next) {
            return sandp[1] + next + current + sandp[0];
        }

        // Ajax-Objekt je nach ausgewähltem Gebiet für Select2 zusammenbauen
        function getAjaxForSelect(){
            var ajax = {};
            var url = geoserviceUrl;

            if(geoserviceCountryCode === 'de+at') {
                ajax = {
                    url: url,
                    dataType: 'json',
                    data: function (params) {
                        var query = {
                            searchterm: params.term
                        }
                        return query;
                    },
                    processResults: function (data) {
                        var idx = 0;
                        var locations = [];
                        data.items.forEach(item => {
                            var plzs = (item.plz || '').split(',');
                            plzs.forEach(plz => {
                                const ort = item.ort && item.ort.startsWith(plz + ' ') ? item.ort : plz + ' ' + item.ort;
                                locations.push({ id: idx++, text: '(' + item.laendercode + ') ' + ort, lat: item.latitude, lon: item.longitude });
                            });
                        });
                        return {
                            results: locations
                        };
                    }
                }
            } else {
                if (geoserviceCountryCode === 'at' || geoserviceCountryCode === 'ch') {
                    url = url + geoserviceCountryCode + '/';
                }
                ajax = {
                    url: url,
                    headers: ajaxHeaders,
                    dataType: 'json',
                    data: function (params) {
                        var query = {
                            text: params.term
                        }
                        return query;
                    },
                    processResults: function (data) {
                        var locations = [];
                        data.forEach(item => {
                            locations.push({ id: item.Id, text: item.CountryCode + ' ' + item.PostCode + ' ' + item.Locality, lat: item.Latitude, lon: item.Longitude });
                        });
                        return {
                            results: locations
                        };
                    }
                }
            };

            return ajax;
        };

    });

})(jQuery);