var Courses = function () {

    var courseId = 0,
        prefix = $('body').data('coursePrefix') || 'd';

    var handleBookButton = function () {

        $('.book').unbind('click').on('click', function () {
            $('a[href="#' + $(this).data('tab') + '"]').click();
            $('.table').pulsate({
                color: "#82D0F5",
                repeat: 5
            });
        });

    };

    var handleSubscriptionButton = function () {

        $('.abo').unbind('click').on('click', function () {
            $('a[href="#' + $(this).data('tab') + '"]').trigger('click');
        });

    };

    var handleInfoAgentButton = function () {

        $('.infoagent').unbind('click').on('click', function () {
            $('a[href="#' + $(this).data('tab') + '"]').trigger('click');
            $('.checkbox-inline').pulsate({
                color: "#82D0F5",
                repeat: 5
            });
        });

    };

    var handleInfoAgent = function () {

        // Show Company Input
        $('input[name="infoagent"]').unbind('change').on('change', function () {
            var id = $(this).val(),
                el = $('#infoagent' + courseId),
                url = (Config.get('c') === 'iframe')
                    ? Config.get('current-url') + '&ia=update_info_agent&course_id=' + id + '&force_id=1'
                    : (Config.get('is-admin') ? '/admin' : '') + '/' + Config.get('c') + '/update_info_agent/?course_id=' + id + '&force_id=1';

            Custom.blockUI({
                target: el,
                boxed: true,
                iconOnly: true
            });

            $.ajax({
                type: 'GET',
                url: url,
                success: function (c) {
                    Custom.unblockUI(el);
                    $('#infoagent_text' + courseId).html(c === 'set' ? Language.get('infoagent_deactivate') : Language.get('infoagent_activate'));
                }
            });
        });

    };

    var handleRangeForm = function () {
        var range_form = $('#review_form' + courseId);

        // Handle Validation
        if (range_form.length) {
            var errorRange = $('.alert-danger', range_form),
                successRange = $('.alert-success', range_form),
                ladda = typeof (Ladda) == 'object'
                    ? Ladda.create(range_form.find('input[type="submit"],button[type="submit"]')[0])
                    : false;

            range_form.validate({
                errorElement: 'span', //default input error message container
                errorClass: 'help-block', // default input error message class
                focusInvalid: false, // do not focus the last invalid input
                ignore: "",
                rules: {
                    text: {
                        minlength: 2,
                        required: true
                    }
                },

                errorPlacement: function (error, element) { // render error placement for each input type
                    if (element.parent(".input-group").size() > 0) {
                        error.insertAfter(element.parent(".input-group"));
                    } else if (element.attr("data-error-container")) {
                        error.appendTo(element.attr("data-error-container"));
                    } else if (element.parents('.radio-list').size() > 0) {
                        error.appendTo(element.parents('.radio-list').attr("data-error-container"));
                    } else if (element.parents('.radio-inline').size() > 0) {
                        error.appendTo(element.parents('.radio-inline').attr("data-error-container"));
                    } else if (element.parents('.checkbox-list').size() > 0) {
                        error.appendTo(element.parents('.checkbox-list').attr("data-error-container"));
                    } else if (element.parents('.checkbox-inline').size() > 0) {
                        error.appendTo(element.parents('.checkbox-inline').attr("data-error-container"));
                    } else {
                        error.insertAfter(element); // for other inputs, just perform default behavior
                    }
                },

                invalidHandler: function () { //display error alert on form submit event, validator
                    successRange.addClass('display-hide');
                    errorRange.removeClass('display-hide');
                    App.scrollTo(errorRange, -200);

                    // stop submit button animation
                    if (ladda) {
                        ladda.stop();
                    }
                },

                highlight: function (element) { // hightlight error inputs
                    $(element).closest('.form-group').addClass('has-error'); // set error class to the control group
                },

                unhighlight: function (element) { // revert the change done by hightlight
                    $(element).closest('.form-group').removeClass('has-error'); // set error class to the control group
                },

                success: function (label) {
                    label.closest('.form-group').removeClass('has-error'); // set success class to the control group
                },

                submitHandler: function (form) {
                    successRange.removeClass('display-hide');
                    errorRange.addClass('display-hide');
                    form.submit();

                    // start submit button animation
                    if (ladda) {
                        ladda.start();
                    }
                }

            });

            range_form.append('<input type="hidden" name="token" value="C4q3$Qc4CT$c443r4xedrq4q3x2">');
        }
    };

    var handleInfoagentForm = function () {
        var ia_forms = $('form[id^="infoagent_form"]');

        // Handle Validation
        if (ia_forms.length) {
            $.each(ia_forms, function () {

                var form = $(this),
                    errorInfoagent = $('.alert-danger', form),
                    successInfoagent = $('.alert-success', form),
                    ladda = typeof (Ladda) == 'object'
                        ? Ladda.create(form.find('input[type="submit"],button[type="submit"]')[0])
                        : false;

                form.validate({
                    errorElement: 'span', //default input error message container
                    errorClass: 'help-block', // default input error message class
                    focusInvalid: false, // do not focus the last invalid input
                    ignore: "",
                    rules: {
                        email: {
                            required: true,
                            email: true
                        },
                        privacy: {
                            required: true
                        }
                    },

                    errorPlacement: function (error, element) { // render error placement for each input type
                        if (element.parent(".input-group").size() > 0) {
                            error.insertAfter(element.parent(".input-group"));
                        } else if (element.attr("data-error-container")) {
                            error.appendTo(element.attr("data-error-container"));
                        } else if (element.parents('.radio-list').size() > 0) {
                            error.appendTo(element.parents('.radio-list').attr("data-error-container"));
                        } else if (element.parents('.radio-inline').size() > 0) {
                            error.appendTo(element.parents('.radio-inline').attr("data-error-container"));
                        } else if (element.parents('.checkbox-list').size() > 0) {
                            error.appendTo(element.parents('.checkbox-list').attr("data-error-container"));
                        } else if (element.parents('.checkbox-inline').size() > 0) {
                            error.appendTo(element.parents('.checkbox-inline').attr("data-error-container"));
                        } else {
                            error.insertAfter(element); // for other inputs, just perform default behavior
                        }
                    },

                    invalidHandler: function () { //display error alert on form submit event, validator
                        successInfoagent.addClass('display-hide');
                        errorInfoagent.removeClass('display-hide');
                        App.scrollTo(errorInfoagent, -200);

                        // stop submit button animation
                        if (ladda) {
                            ladda.stop();
                        }
                    },

                    highlight: function (element) { // hightlight error inputs
                        $(element).closest('.form-group').addClass('has-error'); // set error class to the control group
                    },

                    unhighlight: function (element) { // revert the change done by hightlight
                        $(element).closest('.form-group').removeClass('has-error'); // set error class to the control group
                    },

                    success: function (label) {
                        label.closest('.form-group').removeClass('has-error'); // set success class to the control group
                    },

                    submitHandler: function (form) {
                        successInfoagent.removeClass('display-hide');
                        errorInfoagent.addClass('display-hide');
                        form.submit();

                        // start submit button animation
                        if (ladda) {
                            ladda.start();
                        }
                    }

                });

                form.append('<input type="hidden" name="token" value="C4q3$Qc4CT$c443r4xedrq4q3x2">');
            });
        }
    };

    var handleConfirm = function (force) {
        $('.book-btn').unbind('click').on('click', function (event) {

            var $this = $(this),
                body = $("body"),
                form = $(this).closest('form'),
                course_id = $('input[name="course_id"]', form).val(),
                coursedate_id = $('input[name="coursedate_id"]', form).val(),
                term = $('input[name="term"]', form),
                isRolling = term.length,
                hasAutoCheckIn = $('#' + prefix + '_term_auto_checkin_' + coursedate_id, form),
                hasAboCheck = $('#' + prefix + '_check_abo_' + coursedate_id, form).val(),
                type = $('#' + prefix + '_type_' + coursedate_id).val(),
                steps = [],
                url = (Config.get('c') === 'iframe')
                    ? Config.get('current-url') + '&ia=check_password'
                    : '/' + Config.get('c') + '/check_password/',
                termBtn = $(this).parent().parent().parent().find('[data-coursedate-id="' + coursedate_id + '"]'),
                ladda = typeof (Ladda) == 'object'
                    ? Ladda.create($this[0])
                    : false;

            event.preventDefault();

            ladda.start();

            // kursolino support workaround
            var comment = $('textarea[name="comment"]', form)
            if (comment.length && comment.data('required')) {
                var value = $.trim(comment.val());

                if (!value.length) {
                    swal(Language.get('error_title'), comment.data('required'), "error");
                    ladda.stop();
                    return false;
                }
            }

            // on admin, confirm booking
            if (Config.get('is-admin') && !force && form.attr('data-confirm') && !$this.data('confirmed')) {
                swal({
                    type: 'question',
                    title: Language.get('question'),
                    html: form.attr('data-confirm'),
                    showCancelButton: true,
                    showCloseButton: false,
                    focusConfirm: false,
                    focusCancel: true,
                    allowOutsideClick: false,
                    confirmButtonText: Language.get('yes'),
                    cancelButtonText: Language.get('no')
                }).then(function (result) {
                    if (result.value) {
                        $this.data('confirmed', 1).click();
                        return true;
                    } else {
                        ladda.stop();
                    }
                });

                return false;
            }

            // Check rolling courses
            if ($(this).hasClass('rolling-courses')) {
                if (!$('#' + prefix + '_term_' + coursedate_id).val()) {
                    steps.push({
                        type: 'error',
                        title: Language.get('ops'),
                        html: Language.get('termsErrorMessage'),
                        showCloseButton: true,
                        showCancelButton: true,
                        cancelButtonText: Language.get('Ok'),
                        timer: 3000,
                        allowEscapeKey: true,
                        allowOutsideClick: true
                    });
                } else {
                    if (hasAutoCheckIn.val() && type !== 'waiting_list') {
                        if (termBtn.hasClass('selected')) {
                            var options = {
                                'course_date_id': coursedate_id,
                                'term_duration': $('input[name="term_duration"]', form).val(),
                                'term_days': $('input[name="term_days"]', form).val(),
                                'term_weeks': $('input[name="term_weeks"]', form).val(),
                                'return_text': true
                            };

                            $.when(Courses.getStartDate(options)).done(function (data) {
                                if (data.error === false) {
                                    var startDateText = $('<div/>').html('<p class="margin-top-15">' + data.text + '</p>');

                                    if (data.terms > 1) {
                                        $('<button/>')
                                            .attr({
                                                id: 'changeTerm',
                                                type: 'button',
                                                class: 'btn btn-xl btn-primary margin-top-15'
                                            })
                                            .html(Language.get('change_term'))
                                            .appendTo(startDateText);
                                    }

                                    body.on('click', '#changeTerm', function () {
                                        swal.close();
                                        ladda.stop();
                                        Courses.getTerms(coursedate_id);
                                    });

                                    $('<button/>')
                                        .attr({
                                            id: 'bookNow',
                                            type: 'button',
                                            class: 'btn btn-xl btn-secondary margin-top-15'
                                        })
                                        .html(Language.get('ok'))
                                        .appendTo(startDateText);

                                    body.on('click', '#bookNow', function () {
                                        $('#' + prefix + '_start_' + coursedate_id).val(data.start);
                                        $('#' + prefix + '_end_' + coursedate_id).val(data.end);
                                        swal.clickConfirm();
                                    });

                                    steps.push({
                                        type: 'info',
                                        html: startDateText
                                    });
                                } else {
                                    steps.push({
                                        type: 'error',
                                        html: data.error
                                    });
                                }
                            });
                        }
                    } else if (!hasAutoCheckIn.val() && type !== 'waiting_list') {
                        var hasNotAutoCheckInContent = $('<div/>').html('<p class="margin-top-15">' + hasAutoCheckIn.data('info-text') + '</p>');

                        $('<button/>')
                            .attr({id: 'showDetails', type: 'button', class: 'btn btn-primary margin-top-15'})
                            .html('<i class="fa fa-search"></i> ' + Language.get('details'))
                            .appendTo(hasNotAutoCheckInContent);

                        body.unbind('click').on('click', '#showDetails', function () {
                            ladda.stop();
                            $('a.view-details[data-course_date_id="' + coursedate_id + '"]').trigger('click').unbind('click').removeClass('ajax-initiated');
                        });

                        $('<button/>')
                            .attr({id: 'bookNow', type: 'button', class: 'btn btn-secondary margin-top-15'})
                            .html('<i class="fa fa-thumbs-up"></i> ' + Language.get('ok'))
                            .appendTo(hasNotAutoCheckInContent);

                        body.on('click', '#bookNow', function () {
                            swal.clickConfirm();
                        });

                        steps.push({
                            type: 'info',
                            title: hasAutoCheckIn.data('info-title'),
                            html: hasNotAutoCheckInContent
                        });
                    }
                }
            }

            // Check Password
            if ($(this).hasClass('password-check')) {
                var password_info = $(this).data('password-date').length
                    ? ' <br><br><small class="bold">' + Language.get('course_passwd_until').replace('%s', $(this).data('password-date')) + '</small>'
                    : '';

                steps.push({
                    title: Language.get('course_passwd_title'),
                    html: Language.get('course_passwd_info') + password_info,
                    input: 'password',
                    showConfirmButton: true,
                    confirmButtonText: '<i class="fa fa-check"></i> ' + Language.get('check'),
                    showLoaderOnConfirm: true,
                    preConfirm: function (passwd) {
                        return new Promise(function (resolve) {
                            $.ajax({
                                url: url,
                                type: "GET",
                                dataType: 'json',
                                data: {passwd: passwd, coursedate_id: coursedate_id},
                                success: function (res) {
                                    if (res && res.passwd) {
                                        $('input[name="password"]', form).val(passwd);
                                    } else {
                                        swal.showValidationError(Language.get('wrong_password'));
                                    }
                                    resolve();
                                }
                            });
                        });
                    }
                });
            }

            // Check waiting list
            if ($(this).hasClass('waiting-list')) {
                body.on('submit', '#waitingList', function (e) {
                    var wlForm = $(this).serializeArray(),
                        wlInputs = $('.wlInputs'),
                        l = typeof (Ladda) == 'object'
                            ? Ladda.create($(this).find('input[type="submit"],button[type="submit"]')[0])
                            : false;

                    e.preventDefault();

                    l.start();

                    $.post(Config.get('base-url') + '/account/check-waiting-list-constellation/', wlForm, function (data) {
                        if (data.check === true) {
                            $('#wlAlert').hide();

                            wlInputs.remove();

                            $.each(wlForm, function (index, data) {
                                form.append('<input type="hidden" class="wlInputs" name="' + data.name + '" value="' + data.value + '">');
                            });

                            swal.clickConfirm();
                        } else {
                            $('#wlAlert').show();
                            l.stop();
                        }
                    });

                    return false;
                });

                steps.push({
                    html: '<div id="swalContent"></div>',
                    onOpen: function () {
                        swal.showLoading();
                    },
                    onOpen: function () {
                        var container = $('#swalContent');

                        setTimeout(function () {
                            $.ajax({
                                url: Config.get('base-url') + '/account/get-waiting-list-options/',
                                type: "GET",
                                data: {
                                    course_id: course_id,
                                    coursedate_id: coursedate_id
                                },
                                success: function (html) {
                                    swal.hideLoading();
                                    container.html(html);

                                    Custom.initBootstrapSwitch(container);
                                }
                            });
                        }, 200);
                    }
                });
            } else {
                if (form.data('start-text')) {
                    var checkStartContent = $('<div/>').html('<p class="margin-top-15">' + form.data('start-text') + '</p>');

                    $('<button/>')
                        .attr({id: 'checkStartNo', type: 'button', class: 'btn btn-info margin-top-15'})
                        .html('<i class="fa fa-thumbs-down"></i> ' + Language.get('no'))
                        .appendTo(checkStartContent);

                    body.on('click', '#checkStartNo', function () {
                        ladda.stop();
                        swal.close();
                    });

                    $('<button/>')
                        .attr({id: 'checkStartYes', type: 'button', class: 'btn btn-success margin-top-15'})
                        .html('<i class="fa fa-thumbs-up"></i> ' + Language.get('ok'))
                        .appendTo(checkStartContent);

                    body.on('click', '#checkStartYes', function () {
                        swal.clickConfirm();
                    });

                    steps.push({
                        title: Language.get('question'),
                        html: checkStartContent
                    });
                }
            }

            // Check abo
            if (hasAbo && hasAboCheck === '1') {
                var aboContent = $('<p/>', {
                    class: 'margin-top-15',
                    html: Language.get('course_abo_text') + '<br>'
                });

                $('<button/>')
                    .attr({id: 'aboNo', type: 'button', class: 'btn btn-danger margin-top-15'})
                    .html('<i class="fa fa-thumbs-down"></i> ' + Language.get('no'))
                    .appendTo(aboContent);

                body.on('click', '#aboNo', function () {
                    $('input[name="abo"]', form).val('');
                    swal.clickConfirm();
                });

                $('<button/>')
                    .attr({id: 'aboYes', type: 'button', class: 'btn btn-success margin-top-15'})
                    .html('<i class="fa fa-thumbs-up"></i> ' + Language.get('yes'))
                    .appendTo(aboContent);

                body.on('click', '#aboYes', function () {
                    $('input[name="abo"]', form).val('1');
                    swal.clickConfirm();
                });

                steps.push({
                    title: Language.get('course_abo_title'),
                    html: aboContent,
                    footer: '<a href="javascript:" id="aboInfo" class="btn default">' + Language.get('course_abo_info') + '</a>'
                });

                body.on('click', '#aboInfo', function () {
                    $('.swal2-footer')
                        .css('display', 'block')
                        .html($('#abo' + course_id).html());
                });
            }

            Courses.confirm(form, steps, ladda);

            return false;
        });
    };

    var handlePayRate = function () {
        var payRate = $('.' + prefix + '_pay_rate');

        payRate.unbind('change').on('change', function () {
            var price = parseFloat($(this).data('price')),
                id = $(this).data('id'),
                tax_hint = $('#' + prefix + '_price_' + id).data('tax_hint'),
                newPrice = $(this).val() ? (price / $(this).val()) : price,
                checkPrice = (newPrice * 100.0) % 100;

            newPrice = Custom.formatPrice(newPrice, (!checkPrice ? 0 : 2));

            $('#' + prefix + '_price_' + id).html(newPrice + (prefix === 'm' ? '<small class="tax font-xs text-muted">' + tax_hint + '</small>' : '<sup class="text-muted">' + tax_hint + '</sup>'));
            $('#' + prefix + '_pay_rate_' + id).val($(this).val());
        });

        payRate.trigger('change');
    };

    var handleBookingHotline = function () {
        $('.hotline-btn').click(function (event) {
            var content = $(this).data('content');
            event.preventDefault();

            swal(Language.get('info'), content, "info");

            return false;
        });
    };

    var handleBookingAtLocation = function () {
        $('.at-location-btn').click(function (event) {
            var content = $(this).data('content');
            event.preventDefault();

            swal(Language.get('info'), content, "info");

            return false;
        });
    };

    var handleBookingFrom = function () {
        $('.booking-from-btn').click(function (event) {
            var content = $(this).data('content');
            event.preventDefault();

            swal(Language.get('info'), content, "info");

            return false;
        });
    };

    var handleTermBtn = function () {
        $('.termBtn').unbind('click').on('click', function () {
            Courses.getTerms($(this).data('coursedate-id'));
        });
    };

    var handleMobilLocationFilter = function () {
        $('#locations' + courseId).on('change', function () {
            let $this = $(this),
                value = $this.val(),
                url = $this.data('url')
            if (typeof URL !== 'undefined') {
                if (url.indexOf('/iframe/') === 0) {
                    url = Config.get('base-url') + url
                }
                let u = new URL(url);
                if (value) {
                    u.searchParams.set('location', value)
                } else {
                    u.searchParams.delete('location')
                }
                window.location.href = u.toString()
            } else {
                // fallback for old browsers
                let hasLocationParam = (url.indexOf('location=') !== -1),
                    target = hasLocationParam ? url.slice(0, (url.indexOf('location=') - 1)) : url,
                    parameter = (target.indexOf('?') !== -1 ? '&location=' : '?location=') + value;
                window.location.href = target + (value ? parameter : '');
            }
        })
    };
    var handleMobileCapacityFilter = function () {
        $('#capacity' + courseId).on('change', function () {
            let $this = $(this),
                value = $this.val(),
                url = $this.data('url');
            if (typeof URL !== 'undefined') {
                if (url.indexOf('/iframe/') === 0) {
                    url = Config.get('base-url') + url
                }
                let u = new URL(url);
                if (value) {
                    u.searchParams.set('capacity', value)
                } else {
                    u.searchParams.delete('capacity')
                }

                window.location.href = u.toString()
            } else {
                // fallback for old browsers
                let hasLocationParam = (url.indexOf('capacity=') !== -1),
                    target = hasLocationParam ? url.slice(0, (url.indexOf('capacity=') - 1)) : url,
                    parameter = (target.indexOf('?') !== -1 ? '&capacity=' : '?capacity=') + value;
                window.location.href = target + (value ? parameter : '');
            }
        })
    };

    var handleIframeLinks = function () {
        if (Config.get('c') === 'iframe') {
            // update details link
            $('#datatable_courses' + courseId + ' a.view-details').each(function () {
                var url = Config.get('current-url') + '&ia=get-dates&id=' + $(this).data('course_date_id');
                $(this).attr('href', url);
            });

            // update redirect url
            var IframeCheck = setInterval(function () {
                if (window.iframe_referer) {
                    clearInterval(IframeCheck);
                    $('.course' + courseId + ' input.redirectUrl').val(window.iframe_referer);
                }
            }, 500);
        }
    };

    var handleRollingCalendar = function () {
        var calendar = $('#zabuto_calendar'),
            url = (Config.get('c') === 'iframe')
                ? Config.get('current-url') + '&ia=get-rolling-dates&coursedate_id=' + calendar.data('course_date_id')
                : '/' + Config.get('c') + '/get-rolling-dates/?coursedate_id=' + calendar.data('course_date_id');

        Custom.blockUI({
            target: calendar.parent(),
            boxed: true,
            iconOnly: true
        });

        if (!calendar.length || !jQuery().zabuto_calendar) {
            return;
        }

        calendar.empty().zabuto_calendar({
            language: Language.get('locale').split('_')[0],
            cell_border: false,
            show_previous: false,
            today: true,
            month: calendar.data('month'),
            year: calendar.data('year'),
            nav_icon: {
                prev: '<i class="fa fa-chevron-left"></i>',
                next: '<i class="fa fa-chevron-right"></i>'
            },
            ajax: {
                url: url
            },
            legend: [
                {type: "block", label: calendar.data('free'), classname: "bg-success"},
                {type: "block", label: calendar.data('low'), classname: "bg-warning"},
                {type: "block", label: calendar.data('empty'), classname: "bg-danger"}
            ],
            callback: function () {
                // set year & month
                calendar
                    .data('month', calendar.data('currDate').getMonth() + 1)
                    .data('year', calendar.data('currDate').getFullYear());

                // enable tooltip
                calendar.find('td.event-styled').tooltip({
                    container: 'body',
                    placement: 'auto',
                    html: true
                });

                Custom.unblockUI(calendar.parent());
            },
            action_nav: function () {
                Custom.blockUI({
                    target: calendar.parent(),
                    boxed: true,
                    iconOnly: true
                });
            }
        });
    };

    var handleFilter = function () {
        $('.filter-cancel').on('click', function () {
            handleConfirm();
        });
    };

    var loadCoursedates = function () {
        if (courseId) {
            var $mobileCourses = $('#mobile_courses' + courseId),
                $table = $('#datatable_courses' + courseId);

            // reset prefix
            prefix = 'd';
            $('body').data('coursePrefix', 'd');

            // mobile view
            if ($mobileCourses.is(':visible')) {
                prefix = 'm';
                $('body').data('coursePrefix', 'm');

                if (!$mobileCourses.data('initiated')) {
                    $mobileCourses.data('initiated', true);
                    $.get($mobileCourses.data('src'), function (html) {
                        $mobileCourses.html(html);
                        Courses.init(true);
                        Custom.initAjax();
                    });
                }
            } else if (!$table.data('initiated')) {
                $table.data('initiated', true).data('disable-autoload', false).on('draw.dt', function () {
                    Courses.init(true);
                })
                    .on('xhr.dt', function (){
                        if ($(this).DataTable().ajax.json().restDiscountHint) {
                            $('#rest-discount-hint').show();
                        }
                    });
                Datatables.init($table);
            }

            $(window).resize(function () {
                loadCoursedates();
            });
        }
    }

    return {
        //main function to initiate the module
        init: function () {
            $('div.course-module').each(function () {
                courseId = $(this).data('course-id');

                loadCoursedates();

                handleBookButton();
                handleSubscriptionButton();
                handleInfoAgentButton();
                handleRangeForm();
                handleInfoAgent();
                handleConfirm();
                handlePayRate();
                if ($('head').data('user-id') === 0) handleInfoagentForm();
                handleBookingHotline();
                handleBookingAtLocation();
                handleBookingFrom();
                handleTermBtn();
                handleMobilLocationFilter();
                handleMobileCapacityFilter();
                handleIframeLinks();
                handleFilter();
            });
        },

        initRollingCalendar: function () {
            handleRollingCalendar();
        },

        roundup: function (num, dec) {
            dec = dec || 0;
            var s = String(num);
            // if (num % 1) s = s.replace(/5$/, '6');
            return Number((+s).toFixed(dec));
        },

        confirm: function (form, steps, ladda) {

            var stepsArray = [];
            for (var i = 0; i < steps.length; ++i) {
                stepsArray.push(i + 1)
            }

            ladda.stop();

            swal.setDefaults({
                showCloseButton: true,
                showConfirmButton: false,
                showCancelButton: false,
                progressSteps: steps.length > 1 ? stepsArray : [],
                allowEscapeKey: false,
                allowOutsideClick: false,
                allowEnterKey: false
            });

            swal.queue(steps).then(function (result) {
                swal.resetDefaults();

                if (typeof result.dismiss === 'undefined') {
                    swal({
                        type: 'success',
                        showConfirmButton: false
                    });

                    // analytics
                    var index = form.closest('div.coursedate').index();
                    if (index === -1) {
                        index = form.closest('tr').index();
                    }

                    A.addToCart(
                        index,
                        form.data('analytics-id'),
                        form.data('analytics-name'),
                        form.data('analytics-price'),
                        form.data('analytics-category'),
                        form.data('analytics-list')
                    );

                    setTimeout(function () {
                        form.submit();
                    }, 100);
                }
            });
        },

        getStartDate: function (options) {
            var url = (Config.get('c') === 'iframe')
                    ? Config.get('current-url') + '&ia=get-start-date&coursedate_id=' + options.course_date_id
                    : '/' + Config.get('c') + '/get-start-date/' + options.course_date_id + '/',
                submitBtn = $('form[data-coursedate-id="' + options.course_date_id + '"]').find('button.rolling-courses'),
                data = {
                    coursedate_id: options.course_date_id,
                    term_duration: options.term_duration,
                    term_days: options.term_days,
                    term_weeks: options.term_weeks
                };

            submitBtn.attr('disabled', true);

            if (options.return_text) {
                return $.ajax({
                    url: url,
                    type: "GET",
                    data: data,
                    async: false
                });
            } else {
                $.ajax({
                    url: url,
                    type: "GET",
                    data: data,
                    success: function (res) {
                        if (res.error === false) {
                            swal({
                                type: 'question',
                                title: Language.get('question'),
                                html: res.text,
                                showConfirmButton: true,
                                showCancelButton: res.terms > 1,
                                showCloseButton: false,
                                focusConfirm: true,
                                focusCancel: false,
                                allowOutsideClick: false,
                                confirmButtonText: Language.get('select_term'),
                                cancelButtonText: Language.get('change_term')
                            }).then(function (result) {
                                if (result.value) {
                                    $('#' + prefix + '_start_' + options.course_date_id).val(res.start);
                                    $('#' + prefix + '_end_' + options.course_date_id).val(res.end);
                                    $('[data-coursedate-id="' + options.course_date_id + '"]').removeClass('selected');
                                } else {
                                    $('[data-coursedate-id="' + options.course_date_id + '"]').click();
                                }

                                submitBtn.attr('disabled', false);
                            });
                        } else {
                            swal(
                                Language.get('error_title'),
                                res.error,
                                'error'
                            )
                        }
                    }
                });
            }
        },

        getTerms: function (courseDateId) {
            var btnTxt = $('.termTxt_' + courseDateId),
                url = (Config.get('c') === 'iframe')
                    ? Config.get('current-url') + '&ia=get_terms'
                    : '/' + Config.get('c') + '/get-terms/';

            // $(this).tooltip('hide');

            Custom.blockUI({
                target: $('body')
            });

            $.ajax({
                url: url,
                data: {
                    course_date_id: courseDateId
                },
                type: "GET",
                success: function (res) {
                    var confirmModal =
                        $('<div id="termModal" class="modal fade" tabindex="-1" role="basic" aria-hidden="true">' +
                            '<div class="modal-dialog">' +
                            '<div class="modal-content">' +
                            '<div class="modal-header">' +
                            '<button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>' +
                            '<h4 class="modal-title"><strong>' + Language.get('terms') + '</strong></h4>' +
                            '<div class="modal-body">' + res + '</div>' +
                            '<div class="modal-footer">' +
                            '<button type="button" class="btn default" data-dismiss="modal">' + Language.get('close') + '</button>' +
                            '</div>' +
                            '</div>' +
                            '</div>' +
                            '</div>' +
                            '</div>');

                    Custom.unblockUI($('body'));

                    if ($('#termModal').length) $('#termModal').remove();
                    if ($('.modal-backdrop').length) $('.modal-backdrop').remove();

                    $('.submitTerm', confirmModal).unbind('click').on('click', function () {
                        var termId = $(this).data('id'),
                            termName = $(this).data('name'),
                            termPrice = $(this).data('price'),
                            termDuration = $(this).data('duration'),
                            termDays = $(this).data('days'),
                            termWeeks = $(this).data('weeks'),
                            hasAutoCheckIn = $(this).data('has-auto-check-in'),
                            tax_hint = $('#' + prefix + '_term_' + courseDateId).data('tax_hint'),
                            type = $('#' + prefix + '_type_' + courseDateId).val();

                        btnTxt.text(termName).removeClass('selected');

                        $('#' + prefix + '_term_' + courseDateId).val(termId);
                        $('#' + prefix + '_term_duration_' + courseDateId).val(termDuration);
                        $('#' + prefix + '_term_days_' + courseDateId).val(termDays);
                        $('#' + prefix + '_term_auto_checkin_' + courseDateId).val(hasAutoCheckIn);
                        $('#' + prefix + '_term_weeks_' + courseDateId).val(termWeeks);
                        $('#' + prefix + '_price_' + courseDateId).html(termPrice + (prefix === 'm' ? '<small class="tax font-xs text-muted">' + tax_hint + '</small>' : '<sup class="text-muted">' + tax_hint + '</sup>'));

                        confirmModal.modal('hide');

                        if ($(this).data('has-auto-check-in') && type !== 'waiting_list') {
                            Courses.getStartDate({
                                'course_date_id': courseDateId,
                                'term_duration': termDuration,
                                'term_days': termDays,
                                'term_weeks': termWeeks
                            })
                        }
                    });

                    if (window.hasOwnProperty('offsetScroll')) {
                        confirmModal.on('show.bs.modal', function () {
                            $(this).css('padding-top', window.offsetScroll + 'px');
                        });
                    }

                    confirmModal.modal('show');
                }
            });
        }
    };

}();