# Forms Module

# Unlike the DTD implementation, this builds on the basic-form module

# This file is based upon the work of James Clark "Modularization of XHTML in RELAX NG"
# (see http://www.thaiopensource.com/relaxng/xhtml/ and
# the accompanying jing-copying.html file)
# All changes are marked with relevant comments.
# The following license refers just to those changes.

# Copyright (c) 2005 Petr Nalevka
# Copyright (c) 2007 Mozilla Foundation
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

default namespace = "http://www.w3.org/1999/xhtml"
namespace sch = "http://www.ascc.net/xml/schematron"

sch:ns [ prefix = "html" uri = "http://www.w3.org/1999/xhtml" ]
include "basic-form.rnc" {
    [
        # added - If select element isn't marked as multiple,
        # just one of his child option elements may be marked as selected
        
        sch:pattern [
            name = "select.multiple.selected.options"
            "\x{a}" ~
            "          "
            sch:rule [
                context = "html:select"
                "\x{a}" ~
                "              "
                sch:report [
                    test =
                        "not(@multiple) and count(html:option[@selected]) > 1"
                    "\x{a}" ~
                    "                   Select elements which aren't marked as multiple may not have more then one selected option.\x{a}" ~
                    "              "
                ]
                "\x{a}" ~
                "          "
            ]
            "\x{a}" ~
            "      "
        ]
    ]
    select = element select { select.attlist, (option | optgroup)+ }
}
form.attlist &=
    attribute accept-charset { charsets.datatype }?,
    attribute accept { content-types.datatype }?
input.attlist &=
    attribute disabled { string "disabled" }?,
    attribute readonly { string "readonly" }?,
    attribute alt { text }?,
    attribute tabindex { tabindexnumber.datatype }?,
    attribute accept { content-types.datatype }?
InputType.class |=
    string "image"
    | string "button"
    | # bugfix - added
      string "file"
select.attlist &=
    attribute disabled { string "disabled" }?,
    attribute tabindex { tabindexnumber.datatype }?
option.attlist &=
    attribute disabled { string "disabled" }?,
    attribute label { text.datatype }?
optgroup = element optgroup { optgroup.attlist, option+ }
optgroup.attlist =
    Common.attrib,
    attribute disabled { string "disabled" }?,
    attribute label { text.datatype }
textarea.attlist &=
    attribute disabled { string "disabled" }?,
    attribute readonly { string "readonly" }?,
    attribute tabindex { tabindexnumber.datatype }?
fieldset = element fieldset { fieldset.attlist, legend?, Flow.model* }
fieldset.attlist = Common.attrib
button =
    element button {
        button.attlist,
        Flow.model
        # added - bugfix - button may contain flow elements but excluding a,form and form controls
        
        >> sch:pattern [
               name = "button.content"
               "\x{a}" ~
               "          "
               sch:rule [
                   context = "html:button"
                   "\x{a}" ~
                   "              "
                   sch:report [
                       test =
                           "html:form or html:a or html:input or html:select or html:textarea or html:button or html:label"
                       "\x{a}" ~
                       "                   Button may contain all flow elements but excluding a, form and all form controls.\x{a}" ~
                       "              "
                   ]
                   "\x{a}" ~
                   "          "
               ]
               "\x{a}" ~
               "      "
           ]
    }
button.attlist =
    Common.attrib,
    attribute name { text }?,
    attribute value { text }?,
    attribute type { string "button" | string "submit" | string "reset" }?,
    attribute disabled { string "disabled" }?,
    attribute tabindex { tabindexnumber.datatype }?,
    attribute accesskey { character.datatype }?
legend = element legend { legend.attlist, Inline.model }
legend.attlist =
    Common.attrib,
    attribute accesskey { character.datatype }?
Form.class |= fieldset
Formctrl.class |= button
