<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:hatatap" 
	   xmlns:xs="http://www.w3.org/2001/XMLSchema"
	   xmlns:test="urn:hatatap"
	   elementFormDefault="qualified"
	   attributeFormDefault="unqualified">

  <xs:element name="script">
    <xs:complexType>
      <xs:sequence>
	<xs:element ref="test:param" minOccurs="0" maxOccurs="unbounded"/>
	<xs:element ref="test:setup" minOccurs="0" maxOccurs="1"/>
	<xs:choice minOccurs="0" maxOccurs="unbounded">
	  <xs:element ref="test:click"/>
	  <xs:element ref="test:mouseover"/>
	  <xs:element ref="test:send"/>
	  <xs:element ref="test:form"/>
	  <xs:element ref="test:verify"/>
	  <xs:element ref="test:log"/>
	  <xs:element ref="test:save"/>
	  <xs:element ref="test:wait"/>
	  <xs:element ref="test:refresh"/>
	  <xs:element ref="test:javascript"/>
	</xs:choice>
	<xs:element ref="test:reset" minOccurs="0" maxOccurs="1"/>
	<xs:element ref="test:cleanup" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="javascript" type="xs:string" use="optional"/><!-- yes | no -->
      <xs:attribute name="threads" type="xs:decimal" use="optional"/>
      <xs:attribute name="iterations" type="xs:decimal" use="optional"/>
      <xs:attribute name="useragent" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="param">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="default" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="form">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="select" type="xs:string" use="optional"/>
      <xs:sequence>
	<xs:choice minOccurs="0" maxOccurs="unbounded">
	  <xs:any namespace="##local"
		  processContents="skip"/>
	  <xs:element ref="test:input"/>
	  <xs:element ref="test:check"/>
	  <xs:element ref="test:uncheck"/>
	  <xs:element ref="test:toggle"/>
	</xs:choice>
	<xs:element ref="test:submit" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="input">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="select" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="submit">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="ref" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="checkbox">
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>
  <xs:element name="check" type="test:checkbox"/>
  <xs:element name="uncheck" type="test:checkbox"/>
  <xs:element name="toggle" type="test:checkbox"/>

  <xs:element name="verify">
    <xs:complexType>
      <xs:attribute name="response-code" type="xs:string" use="optional"/>
      <xs:attribute name="content-type" type="xs:string" use="optional"/>
      <xs:attribute name="content-length" type="xs:string" use="optional"/>
      <xs:attribute name="contains" type="xs:string" use="optional"/>
      <xs:attribute name="title" type="xs:string" use="optional"/>
      <xs:attribute name="test" type="xs:string" use="optional"/>
      <xs:attribute name="cookie" type="xs:string" use="optional"/><!-- verify cookie presence -->
      <xs:attribute name="value" type="xs:string" use="optional"/><!-- verify cookie value (only used with 'cookie') -->
      <xs:attribute name="msg" type="xs:string" use="optional"/><!-- error message if assertion fails -->
    </xs:complexType>
  </xs:element>

  <xs:element name="send">
    <xs:complexType>
      <xs:sequence>
	<xs:element ref="test:header" minOccurs="0" maxOccurs="unbounded"/>
	<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="url" type="xs:anyURI" use="required"/>
      <xs:attribute name="content-type" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="header">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="save">
    <xs:complexType>
      <xs:attribute name="href" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="wait">
    <xs:complexType>
      <xs:attribute name="seconds" type="xs:string" use="optional"/>
      <xs:attribute name="millis" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="log">
    <xs:complexType>
      <xs:attribute name="msg" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="javascript">
    <xs:complexType>
      <xs:attribute name="evaluate" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="refresh">
    <xs:complexType/>
  </xs:element>

  <xs:complexType name="container">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="test:click"/>
      <xs:element ref="test:mouseover"/>
      <xs:element ref="test:send"/>
      <xs:element ref="test:form"/>
      <xs:element ref="test:verify"/>
      <xs:element ref="test:log"/>
      <xs:element ref="test:save"/>
      <xs:element ref="test:wait"/>
      <xs:element ref="test:refresh"/>
      <xs:element ref="test:javascript"/>
    </xs:choice>
  </xs:complexType>

  <xs:element name="setup" type="test:container"/>
  <xs:element name="reset" type="test:container"/>
  <xs:element name="cleanup" type="test:container"/>

  <xs:element name="click">
    <xs:complexType>
      <xs:attribute name="url" type="xs:anyURI" use="optional"/>
      <xs:attribute name="text" type="xs:string" use="optional"/>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="alt" type="xs:string" use="optional"/>
      <xs:attribute name="ref" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="mouseover">
    <xs:complexType>
      <xs:attribute name="text" type="xs:string" use="optional"/>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="alt" type="xs:string" use="optional"/>
      <xs:attribute name="ref" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
