// variables for jslint
/*
 var $ = $;
 var console = console;
 var window = window;
 var jQuery = jQuery;
 var simpleStorage = simpleStorage;
 var define = define;
 */

String.prototype.capitalizeFirstLetter = function () {
    "use strict";
    return this.charAt(0).toUpperCase() + this.slice(1);
};

/**
 * detect IE
 * returns version of IE or false, if browser is not Internet Explorer
 */
function detectIE() {
    "use strict";
    var ua = window.navigator.userAgent;

    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }

    var trident = ua.indexOf('Trident/');
    if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }

    var edge = ua.indexOf('Edge/');
    if (edge > 0) {
        // IE 12 => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }

    // other browser
    return false;
}

/* --------------------------------------------------------- */
/* Bildungskalender                                          */
/* --------------------------------------------------------- */

// global variables
var inm = {
    bk: {
        lang: $('html').attr('lang'),
        pi1: {
            txName: 'tx_holzbauschweizbildungskalender_pi1',
            pageTypeAjax: 8303,
            pageTypeJson: 8304,
            validationAlerts: {
                alertBkTypeMandatory: 'Dies ist ein Pflichtfeld',
                alertBkTypeDate: 'Format: DD.MM.YYYY',
                alertBkTypeInt: 'Bitte eine ganze Zahl eingeben',
                alertBkTypeFloat: 'Bitte eine Zahl eingeben',
                alertBkTypePrice: 'Bitte einen Preis eingeben',
                alertBkTypeUid: 'Format: CHE-XXX.XXX.XXX',
                alertBkTypeAhvn13: 'Format: XXX.XXXX.XXXX.XX',
                alertBkTypeAhvn13CheckDigit: 'Die Prüfziffer stimmt nicht überein.',
                alertBkTypeUrl: 'Format: http://www.link.ch',
                alertBkTypeEmail: 'Format: hans.muster@domain.ch',
                alertBkMaxLen: 'Die maximale Feldlänge ist %1s',
                alertBkNonPositive: 'Bitte einen Wert > 0 eingeben',
                alertBox: '<div class="validation-error"><div class="al"></div><div class="msg"><span>$alert</span></div></div>'
            },
            getCurrentLanguageId: function () {
                "use strict";
                switch (inm.bk.lang) {
                    case 'de':
                        return 16;
                    case 'it':
                    case 'it_CH':
                        return 18;
                    default:
                        return '';
                }
            }
        }
    }
};

inm.bk.toExcel = function (selector) {
    "use strict";
    var $tableHTML = $(selector).html();
    var re = new RegExp('<colgroup>(.*)</colgroup>', 'g');
    $tableHTML = $tableHTML.replace(re, '');
    window.open('data:application/vnd.ms-excel,' + encodeURIComponent($tableHTML));
};

inm.bk.getText = function (key) {
    "use strict";

    var $tableHTML = $(selector).html();
    var re = new RegExp('<colgroup>(.*)</colgroup>', 'g');
    $tableHTML = $tableHTML.replace(re, '');
    window.open('data:application/vnd.ms-excel,' + encodeURIComponent($tableHTML));
};

inm.bk.getStorageKeyForForm = function (form) {
    "use strict";

    var $form = $(form);

    if (!$form.is('form')) {
        return null;
    }

    var formName = $form.attr('name');
    return 'bk-' + formName + '-filter';
};

inm.bk.getBkAjaxControllerUrl = function () {
    "use strict";
    return inm.bk.getBaseUrl() + '?type=' + inm.bk.pi1.pageTypeAjax;
    /*
     var url = window.location.href;
     if (url.indexOf('?') > -1) {
     url += '&type=' + inm.bk.pi1.pageTypeAjax;
     } else {
     url += '?type=' + inm.bk.pi1.pageTypeAjax;
     }
     return url;
     */
};

inm.bk.getBaseUrl = function () {
    "use strict";
    var url = window.location.href;
    var startPos = 0;
    var hasQm = (url.indexOf('?id=') > 0);
    if (hasQm) {
        startPos = url.indexOf('&');
    } else {
        startPos = url.indexOf('?');
    }
    if (startPos > 0) {
        url = url.substr(0, startPos);
    }
    return url;
};

inm.bk.getBaseUrlAjax = function (contentType) {
    "use strict";
    var url = inm.bk.getBaseUrl();
    var hasQm = (url.indexOf('?') > 0);
    if (hasQm) {
        url += "&type=";
    } else {
        url += "?type=";
    }
    if (contentType === 'json') {
        url += inm.bk.pi1.pageTypeJson;
    } else {
        url += inm.bk.pi1.pageTypeAjax;
    }
    return url;
};

inm.bk.buildControllerActionUrl = function (controller, action, params) {
    "use strict";
    if (controller !== undefined && action !== undefined) {
        var url = window.location.href;
        var startPos = 0;
        var hasQm = (url.indexOf('?id=') > 0);
        if (hasQm) {
            startPos = url.indexOf('&');
        } else {
            startPos = url.indexOf('?');
        }
        if (startPos > 0) {
            url = url.substr(0, startPos);
        }
        url += (hasQm ? "&" : "?") + inm.bk.pi1.txName + '[controller]=' + controller + '&' + inm.bk.pi1.txName + '[action]=' + action;
        if (params !== undefined) {
            var prop = null;
            for (prop in params) {
                if (prop !== undefined) {
                    url += '&' + inm.bk.pi1.txName + '[' + encodeURIComponent(prop) + ']=' + encodeURIComponent(params[prop]);
                }
            }
        }
        return url;
    }
};

inm.bk.redirectToControllerAction = function (controller, action, params) {
    "use strict";
    var url = inm.bk.buildControllerActionUrl(controller, action, params);
    window.location.href = url;
};

inm.bk.toggleLoadIndicator = function () {
    "use strict";
    $(".load-indicator").toggle();
};

inm.bk.pi1.quickInfoTemplate = function () {
    "use strict";
    this.html = '';
    this.getHtml = function () {
        return '<table class="bk-quickinfo"><tbody>' + this.html + '</tbody></table>';
    };
    this.addRow = function (label, value) {
        value = value || '';
        this.html += '<tr>';
        this.html += '<td>' + label + '</td>';
        this.html += '<td>' + value + '</td>';
        this.html += '</tr>';
    };
};

inm.bk.pi1.courseSearchShowQuickInfo = function () {
    "use strict";

    var $this = $(this);

    if ($this.is("[data-original-title]")) {
        $this.popover('show');
        return;
    }

    // get courseId
    var courseId = $this.closest('tr').attr('data-id');

    var postData = [];
    postData.push({name: inm.bk.pi1.txName + "[controller]", value: "Ajax"});
    postData.push({name: inm.bk.pi1.txName + "[action]", value: "getCourseQuickInfo"});
    postData.push({name: inm.bk.pi1.txName + "[courseId]", value: courseId});

    $.ajax({
        url: inm.bk.getBaseUrlAjax('json'),
        type: "POST",
        dataType: "json",
        data: postData,
        beforeSend: function () {
            inm.bk.toggleLoadIndicator();
        },
        success: function (data) {

            var $texts = $(".hbch-bk .assets #language-texts");
            var html = new inm.bk.pi1.quickInfoTemplate();
            html.addRow($texts.bkGetText('kurs.beschreibung-kursinhalt'), data.KursInhalt);
            html.addRow($texts.bkGetText('kurs.kursanbieter'), data.Veranstalter);
            html.addRow($texts.bkGetText('kurs.bildungsschwerpunkt'), data.Bildungsschwerpunkt);
            html.addRow($texts.bkGetText('kurs.nettokosten-exkl-mwst'), data.Preis); //todo: data.NettoKosten?
            html.addRow($texts.bkGetText('kurs.kostenbeschreibung'), data.Zusatzkosten);

            $this.popover({
                trigger: 'hover',
                placement: 'auto',
                html: true,
                /* title: "Header", */
                content: html.getHtml()
            });
            if (detectIE() > 0) {
                setTimeout(function () {
                    $this.popover('hide');
                }, 3000);
                $this.popover('show');

            }
        },
        error: function (jqXHR, textStatus, errorThrown) {
            if (console !== undefined) {
                console.log(textStatus);
            }
        },
        complete: function () {
            inm.bk.toggleLoadIndicator();
        }
    });

};

(function ($) {
    "use strict";

    /**
     * jQuery plugin to get text from text asset
     * @param key
     * @returns {*}
     */
    $.fn.bkGetText = function (key) {
        var $this = $(this);
        key = key.replace(/\./g, '-');
        var text = $this.find('[class="' + key + '"]').text();
        return text;
    };

    /**
     * jQuery plugin to prevent double submission of forms
     *
     * @returns {*}
     */
    $.fn.preventDoubleSubmission = function () {
        $(this).on('submit', function (e) {
            var $form = $(this);

            if ($form.data('submitted') === true) {
                // Previously submitted - don't submit again
                e.preventDefault();
            } else {
                // Mark it so that the next submit can be ignored
                $form.data('submitted', true);
            }
        });

        // Keep chainability
        return this;
    };

    /**
     * jQuery plugin to test a set of bk-form fields against validation criteria
     *
     * @param options
     * @returns {*}
     */
    $.fn.bkValidate = function (options) {
        var settings = $.extend(inm.bk.pi1.validationAlerts, options);

        $(".validation-error").remove();

        var $firstErrorField = null;
        var hasErrors = false;
        this.each(function () {
            var $field = $(this);
            var bkType = $field.attr('data-bk-type');
            var bkLength = $field.attr('data-bk-length');
            var bkGtZero = ($field.attr('data-bk-gt-zero') === 'true') ? true : false;
            bkType = bkType || 'string';

            var isMandatory = ($field.attr('data-bk-required') === 'true') ? true : false;
            if (settings.ignoreMandatory) {
                isMandatory = false;
            }
            var hasFormatError = false;
            var alertBoxHtml;
            var $el;
            var width;

            switch (this.type) {
                case 'text':
                case 'url':
                case 'textarea':
                    $field.val($field.val().trim());
                    var value = $field.val();
                    if (isMandatory && (value.length === 0)) {
                        bkType = 'mandatory';
                        hasFormatError = true;
                    } else {
                        if (value.length > 0) {
                            switch (bkType) {
                                case 'date':
                                    // regular expression to match required date format
                                    var re = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
                                    if (value.match(re)) {
                                        var parts = value.split('.');
                                        if (parts[0] < 1 || parts[0] > 31 || parts[1] < 1 || parts[1] > 12) {
                                            hasFormatError = true;
                                        }
                                    } else {
                                        hasFormatError = true;
                                    }
                                    break;
                                case 'int':
                                    hasFormatError = !(/^[\d.]+$/.test(value));
                                    break;
                                case 'float':
                                    hasFormatError = !(/^[\d.]+[\.\d+]?$/.test(value));
                                    break;
                                case 'uid':
                                    /* format: CHE-123.456.789 */
                                    hasFormatError = !(/^CHE-\d{3}\.\d{3}\.\d{3}$/.test(value));
                                    break;
                                case 'ahvn13':
                                    /* format: 756.0123.4567.89 */
                                    hasFormatError = !(/^\d{3}\.\d{4}\.\d{4}.\d{2}$/.test(value));
                                    break;
                                case 'price':
                                    hasFormatError = !(/^\d{0,8}(\.\d{1,2})?$/.test(value));
                                    break;
                                case 'url':
                                    if (!(/^(http[s]?:\/\/)/.test(value))) {
                                        value = 'http://' + value;
                                        $field.val(value);
                                    }
                                    hasFormatError = !(/^(http[s]?:\/\/)(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/.test(value));
                                    break;
                                case 'email':
                                    hasFormatError = !(/^(([^<>()[\]\\.,;:\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,}))$/.test(value));
                                    break;
                            }
                        }
                    }
                    var errorMsg;
                    var ucType;

                    // Check bkLength
                    if (bkLength !== undefined) {
                        //z.B. "1-100" or "100"
                        var ranges = bkLength.split('-');
                        if (ranges.length === 1) {
                            var maxLen = ranges[0];
                            if (value.length > maxLen) {
                                errorMsg = settings.alertBkMaxLen;
                                errorMsg = errorMsg.replace('%1s', maxLen);
                                hasFormatError = true;
                            }
                        }
                    }

                    if (bkGtZero && !hasFormatError) {
                        switch (bkType) {
                            case 'int':
                            case 'float':
                            case 'price':
                                if (value <= 0) {
                                    errorMsg = settings.alertBkNonPositive;
                                    hasFormatError = true;
                                }
                                break;
                        }
                    }

                    if (hasFormatError) {
                        if ($firstErrorField === null) {
                            $firstErrorField = $field;
                        }
                        if (errorMsg === undefined) {
                            ucType = bkType.charAt(0).toUpperCase() + bkType.slice(1);
                            errorMsg = settings['alertBkType' + ucType];
                        }
                        alertBoxHtml = settings.alertBox.replace('$alert', errorMsg);
                        $field.parent().prepend(alertBoxHtml);
                        $el = $field.prev();
                        width = $el.find("span").width();
                        $el.find(".msg").width(width + 20);
                    } else {
                        // ahvn13 check digit evaluation
                        if (bkType === 'ahvn13') {
                            var ahv13 = value.replace(/\./g, '');
                            var checkDigit = parseInt(ahv13.substring(12, 13), 10);
                            var sum = 0;
                            var i;
                            for (i = 11; i >= 0; i--) {
                                if (i % 2 === 0) {
                                    sum += parseInt(ahv13.substring(i, i + 1), 10);
                                } else {
                                    sum += 3 * parseInt(ahv13.substring(i, i + 1), 10);
                                }
                            }
                            var calcDigit = Math.ceil(sum / 10) * 10 - sum;

                            if (checkDigit !== calcDigit) {
                                errorMsg = settings.alertBkTypeAhvn13CheckDigit;
                                alertBoxHtml = settings.alertBox.replace('$alert', errorMsg);
                                $field.parent().prepend(alertBoxHtml);
                                $el = $field.prev();
                                width = $el.find("span").width();
                                $el.find(".msg").width(width + 20);

                                hasErrors = true;
                                if ($firstErrorField === null) {
                                    $firstErrorField = $field;
                                }
                            }
                        }

                    }
                    hasErrors = hasErrors || hasFormatError;
                    break;

                case 'select-one':
                    var selectedKey = $field.children("option").filter(":selected").val();
                    if (isMandatory && selectedKey === "") {
                        if ($firstErrorField === null) {
                            $firstErrorField = $field;
                        }
                        alertBoxHtml = settings.alertBox.replace('$alert', settings.alertBkTypeMandatory);
                        $field.parent().parent().prepend(alertBoxHtml);
                        $el = $field.parent().prev();
                        width = $el.find("span").width();
                        $el.find(".msg").width(width + 20);
                        hasErrors = true;
                    }
                    break;

                case 'select-multiple':
                    var selectOptions = $field.children("option").filter(":selected").length;
                    if (isMandatory && (selectOptions === 0)) {
                        if ($firstErrorField === null) {
                            $firstErrorField = $field;
                        }
                        alertBoxHtml = settings.alertBox.replace('$alert', settings.alertBkTypeMandatory);
                        $field.parent().parent().prepend(alertBoxHtml);
                        $el = $field.parent().prev();
                        width = $el.find("span").width();
                        $el.find(".msg").width(width + 20);
                        hasErrors = true;
                    }
                    break;

                case 'radio':
                    if (isMandatory) {
                        var fieldName = $field.attr("name");
                        if ($('input[name="' + fieldName + '"]:radio:checked').length === 0) {
                            if ($firstErrorField === null) {
                                $firstErrorField = $field;
                            }
                            alertBoxHtml = settings.alertBox.replace('$alert', settings.alertBkTypeMandatory);
                            $field.parent().parent().parent().prepend(alertBoxHtml);
                            $el = $field.parent().parent().prev();
                            width = $el.find("span").width();
                            $el.find(".msg").width(width + 20);
                            hasErrors = true;
                        }
                    }
                    break;

            }
        });

        if (hasErrors) {
            if ($firstErrorField !== null) {
                $firstErrorField.unbind("focus");
                $firstErrorField.focus();
            }
            $(".validation-error").on("click keypress change", function () {
                $(this).remove();
            });
            $(".validation-error").next().on("click keypress change", function () {
                $(this).prev().remove();
            });
        }
        return !hasErrors;
    };

    $.fn.bkValidateForm = function (options) {
        var success = $(this).find("*").bkValidate(options);
        if (success) {
            $(this).data('submitted', false);
        }
        return success;
    };

    $.fn.bkValidateCourseTemplateBase = function (options) {
        var courseNameSelector = 'input[name="' + inm.bk.pi1.txName + '[course][name]"]';
        var passed = $(this).find(courseNameSelector).bkValidate(options);
        var settings = $.extend({
            ignoreMandatory: true
        }, options);
        passed = passed && $(this).find("*").bkValidate(settings);

        return passed;
    };

    /**
     * jQuery plugin to reset bk-forms
     *
     * @returns {*}
     */
    $.fn.bkResetForm = function () {
        return this.each(function () {
            var type = this.type;
            var tag = this.tagName.toLowerCase();
            var $this = $(this);

            if (tag === 'form') {
                return $(':input', this).bkResetForm();
            }
            if (type === 'text' || type === 'password' || tag === 'textarea') {
                this.value = '';
                $this.removeClass('selected');
            } else if (type === 'checkbox' || type === 'radio') {
                this.checked = false;
                $this.uniform();
            } else if (tag === 'select') {
                this.selectedIndex = 0;
                $this.parent().removeClass('selected');
                $this.uniform();
            }
        });
    };

    /**
     * jQuery plugin to initialize bk-forms
     *
     * @returns {*}
     */
    $.fn.bkInitializeForm = function () {
        return this.each(function () {
            var type = this.type;
            var tag = this.tagName.toLowerCase();

            if (tag === 'form') {
                return $(':input', this).bkInitializeForm();
            }

            var $this = $(this);
            var bkType = 'string';
            bkType = $this.attr('data-bk-type');
            bkType = bkType || 'string';

            // Add asterix to Name, if data-required
            var isMandatory = ($this.attr('data-bk-required') === 'true') ? true : false;
            if (isMandatory) {
                switch (this.type) {
                    case 'text':
                    case 'url':
                    case 'textarea':

                        var placeholder = $this.attr('placeholder');
                        if (placeholder && placeholder.length > 0 && placeholder.indexOf("*") < 0) {
                            placeholder += '*';
                        }
                        $this.attr('placeholder', placeholder);

                        break;
                    case 'select-one':
                        $this.find('option[value=""]').each(function () {
                            $this = $(this);
                            $this.text($this.text() + '*');
                            $this.parent().uniform();
                        });
                        break;

                    case 'select-multiple':
                        break;
                }
            }

            if (type === 'checkbox' || type === 'radio' || tag === 'select') {
                $(this).uniform();
            }
        });
    };

    /**
     * jQuery plugin to toggle open/closed areas
     *
     * .bk-form-toggle
     *     .bk-toggle-content-open
     *         .bk-toggle-closer (triggers close event)
     *     .bk-toggle-content-closed
     *         .bk-toggle-opener (triggers open event)
     * @param options
     * @returns {*}
     */
    $.fn.bkFormToggle = function (options) {
        var settings = $.extend({
            persistState: false,
            storageKey: null,
            showOpened: true
        }, options);

        return this.each(function () {
            var $this = $(this);

            // find containers and action elements
            var $contentOpen = $this.find('.bk-toggle-content-open');
            var $contentClosed = $this.find('.bk-toggle-content-closed');
            var $closer = $this.find('.bk-toggle-closer');
            var $opener = $this.find('.bk-toggle-opener');

            $closer.on('click', function () {
                if (settings.persistState && settings.storageKey) {
                    simpleStorage.set(settings.storageKey, 'closed');
                }
                $contentOpen.slideUp();
                $contentClosed.slideDown();
            });

            $opener.on('click', function () {
                if (settings.persistState && settings.storageKey) {
                    simpleStorage.set(settings.storageKey, 'open');
                }
                $contentOpen.slideDown();
                $contentClosed.slideUp();
            });

            // initialize
            var isOpen = settings.showOpened;
            if (settings.persistState) {
                var storageValue = simpleStorage.get(settings.storageKey);
                if (storageValue) {
                    isOpen = (storageValue === 'open');
                }
            }
            if (isOpen) {
                $contentOpen.show();
                $contentClosed.hide();
            } else {
                $contentOpen.hide();
                $contentClosed.show();
            }

        });
    };

    /**
     * jQuery plugin to toggle open/closed areas
     *
     * .bk-form-toggle
     *     .bk-toggle-content-open
     *         .bk-toggle-closer (triggers close event)
     *     .bk-toggle-content-closed
     *         .bk-toggle-opener (triggers open event)
     * @param options
     * @returns {*}
     */
    $.fn.bkAddGoogleMapsIcon = function () {

        return this.each(function () {
            var $this = $(this);
            var address = $this.text().replace(/(AG|AI|AR|BE|BL|BS|FR|GE|GL|GR|JU|LU|NE|NW|OW|SG|SH|SO|SZ|TG|TI|UR|VS|VD|ZG|ZH)/g, '').trim();
            address = encodeURIComponent(address);
            var href = 'https://www.google.ch/maps/place/' + address;
            if (address.length > 0) {
                $this.append('<a class="icon-google-maps" target="_blank" href="' + href + '"></a>');
            }
        });
    };

}(jQuery));

/* ------------------------------------------------------------------------- */
/*                Initialization $(document).ready()                         */
/* ------------------------------------------------------------------------- */
$(document).ready(function () {
    "use strict";

    /* ----------------------------------------- */
    /* tablesorter                               */
    /* ----------------------------------------- */

    // add parser through the tablesorter addParser method
    $.tablesorter.addParser({
        // set a unique id
        id: 'bkDateRange',
        is: function (s) {
            // return false so this parser is not auto detected
            return false;
        },
        format: function (s) {
            s = s.replace('<br />', '');
            s = s.replace(' ', '');
            // format your data for normalization
            var value = '99991231';
            s = s.replace(/\./g, '');
            var parts = s.split('-');
            if (parts.length > 0) {
                s = parts[0];
                if (s.length >= 8) {
                    var s1 = s.substring(4, 8);
                    var s2 = s.substring(2, 4);
                    var s3 = s.substring(0, 2);
                    value = s1 + '/' + s2 + '/' + s3;
                }
            }
            return value;
        },
        // set type, either numeric or text
        type: 'text'
    });

    /* ----------------------------------------- */
    /* Search Forms                              */
    /* ----------------------------------------- */
    $.fn.bkSearchFormInitializeDefaults = function (options) {
        var settings = $.extend({
            storageKey: null,
            reset: false,
            initAfterPopulate: null
        }, options);

        var setFormDefaults = function ($this) {

            // fromMonth = current month
            var d = new Date();
            var curMonth = d.getMonth();
            $this.find('.fromMonth').val(curMonth + 1).uniform();
            // toMonth = december
            $this.find('.toMonth').val(12).uniform();
            var curYear = d.getFullYear();
            $this.find('.fromYear').val(curYear).uniform();
            // toYear = curYear + 1
            $this.find('.toYear').val(curYear + 1).uniform();

            $this.find('.languageId').val(inm.bk.pi1.getCurrentLanguageId()).change();
        };

        return this.each(function () {
            var $this = $(this);

            if (!$this.is('form')) {
                return;
            }

            // get filter state from localStorage
            var postData;
            var storageKey = settings.storageKey;
            if (!storageKey) {
                storageKey = inm.bk.getStorageKeyForForm($this);
            }

            if (settings.reset) {
                $this.bkResetForm();
                setFormDefaults($this);

            } else {
                var postDataJson = simpleStorage.get(storageKey);
                if (postDataJson) {
                    postData = JSON.parse(postDataJson);
                }

                if (postData === undefined) {
                    setFormDefaults($this);
                } else {
                    $this.populate(postData);
                    if (typeof(settings.initAfterPopulate) === 'function') {
                        settings.initAfterPopulate($this, postData);
                    }
                }
                $this.find('select, input[type="checkbox"], input[type="radio"]').uniform();
            }
        });
    };

    /* ----------------------------------------- */
    /* CourseSearch                              */
    /* ----------------------------------------- */
    var $courseSearchForm = $('.hbch-bk .bk-course-search form[name="course-search-form"]');

    $.fn.bkSearchFormAdjustProviderDropdown = function () {
        var $this = $(this);
        var $form = $this;

        var dropdownName = inm.bk.pi1.txName + '[VeranstalterId]';
        var $dropdown = $form.find("select[name='" + dropdownName + "']");

        if ($dropdown) {
            var postData = $form.serializeArray();
            postData.push({name: inm.bk.pi1.txName + '[controller]', value: 'Ajax'});
            postData.push({name: inm.bk.pi1.txName + '[action]', value: 'getProvidersDropdownByFilter'});
            $.ajax({
                url: inm.bk.getBaseUrlAjax('json'),
                type: "POST",
                dataType: "json",
                data: postData,
                beforeSend: function () {
                    // inm.bk.toggleLoadIndicator();
                },
                success: function (data) {
                    $dropdown.html('');
                    var result = $(data).map(function () {
                        return $('<option>').val(this[0]).text(this[1]);
                    });
                    $(result).each(function () {
                        $(this).appendTo($dropdown);
                    });
                    $dropdown.uniform();

                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (console !== undefined) {
                        console.log(textStatus);
                    }
                },
                complete: function () {
                    // inm.bk.toggleLoadIndicator();
                }
            });
            return $this;
        }
    };

    $courseSearchForm.find('.submit').on('click', function () {
        var $form = $(this.form);

        var storageKey = inm.bk.getStorageKeyForForm($form);
        var postData = $form.serializeArray();
        var formUrl = window.location.pathname + '?type=' + inm.bk.pi1.pageTypeAjax;

        simpleStorage.set(storageKey, JSON.stringify($form.serializeObject()));
        $.ajax({
            url: formUrl,
            type: "POST",
            dataType: "html",
            data: postData,
            beforeSend: function () {
                inm.bk.toggleLoadIndicator();
            },
            success: function (data) {
                $(".hbch-bk .search-results").html(data);

                $('.hbch-bk .search-results [data-toggle="tooltip"]').tooltip();

                if ($(".hbch-bk .search-results table tbody tr").length > 0) {

                    // **********************************
                    //  Description of ALL pager options
                    // **********************************
                    var pagerOptions = {

                        // target the pager markup - see the HTML block below
                        container: $(".pager"),

                        // output string - default is '{page}/{totalPages}'
                        // possible variables: {page}, {totalPages}, {filteredPages}, {startRow}, {endRow}, {filteredRows} and {totalRows}
                        // also {page:input} & {startRow:input} will add a modifiable input in place of the value
                        output: '{startRow} - {endRow} ({totalRows})',

                        // apply disabled classname to the pager arrows when the rows at either extreme is visible - default is true
                        updateArrows: true,

                        // starting page of the pager (zero based index)
                        page: 0,

                        // Number of visible rows - default is 10
                        size: 10,

                        // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage in jquery.tablesorter.widgets.js)
                        savePages: true,

                        //defines custom storage key
                        storageKey: 'tablesorter-pager',

                        // if true, the table will remain the same height no matter how many records are displayed. The space is made up by an empty
                        // table row set to a height to compensate; default is false
                        fixedHeight: true,

                        // remove rows from the table to speed up the sort of large tables.
                        // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with the pager enabled.
                        removeRows: false,

                        // css class names of pager arrows
                        cssNext: '.next', // next page arrow
                        cssPrev: '.prev', // previous page arrow
                        cssFirst: '.first', // go to first page arrow
                        cssLast: '.last', // go to last page arrow
                        cssGoto: '.gotoPage', // select dropdown to allow choosing a page

                        cssPageDisplay: '.pagedisplay', // location of where the "output" is displayed
                        cssPageSize: '.pagesize', // page size selector - select dropdown that sets the "size" option

                        // class added to arrows when at the extremes (i.e. prev/first arrows are "disabled" when on the first page)
                        cssDisabled: 'disabled', // Note there is no period "." in front of this class name
                        cssErrorRow: 'tablesorter-errorRow' // ajax error information row
                    };

                    $(".tablesorter")

                        // Initialize tablesorter
                        // ***********************
                        .tablesorter({
                            widthFixed: false,
                            sortList: [[3,0]],
                            headers: {
                                3: {
                                    sorter: 'bkDateRange'
                                }
                            }
                        })

                        // initialize the pager plugin
                        // ****************************
                        .tablesorterPager(pagerOptions);

                    $(".hbch-bk .search-results table tbody tr").on("click", function () {
                        var href = $(this).find(".title a").attr("href");
                        document.location.href = '/' + href;
                    });

                    $(".hbch-bk .search-results td.title a").on("mouseover", inm.bk.pi1.courseSearchShowQuickInfo);

                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                if (console !== undefined) {
                    console.log(textStatus);
                }
            },
            complete: function () {
                inm.bk.toggleLoadIndicator();
            }
        });
    });

    /*
     * Reduce list of providers based on search criteria
     */
    $courseSearchForm.find('input, select').on("change", function () {
        // ignore change of provider dropdown
        if ($(this).attr('name') !== inm.bk.pi1.txName + '[VeranstalterId]') {
            $(this.form).bkSearchFormAdjustProviderDropdown();
        }
    });

    $('.hbch-bk .bk-course-search .bk-form-toggle').bkFormToggle({
        showOpened: false,
        persistState: true,
        storageKey: 'bk-course-search-toggle'
    });

    $courseSearchForm.bkSearchFormInitializeDefaults().bkSearchFormAdjustProviderDropdown();

    $courseSearchForm.find('.submit').click();

    /* ----------------------------------------- */
    /* Provider Registration                     */
    /* ----------------------------------------- */
    $('.hbch-bk .bk-provider-new form').submit(function () {
        var isValid = $(this).bkValidateForm();
        if (isValid) {
            inm.bk.toggleLoadIndicator();
            //$(this).find(":submit").prop("disabled", true);
        }
        return isValid;
    });

    /* ----------------------------------------- */
    /* Provider Cockpit                          */
    /* ----------------------------------------- */

    $('.hbch-bk .bk-provider-cockpit-search-form form .submit').on('click', function () {
        var $form = $(this.form);
        var formUrl = inm.bk.getBkAjaxControllerUrl();

        var $downloadToExcelFilter = $form.find(".downloadToExcel");
        if ($downloadToExcelFilter.val() === '1') {
            this.form.target = "_blank";
            this.form.action = formUrl;
            this.form.submit();
            $downloadToExcelFilter.val('0');
            return;
        }

        var storageKey = inm.bk.getStorageKeyForForm($form);
        var postData = $form.serializeArray();
        //store filter state to localStorage
        simpleStorage.set(storageKey, JSON.stringify($form.serializeObject()));
        $.ajax(
            {
                url: formUrl,
                type: "POST",
                dataType: "html",
                data: postData,
                beforeSend: function () {
                    inm.bk.toggleLoadIndicator();
                },
                success: function (data, textStatus, jqXHR) {

                    $(".hbch-bk .search-results").html(data);

                    $('.hbch-bk .search-results [data-toggle="tooltip"]').tooltip();

                    $('.hbch-bk .search-results .bk-ajax-list .bk-excel-download-durchf').on('click', function () {
                        $form.find(".downloadToExcel").val(1);
                        $form.find(".submit").click();
                    });

                    if ($(".hbch-bk .search-results table tbody tr").length > 0) {
                        $(".hbch-bk .search-results .hierarchy.tablesorter").tablesorter({
                            widthFixed: false,
                            headers: {
                                1: {sorter: false},
                                2: {sorter: false},
                                3: {sorter: false},
                                4: {sorter: false}
                            }
                        });
                        $(".hbch-bk .search-results .list.tablesorter").tablesorter({
                            widthFixed: false,
                            headers: {
                                2: {
                                    sorter: 'bkDateRange'
                                },
                                6: {
                                    sorter: false
                                }
                            }
                        });
                    }
                    // -------------- Template actions ---------------
                    $("tr.template .title").on("click", function () {
                        var $this = $(this);
                        var templateId = $this.parents("tr.template").attr("data-id");
                        inm.bk.redirectToControllerAction("CourseTemplate", "show", {templateId: templateId});
                    });

                    $("tr.template select.select-user-actions").change(function () {
                        var $this = $(this);
                        var templateId = $this.parents("tr.template").attr("data-id");
                        var actionId = $this.val();
                        switch (actionId) {
                            case "template-courseCreate":
                                inm.bk.redirectToControllerAction("Course", "new", {templateId: templateId});
                                break;
                            case "template-edit":
                                inm.bk.redirectToControllerAction("CourseTemplate", "edit", {templateId: templateId});
                                break;
                            case "template-copy":
                                inm.bk.redirectToControllerAction("CourseTemplate", "copy", {templateId: templateId});
                                break;
                            case "template-delete":
                                inm.bk.redirectToControllerAction("CourseTemplate", "delete", {templateId: templateId});
                                break;
                            case "template-activate":
                                inm.bk.redirectToControllerAction("CourseTemplate", "setActive", {
                                    templateId: templateId,
                                    isActive: true
                                });
                                break;
                            case "template-inactivate":
                                inm.bk.redirectToControllerAction("CourseTemplate", "setActive", {
                                    templateId: templateId,
                                    isActive: false
                                });
                                break;
                        }
                    });

                    // -------------- Course actions -----------------

                    $("tr.course .title").on("click", function () {
                        var $this = $(this);
                        var courseId = $this.parents("tr.course").attr("data-id");
                        inm.bk.redirectToControllerAction("Course", "show", {courseId: courseId});
                    });

                    $("tr.course select.select-user-actions").change(function () {
                        var $this = $(this);
                        var courseId = $this.parents("tr.course").attr("data-id");
                        var actionId = $this.val();
                        switch (actionId) {
                            case 'course-edit':
                                inm.bk.redirectToControllerAction("Course", "edit", {"courseId": courseId});
                                break;
                            case 'course-copy':
                                inm.bk.redirectToControllerAction("Course", "copy", {"courseId": courseId});
                                break;
                            case 'course-delete':
                                inm.bk.redirectToControllerAction("Course", "delete", {"courseId": courseId});
                                break;
                            case 'course-activate':
                                inm.bk.redirectToControllerAction("Course", "setActive", {
                                    "courseId": courseId,
                                    "isActive": true
                                });
                                break;
                            case 'course-inactivate':
                                inm.bk.redirectToControllerAction("Course", "setActive", {
                                    "courseId": courseId,
                                    "isActive": false
                                });
                                break;
                        }
                    });

                    // -------------- Load Participants --------------
                    $(".hbch-bk .search-results .toggleList").on("click", function () {
                        var $this = $(this);
                        var $toggleContent = $this.parent().find(".toggleContent");
                        if ($toggleContent.find("table").length > 0) {
                            $toggleContent.toggleClass("open");
                        } else {
                            var courseId = $this.attr("data-course-id");
                            var txName = inm.bk.pi1.txName;
                            var postData = {};
                            postData[txName + '[controller]'] = 'Ajax';
                            postData[txName + '[action]'] = 'courseParticipantsResults';
                            postData[txName + '[courseId]'] = courseId;
                            $.ajax({
                                url: formUrl,
                                type: "POST",
                                dataType: "html",
                                data: postData,
                                beforeSend: function () {
                                    inm.bk.toggleLoadIndicator();
                                },
                                success: function (data, textStatus, jqXHR) {
                                    $toggleContent.html(data);
                                    $toggleContent.addClass("open");
                                    $toggleContent.find(".tablesorter").tablesorter();

                                    $(".participants-download").on("click", function () {
                                        var courseId = $(this).parents("tr.course-details").attr("data-id");
                                        var excelUrl = inm.bk.getBaseUrlAjax();
                                        excelUrl += "?" + inm.bk.pi1.txName + "[controller]=Ajax";
                                        excelUrl += "&" + inm.bk.pi1.txName + "[action]=downloadExcel";
                                        excelUrl += "&" + inm.bk.pi1.txName + "[subAction]=courseParticipants";
                                        excelUrl += "&" + inm.bk.pi1.txName + "[courseId]=" + courseId;
                                        window.open(excelUrl);
                                    });
                                },
                                error: function (jqXHR, textStatus, errorThrown) {
                                    if (console !== undefined) {
                                        console.log(textStatus);
                                    }
                                },
                                complete: function () {
                                    inm.bk.toggleLoadIndicator();
                                }
                            });
                        }
                    });
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (console !== undefined) {
                        console.log(textStatus);
                    }
                },
                complete: function () {
                    inm.bk.toggleLoadIndicator();
                    $(".search-results select").uniform();
                }
            }
        );
    });

    $('.hbch-bk .bk-provider-cockpit-search-form form').bkSearchFormInitializeDefaults({
        initAfterPopulate: function ($form, postData) {
            // initialize viewtype selector
            var $bkViewtypeWrapper = $form.find('.bk-viewtype-wrapper');
            var curViewtype = postData[inm.bk.pi1.txName].viewtype;
            $form.find('.hidden-action').val('providerCourseSearchResults' + curViewtype.capitalizeFirstLetter());
            var $options = $bkViewtypeWrapper.find('li');
            $options.removeClass('checked');
            $bkViewtypeWrapper.find('li[data-viewtype="' + curViewtype + '"]').addClass("checked");
        }
    });
    $('.hbch-bk .bk-provider-cockpit-search-form form .submit').click();

    $('.hbch-bk .bk-provider-cockpit .controls .button-create-template').click(function () {
        if ($(this.form).bkValidateForm()) {
            inm.bk.redirectToControllerAction("CourseTemplate", "new", null);
        }
    });

    $('.hbch-bk .bk-provider-cockpit .bk-viewtype li').click(function () {
        var $this = $(this);
        var curViewtype = $this.attr('data-viewtype');
        var $options = $this.parent().children();
        $options.removeClass('checked');
        $('input.hidden-viewtype').val(curViewtype);
        $this.addClass('checked');
        $this.parents("form").find('.hidden-action').val('providerCourseSearchResults' + curViewtype.capitalizeFirstLetter());
        $this.parents("form").find(".submit").click();
    });

    /* ----------------------------------------- */
    /* Course Template - New                     */
    /* ----------------------------------------- */

    $(".multiselect-anstellungsarten").multiselect({
        nonSelectedText: $("#language-texts .select-default-anstellungsart-waehlen").text(),
        nSelectedText: $("#language-texts .multiselect-ausgewaehlt").text(),
        allSelectedText: $("#language-texts .multiselect-alle-ausgewaehlt").text()
    });
    $(".multiselect-grundausbildungen").multiselect({
        nonSelectedText: $("#language-texts .select-default-grundausbildung-waehlen").text(),
        nSelectedText: $("#language-texts .multiselect-ausgewaehlt").text(),
        allSelectedText: $("#language-texts .multiselect-alle-ausgewaehlt").text()
    });

    inm.bk.getSynchTarget = function ($formfield) {
        var $target;
        try {
            var attrName = $formfield.attr('name');
            var firstBracket = attrName.indexOf("[");
            attrName = attrName.replace('[]', '');
            attrName = attrName.slice(firstBracket, -1);
            attrName = attrName.replace('[course][', '');
            attrName = attrName.replace('][', '-');
            attrName = 'attr-' + attrName;
            $target = $(".summary-item." + attrName);
        } catch (ignore) {
            // do nothing...
        }
        return $target;
    };

    inm.bk.synchFieldToSummary = function ($field) {
        var $target = inm.bk.getSynchTarget($field);
        if ($target) {
            var type = $field.prop("type");
            var targetText = "";
            switch (type) {
                case 'text':
                case 'url':
                    targetText = $field.val();
                    break;
                case 'textarea':
                    targetText = $field.val();
                    var nl = /\n|\r|\r\n/g;
                    targetText = targetText.replace(nl, '<br />');
                    break;
                case 'select-one':
                    targetText = $field.children("option").filter(":selected").text();
                    break;
                case 'select-multiple':
                    $field.children("option").filter(":selected").each(function () {
                        if (targetText.length > 0) {
                            targetText += ', ';
                        }
                        targetText += $(this).text();
                    });
                    break;
            }
            $target.html(targetText);
        }
    };

    /* Synchronize Data with Summary */
    $(".hbch-bk .bk-course-template-form-new :input").on("keyup change", function () {
        inm.bk.synchFieldToSummary($(this));
    }).each(function () {
        /* First Synch after Loading */
        inm.bk.synchFieldToSummary($(this));
    });

    /* ----------------------------------------- */
    /* Course - New                              */
    /* ----------------------------------------- */

    // ---- button for new course location --------
    $(".hbch-bk .bk-course .button-kursort-erfassen").click(function () {
        $(".bk-course-location-new").slideDown();
        $(".bk-course-new").slideUp();
    });

    // ---- when changing startDatum set endDatum, if not set --------
    $(".hbch-bk .bk-course .bk-course-form-new input.startDatum").change(function () {
        var $this = $(this);
        var $endDatum = $(".hbch-bk .bk-course .bk-course-form-new input.endDatum");
        if (!$endDatum.val().length) {
            $endDatum.val($this.val());
        }
    });

    $(".hbch-bk .bk-course .kursort-waehlen select").on("change", function () {
        var $this = $(this);
        // get new id
        var id = $this.val();
        // get data for new id
        var $location = $("#location-" + id);
        $("textarea.anreiseBeschreibung").val($location.find(".anreiseBeschreibung").text());
        $("input.anreiseLink").val($location.find(".anreiseLink").text());
    });

    // handle signupLink field --------------------
    $(".hbch-bk .bk-course .checkbox-anmeldung-bei-anbieter").change(function () {
        var $signupLink = $(".bk-course .textarea-anmeldung-link");
        var $signupLinkWrapper = $(".bk-course .textarea-anmeldung-link-wrapper");
        var placeholder = $signupLink.attr("placeholder");
        if ($(this).is(":checked")) {
            $signupLink.attr("data-bk-required", "true");
            if (placeholder.indexOf("*") < 0) {
                $signupLink.attr("placeholder", placeholder + "*");
            }
            $signupLinkWrapper.show();
        } else {
            $signupLink.attr("data-bk-required", "false");
            $signupLink.attr("placeholder", placeholder.replace("*", ""));
            $signupLink.val("");
            $signupLinkWrapper.hide();
        }
    });

    (function () {
        var $signupLink = $(".bk-course .textarea-anmeldung-link");
        var $signupLinkWrapper = $(".bk-course .textarea-anmeldung-link-wrapper");
        var placeholder = $signupLink.attr("placeholder");
        if ($(".bk-course .checkbox-anmeldung-bei-anbieter:checked").length) {
            $signupLink.attr("data-bk-required", "true");
            if (placeholder.indexOf("*") < 0) {
                $signupLink.attr("placeholder", placeholder + "*");
            }
        } else {
            $signupLink.val("");
            $signupLinkWrapper.hide();
        }
    }(this));

    inm.bk.pi1.bkInnerCreateLocationClose = function () {
        $(".bk-course-location-new").slideUp();
        $(".bk-course-new").slideDown();
    };

    inm.bk.pi1.bkInnerCreateLocation = function (locationForm) {
        var $form = $(locationForm);
        $form.append('<input type="hidden" name="' + inm.bk.pi1.txName + '[isAjax]" value="true" />');
        if ($form.bkValidateForm()) {
            var postData = $form.serializeArray();
            var targetUrl = $form.attr("action");
            $.ajax({
                type: "POST",
                url: "/" + targetUrl,
                dataType: "json",
                data: postData,
                beforeSend: function () {
                    inm.bk.toggleLoadIndicator();
                },
                success: function (data, textStatus, jqXHR) {
                    if (data.result !== undefined) {
                        var result = data.result;
                        var $select = $(".kursort-waehlen select");
                        $select.append('<option value="' + result.ID + '">' + result.Bezeichnung + ", " + result.Standort + '</option>');
                        $select.val(result.ID);
                        $select.uniform();

                        // copy attributes from new location
                        $(".bk-course-new textarea.anreiseBeschreibung").val($(".bk-course-location-new textarea.anreiseBeschreibung").val());
                        $(".bk-course-new input.anreiseLink").val($(".bk-course-location-new input.anreiseLink").val());

                        $(".bk-course-location-new").slideUp();
                        $(".bk-course-new").slideDown();
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (console !== undefined) {
                        console.log(textStatus);
                    }
                },
                complete: function () {
                    inm.bk.toggleLoadIndicator();
                }
            });
        }
    };

    /* ----------------------------------------- */
    /* CourseLocation - Index                    */
    /* ----------------------------------------- */

    // -------------- Template actions ------------
    $(".hbch-bk .bk-course-location-index tr.location select.select-user-actions").change(function () {
        var $this = $(this);
        var locationId = $this.parents("tr.location").attr("data-id");
        var actionId = $this.val();
        switch (actionId) {
            case "location-show":
                inm.bk.redirectToControllerAction("CourseLocation", "show", {locationId: locationId});
                break;
            case "location-edit":
                inm.bk.redirectToControllerAction("CourseLocation", "edit", {locationId: locationId});
                break;
            case "location-activate":
                inm.bk.redirectToControllerAction("CourseLocation", "setActive", {
                    locationId: locationId,
                    isActive: true
                });
                break;
            case "location-inactivate":
                inm.bk.redirectToControllerAction("CourseLocation", "setActive", {
                    locationId: locationId,
                    isActive: false
                });
                break;
            case "location-delete":
                $("#confirm-delete").data("data-id", locationId);
                $.fancybox({
                    href: '#confirm-delete',
                    modal: true
                });
                break;
        }
    });

    $(".hbch-bk .bk-course-location-index tr.location .title").on("click", function () {
        var $this = $(this);
        var locationId = $this.parents("tr.location").attr("data-id");
        inm.bk.redirectToControllerAction("CourseLocation", "show", {locationId: locationId});
    });

    $(".hbch-bk .bk-course-location-index #confirm-delete .button-yes").on("click", function () {
        inm.bk.redirectToControllerAction("CourseLocation", "setActive", {
            "locationId": $("#confirm-delete").data("data-id"),
            "isActive": false
        });
    });

    $(".hbch-bk .bk-course-location-index #confirm-delete .button-no").on("click", function () {
        $.fancybox.close();
    });

    $(".hbch-bk .bk-course-location-index .tablesorter")

        // Initialize tablesorter
        // ***********************
        .tablesorter({
            widthFixed: false
        });

    /* ----------------------------------------- */
    /* CourseLocation - New/Edit                 */
    /* ----------------------------------------- */

    /* ----------------------------------------- */
    /* Employer Registration                     */
    /* ----------------------------------------- */
    $('.hbch-bk .bk-employer-new form').submit(function () {
        var isValid = $(this).bkValidateForm();
        if (isValid) {
            inm.bk.toggleLoadIndicator();
            //$(this).find(":submit").prop("disabled", true);
        }
        return isValid;
    });

    /* ----------------------------------------- */
    /* Employer Cockpit                          */
    /* ----------------------------------------- */
    $(".hbch-bk .bk-employer-cockpit .tablesorter")
        .tablesorter({
            widthFixed: false,
            headers: {
                1: {
                    sorter: 'bkDateRange'
                }
            }
        });

    $('.hbch-bk .bk-employer-cockpit-search-form form .submit').on('click', function () {
        var $form = $(this.form);
        var storageKey = inm.bk.getStorageKeyForForm($form);
        //store filter state to localStorage
        simpleStorage.set(storageKey, JSON.stringify($form.serializeObject()));

        var postData = $form.serializeArray();
        var formUrl = inm.bk.getBkAjaxControllerUrl();
        $.ajax(
            {
                url: formUrl,
                type: "POST",
                dataType: "html",
                data: postData,
                beforeSend: function () {
                    inm.bk.toggleLoadIndicator();
                },
                success: function (data, textStatus, jqXHR) {
                    $(".hbch-bk .search-results").html(data);
                    if ($(".hbch-bk .search-results table tbody tr").length > 0) {
                        $(".hbch-bk .search-results .tablesorter").tablesorter({
                            widthFixed: false,
                            headers: {
                                1: {
                                    sorter: 'bkDateRange'
                                }
                            }
                        });
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (console !== undefined) {
                        console.log(textStatus);
                    }
                },
                complete: function () {
                    inm.bk.toggleLoadIndicator();
                }
            }
        );
    });

    $('.hbch-bk .bk-employer-cockpit-search-form form').bkSearchFormInitializeDefaults();
    $('.hbch-bk .bk-employer-cockpit-search-form form .submit').click();

    /* ----------------------------------------- */
    /* Course Signup                             */
    /* ----------------------------------------- */
    $(".hbch-bk .bk-course-signup button").on("click", function () {
        var $form = $(this.form);
        var result = $form.bkValidateForm();
        var $checkbox = $form.find("input[type='checkbox'].checkbox-agbs-accepted");
        if (result) {
            if ($checkbox.length && $checkbox.attr("checked") !== 'checked') {
                $("#fancybox-container #error-agbs-nicht-akzeptiert").click();
                $checkbox.focus();
                result = false;
            }
        }
        if (result) {
            $checkbox = $form.find("input[type='checkbox'].checkbox-reglemente-accepted");
            if ($checkbox.length && $checkbox.parent().hasClass("checked") == false) {
                $("#fancybox-container #error-reglemente-nicht-akzeptiert").click();
                $checkbox.focus();
                result = false;
            }
        }
        if (result) {
            inm.bk.toggleLoadIndicator();
            $form.submit();
        } else {
            return false;
        }
    });

    $(".hbch-bk .bk-course-signup .select-employee").on("change", function () {
        var $this = $(this);
        var $form = $this.parents("form");
        var $employee = $(".assets .employees .employee[data-id=" + $this.val() + "]");
        var $target, targetValue;

        //$target = $form.find("input[name=uid]");
        //targetValue = $this.val()
        //$target.val(targetValue);

        $target = $form.find("select.select-anrede-id");
        targetValue = $employee.find(".anredeId").text();
        $target.val(targetValue).uniform();

        $target = $form.find(".textfield-nachname");
        targetValue = $employee.find(".nachname").text();
        if (targetValue.length > 0) {
            $target.prop("readonly", true);
        } else {
            $target.prop("readonly", false);
        }
        $target.val(targetValue);
        $target = $form.find(".textfield-vorname");
        targetValue = $employee.find(".vorname").text();
        $target.val(targetValue);

        $target = $form.find(".textfield-ahvn13");
        targetValue = $employee.find(".ahvn13").text();
        $target.val(targetValue);
        if (targetValue.length > 0) {
            $target.prop("readonly", true);
        } else {
            $target.prop("readonly", false);
        }

        $target = $form.find(".textfield-geburtsdatum");
        targetValue = $employee.find(".geburtsdatum").text().trim();
        $target.val(targetValue);

        if (targetValue.length > 0) {
            $target.datepicker('disable');
            $target.prop("readonly", true);
        } else {
            $target.datepicker('enable');
            $target.prop("readonly", false);
        }

    });

    /* ----------------------------------------- */
    /* General Initializations                   */
    /* ----------------------------------------- */

    // tooltips -----------------------------------
    var tooltipCounter = 0;
    $(".hbch-bk .info").each(function () {
        var $this = $(this);
        if ($this.prev().find("select").length) {
            $this.addClass("select");
        }
        var $div = $this.find("div");
        var infoId = "info-" + tooltipCounter;
        $div.attr("id", infoId);
        $div.addClass("fancybox");
        $this.attr("data-info-id", infoId);
        $div.appendTo($("#fancybox-container"));
        $this.on("click", function () {
            var $info = $("#" + infoId);
            $info.click();
        });
        tooltipCounter++;
    });
    $('.hbch-bk [data-toggle="tooltip"]').tooltip();

    // others -------------------------------------
    $(".hbch-bk *[placeholder]").each(function () {
        var $this = $(this);
        if ($this.attr('title') === undefined) {
            if ($this.attr('placeholder') !== undefined) {
                $this.attr('title', $this.attr('placeholder'));
            }
        }
    });

    $(".hbch-bk select").on("focusin", function () {
        $(this).parent().addClass("focussed");
    });

    $(".hbch-bk select").on("focusout", function () {
        $(this).parent().removeClass("focussed");
    });

    $(".hbch-bk .multiselect .btn-group").on("focusin", function () {
        $(this).parents(".multiselect").addClass("focussed");
    });

    $(".hbch-bk .multiselect .btn-group").on("focusout", function () {
        $(this).parents(".multiselect").removeClass("focussed");
    });

    $(".hbch-bk input.textfield-zipcode").on("keyup blur", function () {
        var $this = $(this);
        var zipCode = $this.val();
        if (zipCode.length === 4) {
            var txName = inm.bk.pi1.txName;
            var postData = {};
            postData[txName + '[controller]'] = 'Ajax';
            postData[txName + '[action]'] = 'findCitiesByFilter';
            postData[txName + '[PLZ]'] = zipCode;
            $.ajax({
                url: inm.bk.getBaseUrlAjax('json'),
                type: "POST",
                dataType: "json",
                data: postData,
                beforeSend: function () {
                    inm.bk.toggleLoadIndicator();
                },
                success: function (data, textStatus, jqXHR) {

                    if (data[zipCode] !== undefined) {
                        var city = data[zipCode];
                        $(".plzOrtId").val(city.ID);
                        $("input.textfield-city").val(city.Ort);
                    } else {
                        $(".plzOrtId").val("");
                        $("input.textfield-city").val("");
                    }

                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (console !== undefined) {
                        console.log(textStatus);
                    }
                },
                complete: function () {
                    inm.bk.toggleLoadIndicator();
                }
            });
        }
        if (zipCode.length === 0) {
            $(".plzOrtId").val("");
            $("input.textfield-city").val('');
        }
    });

    // readonly forms
    $(".hbch-bk .bk-readonly input").each(function () {
        var $this = $(this);
        if (!$this.hasClass('bk-readonly-override') && ($this.parents(".bk-readonly-override").size() === 0)) {
            $this.attr("readonly", "readonly");
        }
    });

    $(".hbch-bk .bk-readonly textarea").each(function () {
        var $this = $(this);
        if (!$this.hasClass('bk-readonly-override') && ($this.parents(".bk-readonly-override").size() === 0)) {
            $this.attr("readonly", "readonly");
        }
    });

    $(".hbch-bk .bk-readonly select, .hbch-bk .bk-readonly .multiselect").each(function () {
        var $this = $(this);
        if (!$this.hasClass('bk-readonly-override') && ($this.parents(".bk-readonly-override").size() === 0)) {
            $this.prop("disabled", true);
        }
    });

    $(".hbch-bk .bk-readonly button.multiselect").each(function () {
        var $this = $(this);
        $this.unbind('click, keydown');
    });

    // do not show registration dropdown if it has no children
    if ($('ul.reg-children').children().length === 0) {
        $('nav.course-registration').css('display', 'none');
    }

    $(".hbch-bk .fancybox-container > *").fancybox();

    $(".hbch-bk form").bkInitializeForm();

    $(".hbch-bk form").preventDoubleSubmission();

    $(".hbch-bk #flash-messages").click();

    $(".hbch-bk .bk-address").bkAddGoogleMapsIcon();

    /* --------------------------------------------------------- */
    /* jQuery UI Datepicker Languages                            */
    /* --------------------------------------------------------- */

    // https://github.com/jquery/jquery-ui/blob/master/ui/i18n/datepicker-it-CH.js

    /* Italian initialisation for the jQuery UI date picker plugin. */
    /* Written by Antonello Pasella (antonello.pasella@gmail.com). */
    (function (factory) {
        if (typeof define === "function" && define.amd) {

            // AMD. Register as an anonymous module.
            define(["../widgets/datepicker"], factory);
        } else {

            // Browser globals
            factory(jQuery.datepicker);
        }
    }(function (datepicker) {

        datepicker.regional['it-CH'] = {
            closeText: 'Chiudi',
            prevText: '&#x3C;Prec',
            nextText: 'Succ&#x3E;',
            currentText: 'Oggi',
            monthNames: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
                'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
            monthNamesShort: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu',
                'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'],
            dayNames: ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
            dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
            dayNamesMin: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'],
            weekHeader: 'Sm',
            dateFormat: 'dd.mm.yy',
            firstDay: 1,
            isRTL: false,
            showMonthAfterYear: false,
            yearSuffix: ''
        };
        datepicker.setDefaults(datepicker.regional['it-CH']);

        return datepicker.regional['it-CH'];

    }));

    // https://github.com/jquery/jquery-ui/blob/master/ui/i18n/datepicker-de.js

    /* German initialisation for the jQuery UI date picker plugin. */
    /* Written by Milian Wolff (mail@milianw.de). */
    (function (factory) {
        if (typeof define === "function" && define.amd) {

            // AMD. Register as an anonymous module.
            define(["../widgets/datepicker"], factory);
        } else {

            // Browser globals
            factory(jQuery.datepicker);
        }
    }(function (datepicker) {

        datepicker.regional['de'] = {
            closeText: 'Schließen',
            prevText: '&#x3C;Zurück',
            nextText: 'Vor&#x3E;',
            currentText: 'Heute',
            monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
                'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
            monthNamesShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
                'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
            dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
            dayNamesShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
            dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
            weekHeader: 'KW',
            dateFormat: 'dd.mm.yy',
            firstDay: 1,
            isRTL: false,
            showMonthAfterYear: false,
            yearSuffix: ''
        };
        datepicker.setDefaults(datepicker.regional['de']);
        return datepicker.regional['de'];

    }));

    var lang = inm.bk.lang || 'de';
    if (lang.substr(0, 2) === 'it') {
        lang = 'it-CH';
    }
    $.datepicker.setDefaults($.datepicker.regional[lang]);

    $(".hbch-bk .datepicker.birthday").datepicker({
        dateFormat: "dd.mm.yy",
        changeYear: true,
        yearRange: "c-70:c0"
    });
    $(".hbch-bk .datepicker.birthday").on('click,focus', function (e) {
        $(this).attr('placeholder', '');
    });

    $(".hbch-bk .datepicker").datepicker({
        dateFormat: "dd.mm.yy",
        changeYear: true,
        yearRange: "c-1:c+2"
    });

    /* Highlight selected dropdowns in search criteria */
    $(".hbch-bk .bk-search-criteria select").on("change", function () {
        var $this = $(this);
        if ($this.find("option:first").val() === '') {
            if (this.selectedIndex > 0) {
                $this.parent().addClass("selected");
            } else {
                $this.parent().removeClass("selected");
            }
        }
    }).change();

    $('.hbch-bk .bk-search-criteria input[type="text"]').on('change', function () {
        var $this = $(this);
        if ($this.val().length > 0) {
            $this.addClass("selected");
        } else {
            $this.removeClass("selected");
        }
    }).change();

});

