﻿(function ($) {
    try {
        /**
         * datepicker
         */
        $.fn.datepicker.dates["zh-CN"] = {
            days: [
                "星期日",
                "星期一",
                "星期二",
                "星期三",
                "星期四",
                "星期五",
                "星期六"
            ],
            daysShort: [
                "周日",
                "周一",
                "周二",
                "周三",
                "周四",
                "周五",
                "周六"
            ],
            daysMin: [
                "日",
                "一",
                "二",
                "三",
                "四",
                "五",
                "六"
            ],
            months: [
                "一月",
                "二月",
                "三月",
                "四月",
                "五月",
                "六月",
                "七月",
                "八月",
                "九月",
                "十月",
                "十一月",
                "十二月"
            ],
            monthsShort: [
                "1月",
                "2月",
                "3月",
                "4月",
                "5月",
                "6月",
                "7月",
                "8月",
                "9月",
                "10月",
                "11月",
                "12月"
            ],
            today: "今日",
            clear: "清除",
            format: "yyyy年mm月dd日",
            titleFormat: "yyyy年mm月",
            weekStart: 1
        }
    } catch (error) { }

    try {
        /**
         * datetimepicker
         */
        $.fn.datetimepicker.dates['zh-CN'] = {
            days: [
                "星期日",
                "星期一",
                "星期二",
                "星期三",
                "星期四",
                "星期五",
                "星期六",
                "星期日"
            ],
            daysShort: [
                "周日",
                "周一",
                "周二",
                "周三",
                "周四",
                "周五",
                "周六",
                "周日"
            ],
            daysMin: [
                "日",
                "一",
                "二",
                "三",
                "四",
                "五",
                "六",
                "日"
            ],
            months: [
                "一月",
                "二月",
                "三月",
                "四月",
                "五月",
                "六月",
                "七月",
                "八月",
                "九月",
                "十月",
                "十一月",
                "十二月"
            ],
            monthsShort: [
                "一月",
                "二月",
                "三月",
                "四月",
                "五月",
                "六月",
                "七月",
                "八月",
                "九月",
                "十月",
                "十一月",
                "十二月"
            ],
            today: "今天",
            clear: "清除",
            suffix: [],
            meridiem: ["上午", "下午"]
        };

    } catch (error) { }

    try {
        /**
         * daterangepicker
         */
        $.fn.daterangepicker.defaults = {
            buttonClasses: "m-btn btn m-btn--air",
            applyClass: "btn-primary m-btn--air",
            cancelClass: "btn-secondary m-btn--air",
            startDate: moment().subtract(29, "days"),
            endDate: moment(),
            ranges: {
                "今天": [
                    moment(), moment()
                ],
                "昨天": [
                    moment().subtract(1, "days"),
                    moment().subtract(1, "days")
                ],
                "最近7日": [
                    moment().subtract(6, "days"),
                    moment()
                ],
                "最近30日": [
                    moment().subtract(29, "days"),
                    moment()
                ],
                "本月": [
                    moment().startOf("month"),
                    moment().endOf("month")
                ],
                "上个月": [
                    moment()
                        .subtract(1, "month")
                        .startOf("month"),
                    moment()
                        .subtract(1, "month")
                        .endOf("month")
                ]
            },
            locale: {
                format: 'YYYY-MM-DD',
                applyLabel: '确定',
                cancelLabel: '取消',
                fromLabel: '起始时间',
                toLabel: '结束时间',
                customRangeLabel: '自定义',
                daysOfWeek: [
                    '日',
                    '一',
                    '二',
                    '三',
                    '四',
                    '五',
                    '六'
                ],
                monthNames: [
                    '一月',
                    '二月',
                    '三月',
                    '四月',
                    '五月',
                    '六月',
                    '七月',
                    '八月',
                    '九月',
                    '十月',
                    '十一月',
                    '十二月'
                ],
                firstDay: 1
            },
            selectedCallback: function (a, t, n) { }
        };
    } catch (error) { }

    try {
        /**
         * csummernote
         */
        $.fn.summernote.defaults = {
            lang: 'zh-CN',
            height: 300,
            toolbar: [
                [
                    'style', ['bold', 'italic', 'underline', 'clear']
                ],
                [
                    'font', ['strikethrough', 'superscript', 'subscript']
                ],
                ['fontname', ['fontname']],
                [
                    'fontsize', ['fontsize', 'height', 'color']
                ],
                ['table', ['table']],
                [
                    'para', ['ul', 'ol', 'paragraph']
                ],
                [
                    'insert', ['link', 'picture', 'video']
                ],
                [
                    'misc', ['undo', 'redo', 'codeview', 'fullscreen']
                ]
            ],
            custom: {
                editor: {
                    class: null
                },
                fullscreen: {
                    target: null,
                    isNew: false,
                    newWindow: false,
                    fullscreen: false
                },
                callbacks: {
                    onInit: function (el) { },
                    onFocus: function (el) { },
                    onBlur: function () { },
                    onKeyup: function () { },
                    onKeydown: function () { },
                    onEnter: function () { },
                    onPaste: function () { },
                    onChange: function (el) { },
                    onFullscreen: function () { },
                    onResize: function () { },
                    onNormal: function () { }
                }
            },
            disableDragAndDrop: true
        };
    } catch (error) { }

    try {
        /**
         * summernote.lang
         */
        $.extend($.summernote.lang, {
            'zh-CN': {
                font: {
                    bold: '粗体',
                    italic: '斜体',
                    underline: '下划线',
                    clear: '清除格式',
                    height: '行高',
                    name: '字体',
                    strikethrough: '删除线',
                    subscript: '下标',
                    superscript: '上标',
                    size: '字号'
                },
                image: {
                    image: '图片',
                    insert: '插入图片',
                    resizeFull: '缩放至 100%',
                    resizeHalf: '缩放至 50%',
                    resizeQuarter: '缩放至 25%',
                    floatLeft: '靠左浮动',
                    floatRight: '靠右浮动',
                    floatNone: '取消浮动',
                    shapeRounded: '形状: 圆角',
                    shapeCircle: '形状: 圆',
                    shapeThumbnail: '形状: 缩略图',
                    shapeNone: '形状: 无',
                    dragImageHere: '将图片拖拽至此处',
                    selectFromFiles: '从本地上传',
                    maximumFileSize: '文件大小最大值',
                    maximumFileSizeError: '文件大小超出最大值。',
                    url: '图片地址',
                    remove: '移除图片'
                },
                video: {
                    video: '视频',
                    videoLink: '视频链接',
                    insert: '插入视频',
                    url: '视频地址',
                    providers: '(优酷, Instagram, DailyMotion, Youtube等)'
                },
                link: {
                    link: '链接',
                    insert: '插入链接',
                    unlink: '去除链接',
                    edit: '编辑链接',
                    textToDisplay: '显示文本',
                    url: '链接地址',
                    openInNewWindow: '在新窗口打开'
                },
                table: {
                    table: '表格'
                },
                hr: {
                    insert: '水平线'
                },
                style: {
                    style: '样式',
                    normal: '普通',
                    blockquote: '引用',
                    pre: '代码',
                    h1: '标题 1',
                    h2: '标题 2',
                    h3: '标题 3',
                    h4: '标题 4',
                    h5: '标题 5',
                    h6: '标题 6'
                },
                lists: {
                    unordered: '无序列表',
                    ordered: '有序列表'
                },
                options: {
                    help: '帮助',
                    fullscreen: '全屏',
                    codeview: '源代码'
                },
                paragraph: {
                    paragraph: '段落',
                    outdent: '减少缩进',
                    indent: '增加缩进',
                    left: '左对齐',
                    center: '居中对齐',
                    right: '右对齐',
                    justify: '两端对齐'
                },
                color: {
                    recent: '最近使用',
                    more: '更多',
                    background: '背景',
                    foreground: '前景',
                    transparent: '透明',
                    setTransparent: '透明',
                    reset: '重置',
                    resetToDefault: '默认'
                },
                shortcut: {
                    shortcuts: '快捷键',
                    close: '关闭',
                    textFormatting: '文本格式',
                    action: '动作',
                    paragraphFormatting: '段落格式',
                    documentStyle: '文档样式',
                    extraKeys: '额外按键'
                },
                history: {
                    undo: '撤销',
                    redo: '重做'
                }
            }
        });
    } catch (error) { }

}(jQuery));

/**
 * change Config
 */
var changeConfig = {
    host: '',
};

/**
 * 常用工具类
 */
var changeUtil = function () {
    /**
     * 判断一个元素是否是jQuery对象
     * @param {jQuery} element 待判断的jQuery对象
     * @returns {bool} 是true，否false
     */
    var isjQueryElement = function (element) {
        return element && element instanceof jQuery;
    };

    /**
     * 判断一个元素是否是HTMLElement对象
     * @param {HTMLElement} element 待判断的HTMLElement对象
     * @returns {bool} 是true，否false
     */
    var isHTMLElement = function (element) {
        return element && element instanceof HTMLElement;
    };

    /**
     * 获取标签所有属性
     * @param {object} self this
     */
    var getAttributes = function (self) {
        var attributes = {};
        try {
            $.each(self.attributes, function () {
                if (this.specified) {
                    attributes[this.name] = this.value;
                }
            });
        } catch (error) {
            console.error(error);
        }
        return attributes;
    };

    /**
     * 获取id唯一值
     * @param {string} prefix id前缀，可为空
     * @returns {string} 返回string类型id
     */
    var getUniqueID = function (prefix) {
        prefix = trimAll(prefix);
        return prefix + Math.floor(Math.random() * (new Date()).getTime());
    };

    /**
     * 根据父元素的名称获取父元素
     * @param {jQuery} element 要循环找到父元素的子元素，jQuery对象
     * @param {string} parentClassName 父元素含有的类名
     * @param {int} cycleCount 最多循环的次数，默认10次
     * @returns {jQuery} 返回查询的结果，在规定的循环次数下，找不到相应的父元素返回本身element
     */
    var getParentByClassName = function (element, parentClassName, cycleCount) {
        if (!isjQueryElement(element)) {
            return element;
        }
        parentClassName = trim(parentClassName);
        cycleCount = getInt(cycleCount);
        if (cycleCount < 1) {
            cycleCount = 10;
        }
        var parentEl = element.parent();
        for (var index = 0; index < cycleCount; index++) {
            if (parentEl.hasClass(parentClassName)) {
                return parentEl;
            }
            parentEl = parentEl.parent();
        }
        return parentEl.hasClass(parentClassName) ?
            parentEl :
            element;
    }

    /**
     * 去除文本两端空格
     * @param {string} text 待处理的文本
     * @returns {string} 返回去除两端空格之后的文本
     */
    var trim = function (text) {
        if (typeof text !== 'string') {
            return '';
        }
        return $.trim(text);
    };

    /**
     * 去除文本所有空格
     * @param {string} text 待处理的文本
     * @returns {string} 返回去除所有空格之后的文本
     */
    var trimAll = function (text) {
        if (typeof text !== 'string') {
            return '';
        }
        text = text.replace(/\s+/g, "");
        return text;
    };

    /**
     * 去除开头文本
     * @param {string} text 待处理文本
     * @param {string} searchvalue 待去除开头文本，默认为空
     */
    var trimStart = function (text, searchvalue) {
        if (typeof text !== "string") {
            return "";
        }
        text = changeUtil.trim(text);
        if (changeUtil.trim(searchvalue) === '') {
            var text = text.trimStart();
            return text;
        } else {
            var regExp = new RegExp("^" + searchvalue + "*");
            var text = text.replace(regExp, '');
            return text;
        }
    };

    /**
     * 去除结尾文本
     * @param {string} text 待处理文本
     * @param {string} searchvalue 待去除结尾文本，默认为空
     */
    var trimEnd = function (text, searchvalue) {
        if (typeof text !== "string") {
            return "";
        }
        text = changeUtil.trim(text);
        if (changeUtil.trim(searchvalue) === '') {
            return text.trimEnd();
        } else {
            var regExp = new RegExp(searchvalue);
            var length = text.length;
            while (regExp.test(text.charAt(--length)));
            return text.slice(0, length + 1);
        }
    };

    /**
     * 获取int类型值， 默认返回0
     * @param {object} text 代转换的int的值
     * @returns {int} 返回int类型的值
     */
    var getInt = function (text) {
        var value = parseInt(text);
        return isNaN(value) ?
            0 :
            value;
    };

    /**
     * 获取float类型值， 默认返回0
     * @param {object} text 代转换的float的值
     * @returns {float} 返回float类型的值
     */
    var getFloat = function (text) {
        var value = parseFloat(text);
        return isNaN(value) ?
            0 :
            value;
    };

    /**
     * 将两个对象合并成一个对象
     * @param {object} options1 对象1
     * @param {object} options2 对象2
     * @returns {object} 返回合并之后的新对象
     */
    var mix = function (options1, options2) {
        options1 = options1 || {};
        options2 = options2 || {};
        return $.extend(true, {}, options1, options2);
    };

    /**
     * array 数组帮助类
     */
    var array = (function () {
        /**
         * 判断数组中是否含有某个值
         * @param {Array} array 待判断的数组
         * @param {object} val 待比较的值
         * @returns {bool} 存在true，否则false
         */
        var hasValue = function (array, val) {
            if (!array || !val) {
                return false;
            }
            if (!$.isArray(array) || array.length === 0) {
                return false;
            }
            for (var index = 0; index < array.length; index++) {
                var value = array[index];
                if (value === val) {
                    return true;
                }
            }
            return false;
        };

        /**
         * 移除数组元素（注意： 1. 值相同的元素会被全部移除； 2. 赋值式移除）
         * @param {Array} array 待移除数据的数组
         * @param {object/Array} val 待移除的值或者数组
         * @returns {Array} 返回移除数值之后的数组
         */
        var removeValue = function (array, val) {
            if (!array || !val) {
                return array;
            }
            if (!$.isArray(array) || array.length === 0) {
                return array;
            }
            var temp = [];
            for (var index = 0; index < array.length; index++) {
                var value = array[index];
                if ($.isArray(val)) {
                    if (!hasValue(val, value)) {
                        temp.push(value);
                    }
                } else {
                    if (value !== val) {
                        temp.push(value);
                    }
                }
            }
            return temp;
        };

        /**
         * 添加数组元素(注意： 1. 不存在的push； 2. 赋值式push)
         * @param {Array} array 待添加数值的数组
         * @param {object/Array} val 待添加的值或者数组
         * @returns {Array} 返回添加数值之后的数组
         */
        var pushValue = function (array, val) {
            array = array || [];
            if (!$.isArray(array) || !val) {
                return array;
            }
            if ($.isArray(val)) {
                for (var index = 0; index < val.length; index++) {
                    var value = val[index];
                    if (!hasValue(array, value)) {
                        array.push(value);
                    }
                }
            } else {
                if (!hasValue(array, val)) {
                    array.push(val);
                }
            }
            return array;
        };

        /**
         * 获取数组最小值
         * @param {Array} array 待处理数组
         * @returns {object} 返回最小值
         */
        var getMinValue = function (array) {
            if (!array || !$.isArray(array)) {
                return null;
            }
            var value = Math.min.apply(null, array);
            return value;
        };

        /**
         * 获取数组最大值
         * @param {Array} array 待处理数组
         * @returns {object} 返回最大值
         */
        var getMaxValue = function (array) {
            if (!array || !$.isArray(array)) {
                return null;
            }
            var value = Math.max.apply(null, array);
            return value;
        };

        /**
         * 判断元素是否是数组
         * @param {Array} array 待处理数组
         * @returns {boolean} 是/否 true/false
         */
        var isArray = function (array) {
            return $.isArray(array);
        };

        return {
            /**
             * 判断数组中是否含有某个值
             */
            hasValue: hasValue,

            /**
             * 移除数组元素（注意： 1. 值相同的元素会被全部移除； 2. 赋值式移除）
             */
            removeValue: removeValue,

            /**
             * 添加数组元素(注意： 1. 不存在的push； 2. 赋值式push)
             */
            pushValue: pushValue,

            /**
             * 获取数组最小值
             */
            getMinValue: getMinValue,

            /**
             * 获取数组最大值
             */
            getMaxValue: getMaxValue,

            /**
             * 判断元素是否是数组
             */
            isArray: isArray
        };
    })();

    /**
     * date 日期帮助类
     */
    var date = (function () {
        /**
         * 日期格式化
         * @param {Date} date 待格式化的日期
         * @param {string} fmt 格式化字符串，默认 yyyy-MM-dd HH:mm:ss
         * @returns {string} 返回格式化之后的字符串
         */
        var format = function (date, fmt) {
            date = getDate(date);
            if (date === null) {
                date = new Date();
            }
            if (typeof fmt !== "string") {
                fmt = "yyyy-MM-dd HH:mm:ss";
            }
            var options = {
                "M+": date.getMonth() + 1, //月份
                "d+": date.getDate(), //日
                "h+": date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, //小时
                "H+": date.getHours(), //小时
                "m+": date.getMinutes(), //分
                "s+": date.getSeconds(), //秒
                "q+": Math.floor((date.getMonth() + 3) / 3), //季度
                S: date.getMilliseconds() //毫秒
            };
            var week = {
                "0": "/u65e5",
                "1": "/u4e00",
                "2": "/u4e8c",
                "3": "/u4e09",
                "4": "/u56db",
                "5": "/u4e94",
                "6": "/u516d"
            };
            if (/(y+)/.test(fmt)) {
                fmt = fmt.replace(
                    RegExp.$1,
                    (date.getFullYear() + "").substr(4 - RegExp.$1.length)
                );
            }
            if (/(E+)/.test(fmt)) {
                fmt = fmt.replace(
                    RegExp.$1,
                    (RegExp.$1.length > 1 ?
                        RegExp.$1.length > 2 ?
                            "/u661f/u671f" :
                            "/u5468" :
                        "") + week[date.getDay() + ""]
                );
            }
            for (var k in options) {
                if (new RegExp("(" + k + ")").test(fmt)) {
                    fmt = fmt.replace(
                        RegExp.$1,
                        RegExp.$1.length === 1 ?
                            options[k] :
                            ("00" + options[k]).substr(("" + options[k]).length)
                    );
                }
            }
            return fmt;
        };

        /**
         * 日期比较（ date1 - date2）
         * @param {Date} date1 日期一
         * @param {Date} date2 日期二
         * @returns {object} 返回 date1-date2 的自定义结果对象
         */
        var diff = function (date1, date2) {
            if (!(date1 instanceof Date)) {
                date1 = new Date();
            }
            if (!(date2 instanceof Date)) {
                date2 = new Date();
            }
            var options = {
                date1: date1,
                date2: date2,
                diff: date1 - date2,
                days: null,
                days: null,
                hours: null,
                minutes: null,
                seconds: null
            };

            var d, h, m, s;
            s = Math.floor(options.diff / 1000);
            m = Math.floor(s / 60);
            s = s % 60;
            h = Math.floor(m / 60);
            m = m % 60;
            d = Math.floor(h / 24);
            h = h % 24;
            options.days = d;
            options.hours = h;
            options.minutes = m;
            options.seconds = s;
            return options;
        };

        /**
         * 将 /date(1534176000000)/ 格式的文本转换成Date
         * @param {string} text 待转换日期的文本（/date(1534176000000)/）
         * @returns {Date} 返回转换之后的日期，默认为当前日期
         */
        var convert = function (text) {
            var date = getDate(text);
            if (date === null) {
                return new Date();
            }
            return date;
        };

        /**
         * 是否是有效日期
         * @param {Date} date 待判读日期
         */
        var isValidDate = function (date) {
            return date instanceof Date && !isNaN(date.getTime())
        };

        /**
         * 添加月
         * @param {Date} date 原日期
         * @param {int} month 整数值/月
         */
        var addMonth = function (date, month) {
            if (!isValidDate(date)) {
                date = new Date();
            }
            return new Date(date.setMonth(date.getMonth() + month));
        };

        /**
         * 获取 Date 日期有误则返回null，支持string number /date(1534176000000)/ Date
         */
        var getDate = function (date) {
            if (!isDate(date)) {
                return null;
            }
            if (typeof date === 'string') {
                date = changeUtil.trim(date).toLowerCase();
                if (date.startsWith("/date(")) {
                    date = date.replace(/\/date\((\d+)\)\//, "$1");
                    date = changeUtil.getInt(date);
                    return new Date(date);
                }
                return new Date(date);
            } else if (typeof date === 'number') {
                date = changeUtil.getInt(date);
                return new Date(date);
            }
            return new Date(Date.parse(date));
        };

        /**
         * 判断是否是日期
         */
        var isDate = function (date) {
            if (typeof date === 'undefined' || date === null) {
                return false;
            }
            if (typeof date === 'string') {
                date = changeUtil.trim(date).toLowerCase();
                if (date.startsWith("/date(")) {
                    date = date.replace(/\/date\((\d+)\)\//, "$1");
                    date = changeUtil.getInt(date);
                    return date > 0 && !isNaN(new Date(date));
                }
                return !isNaN(Date.parse(date));
            } else if (typeof date === 'number') {
                date = changeUtil.getInt(date);
                return date > 0 && !isNaN(new Date(date));
            }
            return (date instanceof Date) && !isNaN(date) && !isNaN(Date.parse(date));
        };

        /**
         * 添加天数
         */
        var AddDays = function (dayDate, days) {
            var day = changeUtil.date.convert(dayDate);
            var dayName = changeUtil.date.format(day, 'yyyy-MM-dd');
            day = changeUtil.date.convert(dayName);
            days = changeUtil.getInt(days);

            day = new Date(day.setDate(day.getDate() + days));
            // dayName = changeUtil.date.format(day, 'yyyy-MM-dd');
            // day = changeUtil.date.convert(dayName);
            return day;
        };

        /**
         * 获取星期几
         */
        var getDayOfWeek = function (date, dayOfWeek) {
            date = getDate(date);
            if (date === null) {
                return '';
            }
            dayOfWeek = dayOfWeek || '星期';
            if (typeof dayOfWeek !== "string") {
                dayOfWeek = '星期';
            }
            var days = date.getDay();
            var result = '';
            switch (days) {
                case 1:
                    result = '一';
                    break;
                case 2:
                    result = '二';
                    break;
                case 3:
                    result = '三';
                    break;
                case 4:
                    result = '四';
                    break;
                case 5:
                    result = '五';
                    break;
                case 6:
                    result = '六';
                    break;
                case 0:
                    result = '日';
                    break;
            }

            return result === '' ?
                result : dayOfWeek + result;
        };

        return {
            /**
             * 日期格式化
             */
            format: format,

            /**
             * 日期比较（ date1 - date2）
             */
            diff: diff,

            /**
             * 将 /date(1534176000000)/ 格式的文本转换成Date
             */
            convert: convert,

            /**
             * 是否是有效日期
             */
            isValidDate: isValidDate,

            /**
             * 添加月
             */
            addMonth: addMonth,

            /**
             * 获取 Date 日期有误则返回null，支持string number /date(1534176000000)/ Date
             */
            getDate: getDate,

            /**
             * 判断是否是日期
             */
            isDate: isDate,

            /**
             * 获取星期几
             */
            getDayOfWeek: getDayOfWeek,

            /**
             * 获取星期几
             */
            AddDays: AddDays,
        };
    })();

    /**
     * 获取 html 格式值
     * 例如 <input type="hidden" name="HtmlValue" value="" / >
     * @param {object} options 参数
     * @returns {object} 返回获取值得值
     */
    var getHtmlValue = function (options) {
        /**
         * data-html-value-attribute
         */
        var Options = {
            el: $("form"),
            key: "name",
            query: null, //input
            valueKey: null,
            destroy: false, ///是否销毁el，默认否
            /**
             * 特殊值转换 属性是否下沉
             */
            convertValue_IsSink: false,
            /**
             * 特殊值转换方法 属性是否下沉
             */
            convertFunction_IsSink: false,
            /**
             * 特殊值转换
             */
            convertValue: {
                bool: [],
                int: [],
                float: [],
            },
            /**
             * 特殊值转换方法
             */
            convertFunction: {
                bool: function (model, key) {
                    var value = model[key];
                    if (value === undefined) {
                        return;
                    }
                    // model[key] = changeUtil.trim(value).toLowerCase() === 'true';
                    var _value = changeUtil.trim(value).toLowerCase();
                    model[key] = _value === 'true' || _value === '1';
                },
                int: function (model, key) {
                    var value = model[key];
                    if (value === undefined) {
                        return;
                    }
                    model[key] = changeUtil.getInt(value);
                },
                float: function (model, key) {
                    var value = model[key];
                    if (value === undefined) {
                        return;
                    }
                    model[key] = changeUtil.getFloat(value);
                },
            }
        };

        var Plugin = {
            get: function (options) {
                options = mix(Options, options);
                options.key = trim(options.key);
                options.valueKey = trim(options.valueKey);
                var data = {
                    _cHasHtmlValue: false
                };
                if (!options.el) {
                    return data;
                }
                if (!isjQueryElement(options.el)) {
                    return data;
                }
                options.query = trim(options.query);
                if (options.query === "") {
                    options.query = "[" + options.key + "]";
                }
                var querys = options.el.find(options.query);
                var htmlValueID = getUniqueID("htmlValue_");
                querys.attr("c--htmlvalue-id", htmlValueID);
                var count = 0;
                querys.each(function () {
                    var self = this;
                    var el = $(this);
                    var id = trim(el.attr("id"));
                    var elkey = trim(el.attr(options.key));
                    if (elkey === "") {
                        elkey = id;
                    }
                    if (elkey === "") {
                        return;
                    }
                    var htmlValueAttribute = changeUtil.trim(el.attr('data-html-value-attribute'));
                    if (htmlValueAttribute !== '' && htmlValueAttribute !== options.key) {
                        return;
                    }
                    var tagName = trim(self.tagName).toLowerCase();
                    var type = trim(self.type).toLowerCase();
                    var value = null;
                    var isgroup = trim(el.attr("data-htmlvalue-isgroup")).toLowerCase() === "true";
                    if (isgroup !== true) {
                        if (tagName === "input" && type === "radio") {
                            if (self.checked !== true) {
                                return;
                            }
                        } else if (tagName === "input" && type === "checkbox") {
                            if (self.checked !== true) {
                                return;
                            }
                        }
                        if (options.valueKey !== "") {
                            value = trim(el.attr(options.valueKey));
                        } else {
                            value = trim(el.val());
                        }
                    }

                    count++;
                    if (count == 1) {
                        data._cHasHtmlValue = true;
                    }
                    if (isgroup === true) {
                        var childQuery = trim(el.attr("data-htmlvalue-child-query"));
                        var childKey = trim(el.attr("data-htmlvalue-child-key"));
                        var childValueKey = trim(el.attr("data-htmlvalue-child-valuekey"));
                        data[elkey] = [];
                        el.find(childQuery).each(function () {
                            var _child = $(this);
                            var _childData = getHtmlValue({
                                el: _child,
                                key: childKey,
                                query: null,
                                valueKey: childValueKey,
                                destroy: false,
                                convertValue: options.convertValue_IsSink === true ? options.convertValue : {},
                                convertFunction: options.convertFunction_IsSink === true ? options.convertFunction : {},
                            });
                            if (_childData._cHasHtmlValue === true) {
                                data[elkey].push(_childData);
                            }
                        });

                        return;
                    }
                    var namelength = options.el.find('[c--htmlvalue-id="' + htmlValueID + '"][' + options.key + '="' + elkey + '"]').length;

                    if (type !== "radio" && (namelength > 1 || type === "checkbox")) {
                        if (type === "checkbox") {
                            if (this.checked) {
                                data[elkey] = data[elkey] || [];
                                if (!$.isArray(data[elkey])) {
                                    var temp = data[elkey];
                                    data[elkey] = [];
                                    data[elkey].push(temp);
                                }
                                data[elkey].push(value);
                            }
                        } else {
                            data[elkey] = data[elkey] || [];
                            if (!$.isArray(data[elkey])) {
                                var temp = data[elkey];
                                data[elkey] = [];
                                data[elkey].push(temp);
                            }
                            data[elkey].push(value);
                        }
                    } else if (type === "file") {
                        if (self.files && self.files.length > 0) {
                            if (self.files.length === 1) {
                                data[elkey] = self.files[0];
                            } else {
                                data[elkey] = self.files;
                            }
                        }
                    } else {
                        data[elkey] = value;
                    }
                });
                if (options.destroy && options.destroy === true) {
                    options.el.remove();
                }
                querys.removeAttr("c--htmlvalue-id");
                return Plugin.convertValue(data, options);
            },
            convertValue: function (model, options) {
                if (model._cHasHtmlValue === false || options.convertValue === undefined) {
                    return model;
                }
                ///bool 类型数据转换
                if ($.isArray(options.convertValue.bool) && options.convertValue.bool.length > 0) {
                    var _convertFunction =
                        options.convertFunction !== undefined && $.isFunction(options.convertFunction.bool) ?
                            options.convertFunction.bool : Options.convertFunction.bool;
                    for (var index = 0; index < options.convertValue.bool.length; index++) {
                        try {
                            _convertFunction(model, options.convertValue.bool[index]);
                        } catch (error) {

                        }
                    }
                }
                ///int 类型数据转换
                if ($.isArray(options.convertValue.int) && options.convertValue.int.length > 0) {
                    var _convertFunction =
                        options.convertFunction !== undefined && $.isFunction(options.convertFunction.int) ?
                            options.convertFunction.int : Options.convertFunction.int;

                    for (var index = 0; index < options.convertValue.int.length; index++) {
                        try {
                            var model_key = changeUtil.trim(options.convertValue.int[index]);
                            if (model_key === '' || model[model_key] === undefined || model[model_key] === '') {
                                continue;
                            }
                            _convertFunction(model, model_key);
                        } catch (error) {

                        }
                    }
                }
                ///float 类型数据转换
                if ($.isArray(options.convertValue.float) && options.convertValue.float.length > 0) {
                    var _convertFunction =
                        options.convertFunction !== undefined && $.isFunction(options.convertFunction.float) ?
                            options.convertFunction.float : Options.convertFunction.float;

                    for (var index = 0; index < options.convertValue.float.length; index++) {
                        try {
                            var model_key = changeUtil.trim(options.convertValue.float[index]);
                            if (model_key === '' || model[model_key] === undefined || model[model_key] === '') {
                                continue;
                            }
                            _convertFunction(model, model_key);
                        } catch (error) {

                        }
                    }
                }

                return model;
            },
        };
        return Plugin.get(options);
    };

    /**
     * object To FormData
     * @param {object} obj model 参数，非null
     * @param {object} formData FormData 参数，可为null
     * @param {object} namespace 名称空间前缀，数组类型使用 参数，可为null
     * @returns {object} formData or new FormData 返回获取值得值
     */
    var objectToFormData = function (obj, formData, namespace) {
        var fd = formData || new FormData();
        if (!obj) {
            return fd;
        }
        var formKey;

        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                var key = $.isArray(obj) ? "[]" : "[" + property + "]";
                if (namespace) {
                    formKey = namespace + key;
                } else {
                    formKey = property;
                }

                if (typeof obj[property] === "object" && !(obj[property] instanceof File)) {
                    if ($.isArray(obj[property])) {
                        var kindex = 0;
                        for (var childIndex = 0; childIndex < obj[property].length; childIndex++) {
                            var child = obj[property][childIndex];
                            var _formKey = formKey + "[" + kindex + "]";
                            if (typeof child === "string") {
                                fd.append(_formKey, child);
                            } else {
                                objectToFormData(child, fd, _formKey);
                            }
                            kindex++;
                        }
                    } else {
                        objectToFormData(obj[property], fd, formKey);
                    }
                } else {
                    fd.append(formKey, obj[property]);
                }
            }
        }

        return fd;
    };

    /**
     * 禁用回车事件
     * @param {jQuery} element jQuery对象
     * @param {function} callback 回调函数
     */
    var disableEnter = function (element, callback) {
        if (isjQueryElement(element)) {

            element
                .keypress(function (e) {
                    if (e.keyCode === 13) {
                        //回车
                        e.preventDefault();
                        if ($.isFunction(callback)) {
                            callback($(this));
                        }
                    }
                });
        }
    };

    /**
     * 回车事件
     * @param {jQuery} elements jQuery对象
     * @param {function} callback 回调函数
     */
    var enter = function (elements, callback) {
        if (isjQueryElement(elements)) {
            elements.keypress(function (e) {
                if (e.keyCode === 13) {
                    //回车
                    e.preventDefault();
                    if ($.isFunction(callback)) {
                        callback($(this));
                    }
                }
            });
        }
    };

    /**
     * 按钮分身事件
     * @param {jQuery} element jQuery对象
     * @param {object} options 相关参数
     */
    var btnAvatar = function (element, options) {
        if (!isjQueryElement(element)) {
            return;
        }
        /**
         * html 使用案例
         * <button class="btn btn-info" data-command="btnAvatar">
                <!-- c-btnAvatar-value 可忽略 -->
                <div class="c-btnAvatar-value">
                    <input type="hidden" data-name="avatar_id" value="avatar_id_value" />
                    <input type="hidden" data-name="avatar_value" value="avatar_value_value" />
                </div>
                <!-- c-btnAvatar-tips 可忽略 -->
                <div class="c-btnAvatar-tips">
                    <span>请问你是否确认执行点击的操作？</span>
                </div>
                <!-- c-btnAvatar-clone 可忽略 -->
                <div class="c-btnAvatar-clone">
                    <span class="btn btn-info">示例按钮</span>
                </div>
                示例按钮
            </button>
         */
        var _options = {
            tips: '是否确认执行该操作？',
            callbacks: {
                /**
                 * 点击按钮触发事件之前处理事件 （返回true/false，true继续执行，false停止执行）
                 */
                clickBefore: null,
                /**
                 * 点击按钮触发事件之后处理事件
                 */
                clickAfter: null
            }
        };
        options = mix(_options, options);

        if (!$.isFunction(options.callbacks.clickBefore)) {
            options.callbacks.clickBefore = function (target, tips, clickAfter) {
                swalHelper({
                    html: tips,
                    type: 'warning',
                    showCancelButton: true
                })
                    .then(function (result) {
                        if (result.value) {
                            target.click();
                            clickAfter(target);
                        }
                    });
            }
        }

        if (!$.isFunction(options.callbacks.clickAfter)) {
            options.callbacks.clickAfter = function (target) { }
        }

        element
            .each(function () {
                var self = $(this);
                if (self.hasClass('disabled') || self.attr('disabled') === 'disabled') {
                    self.attr('disabled', 'disabled');
                    return;
                }
                var avatarid = trim(self.data('btnAvatar-id'));
                if (avatarid !== '' && $('#' + avatarid).length > 0) {
                    return;
                }
                var avatarValue = getHtmlValue({
                    el: self.find('>.c-btnAvatar-value'),
                    key: 'data-name',
                    query: 'input[type="hidden"]',
                    destroy: true
                });
                for (var key in avatarValue) {
                    self.data(key, avatarValue[key]);
                }

                var tipsEl = self.find('>.c-btnAvatar-tips');
                var tips = options.tips;
                if (tipsEl.length > 0) {
                    var tipshtml = trim(tipsEl.eq(0).html());
                    if (tipshtml !== '') {
                        tips = tipshtml;
                    }
                    tipsEl.remove();
                }

                var clone = self.find('>.c-btnAvatar-clone');
                avatarid = mUtil.getUniqueID("btnAvatar_");
                var cloneHtml = ''
                if (clone.length === 0) {
                    cloneHtml = '<button type="button" id="' + avatarid + '" class="' + self.attr('class') + '">' + self.html() + '</button>';
                } else {
                    clone = clone.eq(0);
                    clone
                        .find('>*')
                        .attr('id', avatarid);
                    cloneHtml = clone.html();
                    self
                        .find('>.c-btnAvatar-clone')
                        .remove();
                }
                self.after(cloneHtml);
                self.addClass('hidden');
                clone = $('#' + avatarid);
                if (clone.length > 1) {
                    self
                        .parent()
                        .find('#' + avatarid)
                        .remove();
                    return;
                }
                self.data('btnAvatar-id', avatarid);
                clone.click(function () {
                    options
                        .callbacks
                        .clickBefore(self, tips, options.callbacks.clickAfter);
                });

            });
    };

    /**
     * 转义html标签
     * @param {html} html html文本
     * @returns {text} 返回转义标签之后的文本
     */
    var htmlEncode = function (html) {
        //1.首先动态创建一个容器标签元素，如DIV
        var temp = document.createElement("div");
        //2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐，google支持)
        (temp.textContent != undefined) ?
            (temp.textContent = html) :
            (temp.innerText = html);
        //3.最后返回这个元素的innerHTML，即得到经过HTML编码转换的字符串了
        var output = temp.innerHTML;
        temp = null;
        output = output
            .replace(/"/g, "")
            .replace(/\\/g, "");
        return output;
    };

    /**
     * 过滤html标签
     * @param {html} html html文本
     * @returns {text} 返回过滤标签之后的文本
     */
    var htmlDecode = function (html) {
        //1.首先动态创建一个容器标签元素，如DIV
        var temp = document.createElement("div");
        //2.然后将要转换的字符串设置为这个元素的innerHTML(ie，火狐，google都支持)
        temp.innerHTML = html;
        //3.最后返回这个元素的innerText(ie支持)或者textContent(火狐，google支持)，即得到经过HTML解码的字符串了。
        var output = temp.innerText || temp.textContent;
        temp = null;
        output = output
            .replace(/"/g, "")
            .replace(/\\/g, "");
        return output;
    };

    /**
     * unobtrusive 验证帮助类
     */
    var unobtrusive = (function () {
        /**
         * 初始化验证表单
         * @param {jQuery} formElement form jQuery对象
         */
        var init = function (formElement) {
            if (!isjQueryElement(formElement)) {
                return;
            }

            $.validator.unobtrusive.parse(formElement);
            refresh(formElement);
        };

        /**
         * 刷新验证元素
         * @param {jQuery} formElement form jQuery对象
         */
        var refresh = function (formElement) {
            if (!isjQueryElement(formElement)) {
                return;
            }
            var isModalForm = formElement.hasClass("c--modal-form");
            var hasError = formElement.find(".has-error").length > 0;
            if (hasError) {
                formElement.valid();
            } else {
                formElement.submit(function () {
                    var el = $(this);
                    var validate = el.validate();
                    if (validate.errorList && validate.errorList.length > 0) {
                        var firstError = validate.errorList[0];
                        if (!isModalForm) {
                            changeUtil.scrollTo($(firstError.element), -80);
                            setTimeout(function () {
                                firstError.element.focus();
                            }, "slow");
                        } else {
                            firstError.element.focus();
                        }
                    }
                });
            }

            formElement.find('select[data-val="true"]').change(function () {
                var validateEl = $(this);
                var _hasError = formElement.find(".has-error").length > 0;
                if (_hasError) {
                    formElement.validate().element(validateEl);
                }
            });
        };

        /**
         * 显示表单错误元素
         * @param {jQuery} formElement form jQuery对象
         * @param {object} options 配置参数
         */
        var error = function (formElement, options) {
            if (!isjQueryElement(formElement) || formElement.length !== 1) {
                return;
            }
            var isModalForm = formElement.hasClass("c--modal-form");
            var _options = {
                focus: false,
                alert: {
                    container: $('.c-app>.c-page-content .c-page-container>.m-subheader'),
                    place: "prepend", // "append" or "prepend"
                    theme: "alert_styles",
                    type: "danger",
                    icon: 'flaticon-warning',
                    focus: true
                },
                offset: -80,
                errorMsg: "",
                errors: [{
                    ID: "",
                    Message: "",
                    Query: ""
                }],
                nameKey: 'name',
                clickFocus: true,
                //msgAlertContainer: $('.c-app>.c-page-content .c-page-container>.m-subheader'),
                msgAlertContainer: null
            };
            options = mix(_options, options);
            if (!$.isArray(options.errors)) {
                options.errors = [];
            }
            options.errorMsg = trim(options.errorMsg);
            options.nameKey = trim(options.nameKey);
            if (options.nameKey === '') {
                options.nameKey = 'name';
            }

            var firstErrorEl = null;
            var errorMsg = "";
            var errorCount = 0;
            var errorId = getUniqueID("c_unobtrusive_error_");
            errorMsg +=
                '<ul id="' +
                errorId +
                '" class="c-model-error-list" data-command="display-model-error">';
            if (options.errorMsg !== "") {
                errorCount++;
                errorMsg +=
                    '<li class="c-model-error" data-error-id="">' +
                    options.errorMsg +
                    "</li>";
            }

            for (var i = 0; i < options.errors.length; i++) {
                try {
                    var error = options.errors[i];
                    var obj = formElement.find("#" + error.ID);
                    if (obj.length === 0) {
                        var query = trim(error.Query);
                        obj = formElement.find(query);
                    }
                    if (obj.length === 0) {
                        obj = formElement.find('[' + options.nameKey + '="' + error.ID + '"]').last();
                    }
                    error.Message = trim(error.Message);
                    if (error.Message !== "") {
                        errorCount++;
                        errorMsg +=
                            '<li class="c-model-error" data-error-id="' +
                            error.ID +
                            '">' +
                            error.Message +
                            "</li>";
                    }
                    if (!isjQueryElement(obj) || obj.length !== 1) {
                        continue;
                    }
                    if (!isjQueryElement(firstErrorEl)) {
                        firstErrorEl = obj;
                    }
                    var pObj = getParentByClassName(obj, "nv-validate");
                    obj.addClass("is-invalid");
                    pObj.addClass("has-danger is-invalid");
                    var msgObj = formElement.find('[data-valmsg-for="' + error.ID + '"]');
                    if (msgObj.length === 0 && trim(obj.attr("id")) !== "") {
                        msgObj = formElement.find('[data-valmsg-for="' + trim(obj.attr("id")) + '"]');
                    }
                    msgObj.html(error.Message);
                    msgObj.addClass("field-validation-error error invalid-feedback");
                } catch (error) { }
            }
            var alertContainer = null;
            if (errorCount > 0) {
                errorMsg += "</ul>";
                if (options.msgAlertContainer !== null &&
                    changeUtil.isjQueryElement(options.msgAlertContainer) &&
                    options.msgAlertContainer.length === 1) {
                    changeUtil.alert({
                        container: options.msgAlertContainer,
                        place: "prepend", // "append" or "prepend"
                        theme: 'outline-square',
                        type: 'danger',
                        message: errorMsg,
                        offset: options.offset,
                        icon: {
                            type: 'arrow',
                            className: 'fa fa-times'
                        },
                        // focus: !(options.focus === true),
                        focus: isModalForm ? false : (!(options.focus === true))
                    });
                } else {
                    if (options.alert.container.length == 0) {
                        options.alert.container = $('.c-app .m-subheader');
                    }
                    changeUtil.alert({
                        container: options.alert.container,
                        place: options.alert.place,
                        theme: options.alert.theme,
                        type: options.alert.type,
                        message: errorMsg,
                        offset: options.offset,
                        icon: 'flaticon-warning',
                        // focus: !(options.focus === true),
                        // focus: isModalForm ? false : !(options.focus === true)
                        focus: options.alert.focus
                    });
                }


                alertContainer = $("#" + errorId);
                alertContainer.find(">li.c-model-error").each(function () {
                    var errorEl = $(this);
                    var targetid = trim(errorEl.attr("data-error-id"));
                    if (targetid === "") {
                        return;
                    }
                    var target = formElement.find("#" + targetid);
                    if (target.length === 0) {
                        target = formElement.find('[' + options.nameKey + '="' + targetid + '"]').last();
                    }
                    if (target.length == 0) {
                        return;
                    }
                    errorEl.click(function () {
                        if (target.length === 1) {
                            var parent = getParentByClassName(target, "nv-validate");
                            parent.addClass("has-error");
                            if (isModalForm) {
                                target.focus();
                            } else {
                                if (options.clickFocus === true) {
                                    changeUtil.scrollTo(target, options.offset);
                                    setTimeout(function () {
                                        target.focus();
                                    }, "slow");
                                } else {
                                    target.focus();
                                }
                            }
                        } else {
                            var valgoto = form.find('[data-valmsg-for-goto="' + targetid + '"]');
                            if (valgoto.length <= 0) {
                                valgoto = form.find('[data-valmsg-for="' + targetid + '"]');
                            }

                            if (valgoto.length === 1) {
                                if (isModalForm) {
                                    valgoto.focus();
                                } else {
                                    if (options.clickFocus === true) {
                                        changeUtil.scrollTo(valgoto, options.offset);
                                    } else {
                                        valgoto.focus();
                                    }
                                }
                            }
                        }
                    });
                });
            }

            if (options.focus === true) {
                if (isjQueryElement(firstErrorEl)) {
                    changeUtil.scrollTo(firstErrorEl, options.offset);
                } else if (isjQueryElement(alertContainer)) {
                    changeUtil.scrollTo(alertContainer, options.offset);
                } else {
                    changeUtil.scrollTop();
                }
            }
        };

        /**
         * 页面加载时显示错误信息， 配合 @Html.RenderModelError(Model, "form_1") 使用
         */
        var pageModelState = function () {
            var element = $(".c-model-error-list-container--command.hidden");
            element.each(function () {
                var el = $(this);
                if (el.find(">ul.c-model-error-list>li.c-model-error").length > 0) {
                    changeUtil.alert({
                        container: $(
                            ".c-app>.c-page-content .c-page-container>.m-subheader"
                        ),
                        theme: "alert_styles",
                        type: "danger",
                        message: el.html(),
                        icon: 'flaticon-warning'
                    });
                }
                el.remove();
            });
            element = $('ul.c-model-error-list[data-command="display-model-error"]');
            element.each(function () {
                var el = $(this);
                var formid = trim(el.attr("data-form-id"));
                var form = $("body");
                if (formid !== "") {
                    form = $("#" + formid);
                }
                if (form.length === 0) {
                    form = $("body");
                }
                el.find(">li.c-model-error").each(function () {
                    var errorEl = $(this);
                    var targetid = changeUtil.trim(errorEl.attr("data-error-id"));
                    if (targetid === "") {
                        return;
                    }
                    var target = form.find("#" + targetid);
                    errorEl.click(function () {
                        if (target.length === 1) {
                            var parent = changeUtil.getParentByClassName(
                                target,
                                "nv-validate"
                            );
                            parent.addClass("has-error");
                            changeUtil.scrollTo(target, -80);
                            setTimeout(function () {
                                target.focus();
                            }, "slow");
                        } else {
                            var valgoto = form.find('[data-valmsg-for-goto="' + targetid + '"]');
                            if (valgoto.length <= 0) {
                                valgoto = form.find('[data-valmsg-for="' + targetid + '"]');
                            }
                            if (valgoto.length === 1) {
                                changeUtil.scrollTo(valgoto, -80);
                            }
                        }
                    });
                });
            });
        };

        return {
            /**
             * 初始化验证表单
             */
            init: init,

            /**
             * 刷新验证元素
             */
            refresh: refresh,

            /**
             * 显示表单错误元素
             */
            error: error,

            /**
             * 页面加载时显示错误信息， 配合 @Html.RenderModelError(Model, "form_1") 使用
             */
            pageModelState: pageModelState
        };
    })();

    /**
     * toastr Helper类
     */
    var toastrHelper = function () {
        /**
         * 默认参数
         */
        var _options = {
            closeButton: true,
            debug: false,
            newestOnTop: true,
            progressBar: true,
            positionClass: 'toast-top-right',
            preventDuplicates: false,
            showDuration: '300',
            hideDuration: '1000',
            timeOut: '5000',
            extendedTimeOut: '1000',
            showEasing: 'swing',
            hideEasing: 'linear',
            showMethod: 'fadeIn',
            hideMethod: 'fadeOut',
            clearAll: false
        };

        /**
         * 获取当前的options对象（私有方法）
         * @param {object/string} options 参数对象
         * @returns {object} 返回mix之后的options
         */
        var _getCurrentOptions = function (options) {
            if (typeof options === "string") {
                var message = options;
                options = {};
                options.message = message;
            }
            options = options || {};
            if (!options.message || trim(options.message) === '') {
                options.message = '系统提示！';
            }
            options.message = trim(options.message);
            if (options.clearAll) {
                toastr.clear();
                $('.toast').remove();
            }
            return mix(_options, options);
        };

        /**
         * success
         * @param {object/string} options 参数
         */
        var success = function (options) {
            toastr.options = _getCurrentOptions(options);
            toastr.success(toastr.options.message);
        };

        /**
         * info
         * @param {object/string} options 参数
         */
        var info = function (options) {
            toastr.options = _getCurrentOptions(options);
            toastr.info(toastr.options.message);
        };

        /**
         * warning
         * @param {object/string} options 参数
         */
        var warning = function (options) {
            toastr.options = _getCurrentOptions(options);
            toastr.warning(toastr.options.message);
        };

        /**
         * error
         * @param {object/string} options 参数
         */
        var error = function (options) {
            toastr.options = _getCurrentOptions(options);
            toastr.error(toastr.options.message);
        };

        return {
            /**
             * success
             */
            success: success,

            /**
             * info
             */
            info: info,

            /**
             * warning
             */
            warning: warning,

            /**
             * error
             */
            error: error
        };

    }();

    /**
     * 浏览器版本 帮助类
     */
    var browserVersion = (function () {
        /**
         * 浏览器版本信息
         */
        var versions = (function () {
            var userAgent = navigator.userAgent;
            return {
                trident: userAgent.indexOf("Trident") > -1, //IE内核
                presto: userAgent.indexOf("Presto") > -1, //opera内核
                webKit: userAgent.indexOf("AppleWebKit") > -1, //苹果、谷歌内核
                gecko: userAgent.indexOf("Firefox") > -1, //火狐内核Gecko
                mobile: !!userAgent.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
                ios: !!userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios
                android: userAgent.indexOf("Android") > -1 || userAgent.indexOf("Linux") > -1, //android
                iPhone: userAgent.indexOf("iPhone") > -1, //iPhone
                iPad: userAgent.indexOf("iPad") > -1, //iPad
                webApp: userAgent.indexOf("Safari") > -1 //Safari
            };
        })();

        /**
         * 当前浏览器与[compareVersion]比较是否是低版本
         * @param {float} compareVersion 比较的版本信息，默认值10.0
         * @returns {bool} true/false
         */
        var isLowVersion = function (compareVersion) {
            var DEFAULT_VERSION = 10.0;
            compareVersion = getFloat(compareVersion);
            if (compareVersion > 0) {
                DEFAULT_VERSION = compareVersion;
            }
            var ua = navigator.userAgent.toLowerCase();
            var isIE = ua.indexOf("msie") > -1;
            var safariVersion;
            if (isIE) {
                safariVersion = ua.match(/msie ([\d.]+)/)[1];
            }
            return safariVersion <= DEFAULT_VERSION;
        };

        /**
         * 浏览器版本低，禁止访问
         * @param {string} accessUrl 低版本浏览器访问地址
         */
        var lowVersionStopAccess = function (accessUrl) {
            if (isLowVersion() || versions.trident) {
                accessUrl = trim(accessUrl);
                accessUrl = changeUtil.getOSUrl(accessUrl);
                if (accessUrl === "") {
                    $("body").html("<div>浏览器版本过低请下载高版本浏览器</div>");
                } else {
                    window.location.href = accessUrl;
                }
            }
        };

        /**
         * 获取模糊背景样式
         */
        var getbackdropFilterClass = function (backdropfilterClass) {
            if (versions.gecko === true) {
                return;
            }
            backdropfilterClass = changeUtil.trim(backdropfilterClass);
            return backdropfilterClass === '' ? 'backdrop-filter' : backdropfilterClass;
        };

        return {
            /**
             * 浏览器版本信息
             */
            versions: versions,

            /**
             * 当前浏览器与[compareVersion] 比较是否是低版本
             */
            isLowVersion: isLowVersion,

            /**
             * 浏览器版本低， 禁止访问
             */
            lowVersionStopAccess: lowVersionStopAccess,

            /**
             * 获取模糊背景样式
             */
            getbackdropFilterClass: getbackdropFilterClass,
        };
    })();

    /**
     * 添加输入控件限制最大长度效果
     * @param {jQuery} element jQuery对象
     * @param {object} options 配置参数
     */
    var maxlength = function (element, options) {
        if (!isjQueryElement(element)) {
            return;
        }
        /**
         * 默认配置参数
         */
        var _options = {
            threshold: 3,
            alwaysShow: false,
            warningClass: "m-badge m-badge--danger m-badge--rounded m-badge--wide",
            limitReachedClass: "m-badge m-badge--success m-badge--rounded m-badge--wide",
            appendToParent: !0,
            separator: " / ",
            preText: "",
            postText: "",
            validate: !0
        };
        options = mix(_options, options);
        // element.maxlength(options);
        element.each(function () {
            var self = $(this);
            var maxlengthValue = parseInt(self.attr('maxlength'));
            if (!isNaN(maxlengthValue)) {
                self.maxlength(options);
            }
        });
    };

    /**
     * 添加页面元素加载效果 using blockui
     * @param {jQuery} element jQuery对象
     * @param {object} options 配置参数
     */
    var block = function (element, options) {
        if (!isjQueryElement(element)) {
            return;
        }
        /**
         * 默认配置参数
         */
        var _options = {
            opacity: 0.03,
            overlayColor: "#000000",
            /**
             * brand / skin-dark / metal / light / accent / focus / primary / success / info / warning / danger
             */
            state: "brand",
            /**
             * spinner / loader
             */
            type: "loader",
            size: "lg",
            centerX: true,
            centerY: true,
            message: "",
            shadow: true,
            width: "auto",
            fixed: false
        };

        options = mix(_options, options);

        var key = changeUtil.getUniqueID("changeUtil-block-key-");
        element.data("changeUtil-block-key", key);
        element.addClass("c-overflow--hidden");
        if (options.fixed === true) {
            $('body').append('<div class="changeUtil-block-fixed" id="' + key + '"></div>');
            mApp.block($('body>#' + key), options);
        } else {
            mApp.block(element, options);
        }

        $(window).resize(function () {
            var _key = element.data("changeUtil-block-key");
            if (key === _key) {
                if (options.fixed === true) {
                    mApp.unblock($('body>#' + key));
                    mApp.block($('body>#' + key), options);
                } else {
                    mApp.unblock(element);
                    mApp.block(element, options);
                }
            }
        });
    };

    /**
     * 取消页面元素加载效果 using blockui
     * @param {jQuery} element jQuery对象
     */
    var unblock = function (element) {
        if (!isjQueryElement(element)) {
            return;
        }
        var key = element.data("changeUtil-block-key");
        element.removeData("changeUtil-block-key");
        element.removeClass("c-overflow--hidden");
        $('body>.changeUtil-block-fixed#' + key).remove();
        mApp.unblock(element);
    };

    /**
     * 动态移动至指定元素
     * @param {jQuery} element jQuery对象
     * @param {float} offset 偏移量
     * @param {function} callback 回调函数
     */
    var scrollTo = function (element, offset, callback) {
        if (!isjQueryElement(element) || element.length === 0) {
            element = $("body");
        }
        element = element.eq(0);
        offset = getInt(offset);
        var pos = element.offset().top;
        pos = pos + offset;

        if (window.self !== window.top) {
            $("html,body", window.parent.document).animate({
                scrollTop: pos
            },
                "slow"
            );
        } else {
            jQuery("html,body").animate({
                scrollTop: pos
            },
                "slow"
            );
        }
        if (callback && $.isFunction(callback)) {
            setTimeout(function () {
                callback(element);
            }, "slow");
        }
    };

    /**
     * 滚动至页面顶部
     */
    var scrollTop = function () {
        changeUtil.scrollTo();
    };

    /**
     * 自定义alert
     * @param {object} options 配置参数
     * @returns {jQuery} 返回 alert jQuery对象
     */
    var alert = function (options) {
        /**
         * 默认配置参数
         */
        var _options = {
            container: null, //保证有且只有一个，默认$('body')
            place: "prepend", // "append" or "prepend" in container
            /**
             * alert's theme
             * default / outline / outline-square / outline-2x /outline-2x-square / square
             */
            theme: 'default', //
            /**
             * alert's type
             * default / brand / metal / light / accent / focus / primary / success / info / warning / danger
             */
            type: 'default',
            isAir: true,
            title: "", // alert's title
            message: "", // alert's message
            close: true, // make alert closable
            reset: true, // close all previouse alerts first
            focus: true, // auto scroll to the alert after shown
            offset: -70,
            closeInSeconds: 0, // auto close after defined seconds
            icon: {
                /**
                 * alert - icon - type
                 * default/arrow/solid
                 */
                type: 'default',
                className: 'fa fa-info-circle'
            }
        };
        options = mix(_options, options);
        if (!options.container || !isjQueryElement(options.container)) {
            options.container = $('body');
        }
        options.container = options
            .container
            .eq(0);
        options.place = trim(options.place).toLowerCase();
        options.theme = trim(options.theme).toLowerCase();

        options.type = trim(options.type).toLowerCase();
        var types = [
            'brand',
            'metal',
            'light',
            'accent',
            'focus',
            'primary',
            'success',
            'info',
            'warning',
            'danger'
        ];
        options.type = array.hasValue(types, options.type) ?
            options.type :
            'default';

        options.title = trim(options.title);
        options.message = trim(options.message);
        options.icon.type = trim(options.icon.type);
        var iconTypes = ['default', 'arrow', 'solid'];
        options.icon.type = array.hasValue(iconTypes, options.icon.type) ?
            options.icon.type :
            'default';

        options.icon.className = trim(options.icon.className);

        options.closeInSeconds = getInt(options.closeInSeconds);

        if (options.reset) {
            options
                .container
                .find('.custom-alerts')
                .remove();
        }

        var id = getUniqueID('c-app-alert-');

        var alertContinerClassName = 'c-alert alert custom-alerts alert-' + options.type + ' m-alert--icon m-alert--icon-solid';
        if (options.theme === 'outline') {
            alertContinerClassName += ' m-alert--outline';
        } else if (options.theme === 'outline-square') {
            alertContinerClassName += ' m-alert--outline m-alert--square';
        } else if (options.theme === 'outline-2x') {
            alertContinerClassName += ' m-alert--outline m-alert--outline-2x';
        } else if (options.theme === 'outline-2x-square') {
            alertContinerClassName += ' m-alert--outline m-alert--outline-2x m-alert--square';
        } else if (options.theme === 'square') {
            alertContinerClassName += ' m-alert--square';
        } else {
            alertContinerClassName += '';
        }

        if (options.isAir === true) {
            alertContinerClassName += ' m-alert--air';
        }

        var html = '<div id="' + id + '" class="' + alertContinerClassName + '" role = "alert">';
        if (options.icon.className !== '') {
            html += '<div class="m-alert__icon">';
            html += '<i class="' + options.icon.className + '"></i>';
            if (options.icon.type === 'arrow' && array.hasValue([
                'brand',
                'metal',
                'accent',
                'focus',
                'primary',
                'success',
                'info',
                'warning',
                'danger'
            ], options.type)) {
                html += '<span></span>';
            }
            html += '</div>';
        }

        html += '<div class="m-alert__text">';
        if (options.title !== '') {
            html += '<strong>' + options.title + '</strong>';
        }
        html += options.message;
        html += '</div>';
        if (options.close === true) {
            html += '<div class="m-alert__close">\
	<button type="button" class="close" data-dismiss=' +
                '"alert" aria-label="Close"></button>\
</div>';
        }
        if (options.place === 'append') {
            options
                .container
                .append(html);
        } else {
            options
                .container
                .prepend(html);
        }
        var alertEl = options
            .container
            .find('#' + id);

        if (options.focus) {
            options.offset = getInt(options.offset);
            scrollTo(alertEl, options.offset);
        }

        if (options.closeInSeconds > 0) {
            setTimeout(function () {
                $('#' + id).remove();
            }, options.closeInSeconds * 1000);
        }

        return alertEl;

    };

    /**
     * swal Helper
     * @param {object} options 配置参数
     * @returns {object} 返回操作对象
     */
    var swalHelper = function (options) {
        // //避免打开同时打开多个 if (swal.isVisible()) {     return {         result: false }; }
        /**
         * 默认配置参数
         */
        var _options = {
            title: '系统提示',
            html: '',
            type: 'info', //success/error/warning/info/question
            allowOutsideClick: false,
            allowEscapeKey: false,
            allowEnterKey: false,
            showCancelButton: false,
            confirmButtonText: '确定',
            confirmButtonClass: 'btn m-btn m-btn--air btn-danger m-btn--custom',
            cancelButtonText: "取消",
            cancelButtonClass: "btn m-btn m-btn--air btn-secondary m-btn--custom m-btn--label-accent",
            onBeforeOpen: function () {
                $('body').addClass('overflow-hidden');
            },
            onClose: function () {
                $('body').removeClass('overflow-hidden');
            }
        };
        options = mix(_options, options);
        var self = swal(options);
        self.result = true;
        return self;
    };

    /**
     * 自定义 swal 
     */
    var swalCustom = function () {
        var Plugin = {
            init: function (options) {
                //禁止打开多个
                if ($('body>.c-swal2-custom').length > 0) {
                    console.error('页面已经打开一个“自定义的swal”窗口，禁止重复打开多个！');
                    console.error(options);
                    return;
                }
                var _options = {
                    module_id: changeUtil.getUniqueID('swal_custom_'),
                    customClass: {
                        popup: 'c-swal2--popup c-swal2-popup c-bg--brand c-swal2-popup--lg-1',
                        header: 'c-swal2-header',
                        icon: 'flaticon-network',
                        image: ''
                    },
                    init: function (_options) {

                    },
                    close: function (_options) {

                    },
                    // renderTitle: function (_options) {

                    // }
                };
                options = changeUtil.mix(_options, options);
                if (options.renderTitle === undefined) {
                    options.renderTitle = 0;
                }

                var swal2 = Plugin.renderHtml(options);
                _options = {
                    swalContainer: swal2,
                    popup: swal2.find('>.swal2-popup'),
                    module: swal2.find('#' + options.module_id),
                    container: swal2.find('#' + options.module_id + ' .c--swal2---container'),
                    progress: swal2.find('#' + options.module_id + ' .c--swal2---progress'),
                    header: swal2.find('>.swal2-popup>.swal2-header'),
                    title: swal2.find('>.swal2-popup>.swal2-header>.swal2-title .c-swal2-modal-title'),
                    icon: swal2.find('>.swal2-popup>.swal2-header>.swal2-title .c-swal2-modal-icon')
                };
                _options.popup.css('display', 'flex');
                _options.swalContainer.removeClass('swal2-container');
                _options.close = _options.popup.find('.swal2-header .swal2-close[type="button"]');

                mApp.initTooltip(swal2.find('[data-original-title]'));

                _options.container.find('>.c-swal2-modal-loadbefore').cLoadBefore({
                    minHeight: 100,
                    color: '#ddd',
                    backgroundColor: 'transparent',
                    type: 'list',
                    listCount: 5,
                    listbackgroundColor: 'rgba(213, 209, 226, 0.45)'
                });
                changeUtil.progress.bar({
                    el: _options.progress,
                });
                changeUtil.block(_options.container.find('>.c-swal2-modal-loadbefore .c-load-before-list'), {
                    message: '请稍候，正在加载数据……',
                    overlayColor: "transparent",
                });
                $('body').addClass('c-swal--overflow-important');

                if (options.init && $.isFunction(options.init)) {
                    options.init(_options);
                }

                _options.close.click(function () {
                    Plugin.close(_options, options)
                });

            },
            renderHtml: function (_options) {
                var id = changeUtil.getUniqueID('swal2_container_custom_');

                _options.customClass.image = changeUtil.trim(_options.customClass.image);

                var iocnHtml = _options.customClass.image !== '' ?
                    '<img alt="img" src="' + _options.customClass.image + '" />' :
                    '<i class="' + _options.customClass.icon + '"></i>';

                var html = '<div id="' + id + '" class="swal2-center c-swal2-container c-swal2-custom swal2-fade swal2-shown">\
	<div class="swal2-popup swal2-modal swal2-show ' + _options.customClass.popup + '">\
		<div class="swal2-header ' + _options.customClass.header + '">\
			<div class="swal2-title">\
				<div class="c-swal2-title">\
					<div class="c-swal2-modal-icon">' + iocnHtml + '</div>\
					<div class="c-swal2-modal-title">' + _options.title + '</div>\
				</div>\
			</div>\
			<button type="button" class="swal2-close c-swal2--close" data-original-title="关闭">\
				<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1" class="kt-svg-icon">\
					<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">\
						<g transform="translate(12.000000, 12.000000) rotate(-45.000000) translate(-12.000000, -12.000000) translate(4.000000, 4.000000)" fill="#000000">\
							<rect x="0" y="7" width="16" height="2" rx="1"></rect>\
							<rect opacity="0.3" transform="translate(8.000000, 8.000000) rotate(-270.000000) translate(-8.000000, -8.000000) " x="0" y="7" width="16" height="2" rx="1"></rect>\
						</g>\
					</g>\
				</svg>\
			</button>\
		</div>\
		<div class="swal2-content">\
            <div id="' + _options.module_id + '" class="c-swal2-modal">\
                <div class="c-swal2-modal-content">\
                    <div class="c--swal2---container">\
                        <div class="c-swal2-modal-loadbefore c-load-before"></div>\
                    </div>\
                </div>\
                <div class="c-swal2-progress c--swal2---progress"></div>\
            </div>\
		</div>\
	</div>\
</div>';

                $('body').append(html);
                return $('body>#' + id);
            },
            close: function (options, swalOptions) {
                try {
                    $('body>.tooltip').remove();
                    $('body').removeClass('c-swal--overflow-important overflow-hidden swal2-shown swal2-height-auto');
                    options.popup.removeClass('swal2-show').addClass('swal2-hide');
                    setTimeout(function () {
                        options.swalContainer.remove();
                        if (swalOptions.close && $.isFunction(swalOptions.close)) {
                            swalOptions.close(options);
                            $('body>.tooltip').remove();
                        }
                    }, 0.3 * 1000);
                } catch (error) {
                    console.error(error);
                }
            }
        };
        return Plugin.init;
    }();


    /**
     * datepicker yyyy-mm-dd
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var datepicker = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            todayBtn: "linked",
            orientation: "bottom left",
            clearBtn: !0,
            todayHighlight: !0,
            language: "zh-CN", //--语言设置
            orientation: "bottom left",
            format: 'yyyy-mm-dd',
            templates: {
                leftArrow: '<i class="la la-angle-left"></i>',
                rightArrow: '<i class="la la-angle-right"></i>'
            },
            chooseCompleteedAutoClose: true
        };
        options = mix(_options, options);
        elements.each(function () {
            var el = $(this);
            _options = {};

            var title = trim(el.attr('data-title'));
            if (title !== '') {
                _options.title = title;
            }
            var format = trim(el.attr('data-date-format'));
            if (format !== '') {
                _options.format = format;
            }
            el.datepicker(mix(options, _options))
                .on('changeDate', function (data) {
                    if (options.chooseCompleteedAutoClose === true) {
                        el.datepicker('hide');
                    }
                });
        });
    };

    /**
     * datetimepicker yyyy.mm.dd hh:ii
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var datetimepicker = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            todayBtn: "linked",
            orientation: "bottom left",
            clearBtn: !0,
            todayHighlight: !0,
            language: "zh-CN", //--语言设置
            orientation: "bottom left",
            format: 'yyyy-mm-dd hh:ii',
            showMeridian: true,
            templates: {
                leftArrow: '<i class="la la-angle-left"></i>',
                rightArrow: '<i class="la la-angle-right"></i>'
            },
            chooseCompleteedAutoClose: true
        };
        options = mix(_options, options);
        elements.each(function () {
            var el = $(this);
            var title = trim(el.attr('data-title'));
            _options = {};
            if (title !== '') {
                _options.title = title;
            }
            el.datetimepicker(mix(options, _options))
                .on('changeDate', function (data) {
                    if (options.chooseCompleteedAutoClose === true) {
                        el.datetimepicker('hide');
                    }
                });
        });
    };

    /**
     * timepicker hh:mm:ss
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var timepicker = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            defaultTime: '',
            showSeconds: true,
            showMeridian: true
        };
        options = mix(_options, options);
        elements.timepicker(options);
    };

    /**
     * daterangepicker 日期范围
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var daterangepicker = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {};
        _options = $.extend(true, {}, $.fn.daterangepicker.defaults, _options);
        options = mix(_options, options);
        var selectedCallback = options.selectedCallback || function () { };

        if (!$.isFunction(selectedCallback)) {
            selectedCallback = function () { };
        }

        elements.each(function () {
            var el = $(this);
            var __options = options;
            var self = {
                el: el,
                target: el.find('input[type="text"][data-command="target"]'),
                clearEl: el.find('>[data-command="clear"]'),
                startEl: el.find('input[type="text"].c--start-date'),
                endEl: el.find('input[type="text"].c--end-date'),
                clear: function () {
                    self.el.val("");
                    self.target.val("");
                    self.startEl.val("");
                    self.endEl.val("");
                },
                isreset: true
            };
            //2000-01-01
            var reg = /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/; //验证日期

            var start = changeUtil.trim(self.startEl.val());
            var end = changeUtil.trim(self.endEl.val());

            __options.startDate = moment().subtract(29, "days");
            __options.endDate = moment();

            if (reg.test(start) && reg.test(end)) {
                self.isreset = false;
                if (new Date(start) > new Date(end)) {
                    end = start;
                }
                __options.startDate = moment(start);
                __options.endDate = moment(end);
            }

            self.target.daterangepicker(__options, function (a, t, n) {
                var startDate = a.format("YYYY-MM-DD");
                var endDate = t.format("YYYY-MM-DD");
                self.startEl.val(startDate);
                self.endEl.val(endDate);
                selectedCallback(a, t, n, self);
            });

            if (self.isreset === true) {
                self.clear();
            }

            self.clearEl.click(function () {
                self.clear();
            });
        });
    };

    /**
     * summernote
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var summernote = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _limitSize = 5 * 1024 * 1024;
        if (typeof options === "undefined") {
            options = {};
        }
        if (typeof options.custom === "undefined") {
            options.custom = {};
        }
        if (typeof options.custom.callbacks === "undefined") {
            options.custom.callbacks = {};
        }
        options.custom.callbacks = options.custom.callbacks || {};
        options.custom.callbacks = mix(options.callbacks || {}, options.custom.callbacks);
        var plugins = {
            render: function (editor) {
                var tools = {
                    continer: null,
                    help: null,
                    fullscreen: null,
                    codeview: null,
                    fontname: null
                };
                plugins.clearToolbarStyle(editor);
                tools.containers = editor.find(".note-toolbar.panel-heading");
                tools.help = tools.containers.find(">.note-btn-group.btn-group>.btn-help");
                tools.fullscreen = tools.containers.find(">.note-btn-group.btn-group>.btn-fullscreen");
                tools.codeview = tools.containers.find(">.note-btn-group.btn-group>.btn-codeview");

                tools.help.attr("title", "帮助");
                tools.fullscreen.attr("title", "全屏");
                tools.codeview.attr("title", "源代码");

                tools.help.attr("data-toggle", "tooltip");
                tools.fullscreen.attr("data-toggle", "tooltip");
                tools.codeview.attr("data-toggle", "tooltip");

                tools.containers.find('[data-toggle="tooltip"]').tooltip({ placement: "bottom" });

                tools.fontname = tools.containers.find(".note-fontname>.note-btn-group.btn-group>.dropdown-menu.dropdown-fontname");
                tools.fontname.find(">li>a").each(function () {
                    var el = $(this);
                    var value = trim(el.attr("data-value")).toLowerCase();
                    var text = value;
                    switch (value) {
                        case "arial":
                            text = "Arial";
                            break;
                        case "arial black":
                            text = "Arial Black";
                            break;
                        case "comic sans ms":
                            text = "Comic Sans MS";
                            break;
                        case "courier new":
                            text = "Courier New";
                            break;
                        case "helvetica":
                            text = "Helvetica";
                            break;
                        case "impact":
                            text = "Impact";
                            break;
                        case "tahoma":
                            text = "Tahoma";
                            break;
                        case "times new roman":
                            text = "新罗马字体";
                            break;
                        case "verdana":
                            text = "Verdana";
                            break;
                        case "microsoft yahei":
                            text = "微软雅黑";
                            break;
                        case "simhei":
                            text = "黑体";
                            break;
                        case "simsun":
                            text = "宋体";
                            break;
                        case "georgia":
                            text = "Georgia";
                            break;
                        default:
                            //text = value;
                            break;
                    }
                    el.find(">span").html(text);
                });

                editor.click(function () {
                    plugins.displayFontName(editor);
                });

                // tools.fontname.find('>li>a[data-value="SimSun"]>span').click();
            },
            fullscreen: function (target, el, editor) {
                if (options.custom.containerIsFixed === true) {
                    var parent = el.parent();
                    if (parent.hasClass('c--fullscreen')) {
                        var c_summernote_fullscreen_key = parent.data('c_summernote_fullscreen_key');
                        var temp = $('#' + c_summernote_fullscreen_key);
                        temp.after(parent);
                        temp.remove();
                        parent.removeClass('c--fullscreen');
                    } else {
                        parent.data('c_summernote_fullscreen_key', changeUtil.getUniqueID('c_summernote_fullscreen'));
                        parent.after('<div id="' + parent.data('c_summernote_fullscreen_key') + '" class="hidden"></div>');
                        parent.addClass('c--fullscreen');
                        el.parent().appendTo($('body'))
                    }
                }
                el.summernote("focus");
                changeUtil.scrollTo(el.parent(), -70);
            },
            clearToolbarStyle: function (editor) {
                editor.find(">.note-toolbar-wrapper,>.note-toolbar,>.note-toolbar-wrapper>.note-toolbar").removeAttr("style");
                $(window).resize(function () {
                    editor.find(">.note-toolbar-wrapper,>.note-toolbar,>.note-toolbar-wrapper>.note-toolbar").removeAttr("style");
                });
                $(window).scroll(function () {
                    editor.find(">.note-toolbar-wrapper,>.note-toolbar,>.note-toolbar-wrapper>.note-toolbar").removeAttr("style");
                });
            },
            onImageUpload: {
                _insertImgNode: function (data, el) {
                    var node = document.createElement("img");
                    node.setAttribute("data-summernote-img", "upload");
                    node.setAttribute("alt", "summernote-img");
                    node.setAttribute("data-path", data.FilePath);
                    node.setAttribute("src", changeUtil.getOSUrl(data.FilePath, data.WebUrl));
                    node.setAttribute("style", "width:auto;");
                    el.summernote("editor.insertNode", node);
                },
                normal: function (file, el) {
                    changeAjax.postAntiForgery({
                        url: '/System/FileCenter/Upload4Summernote',
                        data: {
                            AttachmentFile: file
                        },
                        success: function (data) {
                            _execute(data);
                        },
                        error: function (data) {
                            _execute({
                                Success: false,
                                Message: "图片上传失败！",
                                ErrorList: []
                            });
                        }
                    });

                    var _execute = function (data) {
                        changeUtil.unblock($("body"));
                        if (data.Success === true) {
                            plugins.onImageUpload._insertImgNode(data.Data, el);
                        } else {
                            if (data.Error && data.Error === "NotAuthorized") {
                                // data.Message = "系统用户登录状态失效，请重新登录系统！";
                                data.Message = "图片上传失败！";
                            }
                            changeUtil.swalHelper({
                                html: data.Message || '图片上传失败！',
                                type: 'error',
                            });
                        }
                    }
                },
                limitUserFileSize: function (file, el) {
                    changeAjax.postAntiForgery({
                        url: '/System/FileCenter/GetPersonalFileImgaeList',
                        data: {
                            fileName: file.name
                        },
                        success: function (data) {
                            _execute(data);
                        },
                        error: function (data) {
                            _execute({
                                Success: false,
                                Message: "图片上传失败！",
                                ErrorList: []
                            });
                        }
                    });

                    var _execute = function (data) {
                        if (data.Success === true) {
                            if (data.Data.AccessCode === 1000) {
                                plugins.onImageUpload._chooseImage(data.Data, file, el);
                            } else if (data.Data.AccessCode === 404) {
                                plugins.onImageUpload._imageUpload4LimitUserFileSize(file, el);
                            } else {
                                changeUtil.unblock($("body"));
                                changeUtil.swalHelper({
                                    html: '图片上传失败！',
                                    type: 'error',
                                });
                            }
                        } else {
                            changeUtil.unblock($("body"));
                            changeUtil.swalHelper({
                                html: data.Message || '图片上传失败！',
                                type: 'error',
                            });
                        }
                    }
                },
                _imageUpload4LimitUserFileSize: function (file, el) {
                    changeUtil.unblock($("body"));
                    changeUtil.block($("body"), {
                        message: "请稍等，正在上传图片信息..."
                    });
                    changeAjax.postAntiForgery({
                        url: '/System/FileCenter/UploadPersonalFile4Json',
                        data: {
                            AttachmentFile: file
                        },
                        success: function (data) {
                            _execute(data);
                        },
                        error: function (data) {
                            _execute({
                                Success: false,
                                Message: "图片上传失败！",
                                ErrorList: []
                            });
                        }
                    });

                    var _execute = function (data) {
                        changeUtil.unblock($("body"));
                        if (data.Success === true) {
                            plugins.onImageUpload._insertImgNode(data.Data, el);
                        } else {
                            if (data.Error && data.Error === "NotAuthorized") {
                                data.Message = "图片上传失败！";
                            }
                            changeUtil.swalHelper({
                                html: data.Message || '图片上传失败！',
                                type: 'error',
                            });

                        }
                    }
                },
                _chooseImage: function (data, file, el) {
                    var modal = changeUtil.modal.init({
                        title: '图片上传提示',
                        isblur: false,
                        hasProgress: false,
                        callbacks: {
                            hide: function () {
                                // changeUtil.unblock($("body"));
                            },
                        }
                    });
                    changeUtil.unblock($("body"));

                    template = '\
                    <div class="c-summernote-modal-choose-tip">\
                        <b>\
                            根据您上传的文件，检索到您曾经上过同名（' + file.name + '）的文件。<br/>您是否仍然要再次上传该文件，这将占用您的个人文件空间。您也可以直接选择在下面展示的文件，无须再次上传！\
                        </b>\
                    </div>\
                    ';
                    template += '<ul class="c-summernote-modal-choose-container">';
                    for (var index = 0; index < data.Data.length; index++) {
                        var imgdata = data.Data[index];
                        var imgsrc = changeUtil.getOSUrl(imgdata.FilePath, data.WebUrl);
                        template += '<li class="c-summernote-modal-choose" data-url="' + imgdata.FilePath + '">';
                        template += '<img src="' + imgsrc + ' " alt="' + imgdata.FileName + '" />';
                        template += '</li>';
                    }
                    template += '</ul>';

                    var moreUrl = changeUtil.getOSUrl('/System/FileCenter?FileName=' + file.name);
                    template += '\
                    <div class="c-summernote-foot">\
                        <a target="_blank" class="btn btn-success btn-elevate" href="'+ moreUrl + '">\
                        <span>\
                            <i class="flaticon2-paperplane"></i>\
                            <span>查看更多</span></span>\
                        </a>\
                        <button type="button" data-command="continue" class="btn ct-btn-label-primary">继续</button>\
                        <button type="button" data-command="cancel" class="btn btn-label-danger">取消</button>\
                    </div>\
                    ';

                    modal.content.html(template);

                    modal.content.find('ul.c-summernote-modal-choose-container>li.c-summernote-modal-choose').click(function () {
                        var imgel = $(this);
                        var url = changeUtil.trim(imgel.attr('data-url'));
                        // el.summernote('editor.insertImage', url);
                        plugins.onImageUpload._insertImgNode({
                            FilePath: url
                        }, el);
                        modal.el.modal('hide');
                    });

                    modal.content.find('button[type="button"][data-command="continue"]').click(function () {
                        modal.el.modal('hide');
                        plugins.onImageUpload._imageUpload4LimitUserFileSize(file, el);
                    });

                    modal.content.find('button[type="button"][data-command="cancel"]').click(function () {
                        modal.el.modal('hide');
                    });

                },
            },
            renderIMGWidthAndHeight: function (el) {
                if (options.custom.refreshIMGWidthAndHeight !== true) {
                    return;
                }

                var _execute = function (imgEL, callback) {
                    var img = new Image();
                    img.src = imgEL.attr('src');
                    if (img.complete) {
                        callback({
                            el: imgEL,
                            width: img.width,
                            height: img.height,
                        });
                    } else {
                        img.onload = function () {
                            callback({
                                el: imgEL,
                                width: img.width,
                                height: img.height,
                            });
                        }
                    }
                };

                el.parent().find('.note-editor img').each(function () {
                    var img = $(this);
                    _execute(img, function (dataModel) {
                        dataModel.width = changeUtil.getFloat(dataModel.width);
                        dataModel.height = changeUtil.getFloat(dataModel.height);

                        var _scale = dataModel.width / dataModel.height;

                        var width = dataModel.el.outerWidth();
                        width = width <= 0 ? dataModel.width : width;
                        width = changeUtil.getFloat(width.toFixed(2));

                        dataModel.el.removeAttr('style');
                        // dataModel.el.css('width', width + 'px');
                        dataModel.el.attr('width', width);

                        var height = width / _scale;
                        height = changeUtil.getFloat(height.toFixed(2));

                        // dataModel.el.css('height', height + 'px');
                        dataModel.el.attr('height', height);

                    });
                });
            },
            /**
             * 显示字体名称
             */
            displayFontName: function (editor) {
                if (!changeUtil.isjQueryElement(editor)) {
                    return;
                }
                var fontname = editor.find('.note-toolbar.panel-heading .note-fontname>.note-btn-group.btn-group>ul.dropdown-menu.dropdown-fontname').eq(0);
                var el = fontname.find('li>a.checked');
                var value = changeUtil.trim(el.find('>span').text());

                var group = fontname.parents('.note-btn-group.btn-group').eq(0);
                var button = group.find('>button.dropdown-toggle>span.note-current-fontname').eq(0);
                button.css('display', 'none');

                var __execute = function () {
                    button.html(value);
                    var _nextButton = button.next('.c--fontname').eq(0);
                    if (_nextButton.length === 0) {
                        button.after('<span class="c--fontname"></span>');
                        _nextButton = button.next('.c--fontname').eq(0);
                        _nextButton.click(function () {
                            button.click();
                            button.click();
                        });
                    };

                    var _value = changeUtil.trim(_nextButton.html());
                    if (_value !== value) {
                        _nextButton.css('font-family', button.css('font-family')).html(value);
                    }
                }
                __execute();
                // setTimeout(function () {
                //     __execute();
                // }, 30);
            },
            getFilterXSSText: function (editor) {
                var el = editor;
                var codeText = el.summernote("code");
                codeText = plugins.covertFilterXSSText(codeText);
                return codeText;
            },
            covertFilterXSSText: function (codeText) {
                codeText = codeText || codeText;
                codeText = FilterXSS(codeText);
                return codeText;
            }
        };
        var _options = {
            custom: {
                editor: {
                    class: "c-square-note-editor"
                },
                /**
                 * 上传图片大小限制
                 */
                imgLimitSize: _limitSize,
                /**
                 * 容器 position 是否是 fixed
                 */
                containerIsFixed: false,
                /**
                 * 是否限定用户上传图片总空间的大小
                 */
                isLimitUserFileSize: true,
                /**
                 * 刷新图片的宽高
                 */
                refreshIMGWidthAndHeight: true,
                /**
                 * 粘贴时只粘贴文本:true/false,默认:false
                 */
                pasteOnlyText: false,
            },
            callbacks: {
                onInit: function () {
                    var el = $(this);
                    var value = el.val();
                    var editor = el.next();
                    plugins.render(editor);
                    if (options.custom.editor.class) {
                        editor.addClass(options.custom.editor.class);
                    }
                    // el.summernote("code", el.val());
                    el.summernote("code", value);
                    var fullscreen = editor.find('.note-toolbar button[type="button"].btn-fullscreen');
                    fullscreen.click(function () {
                        plugins.fullscreen($(this), el, editor);
                    });

                    ///下方状态栏
                    var statusbar = editor.find(".note-statusbar");
                    if (statusbar.length === 1) {
                        statusbar.bind("click mouseup mousedown mouseenter", function () {
                            if ($.isFunction(options.custom.callbacks.onResize)) {
                                options.custom.callbacks.onResize($(this), el, editor);
                            }
                        });
                    }
                    el.parent().find('>.note-editor .note-toolbar .note-btn-group .btn').removeAttr('title');
                    if ($.isFunction(options.custom.callbacks.onInit)) {
                        options.custom.callbacks.onInit(el);
                    }
                    plugins.displayFontName(editor);
                    plugins.renderIMGWidthAndHeight(el);

                    ///// change keydown keyup paste
                    editor.find('textarea.note-codable').bind("change blur focus", function () {
                        var _el = $(this);
                        var codeText = _el.val();
                        codeText = plugins.covertFilterXSSText(codeText);
                        _el.val(codeText);
                    });

                    // editor.find('textarea.note-codable').bind("blur", function () {
                    //     el.summernote("focus");
                    // });

                },
                onFocus: function () {
                    var el = $(this);
                    el.val(plugins.getFilterXSSText(el));
                    var editor = el.next();
                    editor.addClass("focus");
                    plugins.displayFontName(editor);
                    if ($.isFunction(options.custom.callbacks.onFocus)) {
                        options.custom.callbacks.onFocus(el);
                    }
                },
                onBlur: function () {
                    var el = $(this);
                    el.val(plugins.getFilterXSSText(el));
                    var editor = el.next();
                    editor.removeClass("focus");
                    plugins.displayFontName(editor);
                    if ($.isFunction(options.custom.callbacks.onBlur)) {
                        options.custom.callbacks.onBlur();
                    }
                },
                onKeyup: function () {
                    var el = $(this);
                    // el.val(el.summernote('code'));
                    var editor = el.next();
                    plugins.displayFontName(editor);
                    if ($.isFunction(options.custom.callbacks.onKeyup)) {
                        options.custom.callbacks.onKeyup();
                    }
                },
                onKeydown: function () {
                    var el = $(this);
                    // el.val(el.summernote('code'));
                    var editor = el.next();
                    plugins.displayFontName(editor);
                    if ($.isFunction(options.custom.callbacks.onKeydown)) {
                        options.custom.callbacks.onKeydown();
                    }
                },
                onEnter: function () {
                    var el = $(this);
                    // el.val(el.summernote('code'));
                    if ($.isFunction(options.custom.callbacks.onEnter)) {
                        options.custom.callbacks.onEnter();
                    }
                },
                onPaste: function (ne) {
                    var el = $(this);
                    if (options.custom.pasteOnlyText === true) {
                        var codeText = '';
                        try {
                            // codeText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('text/html');
                            // codeText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('text/plain');
                            codeText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('Text');
                            // if (codeText === '') {
                            //     codeText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('text/plain');
                            // }
                            ne.preventDefault ? ne.preventDefault() : (ne.returnValue = false);
                            if (codeText !== '') {
                                var bufferArray = codeText.split('\n');
                                var listText = [];
                                for (var index = 0; index < bufferArray.length; index++) {
                                    var text = bufferArray[index];
                                    listText.push('<div>' + text + '</div>');
                                }
                                codeText = listText.join('');
                            }
                            // codeText = changeUtil.FilterXSS(codeText, ['html', 'meta', 'link', 'script', 'head', 'style', 'body']);
                            codeText = changeUtil.FilterXSS(codeText);
                            var dealTextEL = $('<div></div>');
                            dealTextEL.html(codeText);
                            // dealTextEL.find('[style]').removeAttr('style');
                            // dealTextEL.find('[class]').removeAttr('class');
                            dealTextEL.find('img').remove();

                            // dealTextEL.find('h1,h2,h3,h4,h5,h6,h7').replaceWith(function () {
                            //     return $("<div></div>").append($(this).contents());
                            // });
                            // dealTextEL.find('b').replaceWith(function () {
                            //     return $("<span></span>").append($(this).contents());
                            // });

                            codeText = dealTextEL.html();

                            // document.execCommand('insertHTML', false, codeText);
                            document.execCommand('insertHTML', false, codeText);
                        } catch (error) {
                            console.error(error);
                        }
                    }
                    el.val(plugins.getFilterXSSText(el));
                    if ($.isFunction(options.custom.callbacks.onPaste)) {
                        options.custom.callbacks.onPaste(el);
                    }
                },
                onChange: function () {
                    var el = $(this);
                    el.val(plugins.getFilterXSSText(el));
                    var editor = el.next();
                    plugins.displayFontName(editor);
                    if ($.isFunction(options.custom.callbacks.onChange)) {
                        options.custom.callbacks.onChange(el, editor);
                    }
                    plugins.renderIMGWidthAndHeight(el);
                },
                onImageUpload: function (files, target) {
                    var el = $(this);
                    var file = files[0];
                    if (file.size > options.custom.imgLimitSize) {
                        changeUtil.swalHelper({
                            text: "图片文件大小不能超过5M",
                            type: "warning"
                        });
                        return;
                    }
                    var regex = new RegExp("(.png|.jpg|.svg|.gif|.jpeg|.webp)$");
                    var result = regex.test(file.name.toLowerCase());
                    if (result === false) {
                        changeUtil.swalHelper({
                            text: "请上传有效的图片文件",
                            type: "warning"
                        });
                        return;
                    }
                    //1.直接以base64方式插入图片 target.insertImages(files); 2.将图片上传至本地
                    changeUtil.unblock($("body"));
                    changeUtil.block($("body"), {
                        message: "请稍等，正在上传图片信息..."
                    });
                    if (options.custom.isLimitUserFileSize === true) {
                        plugins.onImageUpload.limitUserFileSize(file, el);
                    } else {
                        plugins.onImageUpload.normal(file, el);
                    }
                    // plugins.renderIMGWidthAndHeight(el);
                },
                onBlurCodeview: function () {
                    // var el = $(this);
                    // el.val(plugins.getFilterXSSText(el));
                    // //// el.summernote('codeview.toggle');
                }
            }
        };

        _options = $.extend(true, {}, $.fn.summernote.defaults, _options);

        options = mix(_options, options);
        options.callbacks = mix(options.callbacks, _options.callbacks);
        options.custom.imgLimitSize = getFloat(options.custom.imgLimitSize);
        if (options.custom.imgLimitSize <= 0) {
            options.custom.imgLimitSize = _limitSize;
        }
        elements.each(function () {
            var element = $(this);
            element.summernote(options);
        });
    };

    /**
     * 关键词输入控件 keyWordsControl
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var keyWordsControl = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            callbacks: {
                change: function (options) { },
                input: function (options) { }
            }
        };
        options = mix(_options, options);
        var plugin = {
            init: function (element, initData) {
                var self = {
                    id: initData.id,
                    name: initData.name
                };
                self.getKeyWords = function () {
                    return plugin.getKeyWords(element);
                };
                if (initData.keywords.length > 0) {
                    for (var index = 0; index < initData.keywords.length; index++) {
                        var keyword = initData.keywords[index];
                        plugin.add(element, self, keyword, keyword, true);
                    }
                }

                var inputEl = element.find('>.c-keywords--input');
                element.click(function () {
                    element.addClass('c-focus');
                    inputEl.focus();
                });

                inputEl.blur(function () {
                    var value = $(this).val();
                    $(this).val('');
                    $(this).removeAttr('style');
                    plugin.add(element, self, value, value);
                    element.removeClass('c-focus');
                });

                inputEl.focus(function () {
                    $(this).val('');
                    $(this).removeAttr('style');
                    element.addClass('c-focus');
                });

                inputEl.keydown(function (event) {
                    switch (event.keyCode) {
                        //case 9:
                        case 13:
                        case 188:
                            var value = $(this).val();
                            $(this).val('');
                            $(this).removeAttr('style');
                            plugin.add(element, self, value, value);
                            return false;
                            break;
                        case 38:
                            // _plugin.toUp();
                            break;
                        case 40:
                            // _plugin.toDown();
                            break;
                        default:
                            plugin.input(element, self, $(this));
                            break;
                    }
                });

                plugin.change(element, self);
            },
            add: function (element, self, value, text, notCallChange) {
                var keyWords = plugin.getKeyWords(element);
                value = trim(value);
                if (value === '' || changeUtil.array.hasValue(keyWords, value) === true) {
                    return;
                }
                var id = getUniqueID('c_keywords_keyword_');
                var html = '<div id="' + id + '" class="c-keywords--keyword">\
    <span class="c-keywords--keyword---text" tit' +
                    'le="' + htmlEncode(value) + '">\
    <input type="hidden" value="' + value + '" /><span>' + text + '</span></span>\
	<span class="c-keywords--keyword---close"></span>\
</div>';
                element
                    .find('>.c-keywords--container')
                    .append(html);
                element.addClass('c-has-data');
                var keywordEl = element
                    .find('>.c-keywords--container')
                    .find('>#' + id);
                keywordEl.removeAttr('id');
                keywordEl
                    .find('>span.c-keywords--keyword---text')
                    .tooltip();

                keywordEl
                    .find('>span.c-keywords--keyword---close')
                    .click(function () {
                        plugin.close(element, self, $(this));
                    });
                if (notCallChange !== true) {
                    plugin.change(element, self);
                }

            },
            close: function (element, self, target) {
                target
                    .parent()
                    .remove();
                plugin.resetValue(element);
                plugin.change(element, self);
            },
            resetValue: function (element) {
                var keyWords = plugin.getKeyWords(element);
                if (keyWords.length > 0) {
                    element.addClass('c-has-data');
                } else {
                    element.removeClass('c-has-data');
                }
            },
            getKeyWords: function (element) {
                var keyWords = [];
                element
                    .find('>.c-keywords--container>.c-keywords--keyword')
                    .each(function () {
                        var el = $(this).find('>.c-keywords--keyword---text>input[type="hidden"]');
                        var value = trim(el.val());
                        keyWords.push(value);
                    });
                return keyWords;
            },
            change: function (element, self) {
                var __options = mix(self, {
                    element: element
                });
                options
                    .callbacks
                    .change(__options);
            },
            /**
             * 文本输入事件
             */
            input: function (element, self, target) {
                var maxWidth = element.width();
                var targetWidth = target.width();
                var tempWidth = targetWidth + 6;
                if (tempWidth < maxWidth) {
                    target.width(tempWidth);
                } else {
                    target.width(maxWidth);
                }
                var __options = mix(self, {
                    element: element,
                    value: trim(target.val()),
                    target: target
                });
                options
                    .callbacks
                    .input(__options);
            }

        };

        elements.each(function () {
            var el = $(this);
            var initData = getHtmlValue({
                el: el.find('>.hidden.c-keywords-input--initValues'),
                key: 'data-name',
                query: 'input[type="hidden"]',
                destroy: true
            });
            initData.id = initData.id || getUniqueID('c_keywords_');
            initData.name = initData.name || '';
            initData.keywords = initData.keywords || '';
            var keywords = [];
            if (initData.keywords !== '') {
                var array = initData
                    .keywords
                    .split(',');
                for (var index in array) {
                    var keyword = trim(array[index]);
                    if (keyword !== '' && changeUtil.array.hasValue(keywords, keyword) === false) {
                        keywords.push(keyword);
                    }
                }
            }
            initData.keywords = keywords;
            initData.placeholder = initData.placeholder || '';
            var id = getUniqueID('c_keywords_container_');
            var html = '';
            if (initData.placeholder === '') {
                html = '<div id="' + id + '" class="c-keywords-input-container">\
                            <div class="c' +
                    '-keywords--container"></div>\
                            <input class="c-keywor' +
                    'ds--input" autocomplete="off" type="text" />\
                        </div>';
            } else {
                html = '<div id="' + id + '" class="c-keywords-input-container">\
                            <span class="' +
                    'c-placeholder">' + initData.placeholder + '</span>\
                            <div class="c-keywords--container"></div>\
' +
                    '                            <input class="c-keywords--input" autocomplete="off" ' +
                    'type="text" />\
                        </div>';
            }

            el.html(html);

            plugin.init(el.find('>#' + id), initData);
        });

    };

    /**
     * 文本输入检索事件 inputSearchControl
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var inputSearchControl = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            callbacks: {
                change: function (options) { },
                input: function (options) { },
                renderItem: function (data, index) {
                    return plugin.renderItem(data, index);
                },
                choose: function (options, target, data) { },
                getAjaxData: function (options, value) {
                    return plugin.getAjaxData(options, value);
                },
                matchValue: function (_options) { }
            }
        };
        options = mix(_options, options);

        var plugin = {
            init: function (_options) {
                var id = getUniqueID('c_input_search_control_');
                var html = '<div id="' + id + '" class="c-input-search-control"></div>';
                _options
                    .el
                    .after(html);
                _options.container = _options
                    .el
                    .parent()
                    .find('>#' + id);
                _options
                    .container
                    .append(_options.el);

                _options.isFocus = function () {
                    return _options
                        .el
                        .is(":focus");
                };

                var value = trim(_options.el.val());
                _options
                    .el
                    .data('data-value', value);

                _options
                    .el
                    .bind('keyup', function (event) {
                        // console.log(event.keyCode);
                        if (event.keyCode === 38) {
                            // 向上
                            plugin.inputToUp(_options, $(this));
                        } else if (event.keyCode === 40) {
                            // 向下
                            plugin.inputToDown(_options, $(this));
                        } else if (event.keyCode === 13) {
                            //回车
                            plugin.enter(_options);
                        } else if (event.keyCode === 9) {
                            //tab
                        } else {
                            plugin.search(_options);
                        }
                    });

                _options
                    .el
                    .focus(function () { });

                _options
                    .el
                    .blur(function () {
                        var container = _options
                            .container
                            .find('>div.c-input-search--content');
                        var hoverEl = container
                            .find('.c-input-search--body>ul>li.hover')
                            .eq(0);
                        if (hoverEl.length === 1) {
                            plugin.choose(_options, hoverEl);
                            _options
                                .el
                                .data('data-search-index', 0);
                            options
                                .callbacks
                                .matchValue(_options);
                        } else {
                            _options
                                .el
                                .data('data-search-index', 0);
                            options
                                .callbacks
                                .matchValue(_options);
                            container.remove();
                        }

                    });

            },
            change: function (_options, data) {
                _options
                    .container
                    .find('>div.c-input-search--content')
                    .remove();

                if (data.length > 0) {
                    var html = '<div class="c-input-search--content">\
                                    <div ' +
                        'class="c-input-search--body">\
                                        <ul></ul>' +
                        '\
                                    </div>\
                                </' +
                        'div>';
                    _options
                        .container
                        .append(html);
                    var container = _options
                        .container
                        .find('>div.c-input-search--content');
                    var ulEl = container.find('.c-input-search--body>ul');
                    for (var index = 0; index < data.length; index++) {
                        var id = getUniqueID('c_input_search_control_item_')
                        ulEl.append('<li id="' + id + '"></li>')
                        var liEl = ulEl.find('>li#' + id);
                        liEl.removeAttr('id');
                        liEl.data('data-value', data[index]);
                        liEl.append(options.callbacks.renderItem(data[index], index));
                        // liEl.click(function () {     plugin.choose(_options, $(this)); });
                        liEl.hover(function () {
                            var el = $(this);
                            el.addClass('hover');
                        }, function () {
                            var el = $(this);
                            el.removeClass('hover');
                        });

                    }
                }
            },
            choose: function (_options, target) {
                _options
                    .el
                    .data('data-search-index', 1);
                _options
                    .el
                    .data('data-search-value', target.data('data-value'));
                options
                    .callbacks
                    .matchValue(_options);
                _options
                    .container
                    .find('>div.c-input-search--content')
                    .remove();
            },
            enter: function (_options) {
                var container = _options
                    .container
                    .find('>div.c-input-search--content');
                var ulEl = container.find('.c-input-search--body>ul');
                var liEls = ulEl.find('>li');
                if (liEls.length === 0) {
                    plugin.search(_options);
                    return;
                }
                var el = ulEl
                    .find('>li.focus')
                    .eq(0);
                if (el.length === 0) {
                    el = liEls.eq(0);
                }
                plugin.choose(_options, el);
            },
            search: function (_options) {
                _options
                    .el
                    .data('data-search-index', 0);
                var value = trim(_options.el.val());
                if (value === '') {
                    plugin.change(_options, []);
                } else {
                    $.ajax({
                        type: "post",
                        url: _options.search.url,
                        data: options
                            .callbacks
                            .getAjaxData(_options, value),
                        success: function (data) {
                            if (data.Success) {
                                plugin.change(_options, data.Data);
                            } else {
                                plugin.change(_options, []);
                            }
                        },
                        error: function (data) {
                            plugin.change(_options, []);
                        }
                    });
                }
            },
            renderItem: function (data, index) {
                return data;
            },
            getAjaxData: function (_options, value) {
                var jsonData = {};
                jsonData[_options.search.paramName] = value;
                return jsonData;
            },
            inputToUp: function (_options, target) {
                _options
                    .el
                    .data('data-search-index', 0);
                var container = _options
                    .container
                    .find('>div.c-input-search--content');
                var ulEl = container.find('.c-input-search--body>ul');
                var liEls = ulEl.find('>li');
                var el = null;
                if (liEls.length === 0) {
                    return;
                } else if (liEls.length === 1) {
                    el = liEls.eq(0);
                } else {
                    el = ulEl
                        .find('>li.focus')
                        .eq(0);
                    if (el.length === 0) {
                        el = liEls.last();
                    } else {
                        el = el.prev();
                    }
                }
                _options
                    .el
                    .data('data-search-index', 1);
                _options
                    .el
                    .data('data-search-value', el.data('data-value'));
                liEls.removeClass('focus');
                el.addClass('focus');
                options
                    .callbacks
                    .matchValue(_options);
            },
            inputToDown: function (_options, target) {
                _options
                    .el
                    .data('data-search-index', 0);
                var container = _options
                    .container
                    .find('>div.c-input-search--content');
                var ulEl = container.find('.c-input-search--body>ul');
                var liEls = ulEl.find('>li');
                var el = null;
                if (liEls.length === 0) {
                    return;
                } else if (liEls.length === 1) {
                    el = liEls.eq(0);
                } else {
                    el = ulEl
                        .find('>li.focus')
                        .eq(0);
                    if (el.length === 0) {
                        el = liEls.first();
                    } else {
                        el = el.next();
                    }
                }
                _options
                    .el
                    .data('data-search-index', 1);
                _options
                    .el
                    .data('data-search-value', el.data('data-value'));
                liEls.removeClass('focus');
                el.addClass('focus');
                options
                    .callbacks
                    .matchValue(_options);
            },
            matchValue: function (_options) { }
        };

        if (!$.isFunction(options.callbacks.renderItem)) {
            options.callbacks.renderItem = plugin.renderItem;
        }

        if (!$.isFunction(options.callbacks.getAjaxData)) {
            options.callbacks.getAjaxData = plugin.getAjaxData;
        }

        if (!$.isFunction(options.callbacks.matchValue)) {
            options.callbacks.matchValue = plugin.matchValue;
        }

        elements
            .each(function () {
                var self = this;
                var el = $(self);
                var attributes = getAttributes(self);
                var data = {
                    self: self,
                    el: el,
                    key: trim(attributes['data-key']),
                    search: {
                        url: trim(attributes['data-search-url']),
                        paramName: trim(attributes['data-search-param-name'])
                    }
                };
                el.removeAttr('data-key');
                el.removeAttr('data-search-url');
                el.removeAttr('data-search-param-name');

                plugin.init(data);
            });
    };

    /**
     * carousel
     * @param {jQuery} elements jQuery对象
     * @param {object} options 配置参数
     */
    var carousel = function (elements, options) {
        if (!isjQueryElement(elements)) {
            return;
        }
        var _options = {
            interval: 6, //单位秒,最小1.5s
            newWindow: true, //是否新窗口打开
            callbacks: {}
        };
        options = mix(_options, options);
        options.interval = getFloat(options.interval);
        if (options.interval < 1.5) {
            options.interval = 1.5;
        }
        var plugin = {
            init: function (element, imgData) {
                if (imgData.length === 0) {
                    return;
                }
                var self = {
                    timer: null
                };
                var ids = [];
                var html = '<div class="c-carousel-content">';
                html += '<div class="c-carousel-content--body">';
                for (var index = 0; index < imgData.length; index++) {
                    var data = imgData[index];
                    var id = getUniqueID('c_carousel__item_');
                    ids.push(id);
                    html += '<div class="c-carousel--item" id="' + id + '">';
                    html += '<img alt="' + data.title + '" src="' + data.src + '" />';
                    data.url = trim(data.url);
                    if (data.url === '') {
                        data.url = "javascript:void(0);";
                    }
                    var newWindow = '';
                    if (options.newWindow) {
                        newWindow = ' target="_blank" ';
                    }
                    html += '<h4 class="c-carousel--item---title"><a ' + newWindow + ' href="' + data.url + '">' + data.title + '</a></h4>';
                    html += '</div>';
                }
                html += '</div>';
                html += '<ul class="c-carousel-content--indicators">';
                for (var index = 0; index < ids.length; index++) {
                    var id = ids[index];
                    html += '<li data-for="' + id + '"></li>';
                }
                html += '</ul>';
                html += '</div>';
                element.append(html);

                var indicatorsEl = element.find('.c-carousel-content--indicators>li');

                indicatorsEl.click(function () {
                    var el = $(this);
                    var id = trim(el.attr('data-for'));
                    var target = element.find('#' + id);
                    element
                        .find('.c-carousel--item')
                        .removeClass('active');
                    element
                        .find('.c-carousel--item')
                        .removeClass('stop');
                    element
                        .find('.c-carousel--item')
                        .removeClass('hover');
                    indicatorsEl.removeClass('active');
                    el.addClass('active');
                    target.addClass('active');
                    target.addClass('stop');
                    setTimeout(function () {
                        target.removeClass('stop');
                    }, 1 * 1000);
                    if (self.timer) {
                        clearInterval(self.timer);
                    }
                    plugin.timer(element, self);
                });

                element.hover(function () {
                    var el = element.find('.c-carousel--item.active');
                    el.addClass('stop');
                    el.addClass('hover');
                }, function () {
                    var el = element.find('.c-carousel--item.active');
                    el.removeClass('stop');
                    el.removeClass('hover');
                });
                indicatorsEl
                    .eq(0)
                    .click();
            },
            timer: function (element, self) {
                var count = 0;
                self.timer = setInterval(function () {
                    var activecarousel = element.find('.c-carousel--item.active');
                    if (activecarousel.hasClass('stop') || activecarousel.hasClass('hover')) {
                        if (activecarousel.hasClass('stop')) {
                            element
                                .find('.c-carousel--item')
                                .removeClass('stop');
                            activecarousel.addClass('stop');
                        }
                        if (activecarousel.hasClass('hover')) {
                            element
                                .find('.c-carousel--item')
                                .removeClass('hover');
                            activecarousel.addClass('hover');
                        }
                        count = 1;
                        return;
                    }
                    if (count > 0) {
                        count = 0;
                        return;
                    }
                    var activeindicators = element.find('.c-carousel-content--indicators>li.active');
                    var next = activeindicators.next();
                    if (next.length === 0) {
                        next = element
                            .find('.c-carousel-content--indicators>li')
                            .eq(0);
                    }
                    next.click();

                }, options.interval * 1000);
            }
        };

        elements.each(function () {
            var el = $(this);
            var imgData = [];
            var dataEL = el.find('>.hidden.c-carousel--data');
            dataEL
                .find('>.c-carousel--data---part')
                .each(function () {
                    var partEl = $(this);
                    var data = getHtmlValue({
                        el: partEl,
                        key: 'data-name',
                        query: 'input[type="hidden"]'
                    });
                    imgData.push(data);
                });
            dataEL.remove();
            plugin.init(el, imgData);
        });
    };

    /**
     * 模态窗口
     */
    var modal = function () {
        var Options = {
            el: null,
            modalClass: 'bs-modal-lg modal-scroll',
            hasHeader: true,
            hasClose: true,
            title: '',
            isblur: true,
            content: null,
            contentMinHeight: 240,
            hasProgress: true,
            callbacks: {
                show: function () {

                },
                hide: function () {

                },
            }
        };

        var Plugin = {
            init: function (options) {
                Options = changeUtil.mix(Options, options);
                if (changeUtil.isjQueryElement(Options.el) !== true || Options.el.length !== 1) {
                    Plugin.render();
                }
                if (Options.isblur === true) {
                    changeUtil.blur(null, true);
                    changeUtil.unblur(Options.el);
                }
                Options.el.on('hidden.bs.modal', function () {
                    Plugin.close();
                    if ($.isFunction(options.callbacks.hide)) {
                        options.callbacks.hide();
                    }
                })
                    .on('shown.bs.modal', function () {
                        var backdrop = Options.el.next('.modal-backdrop.fade.show');
                        if (backdrop.length === 0) {
                            backdrop = Options.el.prev('.modal-backdrop.fade.show');
                        }
                        if (Options.isblur === true) {
                            backdrop.addClass('c-border');
                        } else {
                            backdrop.addClass('c-fade');
                        }
                    }).modal({
                        backdrop: "static",
                        show: true
                    });

                return {
                    el: Options.el,
                    title: Options.el.find('h4.title'),
                    content: Options.el.find('div.content.c--content'),
                    progress: Options.el.find('div.c-modal-progress.c--progress'),
                }
            },
            render: function (options) {
                var colse = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1" class="kt-svg-icon">\
    <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">\
        <g id="Group" transform="translate(12.000000, 12.000000) rotate(-45.000000) translate(-12.000000, -12.000000) translate(4.000000, 4.000000)" fill="#000000">\
            <rect id="Rectangle-185" x="0" y="7" width="16" height="2" rx="1"/>\
            <rect id="Rectangle-185-Copy" opacity="0.5" transform="translate(8.000000, 8.000000) rotate(-270.000000) translate(-8.000000, -8.000000) " x="0" y="7" width="16" height="2" rx="1"/>\
        </g>\
    </g>\
</svg>';
                var id = changeUtil.getUniqueID('c_modal_');
                var html = '<div id="' + id + '" class="c--modal c-modal modal fade ' + Options.modalClass + '">\
    <div class="modal-dialog modal-lg">\
        <div class="modal-content c-modal-content">\
            <div class="modal-body">\
                <div class="change-module">\
                    <div class="title c--title-div hidden">\
                        <h4 class="c--title">' + Options.title + '</h4>\
                        <button type="button" data-button="close" class="close hidden" data-dismiss="modal" aria-hidden="true"><span class="span-svg">' + colse + '</span></button>\
                    </div>\
                    <div class="content c--content"></div>\
                    <div class="c-modal-progress c--progress">\
                    </div>\
                </div>\
            </div>\
        </div>\
    </div>\
</div>';
                $('body').append(html);
                Options.el = $('body>#' + id);
                Options.el.removeAttr('id');
                if (Options.hasHeader === true) {
                    Options.el.find('.c--title-div').removeClass('c--title-div hidden');
                }
                if (Options.hasClose === true) {
                    Options.el.find('[data-button="close"][type="button"]').removeClass('hidden');
                }
                if (Options.contentMinHeight > 0) {
                    Options.el.find('div.c--content.content').html('<div style="min-height: ' + Options.contentMinHeight + 'px;"></div>');
                }
                if (Options.hasProgress === true) {
                    Plugin.addProgress(Options.el.find('div.c-modal-progress.c--progress'));
                }
            },
            close: function (el) {
                if (changeUtil.isjQueryElement(el) !== true && changeUtil.isjQueryElement(Options.el) !== true) {
                    return;
                }
                el = el || Options.el;
                changeUtil.unblur(null, true);
                el.modal('hide');
                el.remove();
                Options.el = null;
            },
            addProgress: function (progress) {
                changeUtil.progress.bar({
                    el: progress,
                });
            },
            removeProgress: function (progress) {
                changeUtil.progress.bar({
                    el: progress,
                    mode: false
                });
            }
        };


        return {
            init: Plugin.init,
            addProgress: Plugin.addProgress,
            removeProgress: Plugin.removeProgress,
        };
    }();

    /**
     * 高斯模糊
     * @param {jQuery} el 作用元素 默认：$('body>div')
     * @param {bool} isImportant 是否作为高级权限
     */
    var blur = function (el, isImportant) {
        if (changeUtil.isjQueryElement(el) !== true) {
            el = $('body>div');
        }
        el.addClass('c---filter-blur c-filter-blur');
        if (isImportant === true) {
            $('body').addClass('c---filter-blur-important');
        }
    };

    /**
     * 取消高斯模糊
     * @param {jQuery} el 作用元素 默认：$('.c---filter-blur.c-filter-blur')
     * @param {bool} isImportant 是否作为高级权限
     */
    var unblur = function (el, isImportant) {
        if (changeUtil.isjQueryElement(el) !== true) {
            if ($('body').hasClass('c---filter-blur-important')) {
                if (isImportant !== true) {
                    $('body>.c--modal.c-modal').removeClass('c---filter-blur c-filter-blur');
                    return;
                }
            }
            el = $('.c---filter-blur.c-filter-blur');
        }
        el.removeClass('c---filter-blur c-filter-blur');
        if (isImportant === true) {
            $('body').removeClass('c---filter-blur-important');
        }

    }

    /**
     * 通过Url加载html页面
     * @param {object} options 配置参数
     */
    var loadHtmlByUrl = function (options) {
        var _options = {
            el: null,
            url: '',
            host: changeConfig.host,
            /**
             * success 回调函数
             * @param {object} data 返回数据
             */
            success: function (data) {

            },
            /**
             * error 回调函数
             * @param {object} data 返回数据
             */
            error: function (data) {

            },
            /**
             * 除 success\error 以外 回调函数
             * @param {object} data 返回数据
             */
            other: function (data) {

            },
            /**
             * must 一定调用/最先调用 回调函数
             * @param {object} data 返回数据
             */
            must: function (data) {

            }
        };
        options = changeUtil.mix(_options, options);
        if (changeUtil.isjQueryElement(options.el) !== true || options.el.length !== 1) {
            if ($.isFunction(options.error)) {
                options.error({
                    msg: '参数获取失败！',
                });
            }
            return;
        }
        options.url = changeUtil.trim(options.url);
        if (options.url === '') {
            options.error({
                msg: '参数获取失败！',
            });
            return;
        }
        options.url = changeUtil.getOSUrl(options.url, options.host);
        options.el.load(options.url, function (responseTxt, statusTxt, xhr) {
            var data = {
                el: options.el,
                url: options.url,
                host: options.host,
                loadContent: $(this),
                responseTxt: responseTxt,
                statusTxt: statusTxt,
                xhr: xhr,
            };
            if ($.isFunction(options.must)) {
                options.must(data);
            }
            if (statusTxt === "success") {
                if ($.isFunction(options.success)) {
                    options.success(data);
                }
            } else if (statusTxt === "error") {
                if ($.isFunction(options.error)) {
                    options.error(data);
                }
            } else {
                if ($.isFunction(options.other)) {
                    options.other(data);
                }
            }
        });

    }

    /**
     *  window.location.href
     * @param {object} options 配置参数，可以为 string ，即直接书写地址
     */
    var locationHref = function (options) {
        var _options = {
            url: '',
            host: changeConfig.host,
        };
        if (typeof options === 'string') {
            _options.url = changeUtil.trim(options)
            options = _options;
        } else {
            options = changeUtil.mix(_options, options);
        }
        options.url = changeUtil.trim(options.url)
        if (options.url === '') {
            return;
        }
        options.url = changeUtil.getOSUrl(options.url, options.host);
        window.location.href = options.url;
    }

    /**
     * autosize
     * @param {jQuery} el jQuery对象
     */
    var Autosize = function (el) {
        if (typeof el === undefined || el.length === 0) {
            return;
        }

        if (isjQueryElement(el) !== true) {
            return;
        }
        autosize(el);
    }

    /**
     * TableHelper
     */
    var TableHelper = (function () {

        var Plugin = {
            init: function () { },
            /**
             * goto
             * @param {jQuery} elements jQuery对象
             */
            goto: function (elements) {
                if (!changeUtil.isjQueryElement(elements)) {
                    return;
                }
                elements.each(function () {
                    var el = $(this);
                    var gotoID = changeUtil.trim(el.attr("data-goto"));
                    if (gotoID !== "") {
                        var gotoEl = $("#" + gotoID);
                        if (gotoEl.length === 1) {
                            changeUtil.scrollTo(gotoEl, -80);
                            el.find("tr.active").removeClass("active");
                            gotoEl.addClass("active");
                        } else {
                            gotoEl = $('[data-goto-2="' + gotoID + '"]');
                            if (gotoEl.length === 1) {
                                changeUtil.scrollTo(gotoEl, -80);
                                el.find("tr.active").removeClass("active");
                                gotoEl.addClass("active");
                            }
                        }
                    }
                });
            },
            /**
             * scroll
             * @param {jQuery} elements jQuery对象,table parent
             * @param {object} options 配置参数
             */
            scroll: function (elements, options) {
                var _options = {
                    heightOffset: 0,
                    /**
                     * 横轴
                     */
                    scrollX: true,
                    /**
                     * 纵轴
                     */
                    scrollY: false,
                };
                options = changeUtil.mix(_options, options);
                if (!changeUtil.isjQueryElement(elements)) {
                    return;
                }

                var _init = function () {
                    elements.each(function () {
                        var parent = $(this);
                        parent.attr('data-scroll', 'true');
                        parent.attr('data-scroll-x', 'true');
                        var table = parent.find('>table');
                        if (options.scrollY === true) {
                            var height = table.outerHeight();
                            var thisHeight = height + options.heightOffset;
                            table.attr('data-height', thisHeight);
                        }

                        if (options.scrollX === true) {
                            var width = 0;
                            table.removeAttr('style');
                            table.find('>thead>tr').each(function () {
                                var tr = $(this);
                                var MinW = changeUtil.getFloat(tr.css('min-width'));
                                var W = changeUtil.getFloat(tr.css('width'));
                                // if (W < MinW) {
                                //     W = MinW;
                                // }
                                W = MinW;
                                MinW = 0;
                                tr.find('>th,>td').each(function () {
                                    var td = $(this);
                                    var minw = changeUtil.getFloat(td.css('min-width'));
                                    var w = changeUtil.getFloat(td.css('width'));
                                    if (w < minw) {
                                        w = minw;
                                    }
                                    w = minw;
                                    MinW += w;
                                });
                                // if (W < MinW) {
                                //     W = MinW;
                                // }
                                W = MinW;
                                if (width < W) {
                                    width = W;
                                }
                            });
                            table.css('min-width', width);
                        }

                        // KTUtil.scrollInit(this, {
                        //     mobileNativeScroll: true,
                        //     handleWindowResize: true,
                        //     rememberPosition: (table.data('remember-position') == 'true' ? true : false),
                        //     height: function () {
                        //         if (KTUtil.isInResponsiveRange('tablet-and-mobile') && table.data('mobile-height')) {
                        //             var _height = table.data('mobile-height');
                        //             return _height;
                        //         } else {
                        //             var _height = table.data('height');
                        //             return _height;
                        //         }
                        //     }
                        // });

                    });
                }
                _init();
                $(window).resize(function () {
                    _init();
                });
            },
            /**
             * checkbox
             */
            checkbox: function () {
                var _Plugin = {
                    init: function (options) {
                        var _options = {
                            table: null,
                            checkAll: null,
                            checkChild: null,
                            callbacks: {
                                checkAll: {
                                    //交互样式变化
                                    style: {
                                        checked: null,
                                        unchecked: null
                                    },
                                    //完成之后
                                    completed: {
                                        checked: null,
                                        unchecked: null
                                    }
                                },
                                checkChild: {
                                    //交互样式变化
                                    style: {
                                        checked: null,
                                        unchecked: null
                                    },
                                    //完成之后
                                    completed: {
                                        checked: null,
                                        unchecked: null
                                    }
                                },
                                checkChanged: function () { }
                            }
                        };
                        options = changeUtil.mix(_options, options);
                        var _self = {
                            success: false
                        };
                        if (!changeUtil.isjQueryElement(options.table) ||
                            options.table.length !== 1
                        ) {
                            _self.msg = "TABLE 获取失败！";
                            console.error("TABLE 获取失败！");
                            return _self;
                        }

                        options.table.find("tr").each(function () {
                            var tr = $(this);
                            var id = changeUtil.trim(tr.attr("id"));
                            if (id === "") {
                                id = changeUtil.getUniqueID("c-app-plugin-table-checkbox-tr-");
                                tr.attr("id", id);
                            }
                            tr.find(
                                '>th label>input[type="checkbox"],>td label>input[type="checkbox"]'
                            ).attr("data-table-checkbox-tr", id);
                        });

                        options.checkAll = options.table.find(
                            '>thead>tr label.c-checkbox-all>input[type="checkbox"]'
                        );

                        if (options.checkAll.length !== 1) {
                            _self.msg = "Check ALL 获取失败！";
                            console.error("Check ALL 获取失败！");
                            return _self;
                        }
                        options.isCheckAllSub = false;
                        options.checkChild = options.table
                            .find(
                                '>tbody>tr label.c-checkbox-child>input[type="checkbox"]:not([disabled="disabled"])'
                            )
                            .not(":disabled");
                        options.checkAll.click(function () {
                            if (this.checked) {
                                _Plugin.checkAll(options);
                            } else {
                                _Plugin.uncheckAll(options);
                            }
                            _Plugin.checkChanged(options);
                            if (options.isCheckAllSub === true) {
                                options.checkAllSub.prop("checked", this.checked);
                            }
                        });
                        var checkAllSub = changeUtil.trim(options.table.find('>thead>tr label.c-checkbox-all').attr('data-checkbox-sub'));

                        if (checkAllSub !== '') {
                            options.checkAllSub = $(checkAllSub + ' input[type="checkbox"]');
                            options.isCheckAllSub = true;
                            options.checkAllSub.click(function () {
                                if (this.checked) {
                                    _Plugin.checkAll(options);
                                } else {
                                    _Plugin.uncheckAll(options);
                                }
                                _Plugin.checkChanged(options);
                                options.checkAll.prop("checked", this.checked);
                            });
                        }
                        options.checkChild.click(function () {
                            if (this.checked) {
                                _Plugin.checkChild(options, this);
                            } else {
                                _Plugin.uncheckChild(options, this);
                            }
                            _Plugin.checkChanged(options);

                        });
                        _self.getCheckChildDetail = function () {
                            return _Plugin.getCheckChildDetail(options);
                        };
                        _self.checkAll = function () {
                            options.checkAll.prop("checked", true);
                            _Plugin.checkAll(options);
                            _Plugin.checkChanged(options);
                        };
                        _self.uncheckAll = function () {
                            options.checkAll.prop("checked", false);
                            _Plugin.uncheckAll(options);
                            _Plugin.checkChanged(options);
                        };
                        _self.success = true;
                        return _self;
                    },
                    checkAll: function (options) {
                        if (typeof options.callbacks.checkAll.style.checked === "function") {
                            options.callbacks.checkAll.style.checked();
                        } else {
                            var tr = $("#" + options.checkAll.attr("data-table-checkbox-tr"));
                            tr.addClass("active");
                            options.checkChild.not(":disabled").each(function () {
                                $("#" + $(this).attr("data-table-checkbox-tr")).addClass("active");
                                $(this).prop("checked", true);
                            });
                        }
                        if (options.isCheckAllSub === true) {
                            options.checkAllSub.prop("checked", true);
                        }
                        if (typeof options.callbacks.checkAll.completed.checked === "function") {
                            options.callbacks.checkAll.completed.checked();
                        }
                    },
                    uncheckAll: function (options) {
                        if (typeof options.callbacks.checkAll.style.unchecked === "function") {
                            options.callbacks.checkAll.style.unchecked();
                        } else {
                            var tr = $("#" + options.checkAll.attr("data-table-checkbox-tr"));
                            tr.removeClass("active");
                            options.checkChild.each(function () {
                                $("#" + $(this).attr("data-table-checkbox-tr")).removeClass("active");
                                $(this).prop("checked", false);
                            });
                        }
                        if (options.isCheckAllSub === true) {
                            options.checkAllSub.prop("checked", false);
                        }
                        if (
                            typeof options.callbacks.checkAll.completed.unchecked === "function"
                        ) {
                            options.callbacks.checkAll.completed.unchecked();
                        }
                    },
                    addCheckAllStyle: function (options) {
                        options.checkAll.prop("checked", true);
                        if (options.isCheckAllSub === true) {
                            options.checkAllSub.prop("checked", true);
                        }
                        var tr = $("#" + options.checkAll.attr("data-table-checkbox-tr"));
                        tr.addClass("active");
                    },
                    cancelCheckAllStyle: function (options) {
                        options.checkAll.prop("checked", false);
                        if (options.isCheckAllSub === true) {
                            options.checkAllSub.prop("checked", false);
                        }
                        var tr = $("#" + options.checkAll.attr("data-table-checkbox-tr"));
                        tr.removeClass("active");
                    },
                    checkChild: function (options, obj) {
                        obj = $(obj);
                        var detail = _Plugin.getCheckChildDetail(options);
                        if (detail.length === detail.checkedList.length) {
                            _Plugin.addCheckAllStyle(options);
                        } else {
                            _Plugin.cancelCheckAllStyle(options);
                        }
                        if (typeof options.callbacks.checkChild.style.checked === "function") {
                            options.callbacks.checkChild.style.checked();
                        } else {
                            var tr = $("#" + obj.attr("data-table-checkbox-tr"));
                            tr.addClass("active");
                        }
                    },
                    uncheckChild: function (options, obj) {
                        obj = $(obj);
                        var detail = _Plugin.getCheckChildDetail(options);
                        if (detail.length === detail.checkedList.length) {
                            _Plugin.addCheckAllStyle(options);
                        } else {
                            _Plugin.cancelCheckAllStyle(options);
                        }
                        if (typeof options.callbacks.checkChild.style.unchecked === "function") {
                            options.callbacks.checkChild.style.unchecked();
                        } else {
                            var tr = $("#" + obj.attr("data-table-checkbox-tr"));
                            tr.removeClass("active");
                        }
                    },
                    getCheckChildDetail: function (options) {
                        var checkedList = [];
                        var checkedEls = [];
                        options.checkChild.each(function () {
                            if (this.checked) {
                                var value = $("#" + $(this).attr("data-table-checkbox-tr")).attr(
                                    "data-table-checkbox-value"
                                );
                                if (value) {
                                    value === changeUtil.trim(value);
                                    if (value !== "" && !changeUtil.array.hasValue(checkedList, value)) {
                                        checkedList.push(value);
                                        checkedEls.push($(this));
                                    }
                                }
                            }
                        });
                        return {
                            length: options.checkChild.length,
                            checkedList: checkedList,
                            checkedEls: checkedEls,
                        };
                    },
                    checkChanged: function (options) {
                        if (typeof options.callbacks.checkChanged === "function") {
                            var detail = _Plugin.getCheckChildDetail(options);
                            options.callbacks.checkChanged(detail);
                        }
                    }
                };

                return _Plugin.init;
            }(),
            /**
             * 表头排序
             */
            theadSort: function () {
                var _Options = {
                    el: null,
                    searchform: null,
                    searchButton: null
                };
                var _Plugin = {
                    init: function (options) {
                        options = changeUtil.mix(_Options, options);
                        if (changeUtil.isjQueryElement(options.el)) {
                            options.el.find(".c-table-cell-sort").click(function () {
                                _Plugin.sort($(this), options);
                            });
                        }
                    },
                    sort: function (el, options) {
                        if (el.hasClass("c--lock")) {
                            return;
                        }
                        el.addClass("c--lock");
                        if (options && options.searchform && options.searchButton) {
                            var ascEl = options.searchform.find("#AscSortKey");
                            var descEl = options.searchform.find("#DescSortKey");
                            if (ascEl && descEl) {
                                var sortMode = changeUtil.trim(el.attr("data-sort-mode")).toLowerCase();
                                var sortKey = changeUtil.trim(el.attr("data-sort-key"));
                                if (sortKey !== "") {
                                    changeUtil.block($("body"), {
                                        message: "数据正在加载中..."
                                    });
                                    if (el.hasClass("active")) {
                                        if (sortMode === "asc") {
                                            ascEl.val("");
                                            descEl.val(sortKey);
                                        } else {
                                            ascEl.val(sortKey);
                                            descEl.val("");
                                        }
                                    } else {
                                        if (sortMode === "asc") {
                                            ascEl.val(sortKey);
                                            descEl.val("");
                                        } else {
                                            ascEl.val("");
                                            descEl.val(sortKey);
                                        }
                                    }
                                    options.searchButton.click();
                                }
                            }
                        }
                    },
                };

                return {
                    init: _Plugin.init
                }
            }(),
            /**
             * responsive
             * @param {jQuery} elements jQuery对象,table parent
             * @param {object} options 配置参数
             */
            responsive: function (elements, options) {
                var _options = {
                    /**
                     * 初始化时是否全部展开
                     */
                    isOpen: false,
                    /**
                     * 是否锁住最后一列
                     */
                    isLockLastColumn: true,
                    callbacks: {
                        // render: function (data) {

                        // },
                        // unRender: function (data) {

                        // }
                    }
                };
                //
                var _Plugin = {
                    run: function () {
                        options = changeUtil.mix(_options, options);
                        if (!changeUtil.isjQueryElement(elements)) {
                            return;
                        }
                        elements.find('>table').each(function () {
                            var table = $(this);
                            if (table.data('table_responsive_inited') === true) {
                                return;
                            }
                            table.data('table_responsive_inited', true);
                            var mode = changeUtil.trim(table.attr('data-responsive-mode')).toLowerCase();
                            if (mode === 'open' || mode === 'close') {
                                options.isOpen = mode === 'open';
                            }
                            var locklastcolumn = changeUtil.trim(table.attr('data-responsive-locklastcolumn')).toLowerCase();
                            if (locklastcolumn === 'true' || locklastcolumn === 'false') {
                                options.isLockLastColumn = locklastcolumn === 'true';
                            }

                            options.minIndexs = [];
                            var min_indexs_text = changeUtil.trim(table.attr('data-responsive-min-indexs'));
                            if (min_indexs_text !== '') {
                                var min_indexs = min_indexs_text.split(',');
                                options.minIndexs.push(0);
                                for (var index = 0; index < min_indexs.length; index++) {
                                    var cellIndex = changeUtil.getInt(min_indexs[index]);
                                    if (changeUtil.array.hasValue(options.minIndexs, cellIndex)) {
                                        continue;
                                    }
                                    options.minIndexs.push(cellIndex);
                                }
                            }

                            var cellIndexsEl = table.find('>thead>tr [data-responsive-cell-index]');
                            if (cellIndexsEl.length > 0) {
                                var min = 0;
                                var max = 0;
                                cellIndexsEl.each(function () {
                                    var cell = $(this);
                                    var cellIndex = changeUtil.getInt(cell.attr('data-responsive-cell-index'));
                                    if (cellIndex <= 0) {
                                        return;
                                    }
                                    if (min === 0 || min > cellIndex) {
                                        min = cellIndex;
                                    }
                                    if (max === 0 || max < cellIndex) {
                                        max = cellIndex;
                                    }
                                });
                                if (min > 0) {
                                    options.minIndexs = [];
                                    var cellIndex = 0;
                                    for (var index = min; index <= max; index++) {
                                        table.find('>thead>tr [data-responsive-cell-index="' + index + '"]').each(function () {
                                            var cell = $(this);
                                            if (cell.hasClass('c---thead-tr-used') || cell.hasClass('hidden')) {
                                                return;
                                            }
                                            cell.addClass('c---thead-tr-used');
                                            cellIndex++;
                                            cell.attr('data-responsive-cell-index', cellIndex);
                                        });
                                    }
                                    var cellIndex_temp = 0;
                                    table.find('>thead>tr>th,>thead>tr>td').each(function () {
                                        var cell = $(this);
                                        cellIndex_temp++;
                                        cell.attr('data-responsive-cell-index--temp', cellIndex_temp);
                                    });
                                    options.minIndexs.push(0);
                                    for (var index = 1; index <= cellIndex; index++) {
                                        var cell = table.find('>thead [data-responsive-cell-index="' + index + '"]').eq(0);
                                        var _cellIndex = changeUtil.getInt(cell.attr('data-responsive-cell-index--temp'));
                                        if (_cellIndex <= 0) {
                                            continue;
                                        }
                                        options.minIndexs.push(_cellIndex);
                                    }

                                }
                            }
                            table.find('[data-responsive-cell-index]').removeAttr('data-responsive-cell-index');
                            table.find('[data-responsive-cell-index--temp]').removeAttr('data-responsive-cell-index--temp');
                            table.find('.c---thead-tr-used').removeClass('c---thead-tr-used');

                            table.data('table_responsive_data', options);

                            _Plugin.init(table);

                            table.removeAttr('data-responsive-mode');
                            table.removeAttr('data-responsive-locklastcolumn');
                            table.removeAttr('data-responsive-min-indexs');
                        });
                    },
                    init: function (table) {
                        var thead_tr = table.find('>thead>tr').eq(0);
                        if (thead_tr.length === 0) {
                            return;
                        }

                        var table_options = table.data('table_responsive_data');

                        var MinW = 0;
                        thead_tr.find('>th,>td').each(function () {
                            var _td = $(this);
                            var minw = changeUtil.getFloat(_td.css('min-width'));
                            if (minw > 0) {
                                if (MinW > minw) {
                                    MinW = minw;
                                }
                                return;
                            }
                        });
                        if (MinW === 0) {
                            MinW = 55;
                        }
                        thead_tr.find('>th,>td').each(function () {
                            var _td = $(this);
                            var minw = changeUtil.getFloat(_td.css('min-width'));
                            if (minw > 0) {
                                return;
                            }
                            _td.css('min-width', MinW);
                        });

                        if (table_options.isOpen === true) {
                            thead_tr.find('>th,>td').eq(0).before('<th class="c-responsive-detail open"><span><i class="fa fa-caret-down"></i></span></th>');
                            table.find('>tbody>tr.c--tr').each(function () {
                                var _tr = $(this);
                                _tr.find('>th,>td').eq(0).before('<td class="c-responsive-detail open"><span><i class="fa fa-caret-down"></i></span></td>');
                            });
                        } else {
                            thead_tr.find('>th,>td').eq(0).before('<th class="c-responsive-detail"><span><i class="fa fa-caret-right"></i></span></th>');
                            table.find('>tbody>tr.c--tr').each(function () {
                                var _tr = $(this);
                                _tr.find('>th,>td').eq(0).before('<td class="c-responsive-detail"><span><i class="fa fa-caret-right"></i></span></td>');
                            });
                        }

                        thead_tr.find('>th.c-responsive-detail').click(function () {
                            var _th = $(this);
                            var isOpen = _th.hasClass('open');
                            if (isOpen) {
                                _th.removeClass('open');
                                _th.find('i.fa').addClass('fa-caret-right').removeClass('fa-caret-down');
                            } else {
                                _th.addClass('open');
                                _th.find('i.fa').addClass('fa-caret-down').removeClass('fa-caret-right');
                            }

                            table.find('>tbody>tr.c--tr>.c-responsive-detail').each(function () {
                                var _td = $(this);
                                var _tr = _td.parents('tr.c--tr').eq(0);
                                var id = _tr.data('table_responsive_tr_index');
                                var detail = table.find('tr#' + id);
                                if (isOpen) {
                                    detail.addClass('hidden');
                                    _td.removeClass('open');
                                    _td.find('i.fa').addClass('fa-caret-right').removeClass('fa-caret-down');
                                } else {
                                    detail.removeClass('hidden');
                                    _td.addClass('open');
                                    _td.find('i.fa').addClass('fa-caret-down').removeClass('fa-caret-right');
                                }
                            });
                        });

                        table.find('>tbody>tr.c--tr>.c-responsive-detail').click(function () {
                            var _td = $(this);
                            var _tr = _td.parents('tr.c--tr').eq(0);
                            var id = _tr.data('table_responsive_tr_index');
                            var detail = table.find('tr#' + id);
                            if (_td.hasClass('open')) {
                                detail.addClass('hidden');
                                _td.removeClass('open');
                                _td.find('i.fa').addClass('fa-caret-right').removeClass('fa-caret-down');
                            } else {
                                detail.removeClass('hidden');
                                _td.addClass('open');
                                _td.find('i.fa').addClass('fa-caret-down').removeClass('fa-caret-right');
                            }
                        });

                        _Plugin.execute(table);
                        $(window).resize(function () {
                            var table_responsive_data = table.data('table_responsive_data');
                            if (table_responsive_data === undefined) {
                                return;
                            }
                            _Plugin.execute(table);
                        });
                    },
                    execute: function (table) {
                        table.removeClass('c-table-responsive');
                        table.find('.c-responsive-hidden').removeClass('c-responsive-hidden');
                        table.find('.c--last--responsive').removeClass('c--last--responsive');
                        table.find('.c--used--responsive').removeClass('c--used--responsive');
                        table.find('tr.c-responsive-detail-table-detail').remove();
                        var table_options = table.data('table_responsive_data');
                        var parent = table.parent();
                        var parent_width = parent.width();
                        var thead_tr = table.find('>thead>tr').eq(0);
                        var tdWidths = 0;
                        if (table_options.isLockLastColumn === true) {
                            tdWidths += thead_tr.find('>th,>td').last().addClass('c--last--responsive').width();
                        }

                        if ($.isArray(table_options.minIndexs) && table_options.minIndexs.length > 0) {
                            for (var index = 0; index < table_options.minIndexs.length; index++) {
                                var cellIndex = table_options.minIndexs[index];
                                if (cellIndex > thead_tr.find('>th,>td').length) {
                                    continue;
                                }
                                var _temp_td = thead_tr.find('>th,>td').eq(cellIndex);
                                if (_temp_td.hasClass('c--last--responsive') ||
                                    _temp_td.hasClass('c--used--responsive') ||
                                    _temp_td.hasClass('hidden')) {
                                    continue;
                                }

                                var minw = changeUtil.getFloat(_temp_td.css('min-width'));
                                // var _width = changeUtil.getFloat(_temp_td.css('width'));
                                // if (_width > minw) {
                                //     minw = _width;
                                // }
                                if (parent_width <= tdWidths || parent_width < tdWidths + minw) {
                                    continue;
                                }
                                _temp_td.addClass('c--used--responsive');
                                tdWidths += minw;
                            }
                        }
                        var hiddenIndex = -1;
                        var hiddenArrary = [];
                        thead_tr.find('>th,>td').each(function () {
                            var _td = $(this);
                            hiddenIndex++;
                            if (_td.hasClass('c--last--responsive') || _td.hasClass('c--used--responsive')) {
                                return;
                            }
                            var minw = changeUtil.getFloat(_td.css('min-width'));
                            if (parent_width <= tdWidths || parent_width < tdWidths + minw) {
                                hiddenArrary.push(hiddenIndex);
                                return;
                            }
                            tdWidths += minw;
                        });
                        if (hiddenArrary.length > 0) {
                            table.addClass('c-table-responsive');
                            for (var index = 0; index < hiddenArrary.length; index++) {
                                var cell_index = hiddenArrary[index];
                                thead_tr.find('>th,>td').eq(cell_index).addClass('c-responsive-hidden');
                                table.find('>tbody>tr.c--tr').each(function () {
                                    var _tr = $(this);
                                    _tr.find('>th,>td').eq(cell_index).addClass('c-responsive-hidden').data('table_responsive_cell_index', cell_index);
                                });
                            }
                            table.find('>tbody>tr.c--tr').each(function () {
                                var _tr = $(this);
                                var trid = changeUtil.trim(_tr.attr('id'));
                                if (trid === '') {
                                    trid = changeUtil.getUniqueID('table_responsive_main_tr_');
                                    _tr.attr('id', trid);
                                }
                                var successCount = 0;
                                _tr.find('.c-responsive-hidden').each(function () {
                                    var _td = $(this);
                                    if (_td.hasClass('hidden')) {
                                        return;
                                    }
                                    successCount++;
                                });
                                if (successCount == 0) {
                                    return;
                                }
                                var id = changeUtil.getUniqueID('table_responsive_tr_index_');
                                _tr.data('table_responsive_tr_index', id);
                                var html = '';
                                var classText = '';
                                if (!_tr.find('>.c-responsive-detail').hasClass('open')) {
                                    classText = " hidden ";
                                }
                                var classText = '';
                                if (!_tr.find('>.c-responsive-detail').hasClass('open')) {
                                    classText = " hidden ";
                                }
                                _tr.after('<tr id="' + id + '" class="c-responsive-detail-table-detail ' + classText + '"><td colspan="' + thead_tr.find('>th,>td').length + '"><table><tbody></tbody></table></td></tr>');
                                var childTR = table.find('tr#' + id);
                                childTR.data('table_responsive_main_tr_index', trid);

                                var childTR_tbody = childTR.find('td>table>tbody');
                                _tr.find('.c-responsive-hidden').each(function () {
                                    var _td = $(this);
                                    if (_td.hasClass('hidden')) {
                                        return;
                                    }
                                    var cell_index = _td.data('table_responsive_cell_index');
                                    var html = '<tr class="c-responsive-detail-row">\
  <td class="c-cell-title">' + thead_tr.find('>th,>td').eq(cell_index).html() + '</td>\
</tr>';
                                    var newtr = childTR_tbody.append(html).find('>tr.c-responsive-detail-row').last();
                                    newtr.append(_td.clone()).find('>td').last().addClass('c-cell-content').removeClass('c-responsive-hidden');
                                });

                                childTR_tbody.find('[data-responsive--bind-click]').click(function () {
                                    var clickEl = $(this);
                                    var clickQuery = changeUtil.trim(clickEl.attr('data-responsive--bind-click'));
                                    if (clickQuery === '') {
                                        return;
                                    }
                                    var _child_tr = clickEl.parents('tr.c-responsive-detail-table-detail').eq(0);
                                    var main_tr = $('tr#' + _child_tr.data('table_responsive_main_tr_index')).eq(0);
                                    main_tr.find(clickQuery).eq(0).click();
                                });

                                if ($.isFunction(table_options.callbacks.render)) {
                                    table_options.callbacks.render({
                                        mainTR: _tr,
                                        childTR: childTR
                                    });
                                } else {
                                    var renderCallback = changeUtil.trim(table.attr('data-responsive-renderCallback'));
                                    if (renderCallback !== '') {
                                        renderCallback = changeUtil.getFunction(renderCallback);
                                        if (renderCallback !== false && $.isFunction(renderCallback)) {
                                            renderCallback({
                                                mainTR: _tr,
                                                childTR: childTR
                                            });
                                        }
                                    }
                                }
                            });
                        } else {
                            if ($.isFunction(table_options.callbacks.unRender)) {
                                table_options.callbacks.unRender({
                                    table: table
                                });
                            }
                        }
                    }
                };

                _Plugin.run();
            },

        };

        return {
            init: Plugin.init,
            goto: Plugin.goto,
            scroll: Plugin.scroll,
            checkbox: Plugin.checkbox,
            theadSort: Plugin.theadSort,
            responsive: Plugin.responsive
        };
    })();

    /**
     * 获取系统访问路径
     * @param {string} url url
     * @param {string} host hos
     */
    var getOSUrl = function (url, host) {
        host = host || changeConfig.host;
        host = changeUtil.trim(host);
        if (host === '') {
            host = changeConfig.host;
        }
        host = changeUtil.trimEnd(host, '/');
        url = changeUtil.trimStart(url, '/');
        if (url.toLowerCase().indexOf('http:/') === 0 || url.toLowerCase().indexOf('https:/') === 0) {
            return url;
        }
        var paras = [];
        // if (host !== '') {
        //     paras.push(host);
        // }
        paras.push(host);
        if (url !== '') {
            paras.push(url);
        }
        return paras.join('/');
    };

    /**
     * getFunction
     * @param {string} code 函数名
     */
    var getFunction = function (code) {
        var fn = window,
            parts = (code || "").split(".");
        while (fn && parts.length) {
            fn = fn[parts.shift()];
        }
        if (typeof (fn) === "function") {
            return fn;
        }
        return false;
    };

    /**
     * 加载 子table
     */
    var loadChildTable = function () {
        var Options = {
            table: null,
            targetQuery: '[type="button"][data-command="show-child-table"]',
            mode: {
                closeIcon: 'fa fa-chevron-right',
                openIcon: 'fa fa-chevron-down',
            },
            isCloseOther: true,
            childTableContainerClass: '',
            dataKey: 'trData',
            callbacks: {
                childLoad: function (content) {

                },
                targetCallback: function (childInfo) {

                },
                toggle: function (childInfo) {

                }
            },
            isInited: false,
            speed: 0.3 * 1000
        };
        var Plugin = {
            init: function (options) {
                Options = changeUtil.mix(Options, options);
                if (!changeUtil.isjQueryElement(Options.table) || Options.table.length !== 1) {
                    return;
                }
                Options.isInited = false;
                Options.table.find('>tbody>tr').each(function () {
                    var tr = $(this);
                    tr.addClass('c--tr');
                    var model = tr.data(Options.dataKey);
                    if (!model) {
                        return;
                    }
                    model.childTableUrl = changeUtil.trim(model.childTableUrl);
                    if (model.childTableUrl === '') {
                        return;
                    }

                    tr.find(Options.targetQuery).click(function () {
                        Plugin.openOrClose($(this));
                    });

                    var mainKey = changeUtil.getUniqueID('child_table_main_key_');
                    tr.attr('data-child-table-mode', 'close')
                        .attr('data-child-table-loaded', 'false')
                        .attr('child-table-main-key', mainKey)
                        .addClass('c--child-talbe-root-tr');
                    var childHtml = '<tr class="c--child-talbe-root-tr c-child-table-container-tr hidden" child-table-child-key="' + mainKey + '">\
  <td colspan="' + tr.find('>td').length + '" class="c-child-table ' + Options.childTableContainerClass + '">\
  </td>\
</tr>';
                    tr.after(childHtml);

                    Plugin._execute_openOrClose(tr, 'close');
                });

                Options.isInited = true;
            },
            _execute_openOrClose: function (tr, mode, isfist) {
                if (isfist !== false) {
                    isfist = isfist || true;
                }
                if (tr.hasClass('c----iscloseother-isfist')) {
                    return;
                }
                if (isfist === true) {
                    tr.addClass('c----iscloseother-isfist');
                }
                var isColse = changeUtil.trim(mode).toLowerCase() === 'close';
                if (!isColse && isfist === true && Options.isCloseOther === true) {
                    Options.table.find('>tbody>tr').each(function () {
                        var _tr = $(this);
                        if (_tr.hasClass('c----iscloseother-isfist') || _tr.hasClass('c-child-table-container-tr')) {
                            return;
                        }
                        Plugin._execute_openOrClose(_tr, 'close', false);
                        _tr.attr('data-child-table-mode', 'close');
                    })
                }

                var mainKey = changeUtil.trim(tr.attr('child-table-main-key'));
                var childContainer = tr.parent().find('>tr[child-table-child-key="' + mainKey + '"]');
                var isOpenImportant = Plugin._isOpenImportant(tr, true);

                tr.find(Options.targetQuery).each(function () {
                    var target = $(this);
                    if (isColse) {
                        target.html('<i class="' + Options.mode.closeIcon + '"></i>');
                    } else {
                        target.html('<i class="' + Options.mode.openIcon + '"></i>');
                    }
                    if (isOpenImportant === true) {
                        target.html('<i class="' + Options.mode.openIcon + '"></i>');
                    }
                });
                if (isOpenImportant === false) {
                    if (isColse) {
                        childContainer.find('>td.c-child-table>div').slideUp(Options.speed, function () {
                            childContainer.addClass('hidden');
                        });
                    } else {
                        childContainer.removeClass('hidden');
                        childContainer.find('>td.c-child-table>div').slideDown(Options.speed, function () {

                        });
                    }
                    if (Options.isInited === true &&
                        isfist === true &&
                        $.isFunction(Options.callbacks.toggle)) {
                        setTimeout(function () {
                            Options.callbacks.toggle(Plugin.getChildTableInfo(tr));
                        }, Options.speed);
                    }
                } else {
                    Plugin.loadChildTable(tr, function (success, data) {
                        tr.attr('data-child-table-mode', 'open');
                        if (childContainer.hasClass('hidden')) {
                            childContainer.removeClass('hidden');
                            childContainer.find('>td.c-child-table>div').slideDown(Options.speed, function () {

                            });
                        }
                        if ($.isFunction(Options.callbacks.targetCallback)) {
                            Options.callbacks.targetCallback(Plugin.getChildTableInfo(tr));
                        }
                    });

                }
                tr.removeClass('c----iscloseother-isfist');
            },
            openOrClose: function (el) {
                if (el.hasClass('c--lock')) {
                    return;
                }
                el.addClass('c--lock');
                var tr = el.parents('tr.c--tr').eq(0);
                if (tr.length !== 1) {
                    return;
                }
                tr.attr('data-child-table-mode', changeUtil.trim(tr.attr('data-child-table-mode')).toLowerCase() === 'close' ? 'open' : 'close');
                var mode = changeUtil.trim(tr.attr('data-child-table-mode'));

                var isLoaded = changeUtil.trim(tr.attr('data-child-table-loaded')).toLowerCase() === 'false';

                if (isLoaded && mode === 'open') {
                    Plugin.loadChildTable(tr, function (success, data) {
                        el.removeClass('c--lock');
                        if (success === true) {
                            tr.removeAttr('data-child-table-loaded');
                        }
                        Plugin._execute_openOrClose(tr, mode);
                    });
                } else {
                    el.removeClass('c--lock');
                    Plugin._execute_openOrClose(tr, mode);
                }


            },
            _isOpenImportant: function (tr, isRemoveClass) {
                var isOpenImportant = false;
                tr.find(Options.targetQuery).each(function () {
                    var target = $(this);
                    if (target.hasClass('c--open-important-4-child-table')) {
                        isOpenImportant = true;
                    }
                });
                if (isRemoveClass === true &&
                    isOpenImportant === true) {
                    tr.find(Options.targetQuery).removeClass('c--open-important-4-child-table');
                }
                return isOpenImportant;
            },
            getChildTableInfo: function (el) {
                if (!changeUtil.isjQueryElement(el)) {
                    return null;
                }
                var rootTr = el;
                if (!rootTr.hasClass('c--child-talbe-root-tr')) {
                    rootTr = el.parents('tr.c--child-talbe-root-tr').eq(0);
                }
                if (rootTr.length !== 1) {
                    return null;
                }
                var result = {};
                if (rootTr.hasClass('c-child-table-container-tr')) {
                    result.childTr = rootTr;
                    result.mainKey = changeUtil.trim(rootTr.attr('child-table-child-key'));
                    result.mainTr = rootTr.parent().find('>tr[child-table-main-key="' + result.mainKey + '"]');
                } else {
                    result.mainTr = rootTr;
                    result.mainKey = changeUtil.trim(rootTr.attr('child-table-main-key'));
                    result.childTr = rootTr.parent().find('>tr[child-table-child-key="' + result.mainKey + '"]');
                }
                result.container = result.mainTr.parent();
                result.childTableContainer = result.childTr.find('>td.c-child-table');
                result.target = result.mainTr.find(Options.targetQuery);
                return result;
            },
            loadChildTable: function (tr, callback) {
                changeUtil.block($('body'), { message: '请稍候，正在加载数据……' });
                var childInfo = Plugin.getChildTableInfo(tr);
                var model = tr.data(Options.dataKey);
                changeUtil.loadHtmlByUrl({
                    el: childInfo.childTableContainer,
                    url: model.childTableUrl,
                    success: function (data) {
                        changeUtil.unblock($('body'));
                        if ($.isFunction(Options.callbacks.childLoad)) {
                            Options.callbacks.childLoad(data.loadContent);
                        }
                        if ($.isFunction(callback)) {
                            callback(true, data);
                        }
                    },
                    error: function (data) {
                        if (data.loadContent) {
                            data.loadContent.html('页面加载失败！');
                        } else {
                            childInfo.childTableContainert.html(data.msg);
                        }
                        changeUtil.unblock($('body'));
                        if ($.isFunction(callback)) {
                            callback(false, data);
                        }
                    }
                });
            },
            refreshChildTable: function (options) {
                var ctInfo = null;
                if (options && options !== null && options.el) {
                    ctInfo = Plugin.getChildTableInfo(options.el);
                }
                if (ctInfo === null ||
                    ctInfo.mainTr.length !== 1 ||
                    ctInfo.target.length === 0) {
                    console.error('get child table info fail!');
                    return;
                }
                Options.callbacks.targetCallback = null;
                if (options && options.callbacks && $.isFunction(options.callbacks.targetCallback)) {
                    Options.callbacks.targetCallback = options.callbacks.targetCallback;
                }
                var target = ctInfo.target.eq(0);
                target.addClass('c--open-important-4-child-table');
                target.click();
            }
        };

        return {
            init: Plugin.init,
            refreshChildTable: Plugin.refreshChildTable
        };
    }();

    /**
     * 文本加密解密
     */
    var TextEnDe = function () {
        var Plugin = {
            /**
             * 文本加密
             * @param {string} text 加密文本
             * @param {string} key 加密key
             */
            encrypt: function (text, key) {
                try {
                    text = changeUtil.trim(text);
                    if (text === '') {
                        return '';
                    }
                    if (typeof key === 'undefined' || key === undefined || key === null) {
                        key = new RSAHelper.RSAKeyPair(changeConfig.RSAExponent, "", changeConfig.RSAModulus);
                    }
                    text = RSAHelper.encryptedString(key, text);
                } catch (error) {
                    text = '';
                }
                return text;
            },
            /**
             * 加密model
             * @param {object} options 配置参数
             */
            encryptModel: function (options) {
                var _options = {
                    model: {},
                    encryptKeys: [],
                    key: null
                };
                options = changeUtil.mix(_options, options)
                if ($.isArray(options.encryptKeys) && options.encryptKeys.length > 0) {
                    for (var index = 0; index < options.encryptKeys.length; index++) {
                        var key = changeUtil.trim(options.encryptKeys[index]);
                        if (key === '') {
                            continue;
                        }
                        if (typeof options.model[key] !== 'undefined') {
                            var value = options.model[key];
                            if (value !== null && value !== undefined) {
                                options.model[key] = Plugin.encrypt(value, options.key);
                            }
                        }
                    }
                }
                return options.model;
            }
        }

        return {
            encrypt: Plugin.encrypt,
            encryptModel: Plugin.encryptModel,
        }
    }();

    /**
     * 背景图片自动调整大小
     */
    var backgroundImgResize = function () {
        var Options = {
            container: $('body'),
            opacity: 1,
            imgSrc: '',
            center: true
        };
        var Plugin = {
            init: function (options) {
                Options = changeUtil.mix(Options, options);
                Options.imgSrc = changeUtil.getOSUrl(Options.imgSrc);

                $("<img/>").attr('src', Options.imgSrc).load(Options.imgSrc, function () {
                    var self = this;
                    Options.img = {
                        self: self,
                        el: $(this),
                        width: self.width,
                        height: self.height
                    };
                    var dataFlag = changeUtil.trim(Options.container.data('background_img_resize_data'));
                    if (dataFlag !== '') {
                        return;
                    }
                    var id = changeUtil.getUniqueID('background_img_resize_');
                    Options.container.data('background_img_resize_data', id);
                    Options.container.append('<div id="' + id + '"></div>');
                    Options.img.container = Options.container.find('>#' + id);
                    Options.img.container.removeAttr('id');
                    Options.img.container.html('<img src="' + Options.imgSrc + '" width="' + Options.img.width + '" height="' + Options.img.height + '" border="0" />');
                    Options.img.container.css("visibility", "hidden");
                    Options.img.el = Options.img.container.find('>img').eq(0);
                    Options.img.el.each(function () {
                        var el = $(this);
                        var wh = $(window).width();
                        el.css('width', self.width > wh ? self.width : wh);
                        el.css('height', self.height);
                    });
                    Plugin.resize(function () {
                        Plugin.resize();
                    });
                    $(window).bind("resize", function () {
                        Plugin.resize();
                    });
                });
            },
            resize: function (callback) {
                Options.img.container.css({
                    "position": "fixed",
                    "top": "0px",
                    "left": "0px",
                    "z-index": "-1",
                    "overflow": "hidden",
                    "width": $(window).width() + "px",
                    "height": $(window).height() + "px",
                    "opacity": Options.opacity
                });

                Options.img.el.css("position", "relative");

                var iw = Options.img.el.width();
                var ih = Options.img.el.height();

                if ($(window).width() > $(window).height()) {
                    if (iw > ih) {
                        var fRatio = iw / ih;
                        Options.img.el.css("width", $(window).width() + "px");
                        var newIh = Math.round($(window).width() * (1 / fRatio));
                        Options.img.el.css("height", newIh);
                        if (newIh < $(window).height()) {
                            var fRatio = ih / iw;
                            Options.img.el.css("height", $(window).height());
                            var latestWidth = Math.round($(window).height() * (1 / fRatio));
                            if (latestWidth < $(window).width()) {
                                latestWidth = $(window).width();
                            }
                            Options.img.el.css("width", latestWidth);
                        }
                    } else {
                        var fRatio = ih / iw;
                        Options.img.el.css("height", $(window).height());

                        var latestWidth = Math.round($(window).height() * (1 / fRatio));
                        if (latestWidth < $(window).width()) {
                            latestWidth = $(window).width();
                        }
                        Options.img.el.css("width", latestWidth);
                    }
                } else {
                    var fRatio = ih / iw;
                    Options.img.el.css("height", $(window).height());
                    var latestWidth = Math.round($(window).height() * (1 / fRatio));
                    if (latestWidth < $(window).width()) {
                        latestWidth = $(window).width();
                    }
                    Options.img.el.css("width", latestWidth);
                }

                if (typeof (Options.center) == 'undefined' || Options.center) {
                    if (Options.img.el.width() > $(window).width()) {
                        var this_left = (Options.img.el.width() - $(window).width()) / 2;
                        Options.img.el.css({
                            "top": 0,
                            "left": -this_left,
                            "width": $(window).width()
                        });
                    }
                    if (Options.img.el.height() > $(window).height()) {
                        var this_height = (Options.img.el.height() - $(window).height()) / 2;
                        Options.img.el.css({
                            "left": 0,
                            "top": -this_height,
                            "height": $(window).height()
                        });
                    }

                    if (Options.img.el.width() <= $(window).width()) {
                        Options.img.el.css({
                            "left": 0,
                        });
                    }

                    if (Options.img.el.height() <= $(window).height()) {
                        Options.img.el.css({
                            "top": 0,
                        });
                    }
                }

                Options.img.container.css({
                    "visibility": "visible"
                });

                if ($.isFunction(callback)) {
                    callback();
                }
            }
        };

        return Plugin.init;
    }();

    /**
     * 加载页面视图
     */
    var loadPageView = function () {
        var Options = {
            el: null,
            callback: function (el) {

            }
        };
        var Plugin = {
            init: function (options) {
                options = changeUtil.mix(Options, options);
                if (!options.el) {
                    return;
                }
                options.el.each(function () {
                    var el = $(this);
                    var model = changeUtil.getHtmlValue({
                        el: el.find(">.hidden.c-loadpage--data"),
                        key: "data-name",
                        destroy: true
                    });
                    var loadbeforeEl = el.find('.c-load-before[data-command="load-before"]');
                    if (loadbeforeEl.length === 1) {
                        var listCount = Math.round(loadbeforeEl.height() / 40);
                        listCount = listCount < 3 ? 3 : listCount;

                        loadbeforeEl.cLoadBefore({
                            listCount: listCount - 1,
                        });
                        changeUtil.block(loadbeforeEl, {
                            opacity: 0,
                            type: "loader",
                            state: "primary",
                            size: "lg",
                            message: "请稍候，正在加载数据..."
                        });
                    }

                    if (model._cHasHtmlValue === true && model.url !== undefined) {
                        var url = changeUtil.trim(model.url);
                        var paramsArray = [];
                        if (model.params !== undefined && $.isArray(model.params) && model.params.length > 0) {
                            for (var index = 0; index < model.params.length; index++) {
                                var param = model.params[index];
                                try {
                                    if (param['paramName'] !== undefined && param['paramValue'] !== undefined) {
                                        var paramName = changeUtil.trim(param['paramName']);
                                        var paramValue = changeUtil.trim(param['paramValue']);
                                        if (paramName !== '' && paramValue !== '') {
                                            paramsArray.push(paramName + "=" + paramValue);
                                        }
                                    }
                                } catch (error) {
                                    continue;
                                }
                            }
                        }
                        if (paramsArray.length > 0) {
                            url += '?' + paramsArray.join("&");
                        }

                        changeUtil.loadHtmlByUrl({
                            el: el,
                            url: url,
                            success: function (data) {
                                if (options.callback && $.isFunction(options.callback)) {
                                    options.callback(data);
                                }
                            },
                            error: function (data) {
                                el.html('页面视图加载失败！');
                            },

                        });
                    }
                });
            },
        };

        return Plugin.init;
    }();

    /**
     * 滚动监听
     */
    var scrollMonitor = function () {
        var _Options = {
            el: null,
            /**
             * scroll对象：可以是对象，也可以是查询关键字。默认值为：$(window)； 若el：c-scroll-top--target 属性为有效查询关键字，则以自身优先
             */
            scrollTarget: $(window),
            /**
             * 偏移量：可以是数值，也可以是方法。默认值为：0；若el：c-scroll-top--offset 属性为有效数值，则以自身优先
             */
            offset: 0,
            callback: function (options) {
                //options.el 
                //options.status -1：无效；0:未开始；1：开始；2：离开；
            },
            /**
             * 是否监听全局 配合window.scrollMonitor_index：window.scrollMonitor_index>0 启用 window.scrollMonitor_index<=-1000 销毁，默认：否
             */
            isMonitorGlobal: false,
            /**
             * 监听间隔秒数/单位：秒 默认：1秒
             */
            monitorGlobalInterval: 1,
        };
        var Plugin = {
            init: function (options) {
                var Options = changeUtil.mix(_Options, options);
                if (!changeUtil.isjQueryElement(Options.el)) {
                    return;
                }
                if (window.scrollMonitor_index === undefined) {
                    window.scrollMonitor_index = 0;
                }
                Options.el.each(function () {
                    var el = $(this);
                    el.data('c_scroll_Monitor_Options', Options);
                    // $(window).scroll(function () {
                    //     Plugin.scroll(el);
                    // });
                    $(window).resize(function () {
                        Plugin.scroll(el, true);
                    });
                    Plugin.run(el);

                    if (Options.isMonitorGlobal === true) {
                        Options.monitorGlobalInterval = changeUtil.getFloat(Options.monitorGlobalInterval);
                        Options.monitorGlobalInterval = Options.monitorGlobalInterval <= 0 ? 1 : Options.monitorGlobalInterval;

                        var MonitorGlobalInterval = setInterval(function () {
                            if (window.scrollMonitor_index === undefined) {
                                clearInterval(MonitorGlobalInterval);
                                return;
                            }
                            var scrollMonitor_index = changeUtil.getInt(window.scrollMonitor_index);
                            if (scrollMonitor_index <= -1000) {
                                clearInterval(MonitorGlobalInterval);
                                return;
                            } else if (scrollMonitor_index <= 0) {
                                return;
                            }
                            window.scrollMonitor_index = scrollMonitor_index - 1;
                            Plugin.run(el);
                        }, Options.monitorGlobalInterval * 1000);

                        // Plugin.setTimeoutExecuteRUN(el, 10);
                    }
                    // Plugin.setTimeoutExecuteRUN(el, 10);
                });
                delete Options.el;
            },
            setTimeoutExecuteRUN: function (el, count) {
                if (!changeUtil.isjQueryElement(el)) {
                    return;
                }
                count = count <= 1 ? 2 : count;
                // Plugin.run(el);
                for (var index = 1; index < count; index++) {
                    setTimeout(function () {
                        Plugin.run(el);
                    }, index * 100);
                }
            },
            scroll: function (el, isresize) {
                var Options = el.data('c_scroll_Monitor_Options');
                if (!Plugin.checkIsEffective(el)) {
                    Plugin.callback(el, -1, isresize);
                    return;
                }
                var scrollTarget = Plugin.getScrollTopEl(el);
                var scrollTop = scrollTarget.scrollTop();
                var elOffset = el.offset();
                elOffset.height = el.height();
                elOffset.outerHeight = el.outerHeight();
                elOffset.innerHeight = el.innerHeight();
                var offset = Plugin.getOffset(el);
                var startValue = scrollTop + offset;
                if (startValue <= 0 || elOffset.top >= startValue) {
                    Plugin.callback(el, 0, isresize);
                    el.data('c_scroll_offset', elOffset);
                    return;
                }
                // elOffset.newTop = elOffset.top + offset;
                elOffset.newTop = Math.abs(elOffset.top) + offset;
                elOffset.bottom = elOffset.height + elOffset.newTop;
                // elOffset.bottom = elOffset.height + elOffset.top;
                elOffset.offset = offset;
                elOffset.startValue = startValue;
                elOffset.scrollTop = scrollTop;

                el.data('c_scroll_offset', elOffset);

                if (scrollTop <= elOffset.bottom) {
                    Plugin.callback(el, 1, isresize);
                } else {
                    Plugin.callback(el, 2, isresize);
                }
            },
            callback: function (el, status, isresize) {
                try {
                    var Options = el.data('c_scroll_Monitor_Options');
                    //options.status -1：无效；0:未开始；1：开始；2：离开；
                    if (Options.callback && $.isFunction(Options.callback)) {
                        Options.status_describe = ' -1：无效/none；0:未开始/un_in；1：开始/in；2：离开/out';
                        var scrollMonitorData = Plugin.get_GlobalScrollMonitorData(el);
                        Options.callback(changeUtil.mix(Options, {
                            el: el,
                            status: status,
                            scrollMonitorData: scrollMonitorData,
                            isresize: isresize === true
                        }));
                    }
                } catch (error) {

                }
            },
            getOffset: function (el) {
                var Options = el.data('c_scroll_Monitor_Options');
                var offset = parseFloat(el.attr('c-scroll-top--offset'));
                if (!isNaN(offset)) {
                    return offset;
                }
                if ($.isFunction(Options.offset)) {
                    offset = parseFloat(Options.offset(changeUtil.mix(Options, {
                        el: el,
                    })));
                    if (!isNaN(offset)) {
                        return offset;
                    }
                }
                offset = parseFloat(Options.offset);
                if (!isNaN(offset)) {
                    return offset;
                }
                return 0;
            },
            getScrollTopEl: function (el) {
                try {
                    var Options = el.data('c_scroll_Monitor_Options');
                    var scrollTarget = changeUtil.trim(el.attr('c-scroll-top--target'));
                    if (scrollTarget != '') {
                        try {
                            scrollTarget = $(scrollTarget);
                            return scrollTarget.eq(0);
                        } catch (error) {

                        }
                    }
                    if (changeUtil.isjQueryElement(Options.scrollTarget) && Options.scrollTarget.length === 1) {
                        return Options.scrollTarget;
                    } else if (typeof Options.scrollTarget === "string") {
                        try {
                            scrollTarget = $(Options.scrollTarget);
                            return scrollTarget;
                        } catch (error) {

                        }
                    }
                    return $(window);
                } catch (error) {
                    return $(window);
                }
            },
            /**
             * 检查是否需要执行 滚动监听
             * @param {element} el element
             */
            checkIsEffective: function (el) {
                try {
                    var Options = el.data('c_scroll_Monitor_Options');
                    if (!changeUtil.isjQueryElement(el) || el.length !== 1) {
                        return false;
                    }
                    var stop = false;
                    var result = true;
                    var _execute = function (_el) {
                        if (_el.hasClass('hidden') || _el.hasClass('hide') || _el.css('display') === 'none') {
                            result = false;
                            stop = true;
                            return false;
                        }
                        if (_el[0].nodeName.toLowerCase() === 'body') {
                            stop = true;
                        }
                        return true;
                    };
                    while (stop === false && _execute(el)) {
                        el = el.parent();
                        _execute(el);
                    }
                    return result;
                } catch (error) {
                    return false;
                }
            },
            reset_GlobalScrollMonitorData: function (el) {
                var Options = el.data('c_scroll_Monitor_Options');
                var scrollTarget = Plugin.getScrollTopEl(el);
                var data_scrollMonitor = Plugin.get_GlobalScrollMonitorData(el);
                var prevScrollTop = data_scrollMonitor.currentScrollTop;
                data_scrollMonitor.scroll = scrollTarget;
                data_scrollMonitor.isToUp = false;
                data_scrollMonitor.isToDown = false;
                data_scrollMonitor.prevScrollTop = prevScrollTop;
                data_scrollMonitor.currentScrollTop = scrollTarget.scrollTop();
                if (prevScrollTop === -1 || data_scrollMonitor.currentScrollTop === 0) {
                    return data_scrollMonitor;
                }

                if (data_scrollMonitor.prevScrollTop > data_scrollMonitor.currentScrollTop) {
                    data_scrollMonitor.isToUp = true;
                } else if (data_scrollMonitor.prevScrollTop < data_scrollMonitor.currentScrollTop) {
                    data_scrollMonitor.isToDown = true;
                }
                return data_scrollMonitor;
            },
            get_GlobalScrollMonitorData: function (el) {
                var scrollTarget = Plugin.getScrollTopEl(el);
                var data_scrollMonitor = scrollTarget.data('data_scrollMonitor');
                if (data_scrollMonitor === undefined) {
                    data_scrollMonitor = {
                        prevScrollTop: -1,
                        currentScrollTop: scrollTarget.scrollTop(),
                        isToUp: false,
                        isToDown: false,
                    };
                    scrollTarget.data('data_scrollMonitor', data_scrollMonitor);
                }
                return data_scrollMonitor;
            },
            run: function (el) {
                var scrollTarget = Plugin.getScrollTopEl(el);
                Plugin.reset_GlobalScrollMonitorData(el);
                scrollTarget.scroll(function (_el) {
                    Plugin.reset_GlobalScrollMonitorData(el);
                    Plugin.scroll(el);
                });
                Plugin.scroll(el);
            },
        };

        return Plugin.init;
    }();

    /**
     * 页面元素固定
     */
    var sticky = function () {
        var _Options = {
            el: null,
            /**
             * 粘住对象：不可为空对象；可以是对象，也可以是查询关键字。默认值为：body； 若el：c-sticky--container 属性为有效查询关键字，则以自身优先
             */
            stickyContainer: 'body',
            /**
             * stickyClass：多个以空格隔开
             */
            stickyClass: 'c-sticky',
            /**
             * 偏移量：可以是数值，也可以是方法。默认值为：0；若el：c-sticky--offset 属性为有效数值，则以自身优先
             */
            offset: 0,
            /**
             * 距离顶部距离：可以是数值，也可以是方法。默认值为：0；若el：c-sticky--margin-top 属性为有效数值，则以自身优先
             */
            marginTop: 0,
            /**
             * 最小视图窗口，大于0时有效
             */
            minWindowWidth: 0,
            /**
             * 是否是克隆新对象
             */
            isClone: false,
            /**
             * 是否是在元素后面插入占位元素，默认是，否则在元素之前
             */
            isAfter: true,
            scrollTargetQuery: '',
            /**
             * 是否监听全局 配合window.scrollMonitor_index：window.scrollMonitor_index>0 启用 window.scrollMonitor_index<=-1000 销毁，默认：否
             */
            isMonitorGlobal: false,
            /**
             * 监听间隔秒数/单位：秒 默认：1秒
             */
            monitorGlobalInterval: 1,
            /**
             * z-index 默认10
             */
            zIndex: 10,
            /**
             * 回调函数
             * @param {element} el 粘住对象
             * @param {object} opt1 参数1 自身参数/sticky
             * @param {object} opt2 参数2 滚动监听参数/scrollMonitor
             */
            callback: function (el, opt1, opt2) {
                //options.el 
                //opt2.status -1：无效；0:未开始；1：开始；2：离开；
            },
        };
        var Plugin = {
            init: function (options) {
                var Options = changeUtil.mix(_Options, options);
                if (!changeUtil.isjQueryElement(Options.el)) {
                    return;
                }
                Options.el.each(function () {
                    var el = $(this);
                    el.data('c_sticky_Options', Options);

                    changeUtil.scrollMonitor({
                        el: Plugin.getContainer(el),
                        isMonitorGlobal: Options.isMonitorGlobal,
                        monitorGlobalInterval: Options.monitorGlobalInterval,
                        offset: function (options) {
                            return Plugin.getOffset(options.el.data('c_sticky_el'));
                        },
                        callback: function (options) {
                            Plugin.callback(options.el.data('c_sticky_el'), options);
                        }
                    });
                });
                delete Options.el;
            },
            getContainer: function (el) {
                var Options = el.data('c_sticky_Options');
                var stickyContainer = changeUtil.trim(el.attr('c-sticky--container'));
                if (stickyContainer != '') {
                    try {
                        stickyContainer = $(stickyContainer);
                        stickyContainer = stickyContainer.eq(0);
                        stickyContainer.data('c_sticky_el', el);
                        Plugin.initScrollTarget(Options, stickyContainer);
                        return stickyContainer;
                    } catch (error) {

                    }
                }
                if (changeUtil.isjQueryElement(Options.stickyContainer) && Options.stickyContainer.length === 1) {

                    stickyContainer = Options.stickyContainer.eq(0);
                    stickyContainer.data('c_sticky_el', el);
                    Plugin.initScrollTarget(Options, stickyContainer);
                    return stickyContainer;
                } else if (typeof Options.stickyContainer === "string") {
                    try {
                        stickyContainer = $(Options.stickyContainer);
                        stickyContainer = stickyContainer.eq(0);
                        stickyContainer.data('c_sticky_el', el);
                        Plugin.initScrollTarget(Options, stickyContainer);
                        return stickyContainer;

                    } catch (error) {

                    }
                }

                stickyContainer = $('body').eq(0);
                stickyContainer.data('c_sticky_el', el);
                Plugin.initScrollTarget(Options, stickyContainer);
                return stickyContainer;
            },
            initScrollTarget: function (Options, el) {
                Options.scrollTargetQuery = changeUtil.trim(Options.scrollTargetQuery);
                if (Options.scrollTargetQuery === '') {
                    return;
                }
                el.attr('c-scroll-top--target', Options.scrollTargetQuery);
            },
            sticky: function (el, options) {
                var Options = el.data('c_sticky_Options');
                var id = changeUtil.trim(el.attr('id'));
                if (id === '') {
                    id = changeUtil.getUniqueID('c_sticky_');
                    el.attr('id', id);
                }
                var cloneEl = $('[c-sticky-clone-id="' + id + '"]');

                if (options.status === 1) {
                    if (cloneEl.length !== 1) {
                        if (cloneEl.length > 0) {
                            cloneEl.remove();
                        }
                        if (Options.isClone === true) {
                            cloneEl = el.clone();
                            cloneEl.removeAttr('id');
                            cloneEl.attr('c-sticky-clone-id', id);
                            if (Options.isAfter === true) {
                                el.after(cloneEl);
                            } else {
                                el.before(cloneEl);
                            }
                        } else {
                            if (Options.isAfter === true) {
                                el.after('<div c-sticky-clone-id="' + id + '" >&nbsp;</div>');
                            } else {
                                el.before('<div c-sticky-clone-id="' + id + '" >&nbsp;</div>');
                            }
                            cloneEl = $('[c-sticky-clone-id="' + id + '"]').eq(0);
                            // Plugin.css(cloneEl, { width: el.outerWidth(), height: el.outerHeight() });
                            Plugin.css(cloneEl, { width: "100%", height: el.outerHeight() });
                        }
                    }
                    el.removeAttr('style');
                    var container = $('body>.c-app-container--root');

                    var scroll_offset = options.el.data('c_scroll_offset');
                    scroll_offset.containerHeight = container.height();
                    scroll_offset.windowHeight = $(window).height();

                    var marginTop = Plugin.getMarginTop(el);
                    if (el.outerHeight() + marginTop >= scroll_offset.windowHeight &&
                        scroll_offset.startValue >= el.outerHeight() * 0.9 + scroll_offset.newTop) {
                        var _bottom = 0;
                        if (scroll_offset.outerHeight - scroll_offset.startValue >= scroll_offset.windowHeight - scroll_offset.newTop) {
                            _bottom = 0;
                        } else {
                            _bottom = scroll_offset.containerHeight - scroll_offset.height - scroll_offset.newTop;
                        }
                        Plugin.css(el, {
                            position: "fixed",
                            width: cloneEl.width(),
                            bottom: _bottom,
                            left: cloneEl.offset().left,
                            'z-index': Options.zIndex
                        });
                    } else {
                        Plugin.css(el, {
                            position: "fixed",
                            width: cloneEl.width(),
                            top: marginTop,
                            left: cloneEl.offset().left,
                            'z-index': Options.zIndex
                        });
                    }

                    Plugin.addOrRemoveClass(el, true);
                } else {
                    cloneEl.remove();
                    // Plugin.css(el, { position: "", width: "", top: "", left: "", 'z-index': 0 });
                    el.removeAttr('style');
                    Plugin.addOrRemoveClass(el, false);
                }
            },
            addOrRemoveClass: function (el, isAdd) {
                var stickyClass = Plugin.getStickyClass(el);
                if (stickyClass.length === 0) {
                    return;
                }
                for (var index = 0; index < stickyClass.length; index++) {
                    var _class = stickyClass[index];
                    try {
                        if (isAdd === true) {
                            el.addClass(_class);
                        } else {
                            el.removeClass(_class);
                        }
                    } catch (error) {

                    }

                }
            },
            getStickyClass: function (el) {
                var Options = el.data('c_sticky_Options');
                Options.stickyClass = changeUtil.trim(Options.stickyClass);
                var stickyClass = [];
                if (Options.stickyClass === '') {
                    stickyClass.push('c-sticky');
                    return stickyClass;
                }
                var temp = Options.stickyClass.split(' ');
                for (var index = 0; index < temp.length; index++) {
                    var child_class = changeUtil.trim(temp[index]);
                    if (child_class === '') {
                        continue;
                    }
                    if (changeUtil.array.hasValue(stickyClass, child_class)) {
                        continue;
                    }
                    stickyClass.push(child_class);
                }
                return stickyClass;
            },
            css: function (el, properties) {
                for (var property in properties) {
                    if (properties.hasOwnProperty(property)) {
                        try {
                            el.css(property, properties[property]);
                        } catch (error) {

                        }
                    }
                }
            },
            callback: function (el, options) {
                var Options = el.data('c_sticky_Options');
                options.status_describe = ' -1：无效/none；0:未开始/un_in；1：开始/in；2：离开/out';
                if (el.height() * 1 > $(window).height()) {
                    options.status = -1;
                }

                if (Options.minWindowWidth > 0 && Options.minWindowWidth > $(window).width()) {
                    options.status = -1;
                }

                Plugin.sticky(el, options);

                if (Options.callback && $.isFunction(Options.callback)) {
                    Options.callback(el, Options, options);
                }
            },
            getOffset: function (el) {
                var Options = el.data('c_sticky_Options');
                var offset = parseFloat(el.attr('c-sticky--offset'));
                if (!isNaN(offset)) {
                    return offset;
                }
                if ($.isFunction(Options.offset)) {
                    offset = parseFloat(Options.offset(changeUtil.mix(Options, {
                        el: el,
                    })));
                    if (!isNaN(offset)) {
                        return offset;
                    }
                }
                offset = parseFloat(Options.offset);
                if (!isNaN(offset)) {
                    return offset;
                }
                return 0;
            },
            getMarginTop: function (el) {
                var Options = el.data('c_sticky_Options');
                var marginTop = parseFloat(el.attr('c-sticky--margin-top'));
                if (!isNaN(marginTop)) {
                    return marginTop;
                }
                if ($.isFunction(Options.marginTop)) {
                    marginTop = parseFloat(Options.marginTop(el));
                    if (!isNaN(marginTop)) {
                        return marginTop;
                    }
                }
                marginTop = parseFloat(Options.marginTop);
                if (!isNaN(marginTop)) {
                    return marginTop;
                }
                return 0;
            },
        };

        return Plugin.init;
    }();

    /**
     * 进度
     */
    var progress = function () {
        var Options = {
            el: null,
            /**
             * 模式：true/false,true:添加；false:移除
             */
            mode: true,
            class: 'mat-primary'
        };
        var Plugin = {
            /**
             * 进度条
             * @param {object} options 配置参数
             * @param {bool} mode 模式：true/false,true:添加；false:移除
             */
            bar: function (options) {
                options = changeUtil.mix(Options, options);
                if (options.mode === false) {
                    options.el.fadeOut(function () {
                        options.el.html('').fadeIn();
                    });
                    return;
                }

                var progress_html = '<div class="mat-progress-bar ' + options.class + '" mode="indeterminate" role="progressbar">\
  <div class="mat-progress-bar-buffer mat-progress-bar-element"></div>\
  <div class="mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"></div>\
  <div class="mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"></div>\
</div>';
                options.el.html(progress_html);
            },
            progress: function () {
                var progressTimer = null;
                var totalCount = 0;
                var count = 0;
                var id = '';
                var container = null;
                var progress = null;
                var _Plugin = {
                    start: function (limitCount, text) {
                        if (progressTimer != null) {
                            return;
                        }
                        limitCount = limitCount || 1;
                        text = text || '请稍候，正在执行操作……';
                        count = 0;
                        totalCount = limitCount;
                        totalCount = totalCount < 1000 ? 1000 : totalCount;
                        id = changeUtil.getUniqueID('progress_');
                        // $('body>.custom-progress-1').remove();
                        // $('body>.custom-progress-1.c--progress').removeClass('c--progress');
                        var html = '\
                        <div class="custom-progress-1 d-flex noselect" id="'+ id + '">\
                            <div class="custom-progress-1--content animated fadeInUp">\
                                <div class="progress">\
                                    <div class="progress-bar" role="progressbar" style="width:0%;"></div>\
                                </div>\
                                <div class="custom-progress-1--text d-flex">\
                                    <div class="custom-progress-1--text-content d-flex">\
                                        <div class="text">'+ text + '</div>\
                                        <div class="kt-spinner kt-spinner--sm kt-spinner--brand"></div>\
                                    </div>\
                                </div>\
                            </div>\
                        </div>\
                        ';
                        $('body').append(html);
                        container = $('body>#' + id + '').eq(0);
                        progress = container.find('.progress>.progress-bar').eq(0);
                        _Plugin.render();
                        progressTimer = setInterval(function () {
                            _Plugin.render();
                        }, 1);
                    },
                    finish: function () {
                        clearInterval(progressTimer);
                        progressTimer = null;
                        progress.css('width', '100%');
                        container.find('.custom-progress-1--content').removeClass('fadeInUp').addClass('fadeOutDown');
                        setTimeout(function () {
                            container.remove();
                        }, 500);
                    },
                    render: function () {
                        count++;
                        var percent = count / totalCount * 100;
                        if (percent > 95) {
                            return;
                        }
                        progress.css('width', '' + percent + '%');
                    }
                };

                return {
                    start: _Plugin.start,
                    finish: _Plugin.finish,
                };
            }(),
        };

        return {
            /**
             * 进度条
             */
            bar: Plugin.bar,
            /**
             * 
             */
            progress: Plugin.progress,
        };
    }();


    /**
     * 加载错误页面
     */
    var loadErrorHtml = function () {
        var Plugin = {
            init: function (options) {
                var _options = {
                    el: null,
                    text: '页面加载失败！',
                    icon: 'flaticon-danger',
                    minHeight: 240
                };
                options = changeUtil.mix(_options, options);
                if (!changeUtil.isjQueryElement(options.el)) {
                    return;
                }
                var html = '<div class="c-data-empty noselect" style="min-height:' + options.minHeight + 'px;"><p><i class="c-data-empty-icon ' + options.icon + '"></i>' + options.text + '</p></div>';
                options.el.html(html);
            }
        };
        return Plugin.init;
    }();

    /**
     * 查看输入的密码
     */
    var viewInputPassWord = function () {
        var Plugin = {
            init: function (els) {
                if (!changeUtil.isjQueryElement(els)) {
                    return;
                }
                els.each(function () {
                    var el = $(this);
                    Plugin.execute(el);
                });

            },
            execute: function (el) {
                if (el.find('>input[type="password"]').length !== 1 ||
                    el.find('>input[type="text"]').length > 0 ||
                    el.find('>button[type="button"]').length > 0) {
                    return;
                }
                el.addClass('c--view-password').addClass('c-view-password');

                el.append('\
<button type="button" class="c-view-password--button">\
	<i class="c--view la la-eye"></i>\
	<i class="c--hide la la-eye-slash"></i>\
</button>');

                el.find('>button[type="button"]').click(function () {
                    var input = $(this);
                    var parent = input.parents('.c--view-password').eq(0);
                    var password = parent.find('>input[type="password"],>input[type="text"]');
                    if (parent.hasClass('c--view')) {
                        parent.removeClass('c--view');
                        password.attr('type', 'password');
                    } else {
                        parent.addClass('c--view');
                        password.attr('type', 'text');
                    }
                });
            }
        };

        return Plugin.init;
    }();

    /**
     * XSS 过滤
     * 需要集成 xss.js/xss.min.js
     * @param {string} text 待处理的文本
     * @param {Array} selfProhibitTags 自定义禁止标签数组 ['html', 'meta', 'link', 'script', 'head', 'style', 'body']
     * @returns {string} 返回XSS过滤之后的文本
     */
    var FilterXSS = function (text, selfProhibitTags) {
        if (typeof text !== "string") {
            return "";
        }
        if (typeof filterXSS === "function") {
            text = filterXSS(text, {}, selfProhibitTags);
        }
        return text;
    };

    /**
     * 初始化 Tooltip
     * @param {jqueryElement} elements 触发对象
     */
    var initTooltip = function (elements) {
        if (!changeUtil.isjQueryElement(elements)) {
            return;
        }
        //// data-skin="light", data-skin="brand" or data-skin="dark"
        elements.each(function () {
            KTApp.initTooltip($(this));
        });
    };

    /**
     * 初始化 initTooltips [data-toggle="kt-tooltip"],[data-tooltip="kt-tooltip"],.c--kt-tooltip,.c--tooltip
     */
    var initTooltips = function () {
        changeUtil.initTooltip($('[data-toggle="kt-tooltip"],[data-tooltip="kt-tooltip"],.c--kt-tooltip,.c--tooltip'));
    };

    return {
        /**
         * 去除文本两端空格
         */
        trim: trim,

        /**
         * 去除文本所有空格
         */
        trimAll: trimAll,

        /**
         * 去除开头文本
         */
        trimStart: trimStart,

        /**
         * 去除结尾文本
         */
        trimEnd: trimEnd,

        /**
         * 获取int类型值， 默认返回0
         */
        getInt: getInt,

        /**
         * 获取float类型值， 默认返回0
         */
        getFloat: getFloat,

        /**
         * 将两个对象合并成一个对象
         */
        mix: mix,

        /**
         * array 数组帮助类
         */
        array: array,

        /**
         * date 日期帮助类
         */
        date: date,

        /**
         * 获取 html 格式值
         */
        getHtmlValue: getHtmlValue,

        /**
         * object To FormData
         */
        objectToFormData: objectToFormData,

        /**
         * 禁用回车事件
         */
        disableEnter: disableEnter,

        /**
         * 回车事件
         */
        enter: enter,

        /**
         * 按钮分身事件
         */
        btnAvatar: btnAvatar,

        /**
         * 判断一个元素是否是jQuery对象
         */
        isjQueryElement: isjQueryElement,

        /**
         * 判断一个元素是否是HTMLElement对象
         */
        isHTMLElement: isHTMLElement,

        /**
         * 获取标签所有属性
         */
        getAttributes: getAttributes,

        /**
         * 获取id唯一值
         */
        getUniqueID: getUniqueID,

        /**
         * 根据父元素的名称获取父元素
         */
        getParentByClassName: getParentByClassName,

        /**
         * 转义html标签
         */
        htmlEncode: htmlEncode,

        /**
         * 过滤html标签
         */
        htmlDecode: htmlDecode,

        /**
         * unobtrusive 验证帮助类
         */
        unobtrusive: unobtrusive,

        /**
         * toastr Helper类
         */
        toastrHelper: toastrHelper,

        /**
         * 浏览器版本 帮助类
         */
        browserVersion: browserVersion,

        /**
         * maxlength
         */
        maxlength: maxlength,

        /**
         * 页面元素加载效果
         */
        block: block,

        /**
         * 取消页面元素加载效果
         */
        unblock: unblock,

        /**
         * 动态移动至指定元素
         */
        scrollTo: scrollTo,

        /**
         * 滚动至页面顶部
         */
        scrollTop: scrollTop,

        /**
         * 自定义alert
         */
        alert: alert,

        /**
         * swal Helper
         */
        swalHelper: swalHelper,

        /**
         * 自定义 swal
         */
        swalCustom: swalCustom,

        /**
         * datepicker yyyy.mm.dd
         */
        datepicker: datepicker,

        /**
         * datetimepicker yyyy.mm.dd hh:ii
         */
        datetimepicker: datetimepicker,

        /**
         * timepicker hh:mm:ss
         */
        timepicker: timepicker,

        /**
         * daterangepicker 日期范围
         */
        daterangepicker: daterangepicker,

        /**
         * summernote
         */
        summernote: summernote,

        /**
         * 关键词输入控件 keyWordsControl
         */
        keyWordsControl: keyWordsControl,

        /**
         * 文本输入检索事件 inputSearchControl
         */
        inputSearchControl: inputSearchControl,

        /**
         * carousel
         */
        carousel: carousel,

        /**
         * 模态窗口
         */
        modal: modal,

        /**
         * 高斯模糊
         */
        blur: blur,

        /**
         * 取消高斯模糊
         */
        unblur: unblur,

        /**
         * 通过Url加载html页面
         */
        loadHtmlByUrl: loadHtmlByUrl,

        /**
         * window.location.href
         */
        locationHref: locationHref,

        /**
         * autosize
         */
        autosize: Autosize,

        /**
         * TableHelper
         */
        TableHelper: TableHelper,

        /**
         * 获取系统访问路径
         */
        getOSUrl: getOSUrl,

        /**
         * getFunction
         */
        getFunction: getFunction,

        /**
         * 加载 子table
         */
        loadChildTable: loadChildTable,

        /**
         * 文本加密解密
         */
        TextEnDe: TextEnDe,

        /**
         * 背景图片自动调整大小
         */
        backgroundImgResize: backgroundImgResize,

        /**
         * 加载页面视图
         */
        loadPageView: loadPageView,

        /**
         * 滚动监听
         */
        scrollMonitor: scrollMonitor,

        /**
         * 页面元素固定
         */
        sticky: sticky,

        /**
         * 进度
         */
        progress: progress,

        /**
         * 加载错误页面
         */
        loadErrorHtml: loadErrorHtml,

        /**
         * 查看输入的密码
         */
        viewInputPassWord: viewInputPassWord,

        /**
         * XSS 过滤
         * 需要集成 xss.js/xss.min.js
         */
        FilterXSS: FilterXSS,

        /**
        * 初始化 Tooltip
        */
        initTooltip: initTooltip,

        /**
         * 初始化 initTooltips [data-toggle="kt-tooltip"],[data-tooltip="kt-tooltip"],.c--kt-tooltip,.c--tooltip
         */
        initTooltips: initTooltips,
    };
}();

/**
 * 系统框架类
 */
var changeApp = function () {

    /**
     * 初始化所有函数
     */
    var init = function () {
        var rootData = changeUtil.getHtmlValue({
            el: $(".hidden.c-page-global-root-data"),
            key: "data-name",
            query: 'global-root-data',
            valueKey: 'data-value',
            destroy: true
        });

        if (rootData._cHasHtmlValue === true) {
            changeConfig = changeUtil.mix(changeConfig, rootData);
        }

        // changeUtil.btnAvatar($('[data-command="btnAvatar"]'));
        // changeUtil.browserVersion.lowVersionStopAccess();
        //// to do
        // changeUtil.browserVersion.lowVersionStopAccess('DownloadBrowsers.html');
        // changeUtil.browserVersion.lowVersionStopAccess('System/Home/DownloadBrowsers');
        changeUtil.maxlength($('.c-command-maxlength,.c--maxlength'));
        changeUtil.autosize($("textarea.c--autosize"));
        changeUtil.TableHelper.responsive($('.c-table-responsive-container'));

        mApp.initTooltip($('.c--tooltip'));

        initSelectpicker();
        initAutocomplete();

        changeUtil.initTooltips();

        changeUtil.viewInputPassWord($('.c-view-password'));

        changeUtil.datepicker($('.c-datepicker'));
        changeUtil.daterangepicker($(".c--daterangepicker"));
        changeUtil.unobtrusive.pageModelState();

        platformLogout($('#c_global_logout_os'));

        clearSearchFormData($('form [type="button"][data-command="clear-form-data"]'));

        $('html>div').remove();
    };

    /**
     * 清除搜索表单数据
     * @param {jQueryElement} formClearButton 表单
     */
    var clearSearchFormData = function (formClearButton) {
        if (!changeUtil.isjQueryElement(formClearButton)) {
            return;
        }

        formClearButton.click(function () {
            var el = $(this);
            var form = el.parents('form').eq(0);
            if (form.length === 0) {
                return;
            }
            form.find('[type="text"],.c--search-reset,input[name="AscSortKey"],input[name="DescSortKey"]').val('');
            form.find('select').each(function () {
                var select = $(this);
                var multiple = changeUtil.trim(select.attr('multiple')).toLowerCase();
                if (multiple === 'multiple') {
                    // select.find('>option').removeAttr('selected');
                    select.selectpicker("val", []);
                } else {
                    var value = changeUtil.trim(select.find('>option').attr('value'));
                    select.val(value);
                    select.selectpicker("val", value);
                }
            });

        });
    };

    var platformLogout = function () {
        var Options = {
            listOS: [],
            listOS_Index: 0,
            listLogout: [],
            listLogout_Index: 0
        };
        var Plugin = {
            init: function (els) {
                els.each(function () {
                    var el = $(this);
                    el.click(function () {
                        Plugin.logout($(this));
                    });
                });
            },
            loadListOS: function () {
                changeAjax.postAntiForgery({
                    url: 'Authserver/GetLogoutList',
                    data: {},
                    success: function (data) {
                        _execute(data);
                    },
                    error: function (data) {
                        _execute({
                            Success: false,
                            Message: 'fail',
                        });
                    }
                });

                var _execute = function (data) {
                    if (data.Success === true) {
                        Options.listOS = data.Data;
                        Options.listOS_Index = 0;
                        Plugin.loadListLogout();
                    } else {
                        Plugin.logoutSuccess();
                    }
                }
            },
            loadListLogout: function () {
                if (Options.listOS_Index >= Options.listOS.length) {
                    Plugin.logoutQuest();
                    return;
                }
                var model = Options.listOS[Options.listOS_Index];
                var url = changeUtil.getOSUrl('Authserver/CheckOutLoginState', model.PlatformUrl);
                var _execute = function (data) {
                    if (data &&
                        data.Success === true &&
                        data.Data &&
                        data.Data.loginState === true) {
                        Options.listLogout.push(model);
                    }
                    Options.listOS_Index += 1;
                    Plugin.loadListLogout();
                }
                $.ajax({
                    url: url,
                    jsonp: "callback",
                    dataType: "jsonp",
                    jsonpCallback: "changeJsonpCallback",
                    data: {},
                    success: function (res) {
                        _execute(res);
                    },
                    error: function (data) {
                        _execute({
                            Success: false,
                            Message: 'checkout loginstate success！',
                        });
                    }
                });
            },
            logout: function (el) {
                if (el.hasClass('c--lock')) {
                    return;
                }
                el.addClass('c--lock');
                changeUtil.block($('body'), { message: '请稍候，正在退出系统……' });
                Plugin.loadListOS();
            },
            logoutQuest: function () {
                if (Options.listLogout.length > 0) {
                    var html = '您好，目前检测到您还登录了以下系统：';
                    for (var index = 0; index < Options.listLogout.length; index++) {
                        var model = Options.listLogout[index];
                        html += '<div><b>' + model.PlatformName + '</b></div>';
                    }
                    html += '您是否要全部退出？'
                    changeUtil.swalHelper({
                        title: '系统退出提示',
                        html: html,
                        type: 'question',
                        confirmButtonText: "是",
                        // confirmButtonClass: "btn btn-label-google",
                        cancelButtonText: "否",
                        // cancelButtonClass: "btn btn-label-twitter",
                        showCancelButton: true,
                    }).then(function (result) {
                        if (result.value === true) {
                            Options.listLogout_Index = 0;
                            Plugin.logoutOtherOS();
                        } else {
                            Plugin.logoutSuccess();
                        }
                    });
                } else {
                    Plugin.logoutSuccess();
                }
            },
            logoutOtherOS: function () {
                if (Options.listLogout_Index >= Options.listLogout.length) {
                    Plugin.logoutSuccess();
                    return;
                }
                var model = Options.listLogout[Options.listLogout_Index];
                var url = changeUtil.getOSUrl('Authserver/Logout_Jsonp', model.PlatformUrl);

                var _execute = function (data) {
                    Options.listLogout_Index += 1;
                    Plugin.logoutOtherOS();
                }
                $.ajax({
                    url: url,
                    jsonp: "callback",
                    dataType: "jsonp",
                    jsonpCallback: "changeJsonpCallback",
                    data: {},
                    success: function (res) {
                        _execute(res);
                    },
                    error: function (data) {
                        _execute({
                            Success: false,
                            Message: '退出系统操作失败！',
                        });
                    }
                });
            },
            logoutSuccess: function () {
                changeAjax.postAntiForgery({
                    url: 'Authserver/Logout',
                    data: { id: '' },
                    success: function (data) {
                        _execute(data);
                    },
                    error: function (data) {
                        _execute({
                            Success: false,
                            Message: 'fail',
                        });
                    }
                });
                var _execute = function (data) {
                    if (data.Success &&
                        data.Data != undefined &&
                        data.Data.signOutUrl != '') {
                        changeUtil.locationHref(data.Data.signOutUrl);
                    } else {
                        window.location.reload();
                    }
                }
            },
        };

        return Plugin.init;
    }();

    var initAutocomplete = function () {
        $("input[type='text'],textarea").attr("autocomplete", "off");
        // $("input[type='password']").attr("autocomplete", "new-password");
        $("input[type='password']").attr("autocomplete", "off");
    };

    /**
     * 初始化 selectpicker 1. c-selectpicker / 2. c-selectpicker c-selectpicker--search
     * @param {jQuery} element jQuery对象，默认为$('select.c-selectpicker')
     */
    var initSelectpicker = function (element) {
        if (!changeUtil.isjQueryElement(element)) {
            element = $('select.c-selectpicker,select.kt-selectpicker');
        }
        element.each(function () {
            var el = $(this);
            if (el.hasClass("c-selectpicker--search")) {
                el.attr("data-live-search", "true");
            }
            if (el.hasClass("c-selectpicker--multiple")) {
                el.attr("multiple", "multiple");
            }
            if (el.hasClass("c-selectpicker--actions")) {
                el.attr("data-actions-box", "true");
            }
            el.selectpicker({
                noneResultsText: "未能根据 {0} 匹配到相关结果",
                noneSelectedText: '未选择',
                deselectAllText: '取消选择',
                selectAllText: '全部选择'
            });
            var value = changeUtil.trim(el.attr("data-c-value"));
            el.removeAttr("data-c-value");
            if (value !== "") {
                el.selectpicker("val", value);
            }
            var parent = el.parents('.bootstrap-select');
            var button = parent.find('>button[type="button"]');
            button.focus(function () {
                $(this).addClass("c-focus");
            });

            button.blur(function () {
                $(this).removeClass("c-focus");
            });

            parent.find('.dropdown-menu .bs-searchbox input[type="text"]')
                .attr('maxlength', 60)
                .attr('placeholder', '请输入关键词检索')
                .addClass('c--maxlength');

            changeUtil.maxlength(parent.find(".c--maxlength"));
        });
    };

    /**
     * 重选渲染 selectpicker
     * @param {jQuery} element jQuery对象，默认为 $('select.c-selectpicker')
     * @param {Array} data 数组 [{Value:'',Text:'请选择'}]
     * @param {String} emptyText 字符串，默认为“请选择”
     * @param {String} emptyValue 字符串，默认为“”
     */
    var renderSelectpicker = function (element, data, emptyText, emptyValue) {
        if (!changeUtil.isjQueryElement(element) || $.isArray(data) === false) {
            return;
        }
        emptyText = changeUtil.trim(emptyText);
        emptyValue = changeUtil.trim(emptyValue);
        if ($.isArray(data) === false || data.length === 0) {
            data = [];
            data.push({
                Value: emptyValue,
                Text: emptyText === "" ? "请选择" : emptyText
            });
        }
        var list = [];
        var listChild = {};
        for (var index = 0; index < data.length; index++) {
            var option = data[index];
            if (typeof option.Group !== "undefined" &&
                option.Group !== null &&
                typeof option.Group.Name === "string") {
                if (typeof listChild[option.Group.Name] === "undefined") {
                    listChild[option.Group.Name] = [];
                }
                listChild[option.Group.Name].push(option);
            } else {
                list.push(option);
            }
        }
        for (var key in listChild) {
            if (!Object.hasOwnProperty.call(listChild, key)) {
                continue;
            }
            list.push({
                Value: key,
                Text: key,
                listChild: listChild[key]
            });
        }

        var html = "";
        for (var index = 0; index < list.length; index++) {
            var option = list[index];
            if (typeof option.listChild !== "undefined" && $.isArray(option.listChild)) {
                var childHtml = '<optgroup label="' + option.Value + '">';
                for (var childIndex = 0; childIndex < option.listChild.length; childIndex++) {
                    var child = option.listChild[childIndex];
                    childHtml += '<option value="' + child.Value + '">' + child.Text + "</option>";
                }
                childHtml += '</optgroup>';
                html += childHtml;
            } else {
                html += '<option value="' + option.Value + '">' + option.Text + "</option>";
            }
        }
        element.selectpicker("destroy");
        element.html(html);
        initSelectpicker(element);
    };

    /**
     * 初始化 后台菜单
     */
    var initBackstageMenu = function () {
        var data = changeUtil.getHtmlValue({
            el: $('body>div.hidden.c-command-pagedata'),
            key: 'data-name',
            query: 'input[type="hidden"]',
            destroy: true, ///是否销毁el，默认否
        });
        // console.log(data);
    };

    /**
     * 系统菜单
     */
    var Menu = function () {
        var Options = {
            target: null,
            globalData: undefined,
            callbacks: {
                success: function (__options) {

                },
                fail: function (__options) {

                }
            },
            moreMenu: {},
            MenuHtml: '',
        };

        var Plugin = {
            init: function (options) {
                Options = changeUtil.mix(Options, options);

                Plugin.dataAccess(function (data) {
                    if (changeUtil.isjQueryElement(Options.target)) {
                        Options.target.html(Options.MenuHtml);
                    }
                    if ($.isFunction(Options.callbacks.success)) {
                        Options.callbacks.success();
                    }
                });

            },
            dataAccess: function (callback) {
                Options.MenuHtml = '';
                var menus = Plugin.getLocalMenuData();
                if (menus === '') {
                    changeAjax.postAntiForgery({
                        url: "System/RoleMenu/GetUserRoleMenuText",
                        data: {},
                        success: function (data) {
                            if (data.Success === true) {
                                Options.MenuHtml = data.Data;
                                window.localStorage['App_UserMenu_CXCY'] = data.Data;
                                data.Data = '';
                            }
                            callback(data);
                        },
                        error: function (data) {
                            callback({
                                Success: false,
                                Message: '用户角色菜单信息获取失败！',
                            });
                        }
                    });

                } else {
                    Options.MenuHtml = menus;
                    callback({
                        Success: true,
                        Message: '用户角色菜单信息获取成功！',
                    });
                }
            },
            clearData: function () {
                window.localStorage.clear('App_UserMenu_CXCY');
            },
            getLocalMenuData: function () {
                var app_UserMenu_string = changeUtil.trim(window.localStorage['App_UserMenu_CXCY']);
                if (changeUtil.trim(app_UserMenu_string) === '') {
                    return '';
                }
                return app_UserMenu_string;
            }
        };

        return {
            init: Plugin.init,
            clearData: Plugin.clearData,
            getLocalMenuData: Plugin.getLocalMenuData,
        };
    }();

    // init();
    return {

        /**
         * 初始化所有函数
         */
        init: init,
        /**
         * 初始化 后台菜单
         */
        initBackstageMenu: initBackstageMenu,
        /**
         * 初始化 selectpicker 1. c-selectpicker / 2. c-selectpicker c-selectpicker--search
         */
        initSelectpicker: initSelectpicker,
        /**
         * 重选渲染 selectpicker
         */
        renderSelectpicker: renderSelectpicker,
        /**
         * 系统菜单
         */
        Menu: Menu,
        /**
         * 清除搜索表单数据
         */
        clearSearchFormData: clearSearchFormData,
    };
}();

(function () {
    $(function () {
        changeApp.init();
        // changeApp.initBackstageMenu();

    });

})(this);

(function ($) {
    /**
     * cpreview pdf/img
     * cpreview Plugin
     */
    $.fn.cpreview = function (options) {
        options = options || {};
        var Self = this;
        var element = $(this);

        var Plugin = {
            run: function (_options) {
                if (!element) {
                    return;
                }
                Plugin.init(_options);
            },
            init: function () {
                Self.options = $.extend(true, {}, $.fn.cpreview.defaults, options);
                options = Self.options;
                element.each(function () {
                    var el = $(this);
                    var previewData = changeUtil.getHtmlValue({
                        el: el.find('.hidden.c-preview-data'),
                        key: 'data-name',
                        query: 'this-preview-data',
                        valueKey: 'data-value',
                        destroy: true
                    });

                    if (previewData._cHasHtmlValue !== true) {
                        previewData = el.data('c_preview_data');
                    }
                    var result = Plugin.match(previewData);
                    if (result.haserror === true) {
                        el.remove();
                        return;
                    }
                    el.attr('data-group--c-preview', changeUtil.trim(previewData.group));
                    el.data('c_preview_is', true);
                    el.data('c_preview_data', previewData);
                    el.click(function () {
                        Plugin.show(el);
                    });
                });
            },
            show: function (el) {
                if (el.hasClass('c--lock')) {
                    return;
                }

                if (Self.options.isblur === true) {
                    changeUtil.blur($('body>.c-app'));
                }

                $('body').addClass('c-modal-open-important');
                var ispreview = el.data('c_preview_is');
                if (ispreview !== true) {
                    return;
                }
                $('body>.tooltip.fade').remove();
                var data = el.data('c_preview_data');
                var result = Plugin.match(data);
                if (result.haserror === true) {
                    el.remove();
                    return;
                }
                var groupKey = changeUtil.trim(el.attr('data-group--c-preview'));
                if (groupKey === '') {
                    groupKey = data.group;
                }
                var groupEL = null;
                if (groupKey !== '' && groupKey === data.group) {
                    groupEL = $('[data-group--c-preview="' + groupKey + '"]');
                }
                var groupArray = [];
                if (changeUtil.isjQueryElement(groupEL) && groupEL.length > 1) {
                    var index = 0;
                    groupEL.each(function () {
                        var _el = $(this);
                        var _data = _el.data('c_preview_data');
                        var _result = Plugin.match(_data);
                        if (_result.haserror === true || _data.group !== groupKey) {
                            return;
                        }
                        _el.attr('data-group--c-preview-index', index);
                        groupArray.push(_el);
                        index++;
                    });
                }

                Plugin.render(el, el, groupArray);
            },
            match: function (data) {
                var result = {
                    haserror: true,
                    mode: ''
                };
                if (data === undefined || data._cHasHtmlValue !== true || changeUtil.trim(data.extension) === '') {
                    return result;
                }
                data.extension = changeUtil.trim(data.extension).toLowerCase();
                if (data.custom !== true && data.custom !== false) {
                    data.custom = changeUtil.trim(data.custom).toLowerCase() === 'true';
                }
                if (data.custom === true) {
                    result.haserror = false;
                    result.mode = 'custom';
                    return result;
                }
                switch (data.extension) {
                    case 'pdf':
                        result.haserror = false;
                        result.mode = 'pdf';
                        break;
                    case 'jpg':
                    case 'bmp':
                    case 'gif':
                    case 'jpeg':
                    case 'png':
                        result.haserror = false;
                        result.mode = 'img';
                        break;
                    // case 'doc': case 'docx':     result.haserror = false;     result.mode =
                    // 'word';     break;
                    case 'mp4':
                        result.haserror = false;
                        result.mode = 'video_mp4';
                        break;
                    case 'flv':
                        // result.haserror = false;
                        // result.mode = 'video_flv';
                        break;
                    default:
                        break;
                }

                return result;
            },
            render: function (targetEl, el, groupArray) {
                var data = el.data('c_preview_data');
                var result = Plugin.match(data);
                var mode = result.mode;
                var id = changeUtil.getUniqueID("c-preview-");
                var index = 0;
                var displayIndex = '';
                if (groupArray.length > 0) {
                    index = changeUtil.getInt(el.attr('data-group--c-preview-index'));
                    displayIndex = '<b class="c-index">[<span class="c-index-left">' + (changeUtil.getInt(index) + 1) + '</span><span class="c-index-split">/</span><span class="c-index-right">' + groupArray.length + '</span>]</b>';
                }
                data.name = changeUtil.trim(data.name);
                var html = '<div id="' + id + '" class="c-preview-modal-part c-preview--' + mode + ' ' + (Self.options.isblur === true ? 'c-preview--blur' : '') + '">\
    <div class="c-preview-modal-container">\
      <div class="c-preview-modal--header">\
            <h6 class="c-preview--title">' + displayIndex + '<span class="c--title">' + data.name + '</span></h6>\
            <span class="c-preview--btn c-preview--close" title="关闭"></span>\
        </div>\
        <div class="c-preview-modal--body c-page-transition">\
            <div class="c-preview-modal---content c-preview-modal----' + mode + '">\
            </div>\
        </div>\
    </div>\
</div>';
                $('body').append(html);
                $('body').addClass('c-modal-open');
                var previewEl = $('body>#' + id);
                previewEl.removeAttr('id');

                var headerEL = previewEl.find('.c-preview-modal--header');
                var contentEL = previewEl.find('.c-preview-modal---content');
                html = '';
                var iframeid = '';
                var videoid = '';
                var os_src = changeUtil.getOSUrl(data.src);
                switch (mode) {
                    case 'pdf':
                        // var pdfVersion = changeUtil.AcrobatHelper.getAcrobatVersion();
                        var isNoUse = (changeUtil.browserVersion.versions.webApp ||
                            changeUtil.browserVersion.versions.webKit) &&
                            !changeUtil.browserVersion.versions.mobile &&
                            navigator.userAgent.search(/Chrome/i) >= 0;

                        if (isNoUse) {
                            html = '<embed class="c-preview-pdf" width="100%" height="100%" src="' + os_src + '" type="application/pdf">';
                        } else {
                            iframeid = changeUtil.getUniqueID('c_preview_pdf__');
                            html = '<iframe class="c-preview-pdf" id="' + iframeid + '" width="100%" height="100%" src="' + data.src + '" frameborder="no" scrolling="no"></iframe>';
                        }
                        break;
                    // case 'word':     html = '<embed class="c-preview-pdf" width="100%"
                    // height="100%" src="' + data.src + '" type="application/msword">';     // html
                    // = '<iframe src="https://view.officeapps.live.com/op/view.aspx?src=' +
                    // data.src + '" width="100%" height="100%" frameborder="1"></iframe>'; break;
                    case 'img':
                        html = '<img class="c-preview-img" src="' + os_src + '" alt="' + data.name + '" />';
                        break;
                    case 'video':
                        html = '<video class="c-preview-video" src="' + os_src + '" controls="controls" width="100%">您的浏览器不支持 video。</video>';
                        break;
                    case 'video_mp4':
                        html = '<video class="c-preview-video" src="' + os_src + '" controls="controls" width="100%">您的浏览器不支持 video。</video>';
                        break;
                    case 'video_flv':
                        videoid = changeUtil.getUniqueID('c_preview_video_flv__');
                        html = '<div class="c-preview-video"><video id="' + videoid + '" class="video-js vjs-default-skin vjs-big-play-centered" controls width="100%"></video></div>';
                        break;
                    default:
                        break;
                }
                contentEL.append(html);
                if (iframeid !== '') {
                    var iframePdf = $('iframe#' + iframeid);
                    // var filePdf = encodeURI('../../' + data.src);
                    var filePdf = encodeURI(os_src);
                    var url = "/assets/plugins/pdfjs-2.0.943-dist/web/viewer.html?file=" + filePdf;
                    url = changeUtil.getOSUrl(url);
                    iframePdf.attr("src", url);
                }
                if (mode === 'video_flv') {
                    // var flvUrl = data.src;

                    // var player = videojs(videoid, {
                    //     techOrder: ['html5', 'flvjs'],
                    //     flvjs: {
                    //         mediaDataSource: {
                    //             isLive: false,
                    //             cors: true,
                    //             withCredentials: false,
                    //         },
                    //     },
                    //     sources: [{
                    //         src: flvUrl,
                    //         type: 'video/x-flv'
                    //     }],
                    //     controls: true,
                    //     preload: "none"
                    // }, function onPlayerReady() {
                    //     player.on('error', function (error) {
                    //         console.log(error);
                    //     });
                    // });
                }

                // if (Self.options.isblur !== true) {
                //     Plugin.resetHeight(contentEL, headerEL.height());
                //     $(window).resize(function () {
                //         Plugin.resetHeight(contentEL, headerEL.height());
                //     });
                // }
                var resetHeight_options = {
                    el: el,
                    data: data,
                    preview: previewEl,
                    header: previewEl.find('>.c-preview-modal-container>.c-preview-modal--header>.c-preview--title'),
                    content: previewEl.find('>.c-preview-modal-container>.c-preview-modal--body>div.c-preview-modal---content'),
                    offset: headerEL.height()
                };

                Plugin.resetHeight(resetHeight_options);
                $(window).resize(function () {
                    Plugin.resetHeight(resetHeight_options);
                });

                if (groupArray.length > 0) {
                    html = '<div class="c-preview--switch">\
    <span class="c-preview--btn c-preview--switch-left" title="上一个"></span>\
    <span class="c-preview--btn c-preview--switch-right" title="下一个"></span>\
</div>';
                    headerEL.append(html);

                    headerEL.find('.c-preview--btn').each(function () {
                        var _el = $(this);
                        if (_el.hasClass('c-preview--switch-left')) {
                            _el.data('c_preview__switch__mode', 'left');
                        } else {
                            _el.data('c_preview__switch__mode', 'right');
                        }
                    });

                    headerEL.find('.c-preview--switch>.c-preview--btn').click(function () {
                        var _el = $(this);
                        var isToLeft = _el.data('c_preview__switch__mode') === 'left';
                        var next = el;

                        if (isToLeft) {
                            if (index <= 0) {
                                next = groupArray[(groupArray.length - 1)];
                            } else {
                                next = groupArray[(index - 1)];
                            }
                        } else {
                            if (index >= groupArray.length - 1) {
                                next = groupArray[0];
                            } else {
                                next = groupArray[(index + 1)];
                            }
                        }
                        Plugin.render(targetEl, next, groupArray);
                        previewEl.remove();
                        $('body>.tooltip.fade').remove();
                    });
                }

                headerEL.find('.c-preview--btn').tooltip();

                previewEl.find('.c-preview--close').click(function () {
                    Plugin.close($(this), targetEl, previewEl);
                });

                var previwBody = previewEl.find(">.c-preview-modal-container>.c-preview-modal--body.c-page-transition");
                previwBody.animate({
                    top: '0',
                    opacity: '1'
                }, function () {
                    previwBody.removeAttr('style').removeClass('c-page-transition');
                });

                if (options && options.callbacks && options.callbacks.show && $.isFunction(options.callbacks.show)) {
                    options.callbacks.show({
                        el: el,
                        data: data,
                        preview: previewEl,
                        header: previewEl.find('>.c-preview-modal-container>.c-preview-modal--header>.c-preview--title'),
                        content: previewEl.find('>.c-preview-modal-container>.c-preview-modal--body>div.c-preview-modal---content'),
                        currentIndex: index,
                        groupCount: groupArray.length
                    });
                }
            },
            resetHeight: function (_options) {
                $('body>.tooltip.fade').remove();
                var wh = $(window).height();
                var diff = wh;
                if (Self.options.isblur === true) {
                    if (diff > 80) {
                        diff -= 80;
                    }
                } else {
                    diff = wh - _options.offset;
                    if (diff < 100) {
                        diff = 100;
                    }
                }
                _options.content.height(diff);

                if (options && options.callbacks && options.callbacks.resize && $.isFunction(options.callbacks.resize)) {
                    options.callbacks.resize(_options);
                }
            },
            close: function (el, target, previewel) {
                $('body>.tooltip.fade').remove();
                $('body').removeClass('c-modal-open');
                previewel.find('.c-preview-modal--header').addClass('hidden');
                previewel.animate({
                    top: '100%',
                    opacity: '0'
                }, function () {
                    previewel.remove();
                    target.removeClass('c--lock');
                    // $('body').removeClass('c-modal-open');
                });
                $('body').removeClass('c-modal-open-important');
                if (Self.options.isblur === true) {
                    changeUtil.unblur($('body>.c-app'));
                }
                if (options && options.callbacks && options.callbacks.close && $.isFunction(options.callbacks.close)) {
                    options.callbacks.close({
                        el: el,
                        target: target,
                        preview: previewel
                    });
                }
            }
        };

        Plugin.run.apply(Self, [options]);

        return Self;
    };

    $.fn.cpreview.defaults = {
        isblur: false,
    };
}(jQuery));


var changeJsonpCallback = function (res) {

}

/**
 * change Ajax
 */
var changeAjax = function () {
    var Options = {
        url: "",
        data: {},
        cache: true,
        contentType: "application/x-www-form-urlencoded",
        // processData: false,
        host: changeConfig.host,
        success: function (data) { },
        error: function (jqXHR, textStatus, errorThrown) {
            var data = {
                Success: false,
                Message: 'Access Error',
                ErrorList: [],
                ErrorData: changeUtil.mix(jqXHR, textStatus, errorThrown)
            }
            console.error(data);
        }
    };
    var Plugin = {
        /**
         * post 防伪验证请求
         */
        postAntiForgery: function (options) {
            var _options = {
                type: "POST",
                // contentType: "application/json; charset=utf-8",
                contentType: false,
                isNeedRequestVerificationToken: true,
                isNeedFormData: true,
                processData: false,
                success: function (data) {
                    console.error(data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    var data = {
                        Success: false,
                        Message: 'Post Anti Forgery Access Error',
                        ErrorList: [],
                        ErrorData: changeUtil.mix(jqXHR, textStatus, errorThrown)
                    };
                    console.error(data);
                }
            };
            _options = changeUtil.mix(Options, _options);
            options = changeUtil.mix(changeUtil.mix(_options, _options), options);

            options.url = changeUtil.getOSUrl(options.url, options.host);

            if (options.isNeedRequestVerificationToken === true) {
                var RequestVerificationToken = options.__RequestVerificationToken || $('input[name="__RequestVerificationToken"]').eq(0).val();
                if (changeUtil.trim(RequestVerificationToken) !== '') {
                    options.data['__RequestVerificationToken'] = RequestVerificationToken;
                }
            }

            if (options.isNeedFormData === true) {
                options.data = changeUtil.objectToFormData(options.data);
            }

            var ajaxOptions = {
                type: options.type,
                url: options.url,
                data: options.data,
                cache: options.cache,
                contentType: options.contentType,
                processData: options.processData,
                success: function (data) {
                    if ($.isFunction(options.success)) {
                        options.success(data);
                    } else {
                        _options.success(data);
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    var data = {
                        Success: false,
                        Message: 'Post Anti Forgery Access Error',
                        ErrorList: [],
                        ErrorData: changeUtil.mix(jqXHR, textStatus, errorThrown)
                    };
                    if ($.isFunction(options.error)) {
                        options.error(data);
                    } else {
                        _options.error(data);
                    }
                }
            };

            // if (options.isNeedRequestVerificationToken === true) {
            //     var RequestVerificationToken = options.__RequestVerificationToken || $('input[name="__RequestVerificationToken"]').eq(0).val();
            //     if (changeUtil.trim(RequestVerificationToken) !== '') {
            //         ajaxOptions.headers = ajaxOptions.headers || {};
            //         ajaxOptions.headers['__RequestVerificationToken'] = RequestVerificationToken;
            //     }
            // }

            $.ajax(ajaxOptions);
        },
        /**
         * get
         */
        get: function (options) {
            var _options = {
                type: "GET",
                contentType: "application/json; charset=utf-8",
                cache: false,
                success: function (data) {
                    console.error(data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    var data = {
                        Success: false,
                        Message: 'Get Access Error',
                        ErrorList: [],
                        ErrorData: changeUtil.mix(jqXHR, textStatus, errorThrown)
                    };
                    console.error(data);
                }
            };
            _options = changeUtil.mix(Options, _options);
            options = changeUtil.mix(changeUtil.mix(_options, _options), options);

            options.url = changeUtil.getOSUrl(options.url, options.host);

            var ajaxOptions = {
                type: options.type,
                url: options.url,
                data: options.data,
                cache: options.cache,
                contentType: options.contentType,
                processData: options.processData,
                success: function (data) {
                    if ($.isFunction(options.success)) {
                        options.success(data);
                    } else {
                        _options.success(data);
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    var data = {
                        Success: false,
                        Message: 'Get Access Error',
                        ErrorList: [],
                        ErrorData: changeUtil.mix(jqXHR, textStatus, errorThrown)
                    };
                    if ($.isFunction(options.error)) {
                        options.error(data);
                    } else {
                        _options.error(data);
                    }
                }
            };

            $.ajax(ajaxOptions);
        }
    };
    return {
        /**
         * post 防伪验证请求
         */
        postAntiForgery: Plugin.postAntiForgery,
        /**
         * get
         */
        get: Plugin.get,
    };
}();

/**
 * changeSwitchRole Options
 */
var changeSwitchRole_Options = {
    imgDataUrl: null,
    isShortcut: false,
    isShow: false
};

/**
 * SwitchRole Helper
 */
var changeSwitchRole = (function () {
    var Self = {};
    var element = null;
    var Options = {
        isReload: false,
        callbacks: {
            show: function (__options) {

            },
            close: function (__options) {

            },
            // success: function (__options) {

            // }
        }
    };

    var Plugin = {
        show: function (options) {
            Options = changeUtil.mix(Options, options);
            changeSwitchRole_Options.isShow = true;
            Plugin.filter(true);

            var cModals = $("body>.c-app-modals");
            if (cModals.length !== 1) {
                $("body>.c-app-modals").remove();
                var template = '<div class="c-app-modals">';
                template += "</div>";
                $("body").append(template);
                cModals = $("body>.c-app-modals");
            }
            cModals.append('<div class="c-app-swtich-role-fade"></div>');
            changeUtil.unblur($("body>.c-app-modals,body>.c-app-modals .c---filter-blur.c-filter-blur"));
            element = cModals.find(">.c-app-swtich-role");
            if (element.length !== 1) {
                element.remove();
                var template = '<div class="c-app-swtich-role">';
                template += "</div>";
                cModals.append(template);
                element = cModals.find(">.c-app-swtich-role");
            }

            changeUtil.loadHtmlByUrl({
                el: element,
                url: '/System/User/ChooseRole',
                success: function (data) {
                    Plugin.render();
                    if ($.isFunction(Options.callbacks.show)) {
                        Options.callbacks.show(data);
                    }
                },
                error: function (data) {
                    if (data.loadContent) {
                        data.loadContent.html('页面加载失败！');
                    } else {
                        element.html(data.msg);
                    }
                }
            });
            $("body").addClass("c-modal-open");
        },
        render: function () {
            mApp.initTooltips();
            changeUtil.initTooltips();
            var timeout = 200;
            element.find(".role-body>ul.roles>li.role:not([disabled])").click(function () {
                Plugin.choose(this);
            });

            element.find('.role-body>ul.roles>li.role[disabled="disabled"]').click(function () {
                Plugin.close();
            });

            element.find('[data-command="c-switch-role--close"]').click(function () {
                Plugin.close();
            });

            var roleBody = element.find(".role-body");
            roleBody.animate({
                "margin-top": "0",
                opacity: "1"
            }, timeout, function () {
                roleBody.removeAttr("style");
            });
        },
        filter: function (isBlur) {
            if (isBlur !== true) {
                changeUtil.unblur();
                return;
            }
            changeUtil.blur();
        },
        choose: function (obj) {
            obj = $(obj);
            var roleCode = changeUtil.trim(obj.attr("data-value"));

            changeAjax.postAntiForgery({
                url: "/System/User/ChooseRole",
                data: {
                    roleCode: roleCode
                },
                success: function (jsonResult) {
                    if (!jsonResult.Success) {
                        changeUtil.swalHelper({
                            title: "提示消息",
                            type: "error",
                            html: jsonResult.Message
                        });
                        return;
                    }
                    changeApp.Menu.clearData();
                    var url = jsonResult.Data;
                    if ($.isFunction(Options.callbacks.success)) {
                        Options.callbacks.success();
                    } else {
                        if (Options.isReload) {
                            window.location.reload();
                        } else {
                            changeUtil.locationHref(url)
                        }
                    }

                },
                error: function () {
                    Plugin.error("角色切换失败！");
                }
            });

        },
        error: function (msg) {
            if (changeUtil.trim(msg) !== '') {
                toastrHelper.error(msg);
            }
            Plugin.close();
        },
        close: function (noteCallback) {
            // Plugin.filter(false);
            if (noteCallback === undefined) {
                noteCallback = true;
            }
            changeSwitchRole_Options.isShow = false;
            changeSwitchRole_Options.isShortcut = false;

            if (element) {
                $(".tooltip.fade.show").remove();
                var timeout = 200;
                var roleBody = element.find(".role-body");
                roleBody.animate({
                    "margin-top": "250px",
                    opacity: "0"
                },
                    timeout,
                    function () {
                        element.parent().find(">.c-app-swtich-role-fade").remove();
                        element.remove();
                        $("body").removeClass("c-modal-open");
                        Plugin.filter(false);
                    }
                );
            } else {
                Plugin.filter(false);
            }
            if (noteCallback === true && $.isFunction(Options.callbacks.close)) {
                Options.callbacks.close();
            }
        },
        shortcut: function (options) {
            if (
                changeSwitchRole_Options.isShortcut == false &&
                changeSwitchRole_Options.isShow === false
            ) {
                changeSwitchRole_Options.isShortcut = true;
                changeSwitchRole.show(options);
            } else {
                changeSwitchRole_Options.isShortcut = false;
                changeSwitchRole.close();
            }
        }
    };

    Self.show = Plugin.show;
    Self.close = function (noteCallback) {
        if (noteCallback === undefined) {
            noteCallback = false;
        }
        Plugin.close(noteCallback)
    };
    Self.shortcut = Plugin.shortcut;
    Plugin.filter($("body"), null);
    return Self;
})();

/**
 * cvalidate
 * validate Plugin
 */
$.fn.cvalidate = function (options) {
    options = options || {};
    var Self = this;
    Self.errorList = [];
    var element = $(this);
    // var rules = {
    //     date2:
    //         "/^[1-9]d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])s+(20|21|22|23|[0-1]d):" +
    //         "[0-5]d$/" //yyyy-MM-dd hh:mm,
    // };
    var Plugin = {
        run: function (_options) {
            Plugin.init(_options);
            options.scrollToFirstErrorOffset = changeUtil.getFloat(options.scrollToFirstErrorOffset);
            element.find('[data-val="true"][data-val-range-max]').each(function () {
                var el = $(this);
                var range_max = changeUtil.trim(el.attr('data-val-range-max'));
                if (range_max === '') {
                    return;
                }
                var maxAttribute = changeUtil.trim(el.attr('data-val-max-value'));
                if (maxAttribute !== '') {
                    return;
                }
                el.attr('data-val-max-value', range_max);
            });
            element.find('[data-val="true"][data-val-range-min]').each(function () {
                var el = $(this);
                var range_min = changeUtil.trim(el.attr('data-val-range-min'));
                if (range_min === '') {
                    return;
                }
                var minAttribute = changeUtil.trim(el.attr('data-val-min-value'));
                if (minAttribute !== '') {
                    return;
                }
                el.attr('data-val-min-value', range_min);
            });

            options.all = element.find('[data-val="true"]');
            options.subming = false;
            if (options.all.length === 0) {
                return;
            }
            options.all.bind("change keydown keyup", function () {
                if (options.subming) {
                    Plugin.executevalidate($(this));
                }
            });
        },
        init: function () {
            Self.options = $.extend(true, {}, $.fn.cvalidate.defaults, options);
            options = Self.options;
        },
        getParentObj: function (el) {
            // var pObj = changeUtil.getParentByClassName(el, "nv-validate", 10);
            var pObj = el.parents('.nv-validate').eq(0);
            return pObj;
        },
        executevalidate: function (el) {
            var self = el[0];
            var id = changeUtil.trim(el.attr("id"));
            var elText = changeUtil.trim(el.attr("data-val-text"));
            var elValue = el.val();
            var elValue_is_array = $.isArray(elValue);
            if (elValue_is_array) {
                for (var value_index = 0; value_index < elValue.length; value_index++) {
                    elValue[value_index] = changeUtil.trim(elValue[value_index]);
                }
            } else {
                elValue = changeUtil.trim(elValue);
            }

            var elOptions = {
                id: id,
                value: elValue,
                type: changeUtil.trim(self.type).toLowerCase(),
                displayEl: $('[data-valmsg-for="' + id + '"]'),
                parent: Plugin.getParentObj(el),
                el: el,
                text: elText,
                isgroup: changeUtil.trim(el.attr('data-htmlvalue-isgroup')).toLowerCase() === 'true',
                required: {
                    enable: changeUtil.trim(el.attr("data-val-required")) !== "",
                    text: changeUtil.trim(el.attr("data-val-required"))
                },
                regex: {
                    enable: changeUtil.trim(el.attr("data-val-regex-pattern")) !== "",
                    regex: new RegExp(changeUtil.trim(el.attr("data-val-regex-pattern"))),
                    text: changeUtil.trim(el.attr("data-val-regex"))
                },
                maxLength: {
                    enable: changeUtil.trim(el.attr("data-val-length-max")) !== "" && changeUtil.getInt(el.attr("data-val-length-max")) >= 0,
                    length: changeUtil.getInt(el.attr("data-val-length-max")),
                    text: changeUtil.trim(el.attr("data-val-length"))
                },
                minLength: {
                    enable: changeUtil.trim(el.attr("data-val-length-min")) !== "" && changeUtil.getInt(el.attr("data-val-length-min")) >= 0,
                    length: changeUtil.getInt(el.attr("data-val-length-min")),
                    text: changeUtil.trim(el.attr("data-val-length"))
                },
                maxValue: {
                    enable: changeUtil.trim(el.attr("data-val-max-value")) !== "" && isNaN(el.attr("data-val-max-value")) !== true,
                    value: changeUtil.getFloat(el.attr("data-val-max-value")),
                    text: elText + " 最大值为" + changeUtil.getFloat(el.attr("data-val-max-value"))
                },
                minValue: {
                    enable: changeUtil.trim(el.attr("data-val-min-value")) !== "" && isNaN(el.attr("data-val-min-value")) !== true,
                    value: changeUtil.getFloat(el.attr("data-val-min-value")),
                    text: elText + " 最小值为" + changeUtil.getFloat(el.attr("data-val-min-value"))
                },
                file: {
                    enable: changeUtil.trim(el.attr("data-val-file-extension")) !== "",
                    /**
                     * e.g:.docx,.rar,.xls,.pptx
                     */
                    extensions: changeUtil.trim(el.attr("data-val-file-extension")).split(','),
                    text: changeUtil.trim(el.attr("data-val-file-text"))
                },
                /**
                 * 限制上传文件大小(最小大小)
                 */
                limitMinFileSize: {
                    enable: changeUtil.trim(el.attr("data-val-limit-min-file-size")) !== "" && changeUtil.getFloat(el.attr("data-val-limit-min-file-size")) > 0,
                    value: changeUtil.getFloat(el.attr("data-val-limit-min-file-size")),
                    text: elText + " 文件大小至少需要 " + changeUtil.getFloat(el.attr("data-val-limit-min-file-size")) + " 兆(M)。"
                },
                /**
                 * 限制上传文件大小(最大大小)
                 */
                limitMaxFileSize: {
                    enable: changeUtil.trim(el.attr("data-val-limit-max-file-size")) !== "" && changeUtil.getFloat(el.attr("data-val-limit-max-file-size")) > 0,
                    value: changeUtil.getFloat(el.attr("data-val-limit-max-file-size")),
                    text: elText + " 文件大小限制在 " + changeUtil.getFloat(el.attr("data-val-limit-max-file-size")) + " 兆(M)以内。"
                },
                /**
                 * 至多选择几项
                 */
                atMostOption: {
                    enable: changeUtil.trim(el.attr("data-val-at-most-option")) !== "" && isNaN(el.attr("data-val-at-most-option")) !== true,
                    value: changeUtil.getFloat(el.attr("data-val-at-most-option")),
                    text: elText + " 至多选择 " + changeUtil.getFloat(el.attr("data-val-at-most-option")) + " 项"
                },
                /**
                 * 至少选择几项
                 */
                atLeastOption: {
                    enable: changeUtil.trim(el.attr("data-val-at-least-option")) !== "" && isNaN(el.attr("data-val-at-least-option")) !== true,
                    value: changeUtil.getFloat(el.attr("data-val-at-least-option")),
                    text: elText + " 至少选择 " + changeUtil.getFloat(el.attr("data-val-at-least-option")) + " 项"
                },
            };

            /**
             * 验证 至多选择几项
             */
            var _validate_atMostOption = function (nameKey) {
                if (!elOptions.atMostOption.enable) {
                    return true;
                }
                var _checkedEl = null;
                if (elOptions.isgroup === true) {
                    _checkedEl = el.find(changeUtil.trim(el.attr('data-htmlvalue-child-query')));
                } else if (elOptions.type === "checkbox") {
                    _checkedEl = element.find("[" + options.key + '="' + nameKey + '"]:checked');
                }
                if (_checkedEl === null) {
                    return true;
                }
                if (_checkedEl.length > elOptions.atMostOption.value) {
                    Plugin.addError(elOptions, elOptions.atMostOption.text);
                    return false;
                }
                return true;
            };

            /**
             * 验证 至少选择几项
             */
            var _validate_atLeastOption = function (nameKey) {
                if (!elOptions.atLeastOption.enable) {
                    return true;
                }
                var _checkedEl = null;
                if (elOptions.isgroup === true) {
                    _checkedEl = el.find(changeUtil.trim(el.attr('data-htmlvalue-child-query')));
                } else if (elOptions.type === "checkbox") {
                    _checkedEl = element.find("[" + options.key + '="' + nameKey + '"]:checked');
                }
                if (_checkedEl === null) {
                    return true;
                }
                if (_checkedEl.length < elOptions.atLeastOption.value) {
                    Plugin.addError(elOptions, elOptions.atLeastOption.text);
                    return false;
                }
                return true;
            };

            if (elOptions.type === "radio" || elOptions.type === "checkbox") {
                elOptions.checked = self.checked;
                var nameKey = changeUtil.trim(el.attr(options.key));
                elOptions.displayEl = element.find('[data-valmsg-for="' + nameKey + '"]');
                Plugin.resetEl(elOptions);
                if (elOptions.type === "checkbox") {
                    if (!_validate_atMostOption(nameKey) || !_validate_atLeastOption(nameKey)) {
                        return false;
                    }
                }
                if (self.checked !== true) {
                    var _checkedEl = element.find("[" + options.key + '="' + nameKey + '"]:checked');
                    if (_checkedEl.length > 0) {
                        return true;
                    }
                    elOptions.value = "";
                }
            }

            Plugin.resetEl(elOptions);

            if (elOptions.isgroup === true && elOptions.required.enable) {
                var _checkedEl = el.find(changeUtil.trim(el.attr('data-htmlvalue-child-query')));
                if (_checkedEl.length === 0) {
                    Plugin.addError(elOptions, elOptions.required.text);
                    return false;
                }
            } else if (elOptions.required.enable) {
                if (elValue_is_array) {
                    if (elOptions.value.length === 0) {
                        Plugin.addError(elOptions, elOptions.required.text);
                        return false;
                    }
                } else {
                    if (elOptions.value === "") {
                        Plugin.addError(elOptions, elOptions.required.text);
                        return false;
                    }
                }
            }

            if (elOptions.isgroup === true) {
                if (!_validate_atMostOption() || !_validate_atLeastOption()) {
                    return false;
                }
            }

            if (elOptions.maxLength.enable && elOptions.value.length > elOptions.maxLength.length) {
                Plugin.addError(elOptions, elOptions.maxLength.text);
                return false;
            }

            if (elOptions.minLength.enable && elOptions.value.length < elOptions.minLength.length) {
                Plugin.addError(elOptions, elOptions.minLength.text);
                return false;
            }

            if (elOptions.value !== "") {
                if (elOptions.regex.enable && !elOptions.regex.regex.test(elOptions.value)) {
                    Plugin.addError(elOptions, elOptions.regex.text);
                    return false;
                }
            }

            if (elOptions.maxValue.enable && elOptions.value !== '' && elOptions.maxValue.value < changeUtil.getFloat(elOptions.value)) {
                Plugin.addError(elOptions, elOptions.maxValue.text);
                return false;
            }

            if (elOptions.minValue.enable && elOptions.value !== '' && elOptions.minValue.value > changeUtil.getFloat(elOptions.value)) {
                Plugin.addError(elOptions, elOptions.minValue.text);
                return false;
            }

            if (elOptions.file.enable && elOptions.type === "file" && self.files.length > 0) {
                // var file = self.files[0];
                // var fileName = file.name;
                // //正则表达式获取文件名，不带后缀
                // var strFileName = elOptions.value.replace(/^.+?\\([^\\]+?)(\.[^\.\\]*?)?$/gi, "$1");
                //正则表达式获取后缀
                var fileExt = elOptions.value.replace(/.+\./, "");
                var ext = '.' + changeUtil.trim(fileExt).toLowerCase();
                var isAllow = false;
                for (var index = 0; index < elOptions.file.extensions.length; index++) {
                    var allowExt = changeUtil.trim(elOptions.file.extensions[index]).toLowerCase();
                    if (allowExt === ext) {
                        isAllow = true;
                        break;
                    }
                }

                if (isAllow === false) {
                    Plugin.addError(elOptions, elOptions.file.text);
                    return false;
                }
            }

            if (elOptions.limitMinFileSize.enable && elOptions.type === "file" && self.files.length > 0) {
                var totalFileSize = 0;
                for (var index = 0; index < self.files.length; index++) {
                    var file = self.files[index];
                    totalFileSize += file.size;
                }

                var limitMinFileSize = elOptions.limitMinFileSize.value * 1024 * 1024;
                if (totalFileSize < limitMinFileSize) {
                    Plugin.addError(elOptions, elOptions.limitMinFileSize.text);
                    return false;
                }
            }

            if (elOptions.limitMaxFileSize.enable && elOptions.type === "file" && self.files.length > 0) {
                var totalFileSize = 0;
                for (var index = 0; index < self.files.length; index++) {
                    var file = self.files[index];
                    totalFileSize += file.size;
                }
                var limitMaxFileSize = elOptions.limitMaxFileSize.value * 1024 * 1024;
                if (totalFileSize > limitMaxFileSize) {
                    Plugin.addError(elOptions, elOptions.limitMaxFileSize.text);
                    return false;
                }
            }

            return true;
        },
        resetEl: function (elOptions) {
            elOptions.el.removeClass("is-invalid");
            elOptions.el.parents('.dropdown.bootstrap-select').eq(0).removeClass("has-error has-danger is-invalid");
            elOptions.parent.removeClass("has-error has-danger is-invalid");
            // elOptions.parent.find('.has-error,.has-danger,.is-invalid').removeClass("has-error has-danger is-invalid");
            elOptions.displayEl.html("");
        },
        addError: function (elOptions, text) {
            Self.errorList.push({
                id: elOptions.id,
                element: elOptions.el,
                parent: elOptions.parent,
                value: elOptions.value,
                displayEl: elOptions.displayEl,
                message: text
            });
            elOptions.el.addClass("is-invalid");
            elOptions.parent.addClass("is-invalid");
            elOptions.displayEl.addClass("has-error error invalid-feedback");
            elOptions.displayEl.html(text);
        },
        validate: function () {
            // element.find('.has-danger').removeClass('has-danger');
            var successCount = 0;
            Self.errorList = [];
            options.all.each(function () {
                var validateResult = Plugin.executevalidate($(this));
                if (validateResult) {
                    successCount++;
                }
            });
            var _result = successCount === options.all.length;
            if (_result === true) {
                element.find('.is-invalid').removeClass('is-invalid');
                element.find('.invalid-feedback').removeClass('invalid-feedback');
                element.find('.has-danger').removeClass('has-danger');
                element.find('.has-error').removeClass('has-error');
                element.find('.field-validation-valid[data-valmsg-for]').html('');
            }
            return _result;
        },
        form: function () {
            return {
                hasError: Plugin.validate()
            };
        },
        element: function (el) {
            var result = Plugin.executevalidate(el);
            return result;
        },
        submit: function () {
            options.subming = true;
            var _result = Plugin.validate();
            if (_result !== true) {
                if (options.isScrollToFirstError === true) {
                    changeUtil.scrollTo(Self.errorList[0].element, options.scrollToFirstErrorOffset, function (errorEl) {
                        if (options.isFocusToFirstError === true) {
                            errorEl.find('[data-val="true"]').focus();
                        }
                    })
                } else {
                    if (options.isFocusToFirstError === true) {
                        Self.errorList[0].element.focus();
                    }
                }
            }
            return _result;
        },
        formvalue: function (convertValue, convertFunction) {
            if (convertValue === undefined || convertValue === null) {
                convertValue = {};
            }
            if (convertFunction === undefined || convertFunction === null) {
                convertFunction = {};
            }
            var data = changeUtil.getHtmlValue({
                el: element,
                key: options.key,
                query: null,
                valueKey: null,
                convertValue: convertValue,
                convertFunction: convertFunction,
                convertValue_IsSink: options.convertValue_IsSink,
                convertFunction_IsSink: options.convertFunction_IsSink,
            });
            return data;
        }
    };

    Plugin.run.apply(Self, [options]);

    Self.submit = Plugin.submit;
    Self.formvalue = Plugin.formvalue;

    Self.validate = function () {
        if (!options.subming) {
            return true;
        }
        return Plugin.validate();
    };

    Self.set_subming = function (_subming) {
        options.subming = _subming === true;
    };

    Self.setSubming = function (state) {
        if (state !== true && state !== false) {
            return;
        }
        options.subming = state;
    };

    Self.form = function () {
        return Plugin.form();
    };

    Self.element = function (el) {
        return Plugin.element(el);
    };

    return Self;
};

$.fn.cvalidate.defaults = {
    key: "name",
    isScrollToFirstError: true,
    /**
     * 是否 focus 到第一个错误
     */
    isFocusToFirstError: true,
    /**
     * 特殊值转换 属性是否下沉 formvalue 使用
     */
    convertValue_IsSink: false,
    /**
     * 特殊值转换方法 属性是否下沉 formvalue 使用
     */
    convertFunction_IsSink: false,
    /**
     * 滚动至第一个错误元素的偏移量
     */
    scrollToFirstErrorOffset: -70
};