var Update = React.createClass({
    mixins: [FormMixin],
    shouldUpdate: false,
    getInitialState() {
        return {}
    },
    checked(a) {
        var s = {};
        a && a.forEach(v => s[v] = 'checked');
        return s;
    },
    getPostal(info) {
        return {
            name: info.name,
            org: info.org,
            addr: {
                street: [info.street1, info.street2, info.street3],
                city: info.city,
                sp: info.sp,
                pc: info.pc,
                cc: info.cc
            }
        }
    },
    getSecDNS(info){
      return {
        dsData: [{
          keyTag: info.keyTag,
          alg: info.alg,
          digestType: info.digestType,
          digest: info.digest
        }]
      }
    },
    setPostal(info) {
        return {
            name: info.name,
            org: info.org,
            street1: info.addr.street[0],
            street2: info.addr.street[1],
            street3: info.addr.street[2],
            city: info.addr.city,
            sp: info.addr.sp,
            pc: info.addr.pc,
            cc: info.addr.cc
        }
    },
    setSecDNS(info){
      return {
          keyTag: info.dsData[0].keyTag,
          alg: info.dsData[0].alg,
          digestType: info.dsData[0].digestType,
          digest: info.dsData[0].digest
      }
    },
    shouldComponentUpdate(nextProps, nextState) {
        if(this.shouldUpdate) return true;
        api.show(this.props.obj, nextState.id, function(code, data) {
            if(code !== '1000') {
                logout();
                return;
            }
            data.id = nextState.id;
            data.s = this.checked(data.s);
            switch(this.props.obj) {
            case 'domain':
            case 'launch':
                data.ns = data.ns ? data.ns.join('\n') : '';
                if(data.secDNS)
                    data.secDNS = this.setSecDNS(data.secDNS);
                break;
            case 'host':
                data.ip = data.ip ? data.ip.join('\n') : '';
                data.new_name = data.name;
                break;
            case 'contact':
                data.int = this.setPostal(data.int);
                if(data.loc) {
                    data.loc = this.setPostal(data.loc);
                    data.has_loc = 'block';
                }
                else {
                    data.has_loc = 'none';
                }
                [data.xv, data.voice] = (data.voice || '+').split('+');
                [data.xf, data.fax] = (data.fax || '+').split('+');
                break;
            }
            this.shouldUpdate = true;
            this.replaceState(data, function() {
                this.shouldUpdate = false;
            });
        }.bind(this));
        return false;
    },
    getParam() {
        switch(this.props.obj) {
        case 'domain':
            return {
                name: this.state.id,
                ns: SPLIT(this.state.ns),
                registrant: TRIM(this.state.registrant),
                admin: TRIM(this.state.admin),
                tech: TRIM(this.state.tech),
                billing: TRIM(this.state.billing),
                pw: this.state.pw,
                secDNS: this.getSecDNS(this.state.secDNS),
                s: forJSON(this.state.s, (key, value) => value ? key : undefined)
            };
        case 'host':
            return {
                name: this.state.id,
                new_name: this.state.new_name,
                ip: SPLIT(this.state.ip),
                s: forJSON(this.state.s, (key, value) => value ? key : undefined)
            };
        case 'contact':
            var r = {
                name: this.state.id,
                int: this.getPostal(this.state.int),
                loc: this.state.has_loc!=='none'
                   ? this.getPostal(this.state.loc)
                   : undefined
            };
            if(TRIM(this.state.voice)){
                if(/^86\.[0-9]{1,14}/.test(TRIM(this.state.voice))){
                    r.voice = '+'+TRIM(this.state.voice) + TRIM(this.state.xv);
                }else if(!/^86\.$/.test(TRIM(this.state.voice))){
                    r.voice = '+86.'+TRIM(this.state.voice) + TRIM(this.state.xv);
                }else{
                    r.voice = '+86.01012345678';
                }
            }else{ 
                r.voice = '+86.01012345678';
            }
            if(TRIM(this.state.fax)){
                if(/^86\.[0-9]{1,14}/.test(TRIM(this.state.fax))){
                    r.fax = '+'+TRIM(this.state.fax) + TRIM(this.state.xf);
                }else if(!/^86\.$/.test(TRIM(this.state.fax))){
                    r.fax = '+86.'+TRIM(this.state.fax) + TRIM(this.state.xf);
                }else { 
                    r.fax = '+86.01012345678';
                }
            }else { 
                r.fax = '+86.01012345678';
            }
            r.email = TRIM(this.state.email);
            r.pw = this.state.pw;
			r.s = forJSON(this.state.s, (key, value) => value ? key : undefined);
            return r;
        case 'launch':
            return {
                name: this.state.name,
                ns: SPLIT(this.state.ns),
                registrant: TRIM(this.state.registrant),
                admin: TRIM(this.state.admin),
                tech: TRIM(this.state.tech),
                billing: TRIM(this.state.billing),
                pw: this.state.pw,
                dsData: this.state.dsData,
                phase: this.state.phase,
                applicationID: this.state.id,
                s: forJSON(this.state.s, (key, value) => value ? key : undefined)
            };
        }
    },
    handleSubmit(e) {
        api.update(this.props.obj==='launch' ? 'domain' : this.props.obj, this.getParam(), function(code, data) {
            switch(code) {
            case '1000':
                this.props.onFinish();
                break;
            case '2501':
                logout();
                break;
            default:
                this.state.value = data;
                this.forceUpdate();
            }
        }.bind(this));
    },
    render() {
        switch(this.props.obj) {
        case 'domain':
        case 'launch':
            return (
                <div>
                <table border="0" align="center">
                <tbody>
                  <tr align="center">
                    <td colSpan="2">{this.props.children}</td>
                  </tr>
                  <tr>
                    <td colSpan="2" height="16"></td>
                  </tr>
                  <tr>
                    <td>域名：{this.state.name || this.state.id}</td>
                    <td>
                      <input {...this.linkState({
                          name:"s.clientTransferProhibited",
                          type:"checkbox",
                          value:"checked"
                      })} />禁转
                      <input {...this.linkState({
                          name:"s.clientDeleteProhibited",
                          type:"checkbox",
                          value:"checked"
                      })} />禁删
                      <input {...this.linkState({
                          name:"s.clientUpdateProhibited",
                          type:"checkbox",
                          value:"checked"
                      })} />禁改
                      <input {...this.linkState({
                          name:"s.clientRenewProhibited",
                          type:"checkbox",
                          value:"checked"
                      })} />禁续
                      <input {...this.linkState({
                          name:"s.clientHold",
                          type:"checkbox",
                          value:"checked"
                      })} />HOLD
                    </td>
                  </tr>
                  <tr>
                    <td>NS主机：</td>
                    <td>
                      <textarea {...this.linkState({
                          name:"ns",
                          rows:"6",
                          cols:"40"
                      })}></textarea>
                    </td>
                  </tr>
                  <tr>
                    <td>登记人：</td>
                    <td>
                      <input {...this.linkState({
                          name:"registrant",
                          type:"text",
                          size:"16",
                          maxLength:"16"
                      })}/>
                    </td>
                  </tr>
                  <tr>
                    <td>管理联系人：</td>
                    <td>
                      <input {...this.linkState({
                          name:"admin",
                          type:"text",
                          size:"16",
                          maxLength:"16"
                      })}/>
                    </td>
                  </tr>
                  <tr>
                    <td>交费联系人：</td>
                    <td>
                      <input {...this.linkState({
                          name:"billing",
                          type:"text",
                          size:"16",
                          maxLength:"16"
                      })}/>
                    </td>
                  </tr>
                  <tr>
                    <td>技术联系人：</td>
                    <td>
                      <input {...this.linkState({
                          name:"tech",
                          type:"text",
                          size:"16",
                          maxLength:"16"
                      })}/>
                    </td>
                  </tr>
                  <tr>
                    <td>口令：</td>
                    <td>
                      <input {...this.linkState({
                          name:"pw",
                          type:"text",
                          size:"16",
                          maxLength:"16"
                      })}/>
                    </td>
                  </tr>
                  <tr>
                    <td colSpan="2" height="16"></td>
                  </tr>
                  <tr>
                    <td>secDNS：</td>
                    <td><DsData name="secDNS" linkState={this.linkState}/></td>
                  </tr>
                  <tr>
                    <td colSpan="2" height="16"></td>
                  </tr>
                  <tr align="center">
                    <td colSpan="2">
                      <input type="button" value="提交" onClick={this.handleSubmit}/>
                    </td>
                  </tr>
                </tbody>
                </table>
                <OpResult content={this.state.value} />
                </div>
            );
        case 'host':
            return (
                <div>
                  <table>
                  <tbody>
                    <tr>
                      <td colSpan="2">{this.props.children}</td>
                    </tr>
                    <tr>
                      <td colSpan="2" height="16"></td>
                    </tr>
                    <tr>
                      <td>主机名：</td>
                      <td>
                        <input {...this.linkState({
                              readOnly:true,
                              name:"new_name",
                              type:"text",
                              size:"40",
                              maxLength:"255"
                        })} />
                        <input {...this.linkState({
                            name:"s.clientDeleteProhibited",
                            type:"checkbox",
                            value:"checked"
                        })} />禁删
                        <input {...this.linkState({
                            name:"s.clientUpdateProhibited",
                            type:"checkbox",
                            value:"checked"
                        })} />禁改
                      </td>
                    </tr>
                    <tr>
                      <td>IP地址：</td>
                      <td><textarea {...this.linkState({
                              name:"ip",
                              rows:"6",
                              cols:"40"
                          })} />
                      </td>
                    </tr>
                    <tr>
                      <td colSpan="2" height="16"></td>
                    </tr>
                    <tr align="center">
                      <td colSpan="2"><input type="button" value="提交" onClick={this.handleSubmit} /></td>
                    </tr>
                  </tbody>
                  </table>
                  <OpResult content={this.state.value} />
                </div>
            );
        case 'contact':
            return (
                <div>
                  <table border="0" align="center">
                  <tbody>
                    <tr align="center">
                        <td colSpan="2"><b>修改联系人信息</b><span className="help"></span></td>
                    </tr>
                    <tr>
                      <td colSpan="2" height="16"></td>
                    </tr>
                    <tr>
                      <td>联系人ID：</td>
                      <td>{this.state.id}</td>
                    </tr>
                    <tr>
                      <td>状态：</td>
                      <td>
                        <input {...this.linkState({
                            name:"s.clientTransferProhibited",
                            type:"checkbox",
                            value:"checked"
                        })} />禁转
                        <input {...this.linkState({
                            name:"s.clientDeleteProhibited",
                            type:"checkbox",
                            value:"checked"
                        })} />禁删
                        <input {...this.linkState({
                            name:"s.clientUpdateProhibited",
                            type:"checkbox",
                            value:"checked"
                        })} />禁改
                      </td>
                    </tr>
                    <tr>
                      <td colSpan="2"><PostalInfo name="int" linkState={this.linkState} readOnly={true}/></td>
                    </tr>
                    <tr>
                      <td colSpan="2">
                        <input {...this.linkState({
                            name: 'has_loc',
                            type: 'radio',
                            value: 'none'
                        })}/>没有本地语言联系方式
                        <input {...this.linkState({
                            name: 'has_loc',
                            type: 'radio',
                            value: 'table-row'
                        })}/>有本地语言联系方式
                      </td>
                    </tr>
                    <tr style={{display: this.state.has_loc}}>
                      <td colSpan="2"><PostalInfo name="loc" linkState={this.linkState} readOnly={true}/></td>
                    </tr>
                    <tr>
                      <td>电话：</td>
                      <td>
                        <input {...this.linkState({
                            name: 'voice',
                            type: 'text',
                            size: '17',
                            maxLength: '17'
                        })}/>
                        转
                        <input {...this.linkState({
                            name: 'xv',
                            type: 'text',
                            size: '5',
                            maxLength: '5'
                        })}/>
                      <label>格式为国别(<strong className="red">86</strong>).区号(<strong className="red">531</strong>)座机号，如：86.53186920439或国别.手机号,如：86.13425668204，电话号码不得是1111111，1234567,00000等无意义的号码</label>
                      </td>
                    </tr>
                    <tr>
                      <td>传真：</td>
                      <td>
                        <input {...this.linkState({
                            name: 'fax',
                            type: 'text',
                            size: '17',
                            maxLength: '17'
                        })}/>
                        转
                        <input {...this.linkState({
                            name: 'xf',
                            type: 'text',
                            size: '5',
                            maxLength: '5'
                        })}/>
                      <label>格式为国别(<strong className="red">86</strong>).区号(<strong className="red">531</strong>)座机号，如：86.53186920439或国别.手机号,如：86.13425668204，电话号码不得是1111111，1234567,00000等无意义的号码</label>
                      </td>
                    </tr>
                    <tr>
                      <td>电子邮件：</td>
                      <td>
                        <input {...this.linkState({
                            name: 'email',
                            type: 'text',
                            size: '40',
                            maxLength: '255'
                        })}/>
                      <label>必须真实有效，用于接收有关所注册域名的重要通知，<strong className="red">不可用中文邮箱</strong></label>
                      </td>
                    </tr>
                    <tr>
                      <td>口令：</td>
                      <td>
                        <input {...this.linkState({
                            name:"pw",
                            type:"text",
                            size:"16",
                            maxLength:"16"
                        })}/>
                      </td>
                    </tr>
                    <tr>
                      <td colSpan="2" height="16"></td>
                    </tr>
                    <tr align="center">
                      <td colSpan="2"><input type="button" value="提交" onClick={this.handleSubmit} /></td>
                    </tr>
                  </tbody>
                  </table>
                  <OpResult content={this.state.value} />
                </div>
            );
        }
    }
});
