/**
 * Created by Patrick on 23.09.2016.
 */
var Coupons = function () {

    var handelCustomPrice = function () {
        $('.coupon-input').keyup(function () {
            var form = $(this).closest('form'),
                val = $(this).val().replace(/[^\.^,\d]/g, '').replace('.', '').replace(',', '');
            $(this).val(val);

            form.data('analytics-price', val);

        });
    };

    var handleBuyWizard = function () {

        if (!jQuery().bootstrapWizard) {
            return;
        }

        function format(state) {
            if (!state.id) return state.text; // optgroup
            return Config.get('base-url') + '<img class="flag" src="' + Config.get('template-url') + '/images/flags/.png"/>&nbsp;&nbsp;' + state.id.toLowerCase() + '' + state.text;
        }

        $("#country_list").select2({
            placeholder: "Select",
            allowClear: true,
            formatResult: format,
            formatSelection: format,
            escapeMarkup: function (m) {
                return m;
            }
        });

        var buy_form = $('#buy_form');
        var error = $('.alert-danger', buy_form);
        var success = $('.alert-success', buy_form);

        buy_form.validate({
            doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
            errorElement: 'span', //default input error message container
            errorClass: 'help-block', // default input error message class
            focusInvalid: false, // do not focus the last invalid input
            rules: {

                //account
                "user[account]": {
                    required: true
                },
                //profile
                "user[salutation]": {
                    required: true
                },
                "user[first_name]": {
                    required: true
                },
                "user[name]": {
                    required: true
                },
                "user[email]": {
                    required: true,
                    email: true
                },
                "user[street]": {
                    required: true
                },
                "user[house_no]": {
                    required: true,
                    minlength: 1
                },
                "user[zip]": {
                    required: true,
                    minlength: 5
                },
                "user[city]": {
                    required: true
                },
                "user[country]": {
                    required: true
                },
                owner: {
                    required: true
                },
                privacy: {
                    required: true
                },
                //payment
                payment: {
                    required: true
                },
                terms: {
                    required: true
                }

            },

            messages: { // custom messages for radio buttons and checkboxes
                "user[account]": {
                    required: Language.get('no_item_select')
                },
                privacy: {
                    required: Language.get('check_privacy')
                },
                payment: {
                    required: Language.get('no_item_select')
                },
                terms: {
                    required: Language.get('check_terms')
                }
            },

            errorPlacement: function (error, element) {
                if (element.attr("name") == "user[account]") {
                    $('#account_error').html(error);
                } else if (element.attr("name") == "payment") {
                    $('#payment_error').html(error);
                } else if (element.val() == "2010-01-01") {
                    $('#child_birthday_error').html(error);
                } else if (element.attr("name") == "privacy") {
                    $('#privacy_error').html(error);
                } else if (element.attr("name") == "terms") {
                    $('#terms_error').html(error);
                } else {
                    error.insertAfter(element);
                }
            },

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

            highlight: function (element) { // hightlight error inputs
                $(element)
                    .closest('.form-group').removeClass('has-success').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) {
                if (label.attr("for") == "gender" || label.attr("for") == "payment[]") { // for checkboxes and radio buttons, no need to show OK icon
                    label
                        .closest('.form-group').removeClass('has-error').addClass('has-success');
                    label.remove(); // remove error label here
                } else { // display success icon for other inputs
                    label
                        .addClass('valid') // mark the current input as valid and display OK icon
                        .closest('.form-group').removeClass('has-error').addClass('has-success'); // set success class to the control group
                }
            },

            submitHandler: function (form) {
                success.removeClass('disply-hide');
                error.addClass('disply-hide');
            }

        });

        var displayConfirm = function () {

            $('#tab5 .form-control-static', buy_form).each(function () {

                var input = $('[name="' + $(this).attr("data-display") + '"]', buy_form);

                if (input.is(":hidden") && $(this).attr("data-display") == 'coupon_price') {
                    $(this).html(Coupons.convertToPrice(input.val()));
                }
                if (input.is(":radio")) {
                    input = $('[name="' + $(this).attr("data-display") + '"]:checked', buy_form);
                }
                if (input.is(":text") || input.is("textarea")) {
                    $(this).html(input.val().replace(/_/g, ''));
                } else if (input.is("select")) {
                    $(this).html(input.find('option:selected').text());
                } else if (input.is(":radio") && input.is(":checked")) {
                    if (input.val() == 'cash') {
                        $('#invoice, #sofort, #external').addClass('display-hide');
                        $('#cash').removeClass('display-hide');
                    } else if (input.val() == 'invoice') {
                        $('#cash, #sofort, #external').addClass('display-hide');
                        $('#invoice').removeClass('display-hide');
                    } else if (input.val() == 'sofort') {
                        $('#cash, #invoice, #external').addClass('display-hide');
                        $('#sofort').removeClass('display-hide');
                    } else if (input.val() == 'external') {
                        $('#cash, #invoice, #sofort').addClass('display-hide');
                        $('#external').removeClass('display-hide');
                    } else {
                        $(this).html(input.attr("data-title"));
                    }
                }

            });
        };

        var handleTitle = function (tab, navigation, index) {
            var total = navigation.find('li').length;
            var current = index + 1;

            // set wizard title
            $('.step-title', $('#form_wizard_1')).text(Language.get('step') + ' ' + (index + 1) + ' ' + Language.get('of') + ' ' + total);
            // set done steps
            jQuery('li', $('#form_wizard_1')).removeClass("done");
            var li_list = navigation.find('li');
            for (var i = 0; i < index; i++) {
                jQuery(li_list[i]).addClass("done");
            }

            if (current == 1) {
                $('#form_wizard_1').find('.button-previous').hide();
            } else {
                $('#form_wizard_1').find('.button-previous').show();
            }

            if (current >= total) {
                $('#form_wizard_1').find('.button-next').hide();
                $('#form_wizard_1').find('.button-submit').show();
                displayConfirm();
            } else {
                $('#form_wizard_1').find('.button-next').show();
                $('#form_wizard_1').find('.button-submit').hide();
            }
            App.scrollTop();
        };

        // default form wizard
        $('#form_wizard_1').bootstrapWizard({
            'nextSelector': '.button-next',
            'previousSelector': '.button-previous',
            onTabClick: function (tab, navigation, index, clickedIndex) {
                return false;

                //success.addClass('display-hide');
                //error.addClass('display-hide');
                //if (buy_form.valid() == false) {
                //    return false;
                //}
                //handleTitle(tab, navigation, clickedIndex);
            },
            onNext: function (tab, navigation, index) {
                success.addClass('display-hide');
                error.addClass('display-hide');

                if (buy_form.valid() == false) {
                    return false;
                }

                handleTitle(tab, navigation, index);
            },
            onPrevious: function (tab, navigation, index) {
                success.addClass('display-hide');
                error.addClass('display-hide');

                handleTitle(tab, navigation, index);
            },
            onTabShow: function (tab, navigation, index) {
                var total = navigation.find('li').length;
                var current = index + 1;
                var $percent = (current / total) * 100;
                handleTitle(tab, navigation, index);
                $('#form_wizard_1').find('.progress-bar').css({
                    width: $percent + '%'
                });
            }
        });

        $('#form_wizard_1').find('.button-previous').hide();
        $('#form_wizard_1 .button-submit').click(function () {
            document.buy.submit()
        }).hide();

        // New Account
        $('input[name="user[account]"]').on('change', function () {

            var value = $(this).val();

            if (value == 'register') {
                $('.new_password').removeClass('display-hide');
                $('input[name="user[password]"]').rules("add", {required: true, minlength: 5});
                $('input[name="user[rpassword]"]').rules("add", {required: true, equalTo: "#password", minlength: 5});
                $('input[name="user[email]"]').rules("remove");
                $('input[name="user[email]"]').rules("add", {
                    required: true,
                    email: true,
                    remote: Config.get('base-url') + "/coupons/check_email/0/",
                    messages: {
                        required: Language.get('enter_valid_url'),
                        remote: Language.get('check_email_double')
                    }
                });
            } else {
                $('.new_password').addClass('display-hide');
                $('input[name="user[password]"]').rules("remove");
                $('input[name="user[rpassword]"]').rules("remove");
                $('input[name="user[email]"]').rules("remove");
                $('input[name="user[email]"]').rules("add", {
                    required: true,
                    email: true,
                    messages: {
                        required: Language.get('enter_valid_url')
                    }
                });
            }

        });

        // Login
        $('#login').on('click', function () {

            var email = $('#email-login').val(),
                password = $('#password-login').val();

            Custom.blockUI({
                target: $('#body'),
                boxed: true,
                iconOnly: true
            });

            $.ajax({
                type: 'POST',
                url: Config.get('base-url') + '/account/login/',
                data: {email: email, password: password, ajax: 'true'},
                success: function (c) {
                    Custom.unblockUI($('#body'));
                    if (c == 'done') {
                        window.location.reload();
                        $('input[name="user[account]"]').rules("remove");
                    } else if (c == 'error') {
                        Custom.alert('E-Mail oder Passwort sind falsch!');
                        $('#email-login').val('');
                        $('#password-login').val('');
                    }
                }
            });

        });

        // Format Client Birthday
        $("#birthday").combodate({
            customClass: "form-control",
            format: 'YYYY-MM-DD',
            template: 'D MMM YYYY',
            minYear: 1920,
            maxYear: new Date().getFullYear()
        });

        // Mask some Fields
        $.mask.definitions['~'] = '([0-9] )?';
        $("#phone, #fax").mask("(099~~) 999~~~~~~~");
        $("#zip").mask("99999");
        $("#mobile").mask("(0999) 999999~~");

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

    var handleSubmitButton = function () {
        $('button.buy-coupon').attr('type', 'button')
            .click(function () {
                var form = $(this).closest('form'),
                    index = $(this).closest('.coupon-wrapper').index() + 1;

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

    var handleIframeLinks = function () {
        if (Config.get('c') === 'iframe') {
            var IframeCheck = setInterval(function () {
                if (window.iframe_referer) {
                    clearInterval(IframeCheck);
                    $('input.redirectUrl').val(window.iframe_referer);
                }
            }, 500);
        }
    };

    return {
        //main function to initiate the module
        init: function () {
            handelCustomPrice();
            handleSubmitButton();
            handleIframeLinks();
        },
        convertToPrice: function (number) {
            if (number) {
                return Coupons.roundup(number, 2) + ' EUR';
            }
        },
        roundup: function (num, dec) {
            dec = dec || 0;
            var s = String(num);
            if (num % 1) s = s.replace(/5$/, '6');
            return Number((+s).toFixed(dec));
        }
    };
}();