var FormMixin = {
    linkState(attr) {
        var dots = attr.name.split('.'),
            state = this.state,
            name = dots[0];
        for(let i=1; i<dots.length; i++) {
            let r = /^(.+)\[(\d+)\]$/.exec(name);
            if(r) {
                name = r[1];
                if(state[name]===undefined) state[name] = [];
                state = state[name];
                name = Number(r[2]);
            }
            if(state[name]===undefined) state[name] = {};
            state = state[name];
            name = dots[i];
        }

        var getter = function() {
            return state[name];
        };
        var setter = function(value) {
            state[name] = value;
            this.forceUpdate();
        }.bind(this);

        switch(attr.type) {
        case 'checkbox':
        case 'radio':
            attr.checked = getter()===attr.value;
            break;
        case 'file':
            break;
        default:
            attr.value = getter();
        }

        attr.onChange = function(e) {
            var that = e.target;
            switch(that.type) {
            case 'checkbox':
                setter(that.checked ? that.value : undefined);
                break;
            case 'radio':
                that.checked && setter(that.value);
                break;
            case 'file':
                var file = that.files[0];
                var reader = new FileReader();
                switch(that.name){
                    case 'encodedSignedMark':
                        reader.onloadend = function(e) {
                            setter(e.target.result);
                        };
                        reader.readAsText(file);
                        break;
                    default:
                        var size = file && file.size/1024;
                        var types = ["image/png","image/jpeg","image/bmp"];
                        if(size < 5 || size > 5120 || types.indexOf(file.type)<0){
                            that.nextElementSibling.innerHTML = "上传的文件,大小或者类型不符合要求";
                            return;
                        }
                        that.nextElementSibling.innerHTML = "";
                        reader.onloadend = function(e) {
                            setter(e.target.result.split(',')[1]);
                        };
                        reader.readAsDataURL(file);
                        break;
                }
                break;
            default:
                setter(that.value);
            }
        };
        return attr;
    },
    onSetState(attr) {
        return e => this.setState(attr);
    }
};
