js分享3

(function (window) {

    var _WFCFrame = function () {
    }

    //    $.extend(_WFCFrame, {
    //        Param: {//公共参数,若为组件私有参数,可定义在compName.Param中
    //            windcode: ‘600000.SH‘,
    //            resizable: getParameter(‘resizable‘) != 0,
    //            sortable: getParameter(‘sortable‘) != 0,
    //            custType: null, //客户类型(风险类型)
    //            FCType: 1, //fc类型
    //            TerminalType: getParameter(‘TerminalType‘) || 101, //终端类型
    //            CustomerId: null
    //            //CustAddType:null//客户新增类型(手动新增/导入)
    //        }
    //        , CurrentWorkspace: null//当前workspace
    //    });

    /* 通用方法 */
    $.fn.extend({
        whSize: function (type, size) {
            if (type.toLowerCase() == ‘w‘) {
                return size ? this.width(size) : this.width();
            } else if (type.toLowerCase() == ‘h‘) {
                return size ? this.height(size) : this.height();
            } else {
                return size ? -1 : this;
            }
        },
        bindFocusEffect: function () {
            return this.focus(function () {
                if ($(this).is(‘input[type="text"],textarea‘)) {
                    setClientSmartInput(0);
                }
                $(this).addClass(‘ui-state-focus‘);
            }).blur(function () {
                if ($(this).is(‘input[type="text"],textarea‘)) {
                    setClientSmartInput(1);
                }
                $(this).removeClass(‘ui-state-focus‘);
            });
        }
    });

    $.extend({
        isObjEqual: IsObjEqual
    });

    function inverseColor(colorCode/* #AABBCC or rgb(12,34,56) */) {
        if (typeof colorCode == ‘string‘) {
            if (colorCode.search(/rgb/i) >= 0) {
                var colors = colorCode.replace(/RGB|\(|\)/ig, ‘‘).split(‘,‘);
                if (colors && colors.length == 3) {
                    return ‘rgb(‘ + (255 - colors[0]) + ‘,‘ + (255 - colors[1]) + ‘,‘ + (255 - colors[2]) + ‘)‘;
                }
            } else if (colorCode.search(/#/i) >= 0) {
                var color = colorCode.replace(/#/ig, ‘‘);
                return ‘#‘ + (parseInt(‘FFFFFF‘, 16) - parseInt(color, 16)).toString(16);
            }
        }
        return ‘‘;
    }

    function fillSettingBySettingProperty(setting, settingProperty) {
        if (settingProperty) {
            $.each(settingProperty, function (index, item) {
                if (!setting.hasOwnProperty(index)) {
                    //为区分复杂类型的setting值与settingProperty,settingProperty obj必须有dVal
                    var val = $.type(item) === ‘object‘ ? item.dVal : item;
                    if (val != null && typeof (val) != ‘undefined‘) {
                        setting[index] = val;
                    }
                }
            });
        }
    }

    //跟$.extend(obj1,obj2)的区别在于obj2的为null的属性会复制过去但null值不会带过去
    function mergeObj(/*target,obj1,obj2,obj3,...*/) {
        var target = arguments[0] || {}, len = arguments.length, options, name;
        if (typeof target !== "object" && !jQuery.isFunction(target)) {
            target = {};
        }

        for (i = 1; i < len; i++) {
            if ((options = arguments[i]) != null) {
                for (name in options) {
                    if (options[name] === undefined || options[name] === null) {
                        if (!target.hasOwnProperty(name)) {
                            target[name] = options[name];
                        }
                    } else {
                        target[name] = options[name];
                    }
                }
            }
        }

        return target;
    }

    //与mergeObj类似,增加了对dVal的判断
    function mergeSettingProperty(/*target,obj1,obj2,obj3,...*/) {
        var target = arguments[0] || {}, len = arguments.length, options, name;
        if (typeof target !== "object" && !jQuery.isFunction(target)) {
            target = {};
        }

        for (i = 1; i < len; i++) {
            if ((options = arguments[i]) != null) {
                for (name in options) {
                    if (!target.hasOwnProperty(name)) {
                        target[name] = options[name];
                    } else {
                        if ($.isPlainObject(options[name])) {
                            if (!$.isPlainObject(target[name])) {
                                target[name] = { dVal: target[name] };
                            }
                            mergeObj(target[name], options[name]);
                        }
                        else if (options[name] != undefined && options[name] != null) {
                            if ($.isPlainObject(target[name])) {
                                target[name].dVal = options[name];
                            } else {
                                target[name] = options[name];
                            }
                        }
                    }
                }
            }
        }

        return target;
    }

    //填入默认对象中property填充到目标对象中(在目标对象无此属性时,且只判断第一层,但属性值深度拷贝)
    function fillDefalutProperty(targetObj, defaultObj) {
        if ($.type(targetObj) !== ‘object‘)
            targetObj = {};
        $.each(defaultObj, function (index, item) {
            if (!targetObj.hasOwnProperty(index)) {
                targetObj[index] = $.type(item) === ‘object‘ ? $.extend(true, {}, item) : item;
            }
        });
        return targetObj;
    }

    function replaceSettingPropertyGroup(SP) {
        if (!SP) {
            return;
        }
        $.each(SP, function (index, item) {
            if (item && item.isGroup) {
                delete SP[index];
                if (SettingPropertyGroups.hasOwnProperty(index)) {
                    /*待修改,改为单独设置优先与group设置*/
                    $.extend(SP, $.extend(true, {}, SettingPropertyGroups[index]));
                }
            }
        });
    }

    /* end of 通用方法 */

    /*内部变量*/
    var param = {//公共参数,若为组件私有参数,可定义在compName.Param中
        windcode: ‘600000.SH‘,
        resizable: getParameter(‘resizable‘) != 0,
        sortable: getParameter(‘sortable‘) != 0,
        custType: null, //客户类型(风险类型)
        FCType: 1, //fc类型
        TerminalType: getParameter(‘TerminalType‘) || 101, //终端类型
        CustomerId: null
        //CustAddType:null//客户新增类型(手动新增/导入)
    }
    var currentWorkspace = null;
    var containerSelHelper = null;
    var minSize = 10; //最小宽度或高度
    var droppable_option = {
        accept: ‘.widgetCase,.widget‘
        , hoverClass: ‘droppable-hover‘
        //        , over: function () {
        //            console.log(‘over‘);
        //        }
        //        , out: function () {
        //            console.log(‘out‘);
        //        }
        , drop: function (event, ui) {
            var $dropHolder = $(‘.droppable-placeHolder‘).hide();
            var pos = $dropHolder.prop(‘pos‘);
            if (pos && pos.type) {
                var isCase = ui.draggable.hasClass(‘widgetCase‘); //是否外部拖入元素
                var $widget = isCase ? createWidget($.extend(true, {}, ui.draggable.prop(‘WFCWidgetOption‘))) : ui.draggable;
                var $parent = ui.draggable.parent(‘.container‘);
                var $this = $(this);
                switch (pos.type) {
                    case ‘topLeft‘:
                        //替换或交换位置
                        if (isCase) {
                            removeWidget($(this).children(‘.widget‘));
                            $this.append($widget);
                        } else {
                            var $p = ui.draggable.parent();
                            if ($p.is($this)) {
                                return;
                            }

                            $p.append($this.find(‘.widget‘));
                            $this.append($widget);

                            //交换位置导致selected变化
                            if ($p.hasClass(‘selected‘)) {
                                $p.removeClass(‘selected‘);
                                $this.addClass(‘selected‘);
                            } else if ($this.hasClass(‘selected‘)) {
                                $this.removeClass(‘selected‘);
                                $p.addClass(‘selected‘);
                            }

                            resizeContainer($p);
                            resizeContainer($this);
                        }
                        break;
                    case ‘topRight‘:
                        //左右切分
                        divideContainer($(this), ‘horizontal‘, 0, $widget);
                        if (!isCase) {
                            removeContainer($parent); //删除原容器
                        }
                        break;
                    case ‘bottom‘:
                        //上下切分
                        divideContainer($(this), ‘vertical‘, 0, $widget);
                        if (!isCase) {
                            removeContainer($parent); //删除原容器
                        }
                        break;
                }

                var $ws = $widget.closest(‘.workspace‘);
                if ($ws.data(‘WFCWorkspace‘)) {
                    $ws.WFCWorkspace("Update");
                }

                if (isCase) {
                    //$widget.WFCWidget($widget.prop(‘WFCWidgetOption‘));
                    initWorkspaceWidget($widget, $ws);
                    //remove selected
                    if ($ws.data(‘WFCWorkspace‘)) {
                        $ws.WFCWorkspace(‘UnSelectContainer‘);
                    }
                    $widget.parent().trigger(‘click‘);
                }
            }

            //                if ($(this).children(‘.widget‘).length > 0) {
            //                    return; //已经有内容了
            //                }
        }
    }

    var resizable_option = {
        handles: ‘e‘
        //, containment: "parent"//此项有时会失效且调整完成后,会莫名增加left样式(发生位移)
        , minHeight: minSize
        , minWidth: minSize
        , helper: ‘resizable-helper-e‘
        //, grid: 2
        , stop: function (event, ui) {
            var parent = ui.element.parent();
            var $next = ui.element.next();
            var isHor = parent.hasClass(‘horizontal‘);
            var sF = ui.element.whSize(isHor ? ‘w‘ : ‘h‘) + (isHor ? 4 : (typeof isIE8 === ‘undefined‘ ? 3 : 4)); //4横向对其了,但纵向差1 (但在ie8下正好)
            var sT = parent.whSize(isHor ? ‘w‘ : ‘h‘);
            var sN = $next.whSize(isHor ? ‘w‘ : ‘h‘);
            var oSize = isHor ? ui.originalSize.width : ui.originalSize.height;
            var sNTarget = sN + oSize - sF;
            if (sF < minSize) {
                sF = minSize;
                sNTarget = sN + oSize - sF;
            } else if (sNTarget < minSize) {
                sNTarget = minSize;
                sF = sN + oSize - sNTarget;
            }

            resizeContainer(ui.element.attr(‘size‘, (sF / sT).toFixed(5)), sF, isHor);
            resizeContainer(ui.element.next().attr(‘size‘, (sNTarget / sT).toFixed(5)), sNTarget, isHor); //-1 for abcpdf

            //这里包括content与页眉页脚都可能调用
            var $ws = ui.element.closest(‘.workspace‘);
            if ($ws.data(‘WFCWorkspace‘)) {
                if (ui.element.closest(‘.pageHeader,.pageFooter‘).length > 0) {
                    $ws.data(‘WFCWorkspace‘).PageHeaderFooterUpdate();
                } else {
                    $ws.WFCWorkspace("Update");
                }
            }
        }
    };

    var draggable_option = {
        cursorAt: { left: 60, top: 45 },
        appendTo: "body",
        helper: function () {
            var self = $(this);
            if (self.hasClass(‘widgetCase‘)) {
                return self.clone().addClass(‘widget-draggable-helper ui-state-hover‘);
            } else {
                return $(‘<div class="widget-draggable-helper ui-state-hover"><div class="widget-draggable-helper-del">删除</div><div class="widget-draggable-helper-title">‘ + $(this).find(‘.widget-head > .ui-dialog-title‘).text() + ‘</div></div>‘);
            }
        },
        scroll: false,
        iframeFix: true,
        drag: function (event, ui) {
            //console.log(ui.position.top + ‘,‘ + ui.position.left + ‘ ; ‘ + ui.offset.top + ‘,‘ + ui.offset.left);
            var $currentDrop = $(‘.workspace .droppable-hover‘);
            if ($currentDrop.length > 0) {
                ui.helper.removeClass("del").removeClass("ui-state-error");
                //get pos
                var pos = null;
                var cH = $currentDrop.height(), cH2 = Math.round(cH / 2), cW = $currentDrop.width(), cW2 = Math.round(cW / 2), cOffset = $currentDrop.offset();
                var mouseX = event.pageX, mouseY = event.pageY;
                if ($currentDrop.children(‘.container,.widget‘).length == 0 || $(this).parent()[0] === $currentDrop[0] || (cOffset.left <= mouseX && mouseX <= cOffset.left + cW2 && cOffset.top <= mouseY && mouseY <= cOffset.top + cH2)) {
                    pos = { type: ‘topLeft‘, left: cOffset.left, top: cOffset.top, width: cW, height: cH };
                } else if (cOffset.left + cW2 < mouseX && mouseX <= cOffset.left + cW && cOffset.top <= mouseY && mouseY <= cOffset.top + cH2) {
                    pos = { type: ‘topRight‘, left: cOffset.left + cW2, top: cOffset.top, width: cW - cW2, height: cH };
                } else if (cOffset.left <= mouseX && mouseX <= cOffset.left + cW && cOffset.top + cH2 < mouseY && mouseY <= cOffset.top + cH) {
                    pos = { type: ‘bottom‘, left: cOffset.left, top: cOffset.top + cH2, width: cW, height: cH - cH2 };
                }
                showDroppablePlaceHolder(pos);
            } else {
                hideDroppablePlaceHolder();
                //console.log(ui.position.top + ‘,‘ + ui.position.left + "|" + ui.offset.top + ‘,‘ + ui.offset.left);
                //if (!event.srcElement.closest(‘.workspace‘).length) {
                //这里还是应该判断鼠标位置是否在workspace中来做
                if (!ui.helper.hasClass(‘widgetCase‘))
                    ui.helper.addClass("del ui-state-error");
                //}
            }
        },
        stop: function (event, ui) {
            if (!ui.helper.hasClass(‘widgetCase‘) && ui.helper.hasClass(‘del‘)) {
                removeContainer($(this).parent(‘.container‘));
            }
        }
    };

    var ProductsBasicInfo = {};

    var SettingPropertyGroups = {
        group_tableStyle: {
            tableStyle: { groupId: ‘tableBorder‘, groupText: ‘框线‘ },
            tableBorderColor: { groupId: ‘tableBorder‘ },
            tableHeadFontStyle: { groupId: ‘tableHead‘, groupText: ‘表头‘ },
            tableHeadFontColor: { groupId: ‘tableHead‘ },
            tableHead: { groupId: ‘tableHead‘ },
            tableRowHeight: { groupId: ‘tableRow‘, groupText: ‘行设置‘ },
            tableBgColor: { groupId: ‘tableRow‘ },
            tableInterlacedRowBgColor: { groupId: ‘tableRow‘ }
        }
    };

    /*end of 内部变量*/

    /* functions */
    function containerClick(evt) {
        var sel = $(‘.workspace .container.selected‘);
        if (sel.length > 0 && sel[0] === this) {
            //$(this).removeClass(‘selected‘);
        } else {
            sel.closest(‘.workspace‘).WFCWorkspace(‘UnSelectContainer‘);

            var self = $(this);
            self.closest(‘.workspace‘).WFCWorkspace(‘SelectContainer‘, self);
        }
        return true;
    }

    //用:hover实现(不支持ie6)
    //    function containerHoverOver(evt) {
    //        var self = $(this);
    //        self.addClass(‘hover‘).append(containerSelHelper);
    //    }

    //    function containerHoverOut(evt) {
    //        var self = $(this);
    //        self.removeClass(‘hover‘);
    //    }

    function removeSelected() {
        $(‘.workspace .container.selected‘).removeClass(‘selected‘);
        var SA = WFCFrame.Settings.widgetSetArea;
        if (SA && SA.data(‘WFCSetting‘)) {
            SA.WFCSetting(‘destroy‘);
        }
        this._trigger("Destroy", null, null);
    }

    function divideContainer($container, direction, childrenPos/*原内容位置,0放置在first中(默认),1放置在last中*/, otherChildren/*需装入另一个容器的内容*/) {
        var isHor = direction.toLowerCase() == ‘horizontal‘ ? true : false; //水平/垂直切分
        if ($container && $container.length > 0) {
            var sT = isHor ? $container.width() : $container.height();
            var sF = Math.round(sT / 2);
            if (sF < minSize)
                return;

            var $children = $container.children(‘.container,.widget‘); //$container.find(‘.widget‘)
            var hasSel = $container.hasClass(‘selected‘);
            $container.unbind("click").droppable(‘destroy‘).removeClass(‘selected horizontal vertical‘).addClass(isHor ? ‘horizontal‘ : ‘vertical‘);
            var $cF = $(‘<div class="container container-first ‘ + (hasSel ? ‘selected‘ : ‘‘) + ‘"></div>‘).attr(‘size‘, (sF / sT).toFixed(5)).whSize(isHor ? ‘w‘ : ‘h‘, sF).append($children).prepend(containerSelHelper);
            var $cL = $(‘<div class="container container-last"></div>‘).whSize(isHor ? ‘w‘ : ‘h‘, sT - sF); //-1 for abcpdf
            $children.appendTo(childrenPos ? $cL : $cF);
            if (otherChildren) {
                otherChildren.appendTo(childrenPos ? $cF : $cL);
            }
            $container.append($cF).append($cL);

            $cF.resizable($.extend(resizable_option, { handles: (isHor ? ‘e‘ : ‘s‘), helper: (isHor ? ‘resizable-helper-e‘ : ‘resizable-helper-s‘) }));

            bindLeafContainerEvent($container.children(‘.container‘));

            //call widget resize
            //resizeWidget($widget);
            resizeContainer($container); //内容需resize
        }
    }

    function removeContainer($container) {
        //有子container时不可删除,并保留另一个container的children
        if ($container && $container.length > 0 && $container.children(‘.container‘).length <= 0) {
            var $ws = $container.closest(‘.workspace‘);
            //有子widget,先删除widget
            removeWidget($container.children(‘.widget‘));

            //根容器本身不可删除(只删除widget)
            if (!$container.parent().hasClass(‘container‘))
                return;

            var $p = $container.parent();
            var $sibs = $container.siblings(‘.container‘);
            if ($sibs.children(‘.container‘).length > 0) {
                var isHor = $sibs.hasClass(‘horizontal‘);
                $p.append($sibs.children(‘.container‘)).removeClass(‘horizontal vertical‘).addClass(isHor ? ‘horizontal‘ : ‘vertical‘);
            }
            else {
                $p.append($sibs.children(‘.widget‘)).removeClass(‘horizontal vertical‘);
                bindLeafContainerEvent($p);
            }
            $sibs.remove();
            //$container.find(‘.widget‘).WFCWidget(‘destroy‘);
            var isSelected = $container.hasClass(‘selected‘);
            $container.remove();

            if (isSelected) {
                var $setArea = WFCFrame.Settings.widgetSetArea;
                if ($setArea && $setArea.data(‘WFCSetting‘))
                    $setArea.WFCSetting(‘destroy‘);
            }

            resizeContainer($p);
            //call widget reseize or do it in resizeContainer

            //通知workspace更新 (若要求效率,是不是没有给container都要隐藏要给引用指向对应的workspace,或放在dom上或放在绑定事件中)

            if ($ws.data(‘WFCWorkspace‘)) {
                $ws.WFCWorkspace("Update");
            }
        }
    }

    function resizeContainer($container, size, isHor) {
        if ($container && $container.length > 0) {
            //deal with self if size is defined
            if (size) {
                $container.whSize(isHor ? ‘w‘ : ‘h‘, size).whSize(isHor ? ‘h‘ : ‘w‘, ‘100%‘); // whSize(isHor ? ‘h‘ : ‘w‘, isHor ? $container.parent().height() : $container.parent().width()); //在container不显示时,设置100%并不起作用
            }

            var $children = $container.children(‘.container‘);
            var len = $children.length;
            var isHorChild = $container.hasClass(‘horizontal‘);
            if (len > 0) {
                var childTotalSize = $container.whSize(isHorChild ? ‘w‘ : ‘h‘);
                var sizeUsed = 0;
                var sF = 0;
                $children.each(function (index, item) {
                    if (index < len - 1) {
                        sF = Math.round(childTotalSize * ($(item).attr(‘size‘) || 0));
                        sizeUsed += sF;
                    } else {
                        sF = childTotalSize - sizeUsed;
                    }
                    resizeContainer($(item), sF, isHorChild);
                });
            } else {
                //call widget resize
                resizeWidget($container.find(‘.widget‘));
            }
        }
    }

    function createWidget(option, noDaggable) {
        var $w = $(‘<div class="widget"></div>‘).prop(‘WFCWidgetOption‘, option);
        if (!noDaggable) {
            $w.draggable(draggable_option);
        }
        return $w;
    }

    function removeWidget($widget) {
        if ($widget && $widget.length > 0) {
            var isSelected = $widget.parent().hasClass(‘selected‘);
            $widget.remove();
            if (isSelected) {//如被删除控件中含被选中的,则需要销毁设置区域
                var SA = WFCFrame.Settings.widgetSetArea;
                if (SA && SA.data(‘WFCSetting‘)) {
                    SA.WFCSetting(‘destroy‘);
                }
            }
        }
    }

    function createContainer($pContainer, option, isLast, dicWidgets, editable) {
        if (!option)
            return;
        editable = typeof (editable) == ‘undefined‘ || editable;
        if (option.type > 0) {
            //widget
            if (option.WidgetID && dicWidgets.hasOwnProperty(option.WidgetID)) {
                option.setting = dicWidgets[option.WidgetID].setting;
            }
            if (editable) {
                bindLeafContainerEvent($pContainer);
            }
            $pContainer.append(createWidget(option, !editable));
        } else {
            //container
            var isHor = $pContainer.hasClass(‘horizontal‘);
            var $new = $(‘<div class="container ‘ + (isLast ? ‘ container-last‘ : ‘ container-first‘) + (option.hv == 0 ? ‘ horizontal‘ : ‘ vertical‘) + ‘"></div>‘).attr(‘size‘, option.sz);
            if (!isLast && editable) {
                $new.resizable($.extend(resizable_option, { handles: (isHor ? ‘e‘ : ‘s‘), helper: (isHor ? ‘resizable-helper-e‘ : ‘resizable-helper-s‘) }));
            }
            $pContainer.append($new);
            if (option.ct && option.ct.length > 0) {
                createContainer($new, option.ct[0], option.ct.length == 1, dicWidgets, editable);
                if (option.ct.length > 1)//只考虑1或2个container的情况
                    createContainer($new, option.ct[1], true, dicWidgets, editable);
            } else if (editable) {
                bindLeafContainerEvent($new);
            }
        }
    }

    function bindLeafContainerEvent($container) {
        if ($container && $container.length) {
            $container.click(containerClick).droppable(droppable_option); //.hover(containerHoverOver, containerHoverOut)
        }
        return $container;
    }

    function showDroppablePlaceHolder(pos) {
        var $pHolder = $(‘.droppable-placeHolder‘);
        if ($pHolder.length <= 0) {
            $pHolder = $(‘<div class="droppable-placeHolder ui-widget-overlay"></div>‘).css({ position: ‘absolute‘ }).appendTo(‘body‘);
        }

        var oraginalPos = $pHolder.prop(‘pos‘);
        if (pos && pos.type) {
            if (oraginalPos && oraginalPos.type == pos.type && oraginalPos.left == pos.left && oraginalPos.top == pos.top && oraginalPos.width == pos.width && oraginalPos.height == pos.height) {
                //位置不变
            } else {
                $pHolder.css({ left: pos.left + ‘px‘, top: pos.top + ‘px‘, width: pos.width + ‘px‘, height: pos.height + ‘px‘ }).prop(‘pos‘, pos);
            }
            $pHolder.show();
        } else
            $pHolder.hide();
    }

    function hideDroppablePlaceHolder() {
        $(‘.droppable-placeHolder‘).hide();
    }

    function initWorkspaceWidget($widget, $ws) {
        var callbacks = ($ws && $ws.data("WFCWorkspace")) ? {
            //通知workspace更新,function不会被json化
            Update: function () {
                $ws.WFCWorkspace("Update");
            },
            Complete: function () {
                $ws.WFCWorkspace("WidgetComplete");
            }
        } : null;
        $widget.WFCWidget($.extend($widget.prop(‘WFCWidgetOption‘), callbacks));
    }

    function getNoDataBlockOption(message) {
        var html = ‘<p class="noDataTip"><span class="iconfont"></span>‘ + (message || ‘暂无数据‘) + ‘&nbsp;&nbsp;<a class="aWidgetRefresh" onclick="WFCFrame.RefreshWidget(this);">刷新</a><p>‘;
        //html += ‘<p class="noDataTip">1.数据加载失败,点击<a>此处</a>刷新<br/>2.检查输入条件是否存在数据</p>‘;

        var NoDataBlockOption = {
            noIframe: true,
            message: html,
            css: {
                padding: 0,
                margin: 0,
                textAlign: ‘center‘,
                color: ‘#929292‘,
                width: ‘80%‘,
                //border: ‘1px solid #A6C9E2‘,
                fontSize: ‘16px‘,
                cursor: ‘default‘
            },
            overlayCSS: {
                backgroundColor: ‘#FCFDFD‘,
                opacity: 0.4,
                cursor: ‘default‘
            }
        }
        return NoDataBlockOption;
    }

    function initSelHelper() {
        var $helper = $(‘<div class="container-selected-helper"></div>‘).appendTo(‘body‘); //<a class="container-selected-helper-del">删除</a>
        //        $helper.find(‘.container-selected-helper-del‘).click(function () {
        //            var $ct = $(this).closest(‘.container.selected‘);
        //            var $wt = $ct.find(‘.widget‘);
        //            if ($wt.length > 0) {
        //                removeWidget($wt);
        //            } else {
        //                $helper.prependTo(‘body‘);
        //                removeContainer($ct);
        //            }
        //        });
        $helper.click(function (event) {
            event.stopPropagation();
        });
        return $helper;
    }

    function resizeWidget($widget) {
        try {
            if ($widget.data(‘WFCWidget‘))
                $widget.WFCWidget(‘Resize‘);
        }
        catch (e) {
            showDebugMsg(e.message);
        }
    }

    function getContainerContentObj($container) {
        //var _widgets = [];

        function _getContainerContentObj($container) {
            if ($container.hasClass(‘widget‘)) {
                var widgetOpt = $container.prop(‘WFCWidgetOption‘);
                //_widgets.push(widgetOpt);
                //var reval = $.extend({}, widgetOpt);
                //delete reval.setting; //setting不再单独存储
                //return reval;
                return widgetOpt;
            } else if ($container.hasClass(‘container‘)) {
                var ct = {
                    type: 0,
                    hv: $container.hasClass(‘horizontal‘) ? 0 : 1,
                    sz: $container.attr(‘size‘) || ‘‘
                };

                var $children = $container.children(‘.container,.widget‘);
                if ($children.length > 0) {
                    ct.ct = [];
                    $children.each(function () {
                        ct.ct.push(_getContainerContentObj($(this)));
                    });
                }
                return ct;
            }
            return {};
        }

        var _content = _getContainerContentObj($container);
        //widget(setting)与workspace content分开保存
        return { /*widgets: _widgets,*/content: _content };
    }

    function getProductsBasicInfo(windcodes/*array*/, callback) {
        var reVal = {};
        if (windcodes && $.isArray(windcodes)) {
            var codesNoInfo = ‘‘;
            $.each(windcodes, function (index, item) {
                if (item && !ProductsBasicInfo.hasOwnProperty(item))
                    codesNoInfo += (item + ‘,‘);
            });
            if (codesNoInfo.length > 0) {
                codesNoInfo = codesNoInfo.substring(0, codesNoInfo.length - 1);
                var parameters = [codesNoInfo];
                var dataParameters = { MethodAlias: "MFRB_GetProductsBasicInfo", Parameter: parameters };
                AjaxRequest(ajaxSecureUnlockHandler, dataParameters, function (result) {
                    if (result && result.State == 0 && typeof result.Data === ‘object‘) {
                        //fill ProductsInfo;
                        $.each(result.Data, function (index, item) {
                            if (!ProductsBasicInfo.hasOwnProperty(item.WindCode))
                                ProductsBasicInfo[item.WindCode] = item;
                        });
                    }
                    $.each(windcodes, function (index, item) {
                        if (ProductsBasicInfo.hasOwnProperty(item))
                            reVal[item] = $.extend(true, {}, ProductsBasicInfo[item]);
                    });
                    callback(reVal);
                });
            }
            else {
                $.each(windcodes, function (index, item) {
                    if (ProductsBasicInfo.hasOwnProperty(item))
                        reVal[item] = $.extend(true, {}, ProductsBasicInfo[item]);
                })
                callback(reVal);
            }
        }
    }

    function getProductInfo(windcode, callback) {
        if (windcode && typeof (windcode) == ‘string‘) {
            getProductsBasicInfo([windcode], function (infos) {
                if (infos && infos[windcode]) {
                    callback(infos[windcode]);
                }
            });
        } else if ($.isArray(windcode)) {
            getProductsBasicInfo(windcode, callback);
        }
    }

    //反转chart里series的顺序,但legend顺序保持正序
    function reverseChartSeriesIndex(series) {
        if (series) {
            $.each(series, function (index, item) {
                item.index = series.length - index;
                item.legendIndex = index;
            });
        }
    }

    /* end of functions */

    $.widget("wfc.widgetResizable", {
        version: ‘1.0‘,
        options: {
            handles: "e"//e or s
            //zIndex: 1000
        },
        _create: function () {
            var self = this, opt = this.options, ele = this.element;
            this.handles = opt.handles;
            if (this.handles.constructor == String) {
                var n = this.handles.split(","); this.handles = {};
            }
            ele.addClass("wfc-widgetResizable");
            for (var i = 0; i < n.length; i++) {
                var handle = $.trim(n[i]), hname = ‘wfc-widgetResizable-‘ + handle;
                var axis = $(‘<div class="wfc-widgetResizable-handle ‘ + hname + ‘"></div>‘);

                //Insert into internal handles object and append to element
                this.handles[handle] = ‘.wfc-widgetResizable-‘ + handle;
                this.element.append(axis);
                var dragOpt = $.extend({}, opt, {
                    axis: handle === ‘e‘ ? ‘x‘ : ‘y‘,
                    start: function (event, ui) {
                        var drag = $(this).data("draggable"), o = drag.options;
                        var that = $(this).parent().data(‘widgetResizable‘);
                        $(‘body‘).css(‘cursur‘, o.axis === ‘x‘ ? ‘e-resize‘ : ‘s-resize‘);
                        that._trigger(‘start‘, event, ui);
                    },
                    stop: function (event, ui) {
                        $(‘body‘).css(‘cursur‘, ‘auto‘);
                        var drag = $(this).data("draggable"), o = drag.options;
                        var that = $(this).parent().data(‘widgetResizable‘);
                        if (o.axis === ‘x‘) {
                            that.element.width(ui.position.left);
                        } else if (o.axis === ‘y‘) {
                            that.element.height(ui.position.top);
                        }
                        that._trigger(‘stop‘, event, ui);
                    }
                });

                if (handle === ‘e‘) {
                    axis.css(‘left‘, ele.width());
                } else if (handle === ‘s‘) {
                    axis.css(‘top‘, ele.height());
                }
                axis.draggable(dragOpt);
            }
        },
        _destroy: function () {
            var self = this, opt = this.options, ele = this.element;
            ele.find(‘.wfc-widgetResizable-handle‘).draggable(‘destroy‘);
            ele.removeClass("wfc-widgetResizable");
        }
    });

    /*
    WFCFrame:框架,全局命名空间,包含对下列一系列对象的组织和调用
    Workspace:工作区域,一般为页面的主要内容区域,包含嵌套的多层容器(Container)
    Container:容器,包含一个Widget或两个Container
    Widget:控件,可添加到容器中,在容器限定的区域中展示自定义的业务界面,每个控件需实现预定义的API以与框架交互
    Compment:是否需要?
    Template:模板,包含一系列预定义配置和容器布局的工作区

    SettingProperty:设置的设置,一方面表示有哪些设置可用,另一方面其值有两种情况:一种为非object类型,则表示此设置的默认值,另一种则为复杂设置对象{opts:‘下拉选项‘,dVal:‘默认值‘}

    */

    /* WFCWorkspace define */
    (function ($) {
        $.widget(‘wfc.WFCWorkspace‘, {
            version: ‘2.0‘,
            options: {
                PageHeaderFooter: {
                    header: { sz: 30, content: [{ sz: 0.25, option: { type: 611 } }, { sz: 0.5, option: { type: 611 } }, { sz: 0.25, option: { type: 611 } }] },
                    footer: { sz: 30, content: [{ sz: 0.25, option: { type: 611 } }, { sz: 0.5, option: { type: 611 } }, { sz: 0.25, option: { type: 611 } }] }
                },
                PageIndex: 1,
                editable: true,
                //callback
                Update: null,
                PageHeaderFooterUpdate: null,
                ContainerUnSelect: null,
                ContainerSelect: null,
                Complete: null
            },
            _createWidget: function (option, element) {
                this.originalOption = option || {};
                this._super(option, element);
            },
            _create: function () {
                var self = this,
                options = this.options,
                $divWs = this.element,
                currentWorkspace = this;

                //以下内容注释,暂时仅让widget支持SettingPropertyGroup
                //replaceSettingPropertyGroup(WFCFrame.Report.SettingProperty);
                //replaceSettingPropertyGroup(options.SettingProperty);

                //合并SettingProperty待实现
                options.SettingProperty = $.extend({}, WFCFrame.Report.SettingProperty, options.SettingProperty);
                options.setting = $.extend({}, WFCFrame.Report.SettingObj, options.setting);
                $divWs.addClass(‘workspace‘).attr(‘WFCWorkspace‘, 1).attr(‘workspace-state‘, ‘loading‘);
                var setting = options.setting;
                //填补setting的默认值
                fillSettingBySettingProperty(setting, options.SettingProperty);

                //当用户点击非container和setting区域时,需要移除选中效果
                $(‘body‘).click(function (event) {
                    var $target = $(event.target);
                    if ($target.closest(‘.container,.setting-area,.win-widgetSetting,.ui-datepicker,.ui-datepicker-header,.ui-multiselect-menu‘).length == 0) {
                        $(‘.workspace[workspace-state=complete]:visible‘).WFCWorkspace(‘UnSelectContainer‘);
                        //removeSelected();
                    }
                });

                var dicWidgets = {};
                //widget设置存到workspace中,以避免复制等出现的问题
                //                if (options.Widgets && options.Widgets.length > 0) {
                //                    $.each(options.Widgets, function (index, item) {
                //                        if (!item.hasOwnProperty(‘setting‘))
                //                            item.setting = JSON2.parse(item.Setting || ‘{}‘);
                //                        dicWidgets[item.WidgetID] = item;
                //                    });
                //                }

                //init workspace size
                //var XinZhiSize = { width: 612, height: 792, padding: [24, 54, 24, 54], scale: 1.3333 }; //单位pt
                var paddingTandB = 3;
                var paddingMax = 200;
                var paddingTandBPixel = Math.round(paddingTandB * setting.scale);
                var paddingMaxPixel = Math.round(paddingMax * setting.scale);
                var pageW = Math.round(setting.width * setting.scale);
                var pageH = Math.round(setting.height * setting.scale);
                var pagePadding = setting.padding;
                if (pagePadding && pagePadding.length == 4) {
                    var pagePaddingPixel = [];
                    $.each(pagePadding, function (index, item) {
                        pagePaddingPixel.push(Math.round(item * setting.scale));
                    });
                    //pageW = pageW - pagePaddingPixel[1] - pagePaddingPixel[3];
                    pageH = pageH - paddingTandBPixel * 2;
                    $divWs.css({
                        padding: paddingTandBPixel + ‘px ‘ + 0 + ‘px ‘ + paddingTandBPixel + ‘px ‘ + 0 + ‘px‘
                    });
                }

                $divWs.css({
                    width: pageW + ‘px‘,
                    height: pageH + ‘px‘
                });

                $divWs.append(‘<div class="pageHeader horizontal"></div><div class="pageContent"></div><div class="pageFooter horizontal"></div>‘);
                $divWs.children(‘.pageContent‘).css({
                    marginLeft: (pagePaddingPixel[3] - 1) + ‘px‘,
                    marginRight: (pagePaddingPixel[1] - 1) + ‘px‘
                });
                //.resizable({//需要在content内容之前调用(否则e,s两边无法拉),估计跟内部的resizable冲突
                //handles: ‘n,s,e,w‘, helper: ‘ui-resizable-helper‘
                //,maxHeight:pageH
                //,minHeight:pageH - paddingMaxPixel * 2
                //,maxWidth:pageW - paddingTandBPixel * 2
                //, minWidth: pageW - paddingMaxPixel * 2
                //, start: function (evt, ui) {
                //    //saveSetting
                //    //console.log(evt.srcElement); has
                //    //ui.element

                //}
                //, stop: function (evt, ui) {
                //    if (WFCFrame.Report) {
                //        var setting = WFCFrame.Report.SettingObj;
                //        var padding = setting.padding;
                //        var resizeHandler = $(evt.srcElement);

                //        if (resizeHandler.hasClass(‘.ui-resizable-n‘)) {

                //        } else if (resizeHandler.hasClass(‘.ui-resizable-s‘)) {

                //        } else if (resizeHandler.hasClass(‘.ui-resizable-w‘)) {

                //        } else if (resizeHandler.hasClass(‘.ui-resizable-e‘)) {

                //        }

                //        $(‘.workspace[WFCWorkspace=1]‘).WFCWorkspace(‘Resize‘);
                //    }
                //    //report.Setting 需要刷新reprot的其他workspace(也可以自己做)
                //    //这里的report目前通过wfcframe.report获取,如果考虑多个report的情况的话,还是应该根据上下文获取,
                //    //不过workspace中应该可以保存,但是需要注意的是,如果通过option传入,则option会完全复制一份report,这显然是不愿意看到的情况
                //    //当然,report中最好保存其对应的workspace,这样可以更新,也可以通过jquery选择器
                //    //report.SaveSetting({padding:[]});
                //}
                //});
                $divWs.children(‘.pageHeader,.pageFooter‘).css({
                    paddingLeft: ‘3px‘, // pagePaddingPixel[3] + ‘px‘,
                    paddingRight: ‘3px‘//pagePaddingPixel[1] + ‘px‘
                });

                //init page Header and Footer
                var pageHF = this.options.PageHeaderFooter;
                var pageContentH = pageH;

                $.each(pageHF, function (index, item) {
                    if (item) {
                        var pH = Math.round((index == ‘header‘ ? pagePadding[0] - paddingTandB : pagePadding[2] - paddingTandB) * setting.scale) - 1;
                        pageContentH -= pH;
                        var $pH = $divWs.find(index == ‘header‘ ? ‘.pageHeader‘ : ‘.pageFooter‘);
                        $pH.attr(‘sz‘, item.sz).height(pH);
                        if (item.content && item.content.length) {
                            var pW = $pH.width(), len = item.content.length, tW = 0;
                            $.each(item.content, function (index2, item2) {
                                var $c = $(‘<div class="container"></div>‘);
                                if (options.editable) {
                                    $c.click(containerClick);
                                }
                                if (item2.option) {
                                    $c.append(createWidget(item2.option, true));
                                }
                                if (index2 < len - 1) {
                                    var w = Math.round((item2.sz || 0) * pW);
                                    tW += w;
                                    $c.attr(‘size‘, item2.sz).width(w + ‘px‘);
                                    if (options.editable) {
                                        $c.resizable($.extend(resizable_option, { handles: ‘e‘, helper: ‘resizable-helper-e‘ }));
                                    }
                                } else {
                                    $c.attr(‘size‘, item2.sz).width((pW - tW) + ‘px‘);
                                }
                                $pH.append($c);
                            });
                        }
                    }
                });
                $divWs.children(‘.pageContent‘).height(pageContentH);

                var $divPageContent = $divWs.children(‘.pageContent‘);

                if (!options.ContentJson) {
                    $divPageContent.append(bindLeafContainerEvent($(‘<div class="container"></div>‘)));
                } else {
                    //init by options.content
                    var wsContent = $.parseJSON(options.ContentJson);
                    if (!!wsContent) {
                        createContainer($divPageContent, wsContent, true, dicWidgets, options.editable);
                    }
                }

                var $rootContainer = $divPageContent.children(‘.container‘);
                $rootContainer.addClass(‘container-root‘).css({
                    float: ‘none‘ //根container设置float为none,解决ie8下height:100%无效的问题
                    //width: $divPageContent.width() + ‘px‘, //显示设置width与height避免width为小数导致换行问题
                    //height: $divPageContent.height() + ‘px‘
                }).prepend(‘<div class="emptyContainerTip tip"><span class="iconfont"></span> 可拖拽控件至此</div>‘);

                if (options.ContentJson) {
                    resizeContainer($rootContainer);
                    $divWs.find(‘.widget‘).each(function () {
                        initWorkspaceWidget($(this), $divWs);
                    });
                }

                //                if (param.resizable || param.sortable) {
                //                    $ws.find(‘.ui-resizable-handle‘).mousedown(function () {
                //                        overlayIframe($(this).closest(‘.column‘));
                //                    }).mouseup(function () {
                //                        removeIframeOverlay($(this).closest(‘.column‘));
                //                    }); //释放鼠标事件在移动后不触发,因此ondrag_end和resizable stop事件里也要触发

                $divWs.attr(‘workspace-state‘, ‘initComplete‘);
                this.WidgetComplete();
            },
            _destroy: function () {
                this.CollectInfo(); //销毁前将修改内容更新至option,以防止修改丢失
                this.element.removeClass(‘wrokspace‘).removeAttr(‘WFCWorkspace‘).removeAttr(‘workspace-state‘).empty(); //remove widget div时,会自动调用,因此其实这里可以不调用,且removeWidget时也不必显式调用destroy
            },
            _init: function () {

            },
            originalOption: null,
            needSave: false,
            needCollect: false, //workspace中widget,setting,layout的变化没有完全收集(后期考虑通过传递引用直接修改源数据)
            OriginalOption: function () {
                return this.originalOption;
            },
            UnSelectContainer: function () {
                var self = this;
                var sel = self.element.find(‘.container.selected‘);
                sel.removeClass(‘selected‘);
                //解决控件中textarea无法失去焦点问题(跟控件整体draggable化有关),此方法触发的blur事件中document.activeElement依然为其自身
                //现在改为在widget的UnSelect中做
                //sel.find(‘textarea,input‘).blur();

                var $widget = sel.find(‘.widget‘);
                var SA = WFCFrame.Settings.widgetSetArea;

                $widget.WFCWidget(‘UnSelect‘);

                if (SA && SA.data(‘WFCSetting‘)) {
                    SA.WFCSetting(‘destroy‘);
                }
                self._trigger("ContainerUnSelect", null, null);
            },
            SelectContainer: function ($container) {
                var self = this;
                $container.addClass(‘selected‘).append(containerSelHelper);
                //_WFCFrame.Settings.Init(‘widget‘);

                //这里应该triggle一个选中事件 或者 通过WFCFrame设置传入一个settingarea
                var $widget = $container.find(‘.widget‘);
                var SA = WFCFrame.Settings.widgetSetArea;

                $widget.WFCWidget(‘Select‘);

                if (SA && $widget.length > 0) {
                    var isPageHeaderFooter = $container.closest(‘.pageHeader,.pageFooter‘).length > 0;
                    if (SA.data(‘WFCSetting‘)) {
                        SA.WFCSetting(‘destroy‘);
                    }

                    SA.WFCSetting({ level: ‘widget‘, target: $widget, isPageHeaderFooter: isPageHeaderFooter });
                }

                self._trigger("ContainerSelect", null, null);
            },
            Resize: function () {
                //Resize PageHeaderFooter
                var self = this,
                   options = this.options,
                   $divWs = this.element;
                //var padding = options.setting.padding;//注意options.setting可能为空

                this.element.find(‘.pageHeader,.pageFooter‘).each(function (index, item) {
                    var $cs = $(this).children(‘.container‘);
                    var len = $cs.length;
                    var pW = $(this).width();
                    var tW = 0;
                    var ix = 0;
                    $cs.each(function () {
                        var self = $(this);
                        if (ix < len - 1) {
                            var w = Math.round((self.attr(‘size‘) || 0) * pW);
                            tW += w;
                            self.width(w + ‘px‘);
                            ix++;
                        } else {
                            self.width((pW - tW) + ‘px‘);
                        }
                    });
                });
                this.element.find(‘.pageHeader .widget,.pageFooter .widget‘).WFCWidget(‘Resize‘);

                //Resize Content
                var $divWs = this.element;
                var $rootContainer = $divWs.find(‘.container-root‘);
                resizeContainer($rootContainer);
            },
            WidgetComplete: function (widgetId) {
                //若要提高效率,应该采用注册机制
                var self = this, ele = this.element;
                if (ele.attr(‘workspace-state‘) == ‘initComplete‘ && ele.find(‘.widget[widget-state!=complete]‘).length == 0) {
                    ele.attr(‘workspace-state‘, ‘complete‘);
                    self._trigger("Complete", null, null);
                }
            },
            GetContentObj: function () {
                var $divWs = this.element;
                return getContainerContentObj($divWs.find(‘.pageContent .container-root‘));
            },
            GetPageHeaderFooter: function () {
                var $divWs = this.element;
                var pHF = { header: null, footer: null };
                $divWs.find(‘.pageHeader,.pageFooter‘).each(function () {
                    var $this = $(this);
                    var isHeader = $this.hasClass(‘pageHeader‘);
                    var result = { sz: $this.attr(‘sz‘), content: [] };
                    $this.children(‘.container‘).each(function () {
                        var $widget = $(this).children(‘.widget‘);
                        var obj = { sz: $(this).attr(‘size‘) || 0 };
                        if ($widget.length > 0) {
                            obj.option = $widget.prop(‘WFCWidgetOption‘);
                        }
                        result.content.push(obj);
                    });
                    if (isHeader) {
                        pHF.header = result;
                    } else {
                        pHF.footer = result;
                    }
                });
                return pHF;
            },
            Update: function () { //当内容有改变时,调用此方法
                this.needCollect = true;
                this._trigger(‘Update‘, null, null);
            },
            PageHeaderFooterUpdate: function () {//页眉页脚等report相关内容更新
                var options = this.options;
                var oriOpt = this.originalOption;
                var phf = this.GetPageHeaderFooter();
                if (phf) {
                    options.PageHeaderFooter = phf;
                    oriOpt.PageHeaderFooter = phf;
                }
                //                if(WFCFrame.Report){//这里放在PageHeaderFooterUpdate中做
                //                    WFCFrame.Report.PageHeaderFooter = options.PageHeaderFooter;
                //                }
                this._trigger(‘PageHeaderFooterUpdate‘, null, { PageHeaderFooter: options.PageHeaderFooter });
            },
            Save: function (callback) {
                //目前的保存是全部保存,一般不调用这里
                var self = this,
                options = this.options;
                //self.Update();
                self.CollectInfo();

                //这里考虑遍历this.options.Widgets并保存,目前是放在widget中保存的,注意可能出现widget(新增)保存中,已经获取contentJSON的情况
                var parameters = [options.ReportPageId, options.Name, options.ContentJson, options.Setting];
                var dataParameters = { MethodAlias: "MFRB_UpdateReportPage", Parameter: parameters };
                AjaxRequest(ajaxSecureUnlockHandler, dataParameters, function (result) {
                    self.needSave = false;
                    if (typeof callback === ‘function‘) {
                        callback();
                    }
                });
            },
            RefreshPageHeaderFooter: function () {

            },
            //将内容改变更新至option
            CollectInfo: function () {
                var self = this,
                options = this.options;
                if (this.needCollect) {
                    //用于同步更新自身(workspace)状态
                    var contentObj = this.GetContentObj();
                    if (contentObj && contentObj.content) {
                        options.ContentJson = JSON2.stringify(contentObj.content);
                        //options.Widgets = contentObj.widgets;
                        if (this.originalOption) {
                            this.originalOption.ContentJson = JSON2.stringify(contentObj.content);
                            //this.originalOption.Widgets = contentObj.widgets;
                        }
                    }
                    this.needCollect = false;
                }
            },
            ReCreate: function () {
                this.CollectInfo();
                var opt = this.originalOption;
                this.element.WFCWorkspace(‘destroy‘).prop(‘wsOption‘, opt).WFCWorkspace(opt);
            }
        })
    })(jQuery);

    /* WFCWidget define */

    (function ($) {
        //调用各widget自定义的方法

        var WidgetKind = {
            singleFund: 1,
            multiFund: 2,
            portfolio: 3//(单)组合
        }

        //所有Widget定义都需要在此注册,并放在WFCFrame.Widgets命名空间下
        var WidgetDefine = {
            601: ‘FundPerformanceYieldChart‘
                            , 602: ‘FundPerformanceNetValueTable‘
                            , 603: ‘TextWidget‘
                            , 604: ‘ImageWidget‘
                            , 605: ‘FundHoldingStockStyle‘
                            , 606: ‘FundRiskAnalysisTable‘
                            , 607: ‘FundHeavilyStorehouseSecurity‘
                            , 608: ‘FundBasicInformation‘
                            , 609: ‘FundAssetAllocationChart‘
                            , 610: ‘PageNumber‘
                            , 611: ‘EmptyWidget‘
                            , 612: ‘FundHoldingAssetsConfigurationPie‘
                            , 613: ‘PurchaseInfomation‘
                            , 614: {
                                typeName: ‘GeneralReadonlyTextWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetInvestmentTargetData‘,
                                    Params: function (opts) {
                                        return [opts.setting.majorWindCode, opts.setting.endTime]
                                    },
                                    SettingProperty: {
                                        majorWindCode: null,
                                        title: ‘投资目标‘,
                                        hideHead: null
                                    }
                                }
                            }
                            , 615: ‘FundHistoricalReturnTable‘
                            , 616: ‘FundManagerChange‘
                            , 617: {
                                    //单基金-市场展望
                                    typeName: ‘GeneralReadonlyTextWidget‘,
                                    option: {
                                        MethodAlias: ‘MFRB_GetFundMarketOverlookData‘,
                                        Params: function (opts) {
                                            return [opts.setting.majorWindCode, opts.setting.endTime]
                                        },
                                        SettingProperty: {
                                            majorWindCode: null,
                                            title: ‘市场展望‘,
                                            hideHead: null
                                        }
                                }
                            }
                            , 618: {
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetFundHistoricalScaleTableData‘,
                                    Params: function (opts) {
                                        return [opts.setting.majorWindCode, opts.setting.beginTime, opts.setting.endTime]
                                    },
                                    SettingProperty: {
                                        title: ‘历年规模‘,
                                        hideHead: null,
                                        timeRange: null,
                                        showTimeRangeLabel: 1,
                                        dataColumns: {
                                            opts: [[
                                                { display: ‘报告期‘, name: ‘ReportDate‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                , { display: ‘资产净值(亿元)‘, name: ‘NetAsset‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘资产总值(亿元)‘, name: ‘TotalAsset‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘基金份额(百万份)‘, name: ‘Share‘, width: ‘30px‘, align: ‘right‘ }
                                            ]]
                                        },
                                        majorWindCode: null
                                    }
                                }
                            }
                            , 619: {
                                typeName: ‘FundHistoricalScaleChart‘,
                                option: {
                                    WidgetKind: 1
                                }
                            }
                            , 620: ‘FundHistoricalReturnChart‘
                            , 621: ‘FundHoldingAssetsConfigurationArea‘
                            , 622: ‘FundHoldingAssetsConfigurationTable‘
                            , 623: ‘PageHeaderFooterText‘
                            , 624: ‘FundMarket‘
                            , 625: ‘FundIndustDistribChart‘
                            , 626: ‘FundIndustDistribTable‘
                            , 627: {
                                //多基金-业绩表现(表格):
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundPerformanceData‘,
                                    Params: function (opts) {
                                        var setting = opts.setting;
                                        var benchmarkCode = setting.benchmarks && setting.benchmarks.length ? setting.benchmarks[0].windCode : ‘‘;
                                        return [JSON2.stringify({
                                            windCodes: setting.windCodes,
                                            beginTime: setting.beginTime,
                                            calcCycle: setting.calcCycle,
                                            endTime: setting.endTime,
                                            benchmarkCode: benchmarkCode,
                                            yieldCalMethod: setting.yieldCalMethod
                                        })];
                                    },
                                    SettingProperty: {
                                        title: ‘业绩表现‘,
                                        hideHead: null,
                                        timeRange: null,
                                        showTimeRangeLabel: 1,
                                        yieldCalMethod: 1,
                                        calcCycle: 2,
                                        dataColumns: {
                                            opts: [/*[{ cs: 2, display: ‘种类‘ }, { cs: 3, display: ‘数据‘ }],*/[
                                                        { display: ‘基金名称‘, name: ‘Name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                        , { display: ‘基金类型‘, name: ‘InvestType‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘收益率%‘, name: ‘AdjustedReturn‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘超额回报%‘, name: ‘ExcessReturn‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘标准差‘, name: ‘Stdev‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘夏普比‘, name: ‘Sharpe‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘下行风险‘, name: ‘DownsideRisk‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘信息比‘, name: ‘InfoRatio‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘索丁诺比‘, name: ‘Sortino‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘Alpha‘, name: ‘Alpha‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘Beta‘, name: ‘Beta‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘R平方‘, name: ‘R2‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘跟踪误差‘, name: ‘TrackError‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                            ]]
                                        }
                                    }
                                }
                            }
                            , 628: {
                                //多基金表格控件:相关系数
                                typeName: ‘MultiFundCorrelationCoefficient‘
                            }
                            , 629: {
                                //多基金-基本信息
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundInformationData‘,
                                    Params: function (opts) {
                                        return [opts.setting.windCodes, opts.setting.endTime];
                                    },
                                    SettingProperty: {
                                        title: ‘基本信息‘,
                                        hideHead: null,
                                        dataColumns: {
                                            opts: [[
                                                        { display: ‘基金名称‘, name: ‘Name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                        , { display: ‘证券代码‘, name: ‘Code‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘基金成立日‘, name: ‘SetupDate‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘基金类型‘, name: ‘InvestType‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘在管资产 (亿元)‘, name: ‘NetAsset‘, width: ‘45px‘, align: ‘right‘ }
                                                        , { display: ‘最新净值‘, name: ‘Unit‘, width: ‘30px‘, align: ‘right‘ }
                                                        , { display: ‘基金经理‘, name: ‘FundManager‘, width: ‘45px‘, align: ‘right‘ }
                                                        , { display: ‘Wind综合评级‘, name: ‘WindAvg‘, width: ‘45px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘申赎状态‘, name: ‘Status‘, width: ‘60px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘净值币种‘, name: ‘Navcur‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘投资风格‘, name: ‘InvestStyle‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘业绩比较基准‘, name: ‘Benchmark‘, width: ‘60px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘前端认购费‘, name: ‘SubScriptionFeeBefore‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘后端认购费‘, name: ‘SubScriptionFeeAfter‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘前端申购费‘, name: ‘PurChaseFeeBefore‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘后端申购费‘, name: ‘PurChaseFeeAfter‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘管理费‘, name: ‘ManagementFeeRatio‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘托管费‘, name: ‘CustodianFeeRatio‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘销售服务费‘, name: ‘SaleFeeRatio‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘管理人‘, name: ‘MgrComp‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                        , { display: ‘托管人‘, name: ‘CustodianBank‘, width: ‘30px‘, align: ‘right‘, hide: true }

                                            ]]
                                        }
                                    }
                                }
                            }
                            , 630: {
                                typeName: ‘FundPerformanceYieldChart‘,
                                option: {
                                    WidgetKind: 2
                                }
                            }
                            , 631: {
                                typeName: ‘FundHistoricalReturnChart‘,
                                option: {
                                    WidgetKind: 2
                                }
                            }
                            , 632: {
                                //多基金-阶段表现(表格)
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundStagePerformanceTableData‘,
                                    Params: function (opts) {
                                        var peerGroupIndexName = opts.setting.peerGroupIndex ? opts.setting.peerGroupIndex.name : ‘‘;
                                        var benchmarkCode = opts.setting.benchmarks && opts.setting.benchmarks.length ? opts.setting.benchmarks[0].windCode : ‘‘;
                                        return [opts.setting.windCodes, benchmarkCode, peerGroupIndexName, opts.setting.endTime];
                                    },
                                    SettingProperty: {
                                        title: ‘阶段表现‘,
                                        hideHead: null,
                                        endTime: null,
                                        showTimeRangeLabel: 1,
                                        dataColumns: {
                                            opts: [[
                                                { display: ‘‘, name: ‘name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                , { display: ‘1月‘, name: ‘oneMonth‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘3月‘, name: ‘threeMonth‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘6月‘, name: ‘sixMonth‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘YTD‘, name: ‘yTD‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘1年‘, name: ‘oneYear‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘3年‘, name: ‘threeYear‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘5年‘, name: ‘fiveYear‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘成立以来‘, name: ‘sinceEstablish‘, width: ‘30px‘, align: ‘right‘ }
                                            ]]
                                        }
                                    }
                                }
                            }
                            , 633: {
                                //单基金-阶段表现(图形)
                                typeName: ‘FundStagePerformanceChart‘,
                                option: {
                                    WidgetKind: 1
                                }
                            }
                            , 634: {
                                //多基金-阶段表现(图形)
                                typeName: ‘FundStagePerformanceChart‘,
                                option: {
                                    WidgetKind: 2
                                }
                            }
                            , 635: {
                                //多基金-历年规模(图形)
                                typeName: ‘FundHistoricalScaleChart‘,
                                option: {
                                    WidgetKind: 2
                                }
                            }
                            , 636: {
                                typeName: ‘FundRiskReturnChart‘
                            }
                            , 637: {
                                //多基金-资产配置(图形)
                                typeName: "MultiFundAssetAllocationChart"
                            }
                            , 638: {
                                //多基金-资产配置(表格)
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundAssetAllocationTableData‘,
                                    Params: function (opts) {
                                        return [opts.setting.windCodes, opts.setting.reportPeriod];
                                    },
                                    SettingProperty: {
                                        title: ‘资产配置‘,
                                        hideHead: null,
                                        reportPeriod: null,
                                        showTimeRangeLabel: 1,
                                        dataColumns: {
                                            opts: [[
                                                { display: ‘‘, name: ‘name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                , { display: ‘股票%‘, name: ‘stock‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘债券%‘, name: ‘bond‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘基金%‘, name: ‘fund‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘现金%‘, name: ‘money‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘其他%‘, name: ‘other‘, width: ‘30px‘, align: ‘right‘ }
                                            ]]
                                        }
                                    }
                                }
                            }
                            , 639: {
                                //多基金-持有人结构(图形)
                                typeName: ‘FundShareholderStructureChart‘
                            }
                            , 640: {
                                //多基金-行业配置(表格)
                                typeName: ‘MultiFundSectorAllocationTable‘
                            }
                            , 641: {
                                //多基金-风险分析(图)
                                typeName: "FundHistoricalRiskAnalysisChart"
                            }
                            , 642: {
                                //多基金-风险分析(表)
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundIndicatorsData‘,
                                    Params: function (opts) {
                                        var setting = opts.setting;
                                        var cols = setting.dataColumns || opts.SettingProperty.dataColumns.opts;
                                        var indicator = ‘‘;
                                        if (cols && cols.length > 0 && cols[0].length > 0) {
                                            $.each(cols[0], function (index, item) {
                                                if (item.name != ‘name‘ && !item.hide) {
                                                    indicator += item.name + ‘,‘;
                                                }
                                            });
                                            if (indicator.length > 0) {
                                                indicator = indicator.substring(0, indicator.length - 1);
                                            } else {
                                                indicator = ‘f_info_firstinvesttype,f_risk_annustdev,f_risk_downsidestdev,f_risk_maxdownside,f_risk_annualpha,f_risk_beta,f_risk_r2,f_risk_annusharpe,f_risk_annutreynor,f_risk_annusortino,f_risk_annuinforatio‘;
                                            }
                                        }

                                        return [JSON2.stringify({
                                            windCodes: setting.windCodes, beginTime: setting.beginTime, calcCycle: setting.calcCycle
                                            , endTime: setting.endTime, benchmarkCode: setting.benchmarks && setting.benchmarks.length ? setting.benchmarks[0].windCode : ‘‘,
                                            yieldCalMethod: setting.yieldCalMethod
                                        }), indicator];
                                    },
                                    SettingProperty: {
                                        title: ‘风险分析‘,
                                        hideHead: null,
                                        timeRange: null,
                                        showTimeRangeLabel: 1,
                                        yieldCalMethod: 1,
                                        calcCycle: 2,
                                        dataColumns: {
                                            opts: [[
                                                { display: ‘名称‘, name: ‘Name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                , { display: ‘基金类型‘, name: ‘f_info_firstinvesttype‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘标准差‘, name: ‘f_risk_annustdev‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘下行标准差‘, name: ‘f_risk_downsidestdev‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘最大回撤‘, name: ‘f_risk_maxdownside‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘Alpha‘, name: ‘f_risk_annualpha‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘Beta‘, name: ‘f_risk_beta‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘R平方‘, name: ‘f_risk_r2‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘夏普比‘, name: ‘f_risk_annusharpe‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘特雷诺比‘, name: ‘f_risk_annutreynor‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                , { display: ‘索丁诺比‘, name: ‘f_risk_annusortino‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                                , { display: ‘信息比‘, name: ‘f_risk_annuinforatio‘, width: ‘30px‘, align: ‘right‘, hide: true }
                                            ]]
                                        }
                                    }

                                }
                            }
                            , 643: {
                                //多基金-重仓证券(表)
                                typeName: "MultiFundTopHoldingsTable"
                            }
                            , 644: {
                                //多基金-市场绩效
                                typeName: ‘GeneralTableWidget‘,
                                option: {
                                    MethodAlias: ‘MFRB_GetMultiFundMarketPerformanceTableData‘,
                                    Params: function (opts) {
                                        var setting = opts.setting;
                                        return [setting.windCodes, setting.beginTime, setting.endTime];
                                    },
                                    SettingProperty: {
                                        title: ‘市场绩效‘,
                                        hideHead: null,
                                        timeRange: null,
                                        showTimeRangeLabel: 1,
                                        dataColumns: {
                                            opts: [[
                                                { display: ‘名称‘, name: ‘name‘, width: ‘60px‘, align: ‘left‘, essential: true }
                                                , { display: ‘基金类型‘, name: ‘investType‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘一年以来涨跌幅‘, name: ‘adjustedReturn‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘上涨月份平均收益‘, name: ‘avgIncome‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘下跌月份平均收益‘, name: ‘avgLoss‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘上涨期间百分比‘, name: ‘profitMonthPer‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘下跌期间百分比‘, name: ‘lossMonthPer‘, width: ‘30px‘, align: ‘right‘ }
                                                , { display: ‘最高单月回报‘, name: ‘highestMonthlyReturn‘, width: ‘40px‘, align: ‘right‘ }
                                                , { display: ‘最低单月回报‘, name: ‘lowestMonthlyReturn‘, width: ‘40px‘, align: ‘right‘ }
                                                , { display: ‘最高季度回报‘, name: ‘highestQuarterlyReturn‘, width: ‘40px‘, align: ‘right‘ }
                                                , { display: ‘最低季度回报‘, name: ‘lowestQuarterlyReturn‘, width: ‘40px‘, align: ‘right‘ }
                                            ]]
                                        }
                                    }
                                }
                            }
                            , 645: {
                                typeName: "FundAlphaComparisonChart"
                            }
                            , 646: {
                                typeName: "GeneralReadonlyTextWidget",
                                option: {
                                    MethodAlias: ‘MFRB_GetFundAnalysisComment‘,
                                    Params: function (opts) {
                                        return [JSON2.stringify({
                                            windCode: opts.setting.majorWindCode,
                                            endTime: opts.setting.endTime
                                        })];
                                    },
                                    SettingProperty: {
                                        majorWindCode: null,
                                        title: ‘分析评论‘,
                                        hideHead: null
                                    },
                                    ProcessData: function (analysisCommentInfo) {
                                        function compare2(num1, num2) {
                                            return (num1 > num2) ? "高于" : ((num1 == num2) ? "等于" : "低于");
                                        }
                                        var descri = ‘‘;
                                        if (analysisCommentInfo != null && typeof (analysisCommentInfo) === ‘object‘) {
                                            descri = "<p>" + analysisCommentInfo.FundName + "从" + analysisCommentInfo.FoundDate + "成立以来," +
           "已取得" + analysisCommentInfo.AllReturn + "%的收益," + compare2(analysisCommentInfo.AllReturn, analysisCommentInfo.SameTypeReturn) + "同类平均水平,同类排名" + analysisCommentInfo.SameTypeRank + ",期间资产净值" + analysisCommentInfo.AssetsChange + "。</p><p>" +
           "从各区间表现看,该基金今年以来表现" + analysisCommentInfo.YearPerformance + ",收益率" + analysisCommentInfo.Yield + ",同类排名" + analysisCommentInfo.YearRank + ";1年收益率" + analysisCommentInfo.YearYield + ",同类排名" + analysisCommentInfo.YearYieldSameTypeRank + ";" +
           "3年收益" + analysisCommentInfo.ThreeYearYield + ",同类排名" + analysisCommentInfo.ThreeYearYieldSameTypeRank + ";5年收益" + analysisCommentInfo.FiveYearYield + ",同类排名" + analysisCommentInfo.FiveYearYieldSameTypeRank + "。</p><p>" + analysisCommentInfo.RiskDescription + "</p>";
                                        }
                                        return descri;
                                    }
                                }
                            }
        };
        $.widget(‘wfc.WFCWidget‘, {
            version: ‘2.0‘,
            options: {
                //这里一般不要放任何设置
                //callbacks
                Update: null, //widget内容、设置更新时
                Complete: null//widget内容加载完成后
            },
            _createWidget: function (option, element) {
                //element.prop(‘WFCWidgetOption‘, option);//这句会导致bug
                this._super(option, element);
            },
            childWidget: null, //实现具体业务逻辑的widget子类,后来是用子类扩展本身,所以子类=本身
            typeName: ‘‘, //childWidget的类名
            defaultSetting: {},
            _create: function () {
                var self = this,
                options = this.options,
                $divWidget = this.element,
                isHF = $divWidget.closest(‘.pageHeader,.pageFooter‘).length > 0;
                if (WidgetDefine.hasOwnProperty(options.type)) {
                    var wDefine = WidgetDefine[options.type];
                    if (typeof wDefine === ‘object‘ && wDefine.typeName) {
                        this.typeName = wDefine.typeName;
                        $.extend(options, wDefine.option);
                    } else if (typeof wDefine === ‘string‘) {
                        this.typeName = wDefine;
                    }
                    if (this.typeName && WFCFrame.Widgets.hasOwnProperty(this.typeName)) {
                        this.childWidgetFunc = WFCFrame.Widgets[this.typeName];
                    }
                }

                //if (this.childWidgetFunc) {
                //    this.childWidget = new this.childWidgetFunc(self); //eval(‘ new WFCFrame.Widgets.‘ + this.typeName + ‘(self) ;‘);
                //}
                $divWidget.attr(‘widget-state‘, ‘init‘);
                if (this.typeName)
                    $divWidget.addClass(‘widget win-‘ + this.typeName);

                /* 处理options */

                //优先级:Report.SettingProperty < Widget.SettingProperty < Report.SettingObj < Widget.setting
                if (this.childWidgetFunc) {
                    this.defaultOption = typeof this.childWidgetFunc.defaultOption == ‘function‘ ? this.childWidgetFunc.defaultOption(this) : $.extend(true, {}, this.childWidgetFunc.defaultOption);
                } else if (!this.defaultOption) {
                    this.defaultOption = {};
                }

                replaceSettingPropertyGroup(options.SettingProperty);
                replaceSettingPropertyGroup(this.defaultOption.SettingProperty);

                //options.SettingProperty = $.extend({}, options.SettingProperty, this.defaultOption.SettingProperty);
                options.SettingProperty = mergeSettingProperty(options.SettingProperty, this.defaultOption.SettingProperty);
                //这里的setting应通过workspace获取,而不是report,待修改
                var SettingPropertyMerged = mergeSettingProperty({}, WFCFrame.Report.SettingProperty, options.SettingProperty);
                //将合并后的SettingProperty填入options.SettingProperty,以形成widget可设置的SettingProperty最终版
                $.each(options.SettingProperty, function (index, item) {
                    if (typeof item === ‘undefined‘ || item === null) {
                        options.SettingProperty[index] = SettingPropertyMerged[index];
                    }
                });

                //因为fillSettingBySettingProperty是直接赋值,所以不用担心复杂类型的setting值被篡改
                this.defaultSetting = $.extend({}, WFCFrame.Report.SettingObj, this.defaultOption ? this.defaultOption.setting : null);
                fillSettingBySettingProperty(this.defaultSetting, SettingPropertyMerged);

                //以后添加:将默认值传到widget.SettingProperty但不扩展widget.SettingProperty的属性
                //为方便使用,需要保存一份组合后的setting,但同时也要保存一份组合前的Option以区分开继承设置还是本身的设置
                options.setting = fillDefalutProperty(options.setting, this.defaultSetting); //$.extend({}, this.defaultSetting, options.setting);
                this.options = fillDefalutProperty(options, this.defaultOption); //浅层复制,应用默认option(除SettingProperty和setting(之前已合并)),另childWidgetFunc.defaultOption是否有存在必要?

                /* 处理options  end*/

                var setting = options.setting;
                /* 设置预处理 */

                if (setting.products && setting.products.length > 0) {
                    if (setting.majorWindCode) {
                        var isfound = false;
                        $.each(setting.products, function (index, item) {
                            if (item.windCode === setting.majorWindCode) {
                                isfound = true;
                                setting.majorProduct = item;
                                return false;
                            }
                        });
                        if (!isfound) {
                            setting.majorProduct = setting.products[0];
                            setting.majorWindCode = setting.products[0].windCode;
                        }
                    } else {
                        setting.majorProduct = setting.products[0];
                        setting.majorWindCode = setting.products[0].windCode;
                    }

                    setting.windCodes = setting.products[0].windCode;
                    for (var i = 1; i < setting.products.length; i++) {
                        setting.windCodes += "," + setting.products[i].windCode;
                    }
                }
                setting.majorWindCode = setting.majorWindCode || ‘000001.OF‘;
                //var majorProduct = setting.products && setting.products[0];
                //var majorWindCode = (setting.majorProduct && setting.majorProduct.windCode) || ‘000001.OF‘;
                var majorWindCode = setting.majorWindCode;//还是用windcode以保证颜色等设置一致
                WFCFrame.GetProductInfo([majorWindCode], function (infos) {
                    var foundingDate = "1900-01-01";
                    if (infos && infos.hasOwnProperty(majorWindCode)) {
                        foundingDate = infos[majorWindCode].FoundingDate;
                    }

                    if (setting.timeRange) {
                        var range = getTimeRange(setting.timeRange, foundingDate);
                        if (range) {
                            setting.beginTime = range.beginTime;
                            setting.endTime = range.endTime;
                        }
                    }

                    if (!setting.endTime) {
                        setting.endTime = (new Date()).format(‘yyyy-MM-dd‘);
                    }
                    if (!setting.beginTime || (setting.beginTime < foundingDate)) {
                        setting.beginTime = foundingDate;
                    }
                    if (!setting.reportPeriod) {
                        setting.reportPeriod = setting.endTime;
                    }
                    self._createAfter();
                })
                /* end of 设置预处理 */
            },
            //预处理结束后调用此方法create
            _createAfter: function () {
                var self = this,
                options = this.options,
                $divWidget = this.element,
                isHF = $divWidget.closest(‘.pageHeader,.pageFooter‘).length > 0,
                setting = options.setting;

                var objSetting = {
                    showTimeRangeLabel: setting.showTimeRangeLabel,
                    beginTime: setting.beginTime,
                    endTime: setting.endTime,
                    reportPeriod: setting.reportPeriod
                };
                $divWidget.append(‘<div class="widget-head ui-widget-header ui-corner-top ui-helper-clearfix">‘
                + ‘<span class="ui-dialog-title">‘ + (setting.title || ‘&nbsp;‘) + ‘</span>‘ + ‘<span class="timeRangeLabel">‘ + getTimeRangeLabelText(objSetting) + ‘</span>‘

                //+ ‘<div class="head-divider"></div>‘
                + ‘</div>‘
                + ‘<div class="widget-content ui-widget-content">‘);
                //操作菜单现在dom结构上与widget-head平行
                $divWidget.append(‘<span class="widget-head-operation">‘
                    + ‘<ul class="head-menuBar-custom"></ul>‘
                    + ‘<ul class="head-menuBar-system">‘
                    + ‘<li class="widget-setting" title="设置" style="display:none"><span class="ui-icon"></span></li>‘
                    + ‘<li class="widget-close"><span class="iconfont"></span></li>‘//⊗
                    + ‘</ul>‘
                + ‘</span>‘);

                //应用设置(setting)
                if (isHF || setting.hideHead) {
                    $divWidget.addClass(‘hideHead‘);
                }
                //css方法传入‘‘会删除此属性,传入null/undefined等于不做设置
                if (!isHF) {
                    $divWidget.find(‘.widget-head‘).css({
                        fontFamily: setting.titleStyle_fontFamily || ‘‘,
                        fontSize: setting.titleStyle_fontSize || ‘‘,
                        height: setting.titleStyle_fontSize || ‘‘, //解决workspace hidden时初始化title高度获取不正确的问题
                        color: setting.titleStyle_fontColor || ‘‘,
                        backgroundColor: setting.titleStyle_bgColor || ‘‘,
                        borderTopWidth: setting.titleStyle_dividerLineWidth || ‘‘,
                        borderTopColor: setting.titleStyle_dividerLineColor || ‘‘
                    });

                    var inC = inverseColor(setting.titleStyle_bgColor || ‘‘);
                    $divWidget.find(‘.widget-head-operation‘).css({
                        color: inC
                    });

                    //                $divWidget.find(‘.head-divider‘).css({
                    //                    height: setting.titleStyle_dividerLineWidth || ‘2px‘,
                    //                    background: setting.titleStyle_dividerLineColor || ‘#EEEEEE‘
                    //                });
                }

                $divWidget.find(‘.widget-content‘).css({
                    top: $divWidget.find(‘.widget-head‘).outerHeight(true) + ‘px‘,
                    fontFamily: setting.fontFamily || ‘‘,
                    fontSize: setting.fontSize || ‘‘,
                    color: setting.fontColor || ‘‘,
                    textAlign: setting.textAlign || ‘‘
                });

                if (!isHF) {
                    $divWidget.find(‘.widget-content‘).css({
                        borderWidth: setting.contentStyle_borderWidth || ‘‘,
                        borderColor: setting.contentStyle_borderColor || ‘‘,
                        borderStyle: setting.contentStyle_borderStyle || ‘‘,
                        backgroundColor: setting.contentStyle_fillColor || ‘‘
                    });
                }

                //                $divWidget.find(‘.widget-head-operation‘).click(function (event) {
                //                    event.stopPropagation();
                //                });

                if (!setting.uncloseable) {//删除使用drop方式
                    $divWidget.find(‘.widget-close‘).click(function (event) {
                        var $w = $(this).closest(‘.widget‘);
                        var $c = $w.parent();
                        removeContainer($c);
                        event.stopPropagation();
                    });
                }

                this.content = $divWidget.find(‘.widget-content‘);
                this.title = $divWidget.find(‘.widget-head >.ui-dialog-title‘);
                if (this.childWidgetFunc) {
                    //this.childWidget = new this.childWidgetFunc(self); //eval(‘ new WFCFrame.Widgets.‘ + this.typeName + ‘(self) ;‘);
                    this.childWidgetFunc.call(this, self);
                    for (var func in this.childWidgetFunc.prototype) {
                        if (!self[func]) {
                            self[func] = this.childWidgetFunc.prototype[func];
                        }
                    }
                    this.callWidgetCustomFunc(‘Init‘);
                }
                var widgetState = $divWidget.attr(‘widget-state‘);
                if (widgetState == ‘init‘) {
                    //说明没有调用待ajax的getData
                    this.Complete();
                }
            },
            _init: function () {
            },
            _destroy: function () {
                this.callWidgetCustomFunc(‘destroy‘);
                this.element.removeProp(‘WFCWidgetOption‘).removeClass(‘hideHead widget win-‘ + this.typeName).empty(); //remove widget div时,会自动调用,因此其实这里可以不调用,且removeWidget时也不必显式调用destroy
            },
            callWidgetCustomFunc: function (funName, args) {
                //try {
                //                    if (this.childWidget && typeof (this.childWidget[funName]) == ‘function‘) {
                //                        this.childWidget[funName]();
                //                    }
                if (this.childWidgetFunc && typeof this.childWidgetFunc.prototype[funName] == ‘function‘) {
                    this.childWidgetFunc.prototype[funName].apply(this, args || []); //ie8下args不可传null
                }
                //}
                //catch (e) {
                //    showDebugMsg(‘widget(‘ + this.typeName + ‘).‘ + funName + ‘调用出错:‘ + e.message);
                //}
            },
            Resize: function () {
                this.callWidgetCustomFunc(‘Resize‘);
            },
            Refresh: function () {
                this.callWidgetCustomFunc(‘Refresh‘);
            },
            ReCreate: function () {
                var opt = this.OriginalOption();
                this.element.WFCWidget(‘destroy‘).prop(‘WFCWidgetOption‘, opt).WFCWidget(opt);
            },
            Complete: function () {
                //表示控件已经载入完成,包括ajax和数据的渲染
                if (this.element.attr(‘widget-state‘) != ‘complete‘) {
                    this.element.attr(‘widget-state‘, ‘complete‘);
                    this._trigger("Complete", null, null);
                }
            },
            GetData: function () {
                this.element.attr(‘widget-state‘, ‘getData‘);
                this.callWidgetCustomFunc(‘GetData‘, arguments);
            },
            BindData: function () {
                this.callWidgetCustomFunc(‘BindData‘, arguments);
                this.Complete(); //如果因为数据原因没有走到这里,说明ajax出现问题
            },
            CreateChart: function ($dom, chartOpt, callback) {
                var self = this;
                var setting = self.options.setting || {};
                var _alternateGridColor;
                //判断色彩若为白色则使用默认色为间隔色
                if (ColorHelper.isEqualColor(setting.contentStyle_fillColor, "#ffffff")) {
                    _alternateGridColor = "#f5f5f5";
                } else {
                    _alternateGridColor = ColorHelper.fadeColor(setting.contentStyle_fillColor, 0.7);
                }
                chartOpt = $.extend(true, {
                    chart: {
                        backgroundColor: setting.contentStyle_fillColor,
                        type: setting.chartType
                    },
                    yAxis: {
                        alternateGridColor: _alternateGridColor
                    }
                }, chartOpt);
                //x轴label旋转
                var xAxisLabelRotation = parseFloat(setting.xAxisLabelRotation);
                if (!isNaN(xAxisLabelRotation)) {
                    $.extend(true, chartOpt, {
                        xAxis: {
                            labels: {
                                rotation: xAxisLabelRotation
                            }
                        }
                    });
                }
                //x轴刻度间隔
                var xAxisLabelStep = parseFloat(setting.xAxisLabelStep);
                if (!isNaN(xAxisLabelStep)) {
                    $.extend(true, chartOpt, {
                        xAxis: {
                            tickInterval: xAxisLabelStep
                            //labels: {
                            //    step: xAxisLabelStep
                            //}
                        }
                    });
                }
                if (chartOpt && chartOpt.series && chartOpt.series.length) {
                    var products = setting.products || {};
                    var benchmarks = setting.benchmarks || {};
                    var peerGroupIndex = setting.peerGroupIndex || {};
                    var item = null, itemFind = null;
                    for (var j = 0; j < chartOpt.series.length; j++) {
                        item = chartOpt.series[j];
                        itemFind = null;
                        if (itemFind == null && item.name === "同类平均" || item.name === peerGroupIndex.name || item.windCode === peerGroupIndex.code) {
                            itemFind = peerGroupIndex;
                        }
                        if (itemFind == null && item.windCode) {
                            for (var i = 0; i < products.length; i++) {
                                if (item.windCode === products[i].windCode && products[i].color) {
                                    itemFind = products[i];
                                    break;
                                }
                            }
                        }

                        if (itemFind == null && item.windCode) {
                            for (var i = 0; i < benchmarks.length; i++) {
                                if (item.windCode === benchmarks[i].windCode && benchmarks[i].color) {
                                    itemFind = benchmarks[i];
                                    break;
                                }
                            }
                        }

                        if (itemFind != null) {
                            if (itemFind.hide) {
                                item.enabled = false;
                            }
                            else if (!item.color) {
                                item.color = itemFind.color;
                            }
                        }
                    }
                    //过滤掉隐藏的serie数据
                    chartOpt.series = $.grep(chartOpt.series, function (n, i) {
                        return n.enabled != false;
                    });
                }

                if (setting.chartType == "bar") {
                    //legend位置1的在最上面
                    reverseChartSeriesIndex(chartOpt.series);
                    //时间序列从下往上排列
                    if (chartOpt && chartOpt.xAxis && chartOpt.xAxis.type == ‘datetime‘ && !chartOpt.xAxis.hasOwnProperty(‘reversed‘)) {
                        chartOpt.xAxis.reversed = false;
                    }
                } else if (setting.chartType == "area") {
                    //area图进行特殊处理,stacking为percent的图需要颠倒series里项顺序,其他面积图除了第一个sery以area展示,其他sery以line图展示
                    if (chartOpt && chartOpt.plotOptions && chartOpt.plotOptions.area && chartOpt.plotOptions.area.stacking === "percent") {
                        reverseChartSeriesIndex(chartOpt.series);
                    } else {
                        //将除了第一个之外的sery展示修改为line
                        $.each(chartOpt.series, function (index, item) {
                            if (index === 0) {
                                //面积图增加色彩渐变
                                //Y轴上方渐变
                                item.fillColor = {
                                    linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
                                    stops: [
                                        [0, ColorHelper.fadeColor(item.color, 0.8)],
                                        [0.1, ColorHelper.fadeColor(item.color, 0.6)],
                                        [0.5, ColorHelper.fadeColor(item.color, 0.4)],
                                        [1, ColorHelper.fadeColor(item.color, 0.1)]
                                    ]
                                };
                                //Y轴下方渐变
                                item.negativeColor = {
                                    linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
                                    stops: [
                                        [0, ColorHelper.fadeColor(item.color, 0.1)],
                                        [0.1, ColorHelper.fadeColor(item.color, 0.4)],
                                        [0.5, ColorHelper.fadeColor(item.color, 0.6)],
                                        [1, ColorHelper.fadeColor(item.color, 0.8)]
                                    ]
                                };
                            } else {
                                item.type = "line";
                            }
                        });
                    }
                } else if (setting.chartType == "column" && chartOpt && chartOpt.plotOptions && chartOpt.plotOptions.column && (chartOpt.plotOptions.column.stacking == "normal" || chartOpt.plotOptions.column.stacking == "percent")) {
                    reverseChartSeriesIndex(chartOpt.series);
                }

                if ($dom instanceof jQuery) {
                    $dom.highcharts(chartOpt, callback);
                }
            },
            CreateTable: function ($dom, tableOpt) {
                //option中之保存columnname,完整信息放在SettingProperty.dataColumns.opts中,在这里组合起来
                //table的刷新与option改变放在哪里?
                var self = this,
                options = this.options,
                setting = options.setting,
                $divWidget = this.element,
                childWidgetFunc = this.childWidgetFunc;
                var optColumns = self.options.SettingProperty && self.options.SettingProperty.dataColumns ? self.options.SettingProperty.dataColumns.opts : null;
                var dataColumns = options.setting && options.setting.dataColumns ? options.setting.dataColumns : null;
                var colMs = tableOpt.colModel || [];

                if (optColumns && optColumns.length > 0) {
                    if (!dataColumns || dataColumns.length === 0) {
                        dataColumns = optColumns;
                    }
                    for (var i = 0; i < dataColumns.length; i++) {
                        if (colMs.length <= i) {
                            colMs.push([]);
                        }
                        //添加必需列
                        $.each(optColumns[i], function (index, item) {
                            if (item.essential) colMs[i].push($.extend({}, item));
                        });
                        if (dataColumns[i] && optColumns[i]) {
                            $.each(dataColumns[i], function (index, item) {
                                $.each(optColumns[i], function (index2, item2) {
                                    if (!item2.essential && !item.hide && item2.name == item.name) {
                                        colMs[i].push($.extend({}, item2, item));
                                        return false;
                                    }
                                });
                            })
                        }
                    }
                }
                var cbComplete = tableOpt.onComplete;
                tableOpt.onComplete = function (grid) {
                    //应用表格样式
                    var $t = $(grid.divGrid);
                    $t.addClass(setting.tableStyle).css({ background: setting.tableBgColor });
                    $t.find(".tbHead").css({
                        background: setting.tableHead,
                        fontWeight: setting.tableHeadFontStyle == 2 ? ‘bold‘ : ‘normal‘,
                        color: setting.tableHeadFontColor
                    });

                    $t.find(".tbBody").css({
                        lineHeight: setting.tableRowHeight
                    });

                    $t.css({
                        borderColor: setting.tableBorderColor
                    });

                    if (setting.tableInterlacedRowBgColor) {
                        $t.find(‘.tbBody .erow‘).css({ background: setting.tableInterlacedRowBgColor });
                    }

                    if (typeof cbComplete === "function") {
                        cbComplete(grid);
                    }

                    self.content.unblock();

                    if (!grid.d) {
                        self.content.block(WFCFrame.GetNoDataBlockOption(‘无数据‘));
                    }

                    self.Complete();
                };

                tableOpt.colModel = colMs;
                $dom.sflexigrid(tableOpt);
            },
            headMenuBarCustom: function () {
                return this.element.find(‘.head-menuBar-custom‘);
            },
            addHeadMenuItem: function (item/*domObj or jqueryObj or htmlString*/) {
                var $li = $(‘<li></li>‘).append(item);
                this.headMenuBarCustom().append($li);
                return $li;
            },
            addHeadHelp: function (helpContent) {
                var $help = $(‘<span class="widget-help" title=""></span>‘);
                this.title.after($help);
                $help.tooltip({
                    tooltipClass: "widget-help-tooltip",
                    content: function () {
                        return "<div class=‘widget-help-content‘>" + helpContent + "</div>";
                    }
                });
            },
            isSelected: function () {
                return this.element.parent().hasClass(‘selected‘);
            },
            SaveSetting: function (objSetting) {
                //修改设置并刷新widget/report
                var self = this;
                var oOption = this.OriginalOption();
                var $div = this.element;
                if (objSetting) {
                    //_setOption会把整个setting覆盖
                    $.extend(true, this.options, { setting: objSetting });
                    $.extend(true, oOption, { setting: objSetting });
                }

                var $pageHeaderFooter = $div.closest(‘.pageHeader,.pageFooter‘);
                if ($pageHeaderFooter.length > 0) {
                    var isPageHeader = $pageHeaderFooter.hasClass(‘pageHeader‘);
                    //这里利用了object引用传递了不同workspace之间相同widget的originalOption(含widgetId)
                    $(‘.workspace ‘ + (isPageHeader ? ‘.pageHeader‘ : ‘.pageFooter‘) + ‘ .container:nth-child(‘ + ($div.parent().index() + 1) + ‘) .widget‘).WFCWidget(‘ReCreate‘);
                }
                else {
                    this.ReCreate();
                }

                this._trigger(‘Update‘, null, { setting: objSetting });
            },
            OriginalOption: function () {
                return this.element.prop(‘WFCWidgetOption‘);
            },
            Workspace: function () {
                return this.element.closest(‘.workspace‘);
            },
            WidgetAjaxRequest: function (url, dataParameters, onSuccess, onError, onComplete) {
                var self = this;
                //方便监控程序监控ajax
                var method = "";
                if (dataParameters)
                    method = dataParameters.MethodAlias;
                $.ajax({
                    url: url + "?method=" + method,
                    type: "POST",
                    data: "data=" + encodeURIComponent(JSON2.stringify(dataParameters)),
                    success: onSuccess,
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        if (typeof (onError) == ‘function‘)
                            onError(XMLHttpRequest, textStatus, errorThrown);
                        else {
                            var errmsg = ‘ajax请求发生错误,url: ‘ + this.url + ‘,data: ‘ + this.data;
                            if (XMLHttpRequest && XMLHttpRequest.readyState >= 3)
                                errmsg += ‘,状态码: ‘ + XMLHttpRequest.status + ‘,返回值: ‘ + XMLHttpRequest.responseText;
                            if (textStatus)
                                errmsg += ‘,textStatus: ‘ + textStatus;
                            if (errorThrown)
                                errmsg += ‘,抛出异常: ‘ + errorThrown.toString();

                            showDebugMsg(errmsg);
                        }
                    },
                    onComplete: function () {
                        if (typeof (onComplete) == ‘function‘)
                            onComplete(arguments);
                        //self.Complete();
                    }
                });
            },
            Select: function () {
                this.callWidgetCustomFunc(‘Select‘);
            },
            UnSelect: function () {
                this.callWidgetCustomFunc(‘UnSelect‘);
            }
        })
    })(jQuery);

    /* 操作区域代码(控件区) */
    function initOperationArea($div, option) {
        $div.prepend(‘<div class="widgetKind-tabs ui-widget-header"><span class="tabs-anchor selected ui-state-active" tabIdnex="1">单基金</span><span class="tabs-anchor last" tabIdnex="2">多基金</span></div>‘);//<span class="tabs-anchor" tabIdnex="3">组合</span>
        var $widgetCaseBox = $div.find(‘.widgetCaseBox‘);
        if (option && option.length > 0) {
            $.each(option, function (index, item) {
                $widgetCaseBox.append(‘<h3>‘ + item.title + ‘</h3>‘);
                if (item.widgets && item.widgets.length) {
                    var $innerDiv = $(‘<div></div>‘);
                    $.each(item.widgets, function (index2, item2) {
                        $innerDiv.append($(‘<a class="widgetCase" tabIndex="‘ + (item2.tabIndex || 0) + ‘"><div class="widget-icon widget-icon-‘ + item2.type + ‘"></div>‘ + item2.title + ‘</a>‘).prop(‘WFCWidgetOption‘, $.extend({ type: item2.type }, item2.opt)));
                    });
                    $innerDiv.append("<div style=‘clear:both;‘></div>");
                    $widgetCaseBox.append($innerDiv);
                }
            });
        }
        $widgetCaseBox.accordion({ heightStyle: ‘fill‘ });

        $widgetCaseBox.find(‘.widgetCase‘).draggable(draggable_option);

        $div.find(‘.widgetKind-tabs > .tabs-anchor‘).mouseover(function () {
            $(this).parent().find(‘.selected‘).removeClass(‘selected ui-state-active‘);
            $(this).addClass(‘selected ui-state-active‘);
            $widgetCaseBox.find(‘.widgetCase‘).hide();
            $widgetCaseBox.find(‘.widgetCase[tabIndex=0],.widgetCase[tabIndex=‘ + $(this).attr(‘tabIdnex‘) + ‘]‘).show();
        });
        $div.find(‘.widgetKind-tabs > .tabs-anchor.selected‘).trigger(‘mouseover‘);
    }
    /*end of 操作区域代码(控件区)*/

    (function () {
        function initSetting(setting/*设置值(合并后)*/, settingProperty/* 设置选项 */, setEnumObj/* 设置初始化函数 */, $setArea/* 设置区域 */, level, target) {
            var setObj = setting || {};
            fillSettingBySettingProperty(setObj, settingProperty);
            $.each(settingProperty, function (index, item) {
                if (setEnumObj[index] && typeof (setEnumObj[index]._init) == ‘function‘) {

                    var $setAorG = $setArea;
                    var settingPropertyItem = item;
                    if ($.type(item) !== ‘object‘) {
                        settingPropertyItem = { dVal: item };
                    }
                    if (settingPropertyItem.groupId) {
                        $setAorG = $setArea.find(‘.sGroup-‘ + settingPropertyItem.groupId);
                        if ($setAorG.length == 0) {
                            $setAorG = $(‘<div class="uiCreate sGroup sGroup-‘ + settingPropertyItem.groupId + ‘"><span class="sGroup-name">‘ + settingPropertyItem.groupText + ‘</span></div>‘).appendTo($setArea);
                        }
                    }

                    var swapClass = ‘sWrap-‘ + index;
                    var setC = $setArea.find(‘.‘ + swapClass);
                    if (setC.length == 0) {
                        setC = $(‘<div class="sWrap uiCreate ‘ + swapClass + ‘"></div>‘).appendTo($setAorG);
                    }
                    //每次新建,防止内部使用时因为ui的变量改变而出现问题
                    var ui = {
                        element: setC,//setting对应的dom元素
                        level: level,//widget/report
                        target: target,//设置对应的目标widget或report
                        setArea: $setArea,//设置区域
                        settingPropertyItem: settingPropertyItem,//设置对应的SettingProperty
                        setting: setObj//设置完整对象
                    };

                    setEnumObj[index]._init(ui, setObj[index]);
                }
            });

            //function _initSetting(_setObj, _settingProperty, _setEnumObj, _setName) {
            //    if (!_setEnumObj)
            //        return;
            //    if (typeof (_setEnumObj._init) == ‘function‘) {
            //        //处理设置
            //        if (_setName) {
            //            var setC = ui.setArea.find(‘.‘ + _setName);
            //            if (setC.length == 0) {
            //                setC = $(‘<div class="sWrap ‘ + _setName + ‘"></div>‘).appendTo(ui.setArea);
            //            }
            //            ui.element = setC;
            //            _setEnumObj._init(ui, _setObj);
            //        }
            //    } else if (typeof (_settingProperty) == ‘object‘) {
            //        $.each(_settingProperty, function (index, item) {
            //            if (typeof (index) == ‘string‘ && index.charAt(0) == ‘_‘) {
            //                //下划线开头的为api函数
            //            } else {
            //                _initSetting(_setObj[index], item, _setEnumObj[index], _setName + ‘-‘ + index);
            //            }
            //        });
            //    }
            //}
        }

        function getSetting(setting/*设置值(合并后)*/, settingProperty/* 设置选项 */, setEnumObj/* 设置初始化函数 */, $setArea/* 设置区域 */, level, target) {
            var result = {};
            var ui = { element: $setArea, level: level, target: target, setArea: $setArea, setting: result };
            //var setObj = $.extend({}, settingProperty, setting);
            $.each(settingProperty, function (index, item) {
                //if (typeof (item) == ‘object‘)//为什么加这句?
                //_saveSetting(setting, settingProperty, index, setEnumObj[index], ‘sWrap-‘ + index);
                if (setEnumObj[index] && typeof (setEnumObj[index]._val) == ‘function‘) {
                    //处理设置
                    var swapClass = ‘sWrap-‘ + index;
                    ui.element = ui.setArea.find(‘.‘ + swapClass);
                    if (!ui.element.hasClass(‘loading‘)) {
                        //若设置处于加载中则不处理
                        var val = setEnumObj[index]._val(ui);
                        if (val != ‘_NotChange‘) {
                            if (!val && setting[index]) {
                                result[index] = val == undefined ? null : val;
                            }
                            else if (val && !IsObjEqual(val, setting[index])) {
                                //不为空且不为原值或默认值 (此处需要注意,修改系统默认值会影响采用默认配置的用户)
                                result[index] = val;
                            }
                        }
                    }
                }
            });
            return result;

            //function _saveSetting(_setObj, _sp, index, _setEnumObj, _setName) {
            //    if (!_setEnumObj)
            //        return;
            //    if (typeof (_setEnumObj._val) == ‘function‘) {
            //        //处理设置
            //        ui.element = ui.setArea.find(‘.‘ + _setName);
            //        var val = _setEnumObj._val(ui);
            //        if (val && !IsObjEqual(val, _sp[index])) {
            //            //不为空且不为默认值 (此处需要注意,修改系统默认值会影响采用默认配置的用户)
            //            _setObj[index] = val;
            //        } else {
            //            delete _setObj[index];
            //        }
            //    } else {
            //        if (!_setObj[index])
            //            _setObj[index] = {};
            //        $.each(_sp[index], function (_index, item) {
            //            _saveSetting(_setObj[index], _sp[index], _index, _setEnumObj[_index], _setName + ‘-‘ + _index);
            //        });
            //    }
            //}
        }

        $.widget(‘wfc.WFCSetting‘, {
            version: ‘2.0‘,
            options: {
                target: null,
                level: ‘widget‘,
                settingProperty: null,
                isPageHeaderFooter: false,

                //callback
                Update: null
            },
            originalOption: null, //原始option
            OriginalOption: function () {
                return this.originalOption;
            },
            _createWidget: function (option, element) {
                this.originalOption = option || {};
                this._super(option, element);
            },
            _create: function () {
                var self = this,
                options = this.options,
                $div = this.element;
                $div.addClass(‘setting-area‘);
                var SE = WFCFrame.Settings.SettingEnum;
                var target = options.target;
                if (!target || (level == ‘widget‘ && target.length == 0))
                    return;
                var level = options.level;
                var setting = null;
                if (level == ‘report‘) {
                    setting = $.extend(true, {}, target.SettingObj);
                    fillSettingBySettingProperty(setting, target.SettingProperty);
                    if (!options.settingProperty)
                        options.settingProperty = $.extend({}, target.SettingProperty);
                } else {
                    //var wOpt = target.WFCWidget(‘OriginalOption‘);
                    //setting = wOpt.setting;
                    setting = target.WFCWidget(‘option‘, ‘setting‘);
                    if (!options.settingProperty)
                        options.settingProperty = $.extend({}, target.WFCWidget(‘option‘, ‘SettingProperty‘));
                }

                if (options.isPageHeaderFooter) {
                    this._initPageHeaderFooterSetting();
                    if (options.settingProperty) {
                        //表头元素不可设置hidehead和title
                        delete options.settingProperty.hideHead;
                        delete options.settingProperty.title;
                    }
                }

                if (options.settingProperty) {
                    initSetting(setting, options.settingProperty, SE, $div, level, target);
                }
            },
            _initPageHeaderFooterSetting: function () {
                $div = this.element;
                var target = this.options.target;
                var targetOpt = target.WFCWidget(‘OriginalOption‘);
                var opts = [[611, ‘无‘], [623, ‘文字‘], [604, ‘图片‘], [610, ‘页码‘]];
                var htmlOpt = ‘‘;
                $.each(opts, function (index, item) {
                    htmlOpt += ‘<option value="‘ + item[0] + ‘">‘ + item[1] + ‘</option>‘;
                });
                $div.append(‘<div class="sWrap uiCreate sWrap-pageHeaderFooterWidgetType"><span class="setting-name">类型</span><span class="setting-item"><select class="s-pageHeaderFooterWidgetType">‘ + htmlOpt + ‘</select></span></div>‘);

                $div.find(‘.s-pageHeaderFooterWidgetType‘).val(targetOpt.type).change(function () {
                    var option = { type: $(this).val() };
                    var $ws = target.closest(‘.workspace‘);
                    target.WFCWidget(‘destroy‘).prop(‘WFCWidgetOption‘, option);
                    initWorkspaceWidget(target, $ws);
                    $div.WFCSetting(‘destroy‘).WFCSetting({ target: target, isPageHeaderFooter: true });
                    //保存widget(setting) and workspace(pageHeader/Footer)
                    $ws.WFCWorkspace(‘PageHeaderFooterUpdate‘);
                });
                WFCFrame.Settings.PackageSelect($div.find(‘.s-pageHeaderFooterWidgetType‘));
            },
            _destroy: function () {
                this.element.find(‘.ui-multiselect‘).each(function () {
                    $(this).prev(‘select‘).multiselect(‘destroy‘);
                });
                this.element.find(‘.sp-replacer‘).each(function () {
                    $(this).prev(‘input[type="text"]‘).spectrum(‘destroy‘);
                });

                this.element.removeClass(‘setting-area‘).find(‘.uiCreate‘).remove();
                this.element.find(‘.sWrap‘).empty();
            },
            Update: function (isGlobal/* 是否全局刷新(修改report设置时一般不需要单独刷新) */) {
                //更新设置到option, 修改控件/报告的设置并保存,然后调用update回调方法
                var self = this,
            options = this.options,
            $div = this.element;
                var SE = WFCFrame.Settings.SettingEnum;
                var target = this.originalOption.target; //获取原始的target数据而不是副本
                var level = options.level;
                if (!target || !options.settingProperty || (level == ‘widget‘ && target.length == 0))
                    return;

                if (level == ‘report‘ && !isGlobal) {
                    //report及只在isGlobal为true时应用设置
                    return;
                }

                var settingAfter = null; //合并后的设置
                var originalSetting = null;
                if (level == ‘report‘) {
                    if (!target.SettingObj)
                        target.SettingObj = {};
                    originalSetting = target.SettingObj;
                    settingAfter = $.extend(true, {}, target.SettingObj);
                    fillSettingBySettingProperty(settingAfter, target.SettingProperty);
                } else {
                    var wOpt = target.WFCWidget(‘OriginalOption‘);
                    if (!wOpt.setting)
                        wOpt.setting = {};
                    originalSetting = wOpt.setting;
                    settingAfter = target.WFCWidget(‘option‘, ‘setting‘);
                }
                var setResult = getSetting(settingAfter, options.settingProperty, SE, $div, level, target);

                //这里以后应该将setting传入widget.options中(setOption/setSetting),并判断两个setting是否相等,若相等则不必上传至服务器
                //setResult为empty表示未修改任何内容
                if (!$.isEmptyObject(setResult)) {
                    //                    $.each(setResult, function (index, item) {
                    //                        if (item) {
                    //                            originalSetting[index] = item;
                    //                        } else {
                    //                            delete originalSetting[index]; //这里是否需要删除待确定,这里不会出现与默认值相同的情况
                    //                        }
                    //                    });

                    $.extend(originalSetting, setResult);
                    //刷新
                    if (level == ‘report‘ && isGlobal) {
                        //更新fullSetting
                        target.fullSetting = $.extend(true, {}, target.SettingObj);
                        fillSettingBySettingProperty(target.fullSetting, target.SettingProperty);

                        if (target && typeof target.Update == ‘function‘) {
                            target.Update();
                        }
                        if (target && typeof target.Refresh == ‘function‘) {
                            target.Refresh();
                        }
                    } else if (level == ‘widget‘) {
                        target.WFCWidget(‘SaveSetting‘);
                    }
                }
                //update额外处理,目前没有用到
                this._trigger(‘Update‘, null, { setting: originalSetting });
                return setResult;
            }
            , ReCreate: function () {
                //                this.element.removeClass(‘setting-area‘).find(‘.sWrap.uiCreate‘).remove();
                //                this.element.find(‘.sWrap‘).empty();
                //                this._create();

                var opt = this.originalOption;
                this.element.WFCSetting(‘destroy‘).WFCSetting(opt);
            }
            //,Save: function () {
            //    var self = this,
            //    options = this.options,
            //    $div = this.element;
            //    var SE = WFCFrame.Settings.SettingEnum;
            //    var target = options.target;
            //    var level = options.level;

            //    if (level == ‘report‘) {
            //        //Report.SaveSetting 依赖this._trigger(‘Update‘)
            //    } else {
            //        //widget setting更新依赖对象引用传递至orignalOption,这一句主要起刷新的作用
            //        target.WFCWidget(‘SaveSetting‘);
            //    }
            //}
        });

    })();

    /* end of 设置相关代码(Setting)*/

    /* 菜单区(左侧) */

    /* end of 菜单区 */

    //WFCFrame init
    function _init() {
        //highcharts在WFCFrame下需做的统一配置
        if (typeof (Highcharts) != ‘undefined‘ && Highcharts.setOptions) {
            Highcharts.setOptions({
                chart: {
                    events: {
                        //解决无法捕获Highcharts内点击事件的问题
                        load: function () {
                            //.highcharts-container上的click事件会停止冒泡,故在其上绑定click事件调用父节点的click事件
                            $(this.container).click(function () {
                                $(this).parent().trigger(‘click‘);
                            });
                        }
                    }
                }
            });
        }

        //select helper
        containerSelHelper = initSelHelper();

        //$(‘head‘).append(‘<style id="FrameSettingStyle"></style>‘);

        $(‘body‘).keyup(function (event) {
            //console.log(‘keyup‘);
            //del键
            if (event.keyCode == ‘46‘) {
                var $sel = $(‘.workspace .container.selected‘);
                //页眉页脚不可删除,文本编辑状态下不可删除
                if ($sel.closest(‘.pageHeader,.pageFooter‘).length > 0 || event.srcElement.type == ‘textarea‘ || event.srcElement.type == ‘text‘)
                    return;
                removeContainer($sel);
            }
        })

        $.extend(_WFCFrame, {
            RegisterWidget: function (name, obj) {
                if (this.Widgets.hasOwnProperty(name)) {
                    showDebugMsg(‘名称为‘ + name + ‘的控件已存在‘);
                } else {
                    this.Widgets[name] = obj;
                }
            },
            Widgets: {},
            Param: param,
            Report: null, //当前对应的report,report相关内容通过此传入
            DivideContainerHorizontal: function () {
                divideContainer($(‘.workspace .selected‘), ‘vertical‘);
            },
            DivideContainerVertical: function () {
                divideContainer($(‘.workspace .selected‘), ‘horizontal‘);
            },
            GetNoDataBlockOption: getNoDataBlockOption,
            InitOperationArea: initOperationArea,
            GetContainerContentObj: getContainerContentObj,
            RefreshWidgetsByTypes: function (widgetTypeNameArray) {
                if ($.isArray(widgetTypeNameArray)) {
                    $.each(widgetTypeNameArray, function (index, item) {
                        $(‘.win-‘ + item).WFCWidget(‘Refresh‘);
                    });
                }
            },
            GetProductInfo: getProductInfo,
            FillSettingBySettingProperty: fillSettingBySettingProperty,
            RefreshWidget: function (obj) {
                var $widget = $(obj).hasClass(‘.widget‘) ? $(obj) : $(obj).closest(‘.widget‘);
                var objWidget = $widget.data(‘WFCWidget‘);
                if (objWidget && objWidget.Refresh) {
                    objWidget.Refresh();
                }
            }
        });
    }

    _init();

    /*WFCReport*/
    //var WFCReport = function (option) {
    //    this.option = $.extend(true, {

    //    }, option);
    //};

    //var proto = WFCReport.prototype;
    //proto.SaveSetting = function () {
    //    if(report)
    //}

    //window.WFCReport = WFCReport;

    window.WFCFrame = _WFCFrame;
})(window);
时间: 2024-10-29 10:47:53

js分享3的相关文章

自己封装的一个JS分享组件

因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台. 但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版. 这次的核心就是:JS只负责事件+结构,也就是把功能实现出来,具体的外观样式,则使用者自己进行定义. 以下是新版分享插件的代码: 1 (function(root){ 2 'use strict'; 3 function share(params){ 4 5 this.params = params;

js 分享到按钮

基础的思路,可以在此基础加强 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv

js“分享到”侧边框伸缩实现

思路: 1,临界值是 -150 和 0 如果大于临界值,就要隐藏 2,隐藏:速度为负 显示:速度为正 3,如果与临界值相等,就清空定时器 否则,就运动 --------------------------------html <div id="div1"><span>分享到</span></div> <style> #div1 { position:absolute; left:-150px; width:150px; hei

微信6.0.2 js 分享

12月25日 微信更新到6.0.2版本,此次对开发者影响比较大的就是原来微信分享的JS 将不再对开发者开发,对此官方的解释是: 旧版的获取分享状态及设置分享内容的JS接口一直用于内部业务,并未对外开放,在微信公开的开放文档里面并没有此接口. 某些第三方借助微信客户端漏洞在未获得权限的情况下使用接口,微信6.0.2版本对此漏洞做了修复以确保用户分享内容的准确性,避免诱导分享. 另外,不久将向广大公众号开放正式分享接口供开发者使用. 根据今天我们公司跟腾讯交涉的反馈是腾讯将对此接口进行白名单验证,相

学习js分享

购物车怎么做见代码 /购物车 (数组版本)(function ($) { $.fn.TaShopCartArray = function (setting) { //初始化配置 var opts = $.extend({}, $.fn.TaShopCartArray.defaults, setting); //读取cookeie信息 var _initdata = []; if (opts.savecookie && $.cookie(opts.cookiename) != null &a

iShare.js分享插件

iShare.js是一个小巧的分享插件,纯JS编写,不依赖任何第三方库,使用简便.为啥写这个插件? 因为在搭建个人blog时(还没有搭建好(¯﹃¯)),对目前国内比较受欢迎的分享插件都不太满意,主要如下几点: 不太喜欢官方提供的样式,想重新定制,但又不太方便 提供的大部分接口都没用到,真正用到就那么几个,显得有点冗余 没有进行更新维护,部分接口都是挂掉 另外,工作中,有时想要一个可以自定义样式.支持常用的分享接口.使用方便.不依赖于第三库的独立库.比如写活动页面时(⊙﹏⊙) 基于上述原因自己就创

js分享功能实现

分享功能初步测试,title为当前页面的title. 其他详见注释!!! <!doctype html> <html> <head> <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;"> <title>分享代码测试</title> <meta name="author" content=

微信Js分享朋友接口invalid signature解决方法

导致这个错误是因为签名算法错误 签名需要 noncestr timestamp(因为变量长度限制,不能直接使用毫秒时间戳,要除以1000) jsapi_ticket url 根据微信的文档说明做的话 最容易出错的地方是url 文档上对url的描述反正我是没怎么看懂~ 好了吐槽完毕,是时候上代码了 Java代码:         @RequestMapping("share2Firend")         //from.isappinstalled参数是自定义分享接口时 微信服务器带过

自己动手写js分享插件 [支持https] (可以分享QQ空间,微信,新浪微博。。。)

由于百度分享,jiathis 等分享插件在https下均会报错,就萌生了自己动手写一个分享插件的念头,其实实现起来一点都不难,以下代码都已在https网站运行通过,特附上以下代码:还请各位看官不吝赐教: 附上演示效果网址:https://www.aishandian.com/jiekuan_zhishi-979.html 动画实现效果代码 $(document).on("click", ".msb_main", function() { if($(this).has

微信js分享朋友圈

1.绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 2.引入js文件 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript" src=