/*
 * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved.
 */

;
(function ($) {
    /**
     * 复选按钮组。一系列的复选按钮组成的控件,可以选择其中的零个或者多个。
     *
     *     @example
     *     var editor = new FR.CheckBoxGroup({
     *          renderEl : 'body',
     *          width : 200,
     *          height : 100,
     *          columnsInRow : 1,
     *          mode : 'local',
     *          items : [
     *              {text : 'apple', value : '1'},
     *              {text : 'orange', value : '2'},
     *              {text : 'banana', value : '3'}
     *          ]
     *     });
     *
     * @class FR.CheckBoxGroup
     * @extends FR.ToggleButtonGroup
     *
     * @cfg {JSON} options 配置属性
     * @cfg {Boolean} [options.adaptive=false] 是否自使用宽度换行,如果为true,将自动计算每行放置多少个子控件
     * @cfg {Number} [options.columnsInRow=0] 每行包含子控件的个数,0表示只有一行,全部子控件都在这一行里面
     * @cfg {String} [options.delimiter=','] 返回值的分隔符,当控件返回多个值是,以指定的分隔符将每个值连接起来
     * @cfg {String} [options.startSymbol=''] 返回值的起始补充符,默认为空
     * @cfg {String} [options.endSymbol=''] 返回值的结束补充符,默认为空
     */
    FR.CheckBoxGroup = FR.extend(FR.ToggleButtonGroup, {
        lbox_class: 'fr-group-box',
        sbox_class: 'fr-group-span',

        _defaultConfig: function () {
            return $.extend(FR.CheckBoxGroup.superclass._defaultConfig.apply(), {
                delimiter: ',',
                startSymbol: '',
                endSymbol: '',
                adaptive:false
            });
        },

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

        changeAllState: function (state) {
            if (this.buttonArray) {
                for (var i = 0, len = this.buttonArray.length; i < len; i++) {
                    this.buttonArray[i].setSelected(state);
                }
            }
        },

        _setItems: function (items) {
            var records = items || [];
            var self = this;
            if(self.buttonArray){
                self.buttonArray.clear();
            }
            $.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] = new FR.CheckBox({
                    renderEl: $("<div/>").appendTo(outter),
                    disabled: self.options.disabled,
                    text: it.getShowValue(),
                    fieldValue: it.getValue(),
                    sessionID: self.options.sessionID,
                    widgetName: self.options.widgetName,
                    fontSize: self.options.fontSize
                });
                self.buttonArray[idx].on(FR.Events.BEFORESTATECHANGE,
                    function () {
                        self.fireEvent(FR.Events.BEFORESTATECHANGE);
                    });
                self.buttonArray[idx].on(FR.Events.STATECHANGE, function () {
                    self.fireEvent(FR.Events.STATECHANGE, idx, this
                        .selected());
                    if (self.options.chooseAll) {
                        var selectedItems = self.getSelectedItems();
                        var checkonCount = selectedItems.length ;
                        if (checkonCount === self.buttonArray.length) {
                            self.innerCheckBox.setSelectedWithoutEvent(true);

                        } else {
                            self.innerCheckBox.setSelectedWithoutEvent(false);
                        }
                    }
                    self.fireEvent(FR.Events.AFTEREDIT);
                });
            });
            this._checkChooseAll();
        },

        initItemBox:function(idx, it,outter){
            return new FR.CheckBox({
                renderEl: $("<div/>").appendTo(outter),
                disabled: this.options.disabled,
                text: it.getShowValue(),
                fieldValue: it.getValue(),
                sessionID: this.options.sessionID,
                widgetName: this.options.widgetName,
                fontSize: this.options.fontSize
            });
        },
        getSelectedItems:function(){
            return $('.fr-checkbox-checkon', this.$container);
        },

        doResize: function (give) {
            FR.ToggleButtonGroup.superclass.doResize.call(this, give);
            this._checkTable();
        },

        _checkChooseAll: function () {
            if (!this.options.adaptive) {
                this.grid = new FR.GridLayout(this.gridConfig);
                this.grid.element.doLayout();
                this._checkTable();
            }
            if (this.options.chooseAll) {
                var el;
                var self = this;
                if (this.options.adaptive) {
                    var parent = this.options.form ? this.element : this.element
                        .parent();
                    this.options.form
                    || this.element.height(parseInt(parent.height()) - 19);//这边高度应该是整个全选div的高度加留白的高度
                    el = $("<span/>").addClass(this.sbox_class).appendTo(parent);
                } else {
                    el = $("<span/>").addClass(this.sbox_class);
                    var count = this.buttonArray.length;
                    var gridElement = {
                        column: count % this.gridConfig.columns,
                        row: Math.floor(count / this.gridConfig.columns),
                        el: el
                    };
                    this.gridConfig.items.push(gridElement)
                }
                this.innerCheckBox = new FR.CheckBox({
                    renderEl: el,
                    disabled: self.options.disabled,
                    text: FR.i18nText('FR-Engine_Choose_All'),
                    fontSize: self.options.fontSize
                });
                this.innerCheckBox.on(FR.Events.STATECHANGE, function () {
                    self.changeAllState(self.innerCheckBox.isSelected());
                });
            }
            if (!this.options.adaptive) {
                this.grid = new FR.GridLayout(this.gridConfig);
                this.grid.element.doLayout();
                this._checkTable();
            }
        },

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

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

        getTV: function (getText) {
            var self = this;
            var valueArray = [];
            var noSelectedObject = this.options.noSelected;
            $.each(self.buttonArray, function (idx, it) {
                if (noSelectedObject) {
                    if (it.selected()) {
                        var re = self.options.data.getRecord(idx);
                        valueArray[idx] = getText ? re.getShowValue() : re.getValue();
                    } else {
                        valueArray[idx] = noSelectedObject;
                    }
                } else if (it.selected()) {
                    var rec = self.options.data.getRecord(idx);
                    valueArray[valueArray.length] = getText ? rec.getShowValue() : rec.getValue();
                }
            });
            if (this.options.returnArray) {
                return valueArray;
            }
            var resultStr = this.options.startSymbol
                + valueArray.join(this.options.delimiter)
                + this.options.endSymbol;
            return resultStr;
        },

        _dealValueWithEvents: function (value) {
            var self = this;
            var argument = arguments[1];
            var setValueFunc = function () {
                if (self.isBoxBuild !== true) {
                    return;
                }
                clearInterval(sh);
                var oldValue = self.getValue();
                if (typeof value === "string") {
                    var value_array = value.split(self.options.delimiter);
                } else {
                    var value_array = $.makeArray(value);
                }
                if (!self.options.returnArray) {
                    value = value + "";
                    value_array = value.substring(
                            self.options.startSymbol.length,
                            value.length - self.options.endSymbol.length)
                        .split(self.options.delimiter);
                }
                for (var i = 0; i < self.buttonArray.length; i++) {
                    self.buttonArray[i].setSelectedWithoutEvent(false);
                }
                $.each(value_array, function (idx, v) {
                    for (var i = 0, len = self.buttonArray.length; i < len; i++) {
                        if (self.buttonArray[i].options.fieldValue == v) {
                            self.buttonArray[i]
                                .setSelectedWithoutEvent(true);
                            break;
                        }
                    }
                })
                if (argument !== false) {
                    self.fireEvent(FR.Events.CHANGE, value, oldValue);
                }
            }
            if (this.isBoxBuild === true) {
                setValueFunc();
                return;
            }
            var sh = setInterval(setValueFunc, 100);
        }
    });
    $.shortcut("checkboxgroup", FR.CheckBoxGroup);

})(jQuery);