;(function ($) {
    /**
     * 单选按钮组
     *
     *     @example
     *     var editor = new FR.RadioGroup({
     *          renderEl : 'body',
     *          width : 200,
     *          height : 100,
     *          columnsInRow : 3,       //一行能显示的个数
     *          items : [
     *                  {text : '111', value : '1'},
     *                  {text : '222', value : '2'},
     *                  {text : '333', value : '3'},
     *                  {text : '444', value : '4'},
     *                  {text : '555', value : '5'},
     *                  {text : '666', value : '6'}
     *          ]
     *     });
     *
     * @class FR.RadioGroup
     * @extends FR.ToggleButtonGroup
     *
     * @cfg {JSON} options 配置属性
     * @cfg {Boolean} [options.adaptive=false] 是否自使用宽度换行,如果为true,将自动计算每行放置多少个子控件
     * @cfg {Number} [options.columnsInRow=0] 每行包含子控件的个数,0表示只有一行,全部子控件都在这一行里面
     */
    FR.RadioGroup = FR.extend(FR.ToggleButtonGroup, {

        lbox_class: 'fr-group-box',
        sbox_class: 'fr-group-span',

        _init: function () {
            FR.RadioGroup.superclass._init.apply(this, arguments);
        },

        initData: function () {
            if (this.options.data) {
                return;
            }

            if (this.options.controlAttr) {
                this.setSource(this.options.controlAttr);
                this._confirmEvents = function () {
                    this.fireEvent(FR.Events.AFTERINIT);
                };
                return;
            }

            if (this.options.widgetUrl) {
                this.options.data = FR.DataFactory.createSynchronJSONData(
                    this.options.widgetUrl, false);
                this.options.data.resetStatus(this.createDependencePara4Data());
            } else if (this.options.items) {
                this.options.data = FR.DataFactory
                    .createSynchronArrayData(this.options.items);
            }
            var self = this;
            this.options.data.afterRead(function (items) {
                if (self.isBoxBuild !== true) {
                    self._buildBox(items);
                }
            });
            this.options.data.loadData();
        },

        _setItems: function (items) {
            var records = items || [], len = records.length;
            var rname;
            if (this.options.widgetName) {
                rname = this.options.widgetName;
            } else {
                rname = "noNameChild";
            }
            var self = this;
            $.each(records, function (idx, it) {
                if (self.options.adaptive) {
                    var outter = $("<span></span>")
                        .addClass(self.sbox_class)
                        .appendTo(self.$container);
                } else {
                    var outter = $("<span/>")
                        .addClass(self.sbox_class);
                    var gridElement = {
                        column: idx % self.gridConfig.columns,
                        row: Math.floor(idx / self.gridConfig.columns),
                        el: outter
                    };
                    self.gridConfig.items.push(gridElement);
                }

                self.buttonArray[idx] = self.initItemRadio(idx,it,outter,rname);
                self.buttonArray[idx].on(
                    FR.Events.BEFORESTATECHANGE, function () {
                        self
                            .fireEvent(FR.Events.BEFORESTATECHANGE);
                    });
                self.buttonArray[idx].on(FR.Events.STATECHANGE,
                    function () {
                        self.assureOneButtonChecked(this);
                        if (this.selected() === true || self.getValue() == "") {
                            self.fireEvent(FR.Events.STATECHANGE, idx);
                            self.fireEvent(FR.Events.AFTEREDIT);
                        } else {
                            self.oriValue = self.getValue();
                        }
                    });
            });
            if (!self.options.adaptive) {
                this.grid = new FR.GridLayout(this.gridConfig);
                this.grid.element.doLayout();
                this._checkTable();
            }
        },

        initItemRadio: function(idx,it,outter,rname){
            return new FR.RadioButton({
                renderEl: $("<div/>").appendTo(outter),
                disabled: this.options.disabled,
                text: it.getShowValue(),
                fieldValue: it.getValue(),
                sessionID: this.options.sessionID,
                name: rname,
                fontSize: this.options.fontSize
            });
        },
        assureOneButtonChecked: function (radio) {
            var foundSelected = false;
            if (radio.isSelected()) {
                for (var i = 0, len = this.buttonArray.length; i < len; i++) {
                    if (this.buttonArray[i] == radio) {
                        foundSelected = true;
                        continue;
                    }
                    this.buttonArray[i].setSelectedWithoutEvent(false);
                }
            }
            if (!foundSelected && this.options.assureSelect === true) {
                radio.setSelectedWithoutEvent(true);
            }
        },

        getValue: function () {
            return this.getTV(false);
        },

        getText: function () {
            return this.getTV(true);
        },

        /**
         * 获取组件的显示值或者实际值
         * @private
         * @param forShowValue 是否返回显示值
         * @returns {String} 返回控件的值
         */
        getTV: function (forShowValue) {
            var self = this;
            var value = "";
            $.each(self.buttonArray, function (idx, it) {
                if (it.selected()) {
                    var record = self.options.data.getRecord(idx);
                    if (record) {
                        value = forShowValue ? record.getShowValue() : record.getValue();
                    }
                }
            });
            return value;
        },

        _dealValueWithEvents: function (value) {
            var self = this;
            var argument = arguments[1];
            var setValueFunc = function () {
                if (self.isBoxBuild !== true) {
                    return;
                }
                clearInterval(sh);
                var oldValue = self.options.value;

                if (typeof value == 'boolean') {
                    value = value ? 'true' : 'false';
                }

                if (!value && value !== 0) {
                    return;
                }

                for (var i = 0; i < self.buttonArray.length; i++) {
                    self.buttonArray[i].setSelectedWithoutEvent(false);
                }

                for (var i = 0, len = self.buttonArray.length; i < len; i++) {
                    if (self.buttonArray[i].options.fieldValue == value) {
                        if (argument !== false) {
                            self.buttonArray[i].setSelected(true);
                        } else {
                            self.buttonArray[i].setSelectedWithoutEvent(true);
                        }
                        break;
                    }
                }
            };
            if (this.isBoxBuild === true) {
                setValueFunc();
                return;
            }
            var sh = setInterval(setValueFunc, 100);
        },

        isValidate: function (cValue) {
            var validate = FR.RadioGroup.superclass.isValidate.apply(this, arguments);
            if (validate === false) {
                if (this.oriValue) {
                    this._dealValueWithEvents(this.oriValue);
                }
            }
            return validate;
        }
    });
    $.shortcut("radiogroup", FR.RadioGroup);
})(jQuery);