'.format(json.id, json.tag, selected ? 'active' : '', json.index);
                    _html += '
'.format(json.label,json.labelWidth,_hideLabel);
                    if (json.hideLabel) {
                        _html += '
';
                    elem.append(_html);
                    $('#' + json.id + json.tag).click(function () {
                        layer.open({
                            type: 2,
                            title: '手写签名',
                            btn: ['保存','关闭'], //可以无限个按钮
                            yes: function(index, layero){
                                //do something
                                var iframe = window['layui-layer-iframe' + index];
                                var data = iframe.getCanvasData();
                                json.data = data;
                                that.components[json.tag].update(json,that);
                                layer.close(index); //如果设定了yes回调,需进行手工关闭
                            },
                            btn2: function (index, layero) {
                                layer.close(index);
                            },
                            closeBtn: 1, //不显示关闭按钮
                            shade: [0],
                            area: ['60%', '60%'],
                            offset: 'auto', //右下角弹出
                            anim: 2,
                            content: ['./handwrittenSignature.html', 'yes'], //iframe的url,no代表不显示滚动条
                            success:function (layero,index) {
                            }
                        });
                    });
                },
                /**
                 * 根据json对象更新html对象
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                update: function (json,that) {
                    var $block = $('#' + json.id + ' .layui-input-block');
                    var $label = $('#' + json.id + ' .layui-form-label');
                    $block.empty();
                    $label.empty();
                    if (json.hideLabel) {
                        $label.css("display","none");
                        $block.css("margin-left","0px");
                        $block.css({width: 'calc({0})'.format(json.width)});
                    } else {
                        $label.css("display","block");
                        $block.css("margin-left",json.labelWidth);
                        $block.css({width: 'calc({0} - {1}px)'.format(json.width,json.labelWidth)});
                    }
                    $label.css("width",json.labelWidth);
                    $label.append(json.label + ":");
                    var _html = '';
                    //重绘设计区改id下的所有元素
                    if (json.disabled) {
                        _html += '
'.format(json.id + json.tag ,json.buttonIcon,json.buttonVlaue);
                    }else {
                        _html += '
'.format(json.id + json.tag ,json.buttonIcon,json.buttonVlaue);
                    }
                    if (json.data !== "") {
                        _html += '
'.format(json.data);
                    }
                    $block.append(_html);
                },
                /**
                 * 根据components组件对象获取组件属性
                 * @param {object} id 所属组件id
                 * @param {object} index 所属对象组件索引
                 * @param {object} that 实例对象
                 * */
                jsonData: function (id, index, that) {
                    //分配一个新的ID
                    var _json = JSON.parse(JSON.stringify(formField.components.sign));
                    _json.id = id;
                    _json.index = index;
                    return _json;
                },
                /**
                 * 根据 json 对象显示对应的属性
                 * @param {object} json 当前组件的json属性
                 * @param {object} that 实例对象
                 * */
                property: function (json,that) {
                    that.renderCommonProperty(json); //根据 json 对象获取对应的属性的html
                    that.initCommonProperty(json); //初始化 json 对象获取对应的属性
                },
                /**
                 * 根据json对象生成html文本
                 * @param {object} json 当前组件的json属性
                 * @param {boolean} selected 是否被选中
                 * @param {object} that 实例对象
                 * */
                generateHtml: function (json,selected,that) {
                    if (selected === undefined) {
                        selected = false;
                    }
                    var _hideLabel = json.hideLabel ? 'display: none;' : '';
                    var _html = '
'.format(json.id, json.tag, selected ? 'active' : '', json.index);
                    _html += '
{0}: '.format(json.label,json.labelWidth,_hideLabel);
                    if (json.hideLabel) {
                        _html += '
';
                    return _html;
                },
                /**
                 * 根据json对象生成js文本
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                generateScript:function (json,that) {
                    var scriptHtmlCode = '';
                    return scriptHtmlCode;
                }
            },
            editor: {
                /**
                 * 根据json对象生成html对象
                 * @param {object} json 当前组件的json属性
                 * @param {boolean} selected 是否被选中
                 * @param {object} elem 表单面板jquery对象
                 * @param {object} that 实例对象
                 * */
                render: function (json, selected,elem,that) {
                    if (selected === undefined) {
                        selected = false;
                    }
                    var _hideLabel = json.hideLabel ? 'display: none;' : '';
                    var _html = '
'.format(json.id, json.tag, selected ? 'active' : '', json.index,json.width);
                    _html += '
{0}: '.format(json.label,json.width,_hideLabel);
                    _html += '
';
                    _html += '
';
                    elem.append(_html);
                    var e = new ice.editor(json.tag + json.id);
                    e.width=json.width;   //宽度
                    e.height=json.height;  //高度
                    e.uploadUrl=json.uploadUrl; //上传文件路径
                    e.disabled=json.disabled;
                    e.menu = json.menu;
                    e.create();
                    e.setValue(json.defaultValue);
                    if (that.config.viewOrDesign) {
                        iceEditorObjects[json.id] = e;
                    }
                },
                /**
                 * 根据json对象更新html对象
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                update: function (json,that) {
                    var $label = $('#' + json.id + ' .layui-form-label');
                    $label.empty();
                    $label.css("width",json.width);
                    $label.append(json.label + ":");
                    if (json.hideLabel) {
                        $label.css("display","none");
                    } else {
                        $label.css("display","block");
                    }
                    if (that.config.viewOrDesign) {
                        var e = iceEditorObjects[json.id];
                        e.setValue(json.defaultValue);
                    } else {
                        var $block = $('#' + json.id + ' .layui-input-block');
                        $block.empty();
                        var _html = '
'.format(json.tag + json.id);
                        $block.append(_html);
                        var e = new ice.editor(json.tag + json.id);
                        e.width=json.width;   //宽度
                        e.height=json.height;  //高度
                        e.uploadUrl=json.uploadUrl; //上传文件路径
                        e.disabled=json.disabled;
                        e.menu = json.menu;
                        e.create();
                        e.setValue(json.defaultValue);
                    }
                },
                /**
                 * 根据components组件对象获取组件属性
                 * @param {object} id 所属组件id
                 * @param {object} index 所属对象组件索引
                 * @param {object} that 实例对象
                 * */
                jsonData: function (id, index, that) {
                    //分配一个新的ID
                    var _json = JSON.parse(JSON.stringify(formField.components.editor));
                    _json.id = id;
                    _json.index = index;
                    return _json;
                },
                /**
                 * 根据 json 对象显示对应的属性
                 * @param {object} json 当前组件的json属性
                 * @param {object} that 实例对象
                 * */
                property: function (json,that) {
                    that.renderCommonProperty(json); //根据 json 对象获取对应的属性的html
                    that.initCommonProperty(json); //初始化 json 对象获取对应的属性
                },
                /**
                 * 根据json对象生成html文本
                 * @param {object} json 当前组件的json属性
                 * @param {boolean} selected 是否被选中
                 * @param {object} that 实例对象
                 * */
                generateHtml: function (json,selected,that) {
                    if (selected === undefined) {
                        selected = false;
                    }
                    var _hideLabel = json.hideLabel ? 'display: none;' : '';
                    var _html = '
'.format(json.id, json.tag, selected ? 'active' : '', json.index,json.width);
                    _html += '
{0}: '.format(json.label,json.width,_hideLabel);
                    _html += '
';
                    _html += '
';
                    return _html;
                },
                /**
                 * 根据json对象生成js文本
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                generateScript:function (json,that) {
                    var scriptHtmlCode = '';
                    scriptHtmlCode += ['var e = new ice.editor('+  json.tag + json.id +');'
                        ,'e.width=' + json.width + ';   //宽度'
                        ,'e.height=' + json.height + ';  //高度'
                        ,'e.uploadUrl=' + json.uploadUrl + '; //上传文件路径'
                        ,'e.disabled=' + json.disabled + ';'
                        ,'e.menu = ' + json.menu + ';'
                        ,'e.create();'].join('');
                    return scriptHtmlCode;
                }
            },
            grid: {
                /**
                 * 根据json对象生成html对象
                 * @param {object} json 当前组件的json属性
                 * @param {boolean} selected 是否被选中
                 * @param {object} elem 表单面板jquery对象
                 * @param {object} that 当前实例模块对象
                 * */
                render: function (json, selected,elem,that) {
                    if (selected === undefined) {
                        selected = false;
                    }
                    var _selected = selected ? 'active' : '';
                    var _html = '
';
                    elem.append(_html);
                    that.bindGridSortEvent(json);
                },
                /**
                 * 根据json对象更新html对象
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                update: function (json,that) {
                    var $block = $('#' + json.id);
                    $block.empty();
                    var colClass = 'layui-col-md6';
                    if (json.columns.length == 3) {
                        colClass = 'layui-col-md4';
                    } else if (json.columns.length == 4) {
                        colClass = 'layui-col-md3';
                    }
                    var _html = '';
                    for (var i = 0; i < json.columns.length; i++) {
                        _html += '
'.format(i, json.index, colClass,json.id);
                        //some html
                        _html += '
';
                    }
                    $block.append(_html);
                    that.renderForm();
                },
                /**
                 * 根据components组件对象获取组件属性
                 * @param {object} id 所属组件id
                 * @param {object} index 所属对象组件索引
                 * @param {object} that 实例对象
                 * */
                jsonData: function (id, index,that) {
                    //分配一个新的ID 默认是一个一行两列的布局对象
                    var _json = JSON.parse(JSON.stringify(formField.components.grid));
                    _json.id = id;
                    _json.index = index;
                    return _json;
                },
                /**
                 * 根据 json 对象显示对应的属性
                 * @param {object} json 当前组件的json属性
                 * @param {object} that 实例对象
                 * */
                property: function (json,that) {
                    that.renderCommonProperty(json); //根据 json 对象获取对应的属性的html
                    that.initCommonProperty(json); //初始化 json 对象获取对应的属性
                },
                /**
                 * 根据json对象生成html文本
                 * @param {object} json 当前组件的json属性
                 * @param {boolean} selected 是否被选中
                 * @param {object} that 实例对象
                 * */
                generateHtml: function (json,selected,that) {
                    if (selected === undefined) {
                        selected = false;
                    }
                    var _selected = selected ? 'active' : '';
                    var _html = '
';
                    return _html;
                },
                /**
                 * 根据json对象生成js文本
                 * @param {object} json 变更后的json属性
                 * @param {object} that 实例对象
                 * */
                generateScript:function (json,that) {
                    return '';
                }
            },
        }
        /* 初始化 json 对象获取对应的属性*/
        Class.prototype.initCommonProperty = function (json) {
            var that = this
                , options = that.config;
            for (var key in json) {
                if (key === 'index') {
                    continue;
                }
                switch (key) {
                    case 'id':
                        $('#id').click(function () {
                            //例子2
                            layer.prompt({
                                formType: 0,
                                value: options.selectItem.id,
                                title: '请输入更新后的ID',
                            }, function(value, index, elem){
                                var _checkid = that.findJsonItem(options.data, value);
                                if (_checkid === undefined) {
                                    var findJsonItem = that.findJsonItem(options.data, options.selectItem.id);
                                    findJsonItem.id = value;
                                    that.renderForm();
                                } else {
                                    //提示层
                                    layer.msg('ID已经存在');
                                }
                                layer.close(index);
                            });
                        });
                        $('#id').mouseover(function(){
                            layer.tips('请点击修改id', '#id',);
                        });
                        break;
                    case 'labelWidth':
                        //定义初始值
                        slider.render({
                            elem: '#labelWidth',
                            value: json.labelWidth, //初始值
                            min: 80,
                            max: 300,
                            step: 1,
                            input:true,
                            change: function(value){
                                json.labelWidth = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'width':
                        //定义初始值
                        slider.render({
                            elem: '#width',
                            value: json.width.replace("%",""), //初始值
                            min: 20,
                            max: 100,
                            step: 1,
                            input:true,
                            change: function(value){
                                json.width = value + "%";
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'options':
                        var sortable = Sortable.create(document.getElementById(options.selectItem.tag), {
                            group: {
                                name: 'propertygroup',
                            },
                            ghostClass: "ghost",
                            handle: '.select-option-drag',
                            dataIdAttr: 'data-index',
                            animation: 150,
                            onEnd: function (evt) {
                                if (options.selectItem === undefined) {
                                    return;
                                }
                                var indexArray = sortable.toArray();
                                var newJson = [];
                                for (var i = 0; i < indexArray.length; i++) {
                                    newJson.push(options.selectItem.options[indexArray[i]]);
                                }
                                options.selectItem.options = newJson;
                                var $select = $('#' + options.selectItem.tag);
                                $select.empty();
                                that.components[options.selectItem.tag].update(options.selectItem,that);
                                that.components[options.selectItem.tag].property(options.selectItem,that);
                                form.render('select');
                                form.render('radio');
                                form.render('checkbox');
                            }
                        });
                        that.addOptionEvent(json);
                        break;
                    case 'dataMaxValue':
                        laydate.render({
                            elem: '#dataMaxValue' + json.tag + json.id,
                            format: 'yyyy-MM-dd',
                            btns: ['now','confirm'],
                            value: json.dataMaxValue,
                            done: function(value, date, endDate){
                                json.dataMaxValue = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'dataMinValue':
                        laydate.render({
                            elem: '#dataMinValue' + json.tag + json.id,
                            format: 'yyyy-MM-dd',
                            btns: ['now','confirm'],
                            value: json.dataMinValue,
                            done: function(value, date, endDate){
                                json.dataMinValue = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'dateDefaultValue':
                        laydate.render({
                            elem: '#dateDefaultValue' + json.tag + json.id,
                            type: json.dateType,
                            format: json.dateFormat,
                            value: json.dateDefaultValue,
                            done: function(value, date, endDate){
                                json.dateDefaultValue = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'dateRangeDefaultValue':
                        laydate.render({
                            elem: '#dateRangeDefaultValue' + json.tag + json.id,
                            type: json.dateType,
                            format: json.dateFormat,
                            value: json.dateRangeDefaultValue,
                            range:"-",
                            done: function(value, date, endDate){
                                json.dateRangeDefaultValue = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'buttonIcon':
                        iconPicker.render({
                            // 选择器,推荐使用input
                            elem: '#' + json.tag + json.id + "property",
                            // 数据类型:fontClass/unicode,推荐使用fontClass
                            type: 'fontClass',
                            // 是否开启搜索:true/false,默认true
                            search: true,
                            // 是否开启分页:true/false,默认true
                            page: true,
                            // 每页显示数量,默认12
                            limit: 12,
                            // 每个图标格子的宽度:'43px'或'20%'
                            cellWidth: '43px',
                            // 点击回调
                            click: function (data) {
                                json.buttonIcon = data.icon;
                                that.components[json.tag].update(json,that);
                            },
                            // 渲染成功后的回调
                            success: function(d) {
                                //console.log(d);
                            }
                        });
                        break;
                    case 'whiteSpace':
                        slider.render({
                            elem:'#' + json.tag + json.id + "property",
                            value: json.whiteSpace, //初始值
                            min: 30,
                            max: 500,
                            step: 1,
                            input:true,
                            change: function(value){
                                json.whiteSpace = value;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'colorSelection':
                        colorpicker.render({
                            elem: '#' + json.tag + json.id + "property"
                            ,color: json.colorSelection
                            ,format: 'rgb'
                            ,predefine: true
                            ,alpha: true
                            ,done: function (color) {
                                json.colorSelection = color;
                                that.components[json.tag].update(json,that);
                            }
                        });
                        break;
                    case 'menu':
                        $('#menu').click(function () {
                            layer.open({
                                type: 2,
                                title: '头部菜单',
                                btn: ['保存','关闭'], //可以无限个按钮
                                yes: function(index, layero){
                                    //do something
                                    var iframe = window['layui-layer-iframe' + index];
                                    var checkData = iframe.getCheckData();
                                    json.menu = checkData;
                                    that.components[json.tag].update(json,that);
                                    layer.close(index); //如果设定了yes回调,需进行手工关闭
                                },
                                btn2: function (index, layero) {
                                    layer.close(index);
                                },
                                closeBtn: 1, //不显示关闭按钮
                                shade: [0],
                                area: ['80%', '80%'],
                                offset: 'auto', //右下角弹出
                                anim: 2,
                                content: ['./editorMenu.html', 'yes'], //iframe的url,no代表不显示滚动条
                                success:function (layero,index) {
                                    var iframe = window['layui-layer-iframe' + index];
                                    iframe.child(staticField.iceEditMenus)
                                }
                            });
                        });
                        break;
                    default:
                        break;
                }
            }
        }
        /* 添加选项事件*/
        Class.prototype.addOptionEvent = function (json) {
            var that = this
                , options = that.config;
            $('#select-option-add').on('click', function () {
                //添加html
                json.options.splice(json.options.length + 1, 0, {text: 'option', value: 'value', checked: false});
                var _htmloption = '';
                _htmloption += '
';
                $('#columnProperty .select-options').last().after(_htmloption);
                //更新设计区节点
                that.components[json.tag].update(json,that);
                if (json.tag === 'checkbox') {
                    form.render('checkbox');
                } else if (json.tag === 'radio' || json.tag == 'carousel') {
                    form.render('radio');
                } else if (json.tag == 'select') {
                    form.render('select');
                    form.render('radio');
                }
            });
            //委托监听先关闭在增加 click
            $(document).off('click', '#columnProperty .select-option-delete').on('click', '#columnProperty .select-option-delete', function (e) {
                e.preventDefault();
                e.stopPropagation();
                //从数据源 options.data 中删除节点
                if (json.options.length <= 1) {
                    layer.msg('已达到最低选项,不能继续删除');
                    return;
                }
                var _index = $(this).closest('.layui-form-item')[0].dataset.index;
                if (_index !== undefined) {
                    json.options.splice(_index, 1);//删除此节点
                }
                var checkedDefual = true;
                for (var i = 0; i < json.options.length; i++) {
                    if (json.options[i].checked) {
                        checkedDefual = false
                    }
                }
                if (checkedDefual) {
                    json.options[0].checked = true;
                }
                $('#' + json.tag).empty();
                var _html = '';
                for (var i = 0; i < json.options.length; i++) {
                    _html += '
';
                }
                $('#' + json.tag).append(_html);
                //更新设计区节点
                that.components[json.tag].update(json,that);
                if (json.tag === 'checkbox') {
                    form.render('checkbox');
                } else if (json.tag === 'radio') {
                    form.render('radio');
                } else if (json.tag == 'select') {
                    form.render('select');
                    form.render('radio');
                }
            });
        }
        /* 根据 json 对象获取对应的属性的html*/
        Class.prototype.renderCommonProperty = function (json) {
            $('#columnProperty').empty();
            var _html = '';
            for (var key in json) {
                if (key === 'index') {
                    continue;
                }
                switch (key) {
                    case 'tag':
                    case 'uploadUrl':
                    case 'document':
                    case 'interval':
                    case 'cronUrl':
                        _html += '
';
                        break;
                    case 'readonly':
                        var yes = "只读";
                        var no = "可写";
                        _html += '
';
                        break;
                    case 'disabled':
                    case 'hideLabel':
                        var yes = "隐藏";
                        var no = "显示";
                        _html += '
';
                        break;
                    case 'required':
                        var yes = "必填";
                        var no = "可选";
                        _html += '
';
                        break;
                    case 'expression':
                        _html += '
';
                        break;
                    case 'autoplay':
                    case 'iconPickerSearch':
                    case 'iconPickerPage':
                    case 'isInput':
                        var yes = "是";
                        var no = "否";
                        _html += '
';
                        break;
                    case 'defaultValue':
                    case 'label':
                    case 'height':
                    case 'placeholder':
                    case 'document':
                    case 'minValue':
                    case 'maxValue':
                    case 'stepValue':
                    case 'rateLength':
                    case 'iconPickerLimit':
                    case 'iconPickerCellWidth':
                    case 'buttonVlaue':
                        _html += '
';
                        break;
                    case 'width':
                    case 'labelWidth':
                        _html += '
';
                        break;
                    case 'menu':
                        _html += '
';
                        break;
                    case 'id':
                        _html += '
';
                        break;
                    case 'switchValue':
                        _html += '
';
                        break;
                    case 'dateType':
                        _html += '
';
                        break;
                    case 'dateFormat':
                        _html += '
';
                        break;
                    case 'contents':
                        //处理
                        _html += '
';
                        _html += '
'.format(json.tag);
                        //选项
                        for (var i = 0; i < json.contents.length; i++) {
                            _html += '
'.format(i);
                            _html += '  
';
                            _html += '   
';
                            _html += '  
';
                            _html += '   
';
                            _html += '
';
                            //向 .option .layui-inline 添加drag事件并且必须设在 contents-option-drag 中才能拖动
                        }
                        _html += '
';
                        break;
                    case 'options':
                        //处理
                        _html += '
';
                        _html += '
'.format(json.tag);
                        //选项
                        for (var i = 0; i < json.options.length; i++) {
                            _html += '
';
                            //向 .option .layui-inline 添加drag事件并且必须设在 select-option-drag 中才能拖动
                        }
                        _html += '
';
                        break;
                    case 'anim':
                        //处理
                        _html += '
';
                        break;
                    case 'arrow':
                        //处理
                        _html += '
';
                        break;
                    case 'buttonType':
                        //处理
                        _html += '
';
                        break;
                    case 'buttonSize':
                        //处理
                        _html += '
';
                        break;
                    case 'dataMaxValue':
                    case 'dataMinValue':
                        _html += '
';
                        break;
                    case 'dateDefaultValue':
                        _html += '
';
                        break;
                    case 'dateRangeDefaultValue':
                        _html += '
';
                        break;
                    case 'buttonIcon':
                        _html += '
';
                        break;
                    case 'whiteSpace':
                        _html += '
';
                        break;
                    case 'colorSelection':
                        _html += '
';
                        break;
                    case 'columns':
                        var columnCount = 2;
                        columnCount = json[key].length;
                        //处理
                        _html += '
';
                        break;
                    default:
                        break;
                }
            }
            $('#columnProperty').append(_html);
        }
        /* 给字段属性绑定事件 实现双向绑定*/
        Class.prototype.bindPropertyEvent = function (_json) {
            var that = this
                , options = that.config;
            if (options.data === undefined) {
                return;
            }
            if (typeof (options.data) === 'string') {
                options.data = JSON.parse(options.data);
            }
            //没有可以选择的
            if (_json === undefined) {
                return;
            }
            //全局下拉绑定
            form.on('select', function (data) {
                var _key = data.elem.name;
                var _value = parseInt(data.value);
                var _json = options.selectItem;
                switch (_key) {
                    case 'columns':
                        var columnCount = _json[_key].length;
                        var nullJson = {
                            span: 12,
                            list: []
                        };
                        if (_value > columnCount) {
                            for (var i = columnCount + 1; i <= _value; i++) {
                                _json[_key].splice(i, 0, nullJson);
                            }
                        } else {
                            _json[_key].splice(_value, columnCount);
                        }
                        that.components[_json.tag].update(_json,that);
                        break;
                    case 'dateFormat':
                        if (_json.tag === 'date') {
                            var _html = '
'.format('dateDefaultValue' + _json.tag + _json.id);
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty();
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html);
                            _json.dateFormat = data.value;
                            var dateClass = laydate.render({
                                elem: '#dateDefaultValue' + _json.tag + _json.id,
                                type: _json.datetype,
                                format: _json.dateFormat,
                                value: new Date(),
                                done: function(value, date, endDate){
                                    _json.dateDefaultValue = value;
                                    that.components[_json.tag].update(_json,that);
                                }
                            });
                            _json.dateDefaultValue = dateClass.config.elem[0].innerText;
                            that.components[_json.tag].update(_json,that);
                        }
                        if (_json.tag === 'dateRange') {
                            var _html = '
'.format('dateDefaultValue' + _json.tag + _json.id);
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty();
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html);
                            _json.dateFormat = data.value;
                            var _v = layui.util.toDateString(new Date(), _json.dateFormat) + " - " + layui.util.toDateString(new Date(), _json.dateFormat);
                            laydate.render({
                                elem: '#dateRangeDefaultValue' + _json.tag + _json.id,
                                type: _json.dateType,
                                format: _json.dateFormat,
                                value:  _v,
                                range:"-",
                                done: function(value, date, endDate){
                                    _json.dateRangeDefaultValue = value;
                                    that.components[_json.tag].update(_json,that);
                                }
                            });
                            _json.dateRangeDefaultValue = _v;
                            that.components[_json.tag].update(_json,that);
                        }
                        break;
                    case 'dateType':
                        if (_json.tag === 'date') {
                            var _html = '
'.format('dateDefaultValue' + _json.tag + _json.id);
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty();
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html);
                            _json.dateType = data.value;
                            var dateClass = laydate.render({
                                elem: '#dateDefaultValue' + _json.tag + _json.id,
                                type: _json.dateType,
                                format: _json.dateFormat,
                                value: new Date(),
                                done: function(value, date, endDate){
                                    _json.dateDefaultValue = value;
                                    that.components[_json.tag].update(_json,that);
                                }
                            });
                            _json.dateDefaultValue = dateClass.config.elem[0].innerText;
                            that.components[_json.tag].update(_json,that);
                        }
                        if (_json.tag === 'dateRange') {
                            var _html = '
'.format('dateDefaultValue' + _json.tag + _json.id);
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty();
                            $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html);
                            _json.dateType = data.value;
                            laydate.render({
                                elem: '#dateRangeDefaultValue' + _json.tag + _json.id,
                                type: _json.dateType,
                                format: _json.dateFormat,
                                value: _json.dateRangeDefaultValue,
                                range:"-",
                                done: function(value, date, endDate){
                                    _json.dateRangeDefaultValue = value;
                                    that.components[_json.tag].update(_json,that);
                                }
                            });
                            that.components[_json.tag].update(_json,that);
                        }
                        break;
                    case 'anim':
                    case 'arrow':
                    case 'buttonType':
                    case 'buttonSize':
                        _json[data.elem.name] = data.value;
                        that.components[_json.tag].update(_json,that);
                        break;
                    default:
                        break;
                }
            });
            //全局input框绑定
            $(document).off('keyup', '#columnProperty .layui-input').on('keyup', '#columnProperty .layui-input', function () {
                var _key = $(this).attr("name");
                var _value = $(this).val();
                var _json = options.selectItem;
                switch (_key) {
                    case 'label':
                    case 'width':
                    case 'interval':
                    case 'iconPickerLimit':
                    case 'iconPickerCellWidth':
                    case 'buttonVlaue':
                    case 'placeholder':
                    case 'rateLength':
                    case 'height':
                    case 'iconPickerLimit':
                        _json[_key] = _value;
                        that.components[_json.tag].update(_json,that);
                        break;
                    case 'defaultValue':
                        if (_json.tag === 'slider') {
                            var resultNumber = that.replaceNumber(_value);
                            _json[_key] = resultNumber;
                            $(this).val(resultNumber);
                            slider.render({
                                elem: '#' + _json.tag + _json.id,
                                value: _json.defaultValue, //初始值
                                min: _json.minValue,
                                max: _json.maxValue,
                                step: _json.stepValue,
                                disabled: _json.disabled
                            });
                        } else if (_json.tag == 'numberInput') {
                            var resultNumber = that.replaceNumber(_value);
                            _json[_key] = resultNumber;
                            $(this).val(resultNumber);
                            that.components[_json.tag].update(_json,that);//局部更新
                        } else {
                            _json[_key] = _value;
                            that.components[_json.tag].update(_json,that);
                        }
                        break;
                    case 'minValue':
                    case 'maxValue':
                    case 'stepValue':
                        var resultNumber = that.replaceNumber(_value);
                        _json[_key] = resultNumber;
                        $(this).val(resultNumber);
                        if (_json.tag === 'slider') {
                            slider.render({
                                elem: '#' + _json.tag + _json.id,
                                value: _json.defaultValue, //初始值
                                min: _json.minValue,
                                max: _json.maxValue,
                                step: _json.stepValue,
                                disabled: _json.disabled
                            });
                        }else if (_json.tag == 'numberInput') {
                            that.components[_json.tag].update(_json,that);//局部更新
                        }
                        break;
                    case 'carousel-text':
                    case 'carousel-value':
                        var _options = [];
                        $('#columnProperty .select-options').each(function () {
                            _options.push({
                                text: $(this).find('input[name=carousel-text]').val(),
                                value: $(this).find('input[name=carousel-value]').val(),
                                checked: $(this).find('input[name=carousel]').hasAttribute("checked")
                            });
                        });
                        _json.options = JSON.parse(JSON.stringify(_options));
                        that.components[_json.tag].update(_json,that);//局部更新
                        break;
                    case 'select-text':
                    case 'select-value':
                    case 'radio-text':
                    case 'radio-value':
                    case 'checkbox-text':
                    case 'checkbox-value':
                        //找到 id=key 下的 option值
                        var _index = parseInt($(this).parent().parent().attr("data-index"));
                        if (_key === 'select-text' || _key === 'radio-text' || _key === 'checkbox-text') {
                            _json.options[_index].text = $(this).val();
                        } else {
                            _json.options[_index].value = $(this).val();
                        }
                        that.components[_json.tag].update(_json,that);//局部更新
                        break;
                    default:
                        break;
                }
            });
            //全局开关绑定
            form.on('switch', function (data) {
                var _key = data.elem.name;
                var _value = data.elem.checked ? true : false;
                var _json = options.selectItem;
                switch (_key) {
                    case 'readonly':
                    case 'disabled':
                    case 'required':
                    case 'half':
                    case 'text':
                    case 'switchValue':
                    case 'isInput':
                    case 'iconPickerSearch':
                    case 'iconPickerPage':
                    case 'isEnter':
                    case 'isLabel':
                    case 'autoplay':
                    case 'hideLabel':
                        _json[_key] = _value;
                        that.components[_json.tag].update(_json,that);
                        break;
                    default:
                        break;
                }
            });
            form.on('radio', function (data) {
                var _json = options.selectItem;
                switch (_json.tag) {
                    case 'radio':
                        var _index = parseInt($("#" + _json.id + " .layui-input-block div.layui-form-radio").index(data.othis[0]));
                        if ($(data.othis[0]).parent().parent().parent().attr("id") === 'radio') {
                            _index = parseInt($(data.othis[0]).parent().parent().attr("data-index"));
                        }
                        for (var i = 0; i < _json.options.length; i++) {
                            if (i === _index) {
                                _json.options[i].checked = true;
                                continue;
                            }
                            _json.options[i].checked = false;
                        }
                        that.components[_json.tag].update(_json,that);
                        break;
                    case 'select':
                    case 'carousel':
                        var _index = parseInt(data.elem.closest('.layui-form-item').dataset.index);
                        for (var i = 0; i < _json.options.length; i++) {
                            if (i === _index) {
                                _json.options[i].checked = true;
                                _json.startIndex = i;
                                continue;
                            }
                            _json.options[i].checked = false;
                        }
                        that.components[_json.tag].update(_json,that);
                        break;
                    default:
                        break;
                }
            });
            form.on('checkbox', function (data) {
                var _json = options.selectItem;
                switch (_json.tag) {
                    case 'checkbox':
                        var _index = parseInt($("#" + _json.id + " .layui-input-block div.layui-form-checkbox").index(data.othis[0]));
                        if ($(data.othis[0]).parent().parent().parent().attr("id") === 'checkbox') {
                            _index = parseInt($(data.othis[0]).parent().parent().attr("data-index"));
                        }
                        for (var i = 0; i < _json.options.length; i++) {
                            if (i === _index) {
                                _json.options[i].checked = data.elem.checked;
                                break;
                            }
                        }
                        that.components[_json.tag].update(_json,that);
                        break;
                    default:
                        break;
                }
            });
        }
        /*--------------------------------------------------以下属于非修改内容---------------------------------------------------------*/
        /*--------------------------------------------------以下属于非修改内容---------------------------------------------------------*/
        Class.prototype.reload = function (id
            , options) {
            var that = this;
            options = options || {};//如果是空的话,就赋值 {}
            that.render();
        }
        //核心入口 初始化一个 regionSelect 类
        formDesigner.render = function (options) {
            var ins = new Class(options);
            return thisIns.call(ins);
        };
        /**
         * data 表示设计区数据
         * dataSource 表示数据源即一个控件的数据来源
         *
         */
        Class.prototype.config = {
            version: "1.0.0"
            , formName: "表单示例"
            , Author: "谁家没一个小强"
            , formId: "formPreviewForm"
            , generateId: 0
            , data: []
            , dataSource: {}
            , formData:{}
            , globalDisable:false
            , viewOrDesign:false
            , formDefaultButton:true
            , formProperty: {}
            , selectItem: undefined
        };
        /* 自动生成ID 当前页面自动排序*/
        Class.prototype.autoId = function (tag) {
            var that = this,
                options = that.config;
            options.generateId = options.generateId + 1;
            return tag + '_' + options.generateId;
        }
        //渲染视图
        Class.prototype.render = function () {
            var that = this
                , options = that.config;
            if (options.viewOrDesign) {
                var that = this
                    , options = that.config;
                options.elem = $(options.elem);
                options.id = options.id || options.elem.attr('id') || that.index;
                options.elem.html('
'.format(options.formId));
                that.renderViewForm();
            } else {
                options.elem = $(options.elem);
                options.id = options.id || options.elem.attr('id') || that.index;
                options.elem.html(staticField.formDesignerHtml);
                /* 根据componentsLang渲染组件*/
                var componentsLangHtml = ""
                $.each(formField.componentsLang
                    , function (index
                        , item) {
                        componentsLangHtml += '
{0} 
'.format(item.name);
                        componentsLangHtml += '
'.format(item.component);
                        $.each(item.list
                            , function (index1
                                , item1) {
                                componentsLangHtml += '
{1}
'.format(item1.key
                                    , staticField.lang[item1.key], item1.icon);
                            });
                        componentsLangHtml += '
';
                    });
                $('#components-form-list').append(componentsLangHtml);
                /* 根据templateFormList渲染组件 默认显示5条*/
                var templateFormListHtml = ""
                $.each(staticField.templateFormList
                    , function (index
                        , item) {
                        if (index < 5) {
                            templateFormListHtml += '
';
                            templateFormListHtml += '
'.format(item.imageUrl,index);
                            templateFormListHtml += '
{1}  加载此模板 
'.format(index,item.text);
                            templateFormListHtml += '
';
                            $('#template-form-list').append(templateFormListHtml);
                        }
                    });
                // 加载模板事件注册
                $('body').on('click', '.button--text', function (e) {
                    var id = $(this).data('id');
                    layer.confirm('是否加载这个模板?加载后会覆盖设计器当前表单', function (index) {
                        options.data = [];
                        Object.assign(options.data, staticField.templateFormList[id].value)
                        that.renderForm();
                        layer.close(index);
                    })
                });
                //加载更多模板
                flow.load({
                    elem: '#template-form-list'
                    ,done: function(page, next){
                        //模拟插入
                        setTimeout(function(){
                            var list = [];
                            next(list.join(''), page < 2); //假设总页数为 6
                        }, 500);
                    }
                });
                //排序事件注册
                $.each(formField.componentsLang
                    , function (index
                        , item) {
                        var sortable1 = Sortable.create(document.getElementById(item.component), {
                            group: {
                                name: 'formgroup',
                                pull: 'clone', //克隆本区域元素到其他区域
                                put: false, //禁止本区域实现拖动或拖入
                            },
                            ghostClass: "ghost",
                            sort: false,
                            animation: 150,
                            onEnd: function (evt) {
                                // console.log('onEnd.foo:', [evt.item, evt.from]);
                                // console.log(evt.oldIndex);
                                // console.log(evt.newIndex);
                                var itemEl = evt.item;
                                // console.log(itemEl);
                            }
                        });
                    });
                //表单事件注册
                var formItemSort = Sortable.create(document.getElementById("formDesignerForm"), {
                    group: {
                        name: 'formgroup'
                    },
                    handle: '.widget-view-drag',
                    ghostClass: "ghost",
                    animation: 200,
                    onAdd: function (evt) {
                        if (options.data === undefined) {
                            return;
                        }
                        if (typeof (options.data) === 'string') {
                            options.data = JSON.parse(options.data);
                        }
                        //注意这里的一个bug,newIndex 第一次拖动也是1 第二次拖动也是1
                        if (options.data.length === 0) {
                            evt.newIndex = 0;
                        }
                        if (evt.item.dataset.id !== undefined) {
                            /*根据id的新算法 复制一份副本 删除json中的节点 再插入节点*/
                            var _item = that.findJsonItem(options.data, evt.item.dataset.id);
                            options.selectItem = _item;
                            that.deleteJsonItem(options.data, evt.item.dataset.id);
                            options.data.splice(evt.newIndex + 1, 0, _item);
                        } else {
                            var _id = that.autoId(evt.item.dataset.tag);
                            /* 向现有的表单数据中增加新的数组元素 splice */
                            var _newitem = that.components[evt.item.dataset.tag].jsonData(_id, evt.newIndex,that);
                            //如果是 grid 呢,需要知道几列
                            options.selectItem = _newitem;
                            options.data.splice(evt.newIndex, 0, _newitem);
                        }
                        //局部更新 只要更新 designer 设计区部分
                        that.renderForm();
                    },
                    onEnd: function (evt) {
                        var newIndex = evt.newIndex;
                        var oldIndex = evt.oldIndex;
                        //只有当to的目标容器是 formDesignerForm
                        if (evt.to.id === 'formDesignerForm') {
                            that.moveItem(evt.oldIndex, evt.newIndex);
                        }
                    }
                });
            }
            //注册预览事件
            $('.previewForm').on('click', function () {
                window.localStorage.setItem('layui_form_json', JSON.stringify(options.data));
                layer.confirm('请选择你要预览页面的方式?', {
                    btn: ['弹窗','新页面'] //按钮
                }, function(){
                    //iframe窗
                    layer.open({
                        type: 2,
                        title: '表单预览',
                        btn: ['关闭'], //可以无限个按钮
                        btn1: function (index, layero) {
                            layer.close(index);
                        },
                        closeBtn: 1, //不显示关闭按钮
                        shade: [0],
                        area: ['100%', '100%'],
                        offset: 'auto', //右下角弹出
                        anim: 2,
                        content: ['./preview.html', 'yes'], //iframe的url,no代表不显示滚动条
                        end: function () { //此处用于演示
                            //加载结束
                        }
                    });
                }, function(){
                    window.open("./preview.html");
                });
            });
            $('body').append(staticField.importHtml);
            $('body').append(staticField.exportHtml);
            //注册导入数据
            $('.importJson').on('click', function () {
                document.getElementById('import-json-code').value = JSON.stringify(options.data, null, 4);
                layer.open({
                    type: 1
                    , title: 'JSON模板数据导入'
                    , id: 'Lay_layer_importjsoncodeview'
                    , content: $('.importjsoncodeview')
                    , area: ['800px', '640px']
                    , shade: false
                    , resize: false
                    , success: function (layero, index) {
                    }
                    , end: function () {
                        $('.importjsoncodeview').css("display","none")
                    }
                });
            });
            $('#copy-html-code').on('click', function () {
                var Url2 = document.getElementById("generate-code-view");
                Url2.select(); // 选择对象
                document.execCommand("Copy"); // 执行
                layer.msg('复制成功');
            });
            $('#import-json-code').on('click', function () {
                var _value = document.getElementById("import-json-code-view").value;
                options.data = JSON.parse(_value);
                that.renderForm();
                layer.closeAll();
                layer.msg('导入成功');
            });
            //注册导出数据
            $('.exportJson').on('click', function () {
                document.getElementById('generate-code-view').value = JSON.stringify(options.data, null, 4);
                layer.open({
                    type: 1
                    , title: 'JSON 数据导出'
                    , id: 'Lay_layer_htmlcodeview'
                    , content: $('.htmlcodeview')
                    , area: ['800px', '640px']
                    , shade: false
                    , resize: false
                    , success: function (layero, index) {
                    }
                    , end: function () {
                        $('.htmlcodeview').css("display","none")
                    }
                });
            });
            $('.generateCode').on('click', function () {
                var _html = $('
');;
                that.generateHtml(options.data, _html,_script);
                var _htmlCode = staticField.htmlCode.format(_html.html(),_script.html());
                document.getElementById('generate-code-view').value = style_html(_htmlCode, 4, ' ', 400);
                layer.open({
                    type: 1
                    , title: 'HTML代码'
                    , id: 'Lay_layer_htmlcodeview'
                    , content: $('.htmlcodeview')
                    , area: ['800px', '640px']
                    , shade: false
                    , resize: false
                    , success: function (layero, index) {
                        layer.style(index, {
                            marginLeft: -220
                        });
                    }
                    , end: function () {
                        $('.htmlcodeview').css("display","none")
                    }
                });
            });
            $('.generateHtmlData').on('click', function () {
                var _html = $('
');
                that.generateHtml(options.data, _html,_script);
                return _html.html();
            });
            that.renderForm();
        }
        //递归赋值
        Class.prototype.replaceNumber = function (value) {
            value = value.replace(/[^\d]/g,'');
            if(''!=value){
                value = parseInt(value);
            }
            return value;
        }
        /* 触发 grid 的 sortablejs 事件*/
        Class.prototype.bindGridSortEvent = function (json) {
            var that = this
                , options = that.config;
            var objs = $('#' + json.id + ' .widget-col-list');
            //遍历他下面的节点
            for (var i = 0; i < objs.length; i++) {
                var el = objs[i];
                var ops = {
                    group: {
                        name: 'formgroup'
                    },
                    handle: '.widget-view-drag',
                    ghostClass: "ghost",
                    animation: 150,
                    onAdd: function (evt) {
                        var parentItem = JSON.parse(JSON.stringify(that.findJsonItem(options.data, evt.item.parentElement.parentElement.dataset.id)));
                        var index = evt.newIndex;
                        var colIndex = evt.item.parentElement.dataset.index;
                        if (evt.item.dataset.id != undefined) {
                            //表示从其他地方移动过来
                            var _fromItem = JSON.parse(JSON.stringify(that.findJsonItem(options.data, evt.item.dataset.id)));
                            var _oldid = _fromItem.id;
                            _fromItem.id = that.autoId(_fromItem.tag);
                            _fromItem.index = index;
                            parentItem.columns[colIndex].list.splice(index + 1, 0, _fromItem);
                            that.findAndCopyJson(options.data,parentItem,evt.item.parentElement.parentElement.dataset.id);
                            that.deleteJsonItem(options.data, _oldid);
                        } else {
                            /* 向指定目标放入数据 splice */
                            var tag = evt.item.dataset.tag;
                            _id = that.autoId(tag);
                            var _newitem = that.components[tag].jsonData(_id, evt.newIndex,that);
                            _newitem.index = index;
                            parentItem.columns[colIndex].list.splice(index + 1, 0, _newitem);
                            that.findAndCopyJson(options.data,parentItem,evt.item.parentElement.parentElement.dataset.id);
                            options.selectItem = _newitem;
                        }
                        that.renderForm();
                    },
                    //拖动结束
                    onEnd: function (evt) {
                        //console.log(evt);
                    }};
                var gridSortable = Sortable.create(el,ops);
            }
        };
        /* 重新渲染视图区*/
        Class.prototype.renderViewForm = function () {
            var that = this
                , options = that.config;
            var elem = $('#' + options.formId);
            //清空
            elem.empty();
            that.renderComponents(options.data, elem);
            if (options.formDefaultButton) {
                elem.append(staticField.formDefaultButton);
            }
            that.setFormData(options.formData);
            form.render();//一次性渲染表单
        }
        /* 生成 Html 代码 */
        Class.prototype.generateHtml = function (jsondata, elem, scriptHtml) {
            var that = this
                , options = that.config;
            $.each(jsondata, function (index, item) {
                elem.append(that.components[item.tag].generateHtml(item, that));
                if (item.tag === 'grid') {
                    $.each(item.columns, function (index2, item2) {
                        //获取当前的 DOM 对象
                        if (item2.list.length > 0) {
                            var elem2 = elem.find('#' + item.id + ' .widget-col-list.column' + item.id + index2);
                            that.generateHtml(item2.list, elem2,scriptHtml);
                        }
                    });
                } else {
                    scriptHtml.append(that.components[item.tag].generateScript(item, that));
                }
            });
        }
        //获取表单数据回调
        Class.prototype.setFormData = function (json) {
            var that = this,
                options = that.config;
            //获取表单区域所有值
            for(let key  in json){
                if (key.indexOf("[")!= -1 && key.indexOf("]")!= -1) {
                    var check = key.substring(0,key.indexOf("["));
                    var item = that.findJsonItem(options.data,check);
                    if (item === undefined) {
                        continue;
                    }
                    that.components[item.tag].update(item,that);
                    continue;
                }
                var item = that.findJsonItem(options.data,key);
                if (item === undefined) {
                    continue;
                }
                switch (item.tag) {
                    case 'editor':
                    case 'rate':
                    case 'slider':
                    case 'labelGeneration':
                    case 'iconPicker':
                    case 'cron':
                    case 'colorpicker':
                        item.defaultValue = json[key];
                        that.components[item.tag].update(item,that);
                        break;
                    case 'sign':
                        item.data = json[key];
                        that.components[item.tag].update(item,that);
                        break;
                    default:
                        break;
                }
            }
            if (options.viewOrDesign) {
                form.val(options.formId,json);
            } else {
                form.val("formPreviewForm",json);
            }
            options.formData = json;
            return json;
        }
        //获取表单数据回调
        Class.prototype.getFormData = function () {
            var that = this,
                options = that.config;
            //获取表单区域所有值
            var json = form.val(that.config.formId);
            for(let key  in iceEditorObjects){
                json[key] = iceEditorObjects[key].getHTML();
            }
            for(let key  in labelGenerationObjects){
                json[key] = labelGenerationObjects[key].getData();
            }
            for(let key  in signObjects){
                json[key] = signObjects[key];
            }
            return json;
        }
        //获取表单数据回调
        Class.prototype.getHtmlData = function () {
            var that = this,
                options = that.config;
            var _html = $('
');
            that.generateHtml(options.data, _html,_script);
            return _html.html();
        }
        //递归改变禁用属性
        Class.prototype.findItemToDisable = function (jsondata) {
            var that = this
                , options = that.config;
            $.each(jsondata, function (index, item) {
                if (item.tag === 'grid') {
                    $.each(item.columns, function (index2, item2) {
                        //获取当前的 DOM 对象
                        if (item2.list.length > 0) {
                            that.findItemToDisable(item2.list);
                        }
                    });
                } else {
                    item.disabled = true;
                    item.readonly = true;
                }
            });
        }
        //递归改变禁用属性
        Class.prototype.findItemToNoDisable = function (jsondata) {
            var that = this
                , options = that.config;
            $.each(jsondata, function (index, item) {
                if (item.tag === 'grid') {
                    $.each(item.columns, function (index2, item2) {
                        //获取当前的 DOM 对象
                        if (item2.list.length > 0) {
                            that.findItemToNoDisable(item2.list);
                        }
                    });
                } else {
                    item.disabled = false;
                    item.readonly = false;
                }
            });
        }
        //全局禁用
        Class.prototype.globalDisable = function () {
            var that = this
                , options = that.config;
            that.findItemToDisable(options.data);
            that.renderForm();
        }
        //全局取消禁用
        Class.prototype.globalNoDisable = function () {
            var that = this
                , options = that.config;
            that.findItemToNoDisable(options.data);
            that.renderForm();
        }
        /* 重新渲染设计区*/
        Class.prototype.renderForm = function () {
            var that = this
                , options = that.config;
            if (options.viewOrDesign) {
                var that = this
                    , options = that.config;
                options.elem = $(options.elem);
                options.id = options.id || options.elem.attr('id') || that.index;
                options.elem.html('
'.format(options.formId));
                that.renderViewForm();
            } else {
                var elem = $('#formDesignerForm');
                //清空
                elem.empty();
                //渲染组件
                that.renderComponents(options.data, elem);
                //选中的节点只有一个
                if (options.selectItem !== undefined) {
                    var _draghtml = '
';
                    var len = $('#' + options.selectItem.id).children().length;
                    if ($('#widget-view-action')) {//已存在
                        $('#widget-view-action').remove();
                    }
                    $('#' + options.selectItem.id).children(len - 1).after(_draghtml);
                    $('#formDesignerForm .layui-form-item').removeClass('active');
                    //给当前元素增加class
                    $('#' + options.selectItem.id).addClass('active');
                    that.bindPropertyEvent(options.selectItem);
                }
                /* 向 节点点击添加 click 动作 */
                that.addClick();
                /* 向 拷贝 删除 按钮添加 click 动作 */
                that.addCopyDeleteClick();
                form.render();
            }
        }
        /* 递归渲染组件 */
        Class.prototype.renderComponents = function (jsondata, elem) {
            var that = this
                , options = that.config;
            $.each(jsondata, function (index, item) {
                item.index = index;//设置index 仅仅为了传递给render对象,如果存在下级子节点那么 子节点的也要变动
                if (options.selectItem === undefined) {
                    that.components[item.tag].render(item, false,elem,that);
                } else {
                    if (options.selectItem.id === item.id) {
                        that.components[item.tag].render(item, true,elem,that);
                        //显示当前的属性
                        that.components[item.tag].property(item,that);
                        that.bindPropertyEvent(item);
                    } else {
                        that.components[item.tag].render(item, false,elem,that);
                    }
                }
                if (item.tag === 'grid') {
                    that.bindGridSortEvent(item);
                    $.each(item.columns, function (index2, item2) {
                        //获取当前的 DOM 对象
                        if (item2.list.length > 0) {
                            var elem2 = elem.find('#' + item.id + ' .widget-col-list.column' + item.id + index2);
                            that.renderComponents(item2.list, elem2);
                        }
                    });
                }
            });
        }
        /* 加入copy选项删除 */
        Class.prototype.addCopyDeleteClick = function () {
            var that = this
                , options = that.config;
            if (options.data === undefined) {
                return;
            }
            if (typeof (options.data) === 'string') {
                options.data = JSON.parse(options.data);
            }
            //复制当前节点
            $('#formDesignerForm  .layui-form-item .widget-view-action .layui-icon-file').on('click', function (e) {
                e.stopPropagation();
                //在json中插入
                if (options.data === undefined) {
                    return;
                }
                if (typeof (options.data) === 'string') {
                    options.data = JSON.parse(options.data);
                }
                var _id = document.elementFromPoint(e.pageX, e.pageY).parentElement.parentElement.dataset.id;
                if (_id !== undefined) {
                    options.selectItem = that.copyJsonAfterItem(options.data, _id);
                }
                that.renderForm();
            });
            $('#formDesignerForm  .layui-form-item .layui-icon-delete').on('click', function (e) {
                e.stopPropagation();
                //获取当前组件的组件id
                var _id = document.elementFromPoint(e.pageX, e.pageY).parentElement.parentElement.dataset.id;
                if (_id !== undefined) {
                    options.selectItem = that.deleteJsonItem(options.data, _id);
                }
                that.renderForm();
            });
        };
        /* 如果是grid布局控件 就显示不一样的样式 */
        Class.prototype.addClick = function (evt) {
            var that = this
                , options = that.config;
            $("#formDesignerForm .layui-form-item").on('click', function (e) {
                //当 div 为嵌套关系的时候 阻止事件冒泡
                e.preventDefault();
                e.stopPropagation();
                var index = parseInt($(this)[0].dataset.index);
                var _id = $(this)[0].dataset.id;
                options.selectItem = that.findJsonItem(options.data, _id);
                var tag = $(this)[0].dataset.tag;
                //显示当前的属性
                that.components[tag].property(options.selectItem,that);
                that.bindPropertyEvent();
                //移除 #formDesignerForm .layui-form-item 下所有的 active
                $('#formDesignerForm .layui-form-item').removeClass('active');
                //给当前元素增加class
                $(this).addClass('active');
                var _draghtml = '
';
                var len = $(this).children().length;
                if (len <= 12) {
                    //先删除元素
                    $("#formDesignerForm .layui-form-item .widget-view-action").remove();
                    $("#formDesignerForm .layui-form-item .widget-view-drag").remove();
                    if ($('#widget-view-action')) {//已存在
                        $('#widget-view-action').remove();
                    }
                    $(this).children(len - 1).after(_draghtml);
                }
                /* 向 拷贝 删除 按钮添加 click 动作 */
                that.addCopyDeleteClick();
                //重新渲染
                form.render();
            });
        };
        //移动视图
        Class.prototype.moveItem = function (oldIndex,newIndex) {
            var that = this
                , options = that.config;
            var newData = options.data[newIndex];
            var oldData = options.data[oldIndex];
            options.data[newIndex] = oldData;
            options.data[oldIndex] = newData;
        }
        /* 根据id返回json中的节点*/
        Class.prototype.findJsonItem = function (json, id) {
            var that = this,
                options = that.config;
            for (var i = 0; i < json.length; i++) {
                if (json[i].id === id) {
                    return json[i];
                } else {
                    if (json[i].tag === 'grid') {
                        for (var j = 0; j < json[i].columns.length; j++) {
                            if (json[i].columns[j].list.length > 0) {
                                var _item = that.findJsonItem(json[i].columns[j].list, id);
                                if (_item) {
                                    return _item;
                                }
                            }
                        }
                    }
                }
            }
            return undefined;
        }
        /* 复制json中的节点并返回上一个节点*/
        Class.prototype.copyJsonAfterItem = function (json, id) {
            var that = this,
                options = that.config;
            for (var i = 0; i < json.length; i++) {
                if (json[i].id === id) {
                    var _newjson = JSON.parse(JSON.stringify(json[i]));
                    _newjson.id = that.autoId(_newjson.tag);
                    json.splice(i + 1, 0, _newjson);
                    return json[i];
                } else {
                    if (json[i].tag === 'grid') {
                        for (var j = 0; j < json[i].columns.length; j++) {
                            if (json[i].columns[j].list.length > 0) {
                                var _item = that.copyJsonAfterItem(json[i].columns[j].list, id);
                                if (_item) {
                                    return _item;
                                }
                            }
                        }
                    }
                }
            }
            return undefined;
        };
        /* 删除json中的节点并返回上一个节点*/
        Class.prototype.deleteJsonItem = function (json, id) {
            var that = this,
                options = that.config;
            for (var i = 0; i < json.length; i++) {
                if (json[i].id === id) {
                    json.splice(i, 1);
                    if (i > 0) {
                        return json[i - 1];
                    }
                    break;
                }else {
                    if (json[i].tag === 'grid') {
                        for (var j = 0; j < json[i].columns.length; j++) {
                            if (json[i].columns[j].list.length > 0) {
                                that.deleteJsonItem(json[i].columns[j].list, id);
                            }
                        }
                    }
                }
            }
            return undefined;
        };
        /* 自动生成ID 当前页面自动排序*/
        Class.prototype.autoId = function (tag) {
            var that = this,
                options = that.config;
            options.generateId = options.generateId + 1;
            var findJsonItem = that.findJsonItem(options.data,tag + '_' + options.generateId);
            if (findJsonItem != undefined) {
                return that.autoId(tag);
            } else {
                return tag + '_' + options.generateId;
            }
        }
        //递归赋值
        Class.prototype.findAndCopyJson = function (json,parentItem,id) {
            var that = this;
            for (var i = 0; i < json.length; i++) {
                if (json[i].id === id) {
                    json[i] = parentItem;
                } else {
                    if (json[i].tag === 'grid') {
                        for (var j = 0; j < json[i].columns.length; j++) {
                            if (json[i].columns[j].list.length > 0) {
                                that.findAndCopyJson(json[i].columns[j].list,parentItem,id);
                            }
                        }
                    }
                }
            }
        }
        /* 此方法最后一道 commom.js 中 */
        String.prototype.format = function (args) {
            var result = this;
            if (arguments.length > 0) {
                if (arguments.length == 1 && typeof (args) == "object") {
                    for (var key in args) {
                        if (args[key] != undefined) {
                            var reg = new RegExp("({" + key + "})"
                                , "g");
                            result = result.replace(reg
                                , args[key]);
                        }
                    }
                } else {
                    for (var i = 0; i < arguments.length; i++) {
                        if (arguments[i] != undefined) {
                            var reg = new RegExp("({[" + i + "]})"
                                , "g");
                            result = result.replace(reg
                                , arguments[i]);
                        }
                    }
                }
            }
            return result;
        }
        exports('formDesigner'
            , formDesigner);
    });