// Up-to-date as of 2013-04-07.
var formElements = {
  form: {
    acceptCharset: {type: "string", domAttrName: "accept-charset"},
    // TODO: action is special
    // action: "url",
    autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
    enctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded"},
    encoding: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded", domAttrName: "enctype"},
    method: {type: "enum", keywords: ["get", "post", "dialog"], defaultVal: "get"},
    name: "string",
    noValidate: "boolean",
    target: "string",
  },
  fieldset: {
    disabled: "boolean",
    name: "string",
  },
  legend: {
    // Obsolete
    align: "string",
  },
  label: {
    htmlFor: {type: "string", domAttrName: "for"},
  },
  input: {
    // Conforming
    accept: "string",
    alt: "string",
    // TODO: autocomplete is special.
    // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
    autofocus: "boolean",
    defaultChecked: {type: "boolean", domAttrName: "checked"},
    dirName: "string",
    disabled: "boolean",
    // TODO: formAction is special
    // formAction: "url",
    formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
    formMethod: {type: "enum", keywords: ["get", "post"], invalidVal: "get"},
    formNoValidate: "boolean",
    formTarget: "string",
    //TODO: only reflected on setting
    //height: "unsigned long",
    inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
    max: "string",
    maxLength: "limited long",
    min: "string",
    multiple: "boolean",
    name: "string",
    pattern: "string",
    placeholder: "string",
    readOnly: "boolean",
    required: "boolean",
    // https://html.spec.whatwg.org/multipage/#attr-input-size
    size: {type: "limited unsigned long", defaultVal: 20},
    src: "url",
    step: "string",
    type: {type: "enum", keywords: ["hidden", "text", "search", "tel",
      "url", "email", "password", "datetime", "date", "month", "week",
      "time", "datetime-local", "number", "range", "color", "checkbox",
      "radio", "file", "submit", "image", "reset", "button"], defaultVal:
      "text"},
    //TODO: only reflected on setting
    //width: "unsigned long",
    defaultValue: {type: "string", domAttrName: "value"},

    // Obsolete
    align: "string",
    useMap: "string",
  },
  button: {
    autofocus: "boolean",
    disabled: "boolean",
    // TODO: formAction is special
    // formAction: "url",
    formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
    formMethod: {type: "enum", keywords: ["get", "post", "dialog"], invalidVal: "get"},
    formNoValidate: "boolean",
    formTarget: "string",
    name: "string",
    type: {type: "enum", keywords: ["submit", "reset", "button"], defaultVal: "submit"},
    value: "string",
    // TODO: menu
  },
  select: {
    autofocus: "boolean",
    disabled: "boolean",
    multiple: "boolean",
    name: "string",
    required: "boolean",
    size: {type: "unsigned long", defaultVal: 0},
  },
  datalist: {},
  optgroup: {
    disabled: "boolean",
    label: "string",
  },
  option: {
    disabled: "boolean",
    label: {type: "string", customGetter: true},
    defaultSelected: {type: "boolean", domAttrName: "selected"},
    value: {type: "string", customGetter: true},
  },
  textarea: {
    // TODO: autocomplete is special.
    // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
    autofocus: "boolean",
    cols: {type: "limited unsigned long with fallback", defaultVal: 20},
    dirName: "string",
    disabled: "boolean",
    inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
    maxLength: "limited long",
    name: "string",
    placeholder: "string",
    readOnly: "boolean",
    required: "boolean",
    rows: {type: "limited unsigned long with fallback", defaultVal: 2},
    wrap: "string",
  },
  keygen: {
    autofocus: "boolean",
    challenge: "string",
    disabled: "boolean",
    // The invalid value default is the "unknown" state, which for our
    // purposes  seems to be the same as having no invalid value default.
    // The missing  value default depends on whether "rsa" is implemented,
    // so we use null,  which is magically reserved for "don't try testing
    // this", since no one  default is required.  (TODO: we could test that
    // it's either the RSA  state or the unknown state.)
    keytype: {type: "enum", keywords: ["rsa"], defaultVal: null},
    name: "string",
  },
  output: {
    htmlFor: {type: "settable tokenlist", domAttrName: "for" },
    name: "string",
  },
  progress: {
    max: {type: "limited double", defaultVal: 1.0},
  },
  meter: {},
};

mergeElements(formElements);
