/*!
 * common-mask.js
 * prerequisite:
 *   - jQuery loaded
 *   - global alias $j already defined outside
 */
(function (window) {
    'use strict';

    if (!window.$j) {
        throw new Error('$j is required for common-mask.js');
    }

    var CommonMask = {
        printMasking: true,
        closeAfterPrint: false,
        closeDelay: 0,
        printEventBound: false,

        initPrintEvents: function () {
            if (CommonMask.printEventBound) {
                return;
            }

            var beforeHandler = function () {
                if (CommonMask.printMasking) {
                    CommonMask.applyMasking();
                } else {
                    CommonMask.restoreOriginal();
                }
            };

            var afterHandler = function () {
                CommonMask.restoreOriginal();

                if (CommonMask.closeAfterPrint) {
                    window.setTimeout(function () {
                        try {
                            window.close();
                        } catch (e) {
                        }
                    }, CommonMask.closeDelay);
                }
            };

            if (window.addEventListener) {
                window.addEventListener('beforeprint', beforeHandler);
                window.addEventListener('afterprint', afterHandler);
            } else {
                window.onbeforeprint = beforeHandler;
                window.onafterprint = afterHandler;
            }

            CommonMask.printEventBound = true;
        },

        setPrintMasking: function (flag) {
            CommonMask.printMasking = !!flag;
        },

        setCloseAfterPrint: function (flag, delay) {
            CommonMask.closeAfterPrint = !!flag;
            CommonMask.closeDelay = typeof delay === 'number' ? delay : 0;
        },

        nvl: function (val) {
            return val == null ? '' : String(val);
        },

        trim: function (val) {
            return CommonMask.nvl(val).replace(/^\s+|\s+$/g, '');
        },

        onlyNumber: function (val) {
            return CommonMask.nvl(val).replace(/[^0-9]/g, '');
        },

        repeatMask: function (len) {
            len = parseInt(len, 10) || 0;
            return new Array(len + 1).join('*');
        },

        maskName: function (val) {
            val = CommonMask.trim(val);
            if (!val) return '';

            if (val.length === 1) return val;
            
            return val.substring(0, 1) + CommonMask.repeatMask(val.length - 1);
        },

        maskPhone: function (val) {
            var num = CommonMask.onlyNumber(val);
            if (!num) return '';

            if (num.length === 11) {
                return num.substring(0, 3) + '-****-' + num.substring(7);
            }

            if (num.length === 10) {
                if (num.substring(0, 2) === '02') {
                    return num.substring(0, 2) + '-***-' + num.substring(6);
                }
                return num.substring(0, 3) + '-***-' + num.substring(6);
            }

            if (num.length === 9 && num.substring(0, 2) === '02') {
                return num.substring(0, 2) + '-***-' + num.substring(5);
            }

            return CommonMask.nvl(val);
        },

        maskBirth: function (val) {
            var num = CommonMask.onlyNumber(val);
            if (num.length !== 8) return CommonMask.nvl(val);

            return num.substring(0, 2) + '**-**-**';
        },

        maskRrn: function (val) {
            var num = CommonMask.onlyNumber(val);
            if (num.length !== 13) return CommonMask.nvl(val);

            return num.substring(0, 6) + '-' + num.substring(6, 7) + '******';
        },

        maskEmail: function (val) {
            val = CommonMask.trim(val);
            if (!val || val.indexOf('@') < 0) return val;

            var arr = val.split('@');
            var id = arr[0];
            var domain = arr.slice(1).join('@');

            if (id.length <= 1) return '*' + '@' + domain;
            if (id.length === 2) return id.substring(0, 1) + '*' + '@' + domain;

            return id.substring(0, 2)
                + CommonMask.repeatMask(id.length - 2)
                + '@' + domain;
        },

        maskValue: function (type, val) {
            type = CommonMask.nvl(type).toUpperCase();

            switch (type) {
                case 'NAME':
                    return CommonMask.maskName(val);
                case 'PHONE':
                case 'TEL':
                case 'MOBILE':
                    return CommonMask.maskPhone(val);
                case 'BIRTH':
                case 'BIRTHDAY':
                    return CommonMask.maskBirth(val);
                case 'RRN':
                case 'JUMIN':
                    return CommonMask.maskRrn(val);
                case 'EMAIL':
                    return CommonMask.maskEmail(val);
                default:
                    return CommonMask.nvl(val);
            }
        },

        applyMasking: function (selector) {
            var target = selector || '.pii';

            window.$j(target).each(function () {
                var $el = window.$j(this);
                var raw = $el.attr('data-raw');
                var type = $el.attr('data-mask-type');

                if (typeof raw === 'undefined' || raw === null) {
                    raw = $el.text();
                    $el.attr('data-raw', raw);
                }

                $el.text(CommonMask.maskValue(type, raw));
            });
        },

        restoreOriginal: function (selector) {
            var target = selector || '.pii';

            window.$j(target).each(function () {
                var $el = window.$j(this);
                var raw = $el.attr('data-raw');

                if (typeof raw !== 'undefined' && raw !== null) {
                    $el.text(raw);
                }
            });
        },

        print: function (masking, closeAfterPrint) {
            if (typeof masking !== 'undefined') {
                CommonMask.setPrintMasking(masking);
            }

            if (typeof closeAfterPrint !== 'undefined') {
                CommonMask.setCloseAfterPrint(closeAfterPrint);
            }

            window.print();
        },

        bindPrintButtons: function (options) {
            var config = window.$j.extend({
                printBtn: '#btnDoPrint',
                closeBtn: '#btnClose',
                optionLayer: '#printOptionLayer',
                radioName: 'printMaskOption',
                closeMode: 'window',
                autoCloseAfterPrint: true,
                autoCloseDelay: 0
            }, options || {});

            CommonMask.setCloseAfterPrint(config.autoCloseAfterPrint, config.autoCloseDelay);

            window.$j(config.printBtn).off('click.commonMask').on('click.commonMask', function () {
                var maskYn = window.$j('input[name="' + config.radioName + '"]:checked').val();
                CommonMask.setPrintMasking(maskYn === 'Y');
                window.$j(config.optionLayer).hide();
                window.print();
            });

            window.$j(config.closeBtn).off('click.commonMask').on('click.commonMask', function () {
                if (config.closeMode === 'window') {
                    window.close();
                } else {
                    window.$j(config.optionLayer).hide();
                }
            });
        }
    };

    window.CommonMask = CommonMask;

})(window);