<?xml version="1.0"?>
<xs:schema targetNamespace="urn:Autodesk:Server"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:aw="urn:Autodesk:Server"
		elementFormDefault="qualified">
	<xs:element name="description">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="title" type="aw:labelType" minOccurs="1" maxOccurs="1"/>
				<xs:element name="section" type="aw:sectionType" minOccurs="0" maxOccurs="1" nillable="false"/>
				<xs:element ref="aw:copyright" minOccurs="0"/>
				<xs:element ref="aw:input" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element ref="aw:output" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element ref="aw:options" minOccurs="0" maxOccurs="1"/>
				<xs:choice>
					<xs:element ref="aw:code"/>
					<xs:element ref="aw:class"/>
				</xs:choice>
			</xs:sequence>
			<xs:attribute name="type" type="aw:nodeType" use="required"/>
			<xs:attribute name="id" type="xs:string" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="nodeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="action"/>
			<xs:enumeration value="trigger"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="sectionType" mixed="true">
		<xs:sequence>
			<xs:element ref="aw:label" minOccurs="0" maxOccurs="1"/>
		</xs:sequence>
	</xs:complexType>
	<!-- The copyright is a series of text lines for any copyright information
	associated with the script. This will generally be used by third party
	scripts. -->
	<xs:element name="copyright" type="xs:string" nillable="false"/>
	<!-- input and output contain a single reference to a Java class. -->
	<xs:element name="input" type="xs:string" nillable="false"/>
	<xs:element name="output" type="xs:string" nillable="false"/>
	<!-- Label is a short text description of the element. It is localizable.
	It may also be extracted from the documentation. A label would be used as:
		<label>
			Optional Default text
			<text lang="en_US">US english text</text>
			<text lang="jp_JIS">Japanese JIS text</text>
		<label>
		An XPATH search to find all labels would simply be "//label".
	-->
	<xs:element name="label" type="aw:labelType"/>
	<xs:complexType name="labelType" mixed="true">
		<xs:sequence minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="aw:text"/>
			<!-- We want a list of encoded text. -->
		</xs:sequence>
		<!-- Allow a string to have descriptions in multiple languages.
		The element text is the default text for the label. -->
	</xs:complexType>
	<xs:element name="text">
		<xs:complexType mixed="true">
			<xs:attribute name="lang" type="aw:langType" use="required"/>
		</xs:complexType>
		<!-- text is an element that encodes localized text. The lang is
		specified as an attribute to make querying easier. An application looks
		for a text element and then checks the lang on it. XPATH would also
		allow queries of specific languages. -->
	</xs:element>
	<xs:simpleType name="langType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="en_US"/>
			<xs:enumeration value="fr_FR"/>
			<xs:enumeration value="jp_JIS"/>
		</xs:restriction>
		<!-- langType is a restriction that ensures we only write text
		in recognized languages. By simply adding new lines here we add new
		langs without requiring a change to any application. -->
	</xs:simpleType>
	<!-- "options" is used to list the set of options used by a translator. -->
	<xs:element name="options" type="aw:optionsType"/>
	<xs:complexType name="optionsType">
		<xs:sequence>
			<xs:element ref="aw:label"/>
			<xs:group ref="aw:optionsGroup" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:group name="optionsGroup">
		<xs:choice>
			<xs:element ref="aw:option"/>
			<xs:element ref="aw:group"/>
		</xs:choice>
	</xs:group>
	<xs:element name="option">
		<xs:complexType mixed="false">
			<xs:sequence>
				<xs:element ref="aw:label"/>
				<xs:element name="tooltip" type="aw:labelType" minOccurs="0" maxOccurs="1"/>
				<xs:choice>
					<xs:element ref="aw:checkbox"/>
					<xs:element ref="aw:dirname"/>
					<xs:element ref="aw:double"/>
					<xs:element ref="aw:enumeration"/>
					<xs:element ref="aw:filename"/>
					<xs:element ref="aw:integer"/>
					<xs:element ref="aw:password"/>
					<xs:element ref="aw:slider"/>
					<xs:element ref="aw:spinner"/>
					<xs:element ref="aw:string"/>
					<xs:element ref="aw:table"/>
				</xs:choice>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string" use="required"/>
			<xs:attribute name="if" type="xs:string"/>
			<xs:attribute name="unless" type="xs:string"/>
			<xs:attribute name="default" type="xs:string"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="checkbox">
		<xs:complexType mixed="false">
			<xs:attribute name="default" type="xs:boolean" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="dirname">
		<xs:complexType mixed="false">
			<!-- No contents here. -->
		</xs:complexType>
		<!-- Use <filename />. A filename is an empty element indicating that the
		argument is a filename. -->
	</xs:element>
	<xs:element name="double" type="aw:doubleType"/>
	<xs:complexType name="doubleType" mixed="false">
		<xs:attribute name="min" type="xs:double" use="required"/>
		<xs:attribute name="max" type="xs:double" use="required"/>
		<xs:attribute name="default" type="xs:double" use="required"/>
	</xs:complexType>
	<!-- Use <double min='minValue' max='maxValue' default='default' /> -->
	<!-- i.e. <double min='0.0' max='10.0' default='1.0' /> -->
	<!-- The value will be placed on the command line after a command -->
	<!-- line flag if specified. -->
	<xs:element name="enumeration" type="aw:enumerationType" nillable="false"/>
	<xs:complexType name="enumerationType" mixed="false">
		<xs:sequence>
			<xs:element name="label" nillable="false" maxOccurs="unbounded">
				<xs:complexType>
					<xs:complexContent>
						<xs:extension base="aw:labelType">
							<xs:attribute name="value" type="xs:string"/>
						</xs:extension>
					</xs:complexContent>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="default" type="xs:nonNegativeInteger" use="required"/>
		<xs:attribute name="buttons" type="xs:boolean"/>
	</xs:complexType>
	<!-- An enumeration is a set of labels which describe the set of possible
	values for an argument. The normal labelType is extended with a value
	attribute which is what the label is "evaluated" to when selected. The
	enumeration requires a default value to be set.
	i.e.
		<type>
			<enumeration default="1">
				<label>Choice A</label>
				<label>Choice B</label>
				<label>Choice C</label>
			</enumeration>
		</type>
	this would create a choice list with three choices with "Choice B" initially
	selected (default is 1, and counting starts at 0).
	-->
	<xs:element name="filename">
		<xs:complexType>
			<xs:sequence minOccurs="1" maxOccurs="unbounded">
				<xs:element name="filter" type="aw:filterType"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="filterType" mixed="true">
		<xs:complexContent>
			<xs:extension base="aw:labelType">
				<xs:attribute name="pattern" type="xs:string" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="integer" type="aw:integerType"/>
	<xs:complexType name="integerType" mixed="false">
		<xs:attribute name="min" type="xs:integer" use="required"/>
		<xs:attribute name="max" type="xs:integer" use="required"/>
		<xs:attribute name="default" type="xs:integer" use="required"/>
	</xs:complexType>
	<!-- Use is the same as for 'double' above. -->
	<xs:element name="slider">
		<xs:complexType mixed="false">
			<xs:attribute name="min" type="xs:integer" use="required"/>
			<xs:attribute name="max" type="xs:integer" use="required"/>
			<xs:attribute name="default" type="xs:integer" use="required"/>
			<xs:attribute name="ticksAt" type="xs:integer" use="optional"/>
			<xs:attribute name="labeledTicksAt" type="xs:integer" use="optional"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="spinner">
		<xs:complexType mixed="false">
			<xs:sequence>
				<xs:choice>
					<xs:element name="date" type="aw:dateType"/>
					<xs:element name="double">
						<xs:complexType>
							<xs:complexContent>
								<xs:extension base="aw:doubleType">
									<xs:attribute name="step" type="xs:double"/>
								</xs:extension>
							</xs:complexContent>
						</xs:complexType>
					</xs:element>
					<xs:element ref="aw:enumeration"/>
					<xs:element name="integer">
						<xs:complexType>
							<xs:complexContent>
								<xs:extension base="aw:integerType">
									<xs:attribute name="step" type="xs:positiveInteger"/>
								</xs:extension>
							</xs:complexContent>
						</xs:complexType>
					</xs:element>
				</xs:choice>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="stringType" mixed="true">
		<xs:complexContent>
			<!-- Base the string type on labelType so that any default text -->
			<!-- can be localized in a consistent fashion. -->
			<xs:extension base="aw:labelType">
				<xs:attribute name="maxLength" type="xs:positiveInteger" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="dateType">
		<xs:sequence>
			<xs:element name="initial" type="xs:dateTime" nillable="false" minOccurs="0"/>
			<xs:element name="earliest" type="xs:dateTime" nillable="false" minOccurs="0"/>
			<xs:element name="latest" type="xs:dateTime" nillable="false" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute name="format" type="xs:string" use="optional"/>
	</xs:complexType>
	<xs:element name="string">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="aw:stringType">
					<xs:attribute name="numRows" type="xs:positiveInteger" use="optional"/>
					<xs:attribute name="numColumns" type="xs:positiveInteger" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- Use <string maxLength='...' numRows='...' numColumns='...'/> -->
	<!-- i.e. <string maxLength='10' /> -->
	<xs:element name="password" type="aw:stringType"/>
	<xs:element name="table">
		<xs:complexType>
			<xs:sequence minOccurs="1" maxOccurs="unbounded">
				<xs:element name="column" type="aw:columnType"/>
			</xs:sequence>
			<xs:attribute name="numRows" type="xs:positiveInteger" use="required"/>
			<xs:attribute name="numColumns" type="xs:positiveInteger" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="columnType" mixed="false">
		<xs:sequence>
			<xs:element ref="aw:label" minOccurs="0" maxOccurs="1"/>
			<xs:element name="cell" type="aw:cellType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute name="index" type="xs:nonNegativeInteger" use="optional"/>
	</xs:complexType>
	<xs:complexType name="cellType" mixed="false">
		<xs:sequence minOccurs="0" maxOccurs="1">
			<xs:element name="default" type="aw:labelType"/>
		</xs:sequence>
		<xs:attribute name="index" type="xs:nonNegativeInteger" use="optional"/>
	</xs:complexType>
	<xs:element name="group">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="aw:optionsType">
					<xs:attribute name="orientation">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="horizontal"/>
								<xs:enumeration value="vertical"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="code" nillable="false">
		<xs:complexType mixed="true">
			<xs:sequence>
				<!-- The contents of the code element can be anything -->
				<!-- so it's important to NOT process the contents -->
				<!-- against any schemas. -->
				<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="class">
		<xs:complexType mixed="false">
			<xs:attribute name="id" type="xs:string" use="required" />
		</xs:complexType>
	</xs:element>
</xs:schema>
