<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- NOTE: these definitions are in "top-down" order. -->

	<xs:element name="products_by_vendor">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="vendor" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:key name="PK">
			<xs:selector xpath=".//gg_sku"/>
			<xs:field xpath="."/>
		</xs:key>
	</xs:element>

	<xs:element name="vendor">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="vendor_name" type="xs:string"/>

				<xs:choice minOccurs="0" maxOccurs="unbounded">
					<xs:element name="phone"   type="xs:string"/>
					<xs:element name="fax"     type="xs:string"/>
					<xs:element name="website" type="xs:anyURI"/>
					<xs:element name="address" type="AddressType"/>
					<xs:element name="email"   type="xs:string"/>
				</xs:choice>

				<xs:element ref="suite"                   minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="product" type="SKUdata" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="id" type="xs:ID" use="required"/>
		</xs:complexType>
	</xs:element>

	<xs:element name="suite">
		<xs:complexType>
			<xs:sequence>
	 			<xs:element name="suiteInfo" type="SKUdata" minOccurs="1"/>
				<xs:element name="product"   type="SKUdata" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
			<!-- <xs:attribute name="gg_sku" type="GG_SKU" use="required"/> -->
		</xs:complexType>
	</xs:element>

	<xs:complexType name="SKUdata">
		<xs:all>
			<xs:element name="gg_sku"     type="GG_SKU"/>
			<xs:element name="vendor_sku" type="xs:string" minOccurs="0"/>
			<xs:element name="short_desc" type="xs:string" minOccurs="0"/>
			<xs:element name="long_desc"  type="LONG_DESC" minOccurs="0"/>
			<xs:element name="picture"    type="xs:anyURI" minOccurs="0"/>
			<xs:element ref="retail"    minOccurs="0"/>
			<xs:element ref="wholesale" minOccurs="0"/>
			<xs:element ref="onsale"    minOccurs="0"/>
			<xs:element ref="versions"  minOccurs="0"/>
			<xs:element ref="inventory" minOccurs="0"/>
		</xs:all>
	</xs:complexType>

	<xs:element name="versions">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="version" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<xs:element name="version">
		<xs:complexType>
		<xs:all>
			<xs:element name="vendor_sku" type="xs:string" minOccurs="0"/>
			<xs:element name="short_desc" type="xs:string" minOccurs="1"/>
			<xs:element ref="retail"    minOccurs="0"/>
			<xs:element ref="wholesale" minOccurs="0"/>
			<xs:element ref="onsale"    minOccurs="0"/>
			<xs:element ref="inventory" minOccurs="0"/>
		</xs:all>
		</xs:complexType>
	</xs:element>

	<!-- "primitive" definitions that are referenced above -->

	<xs:element name="price">
		<xs:complexType>
			<xs:simpleContent>
				<xs:extension base="MoneyType">
					<xs:attribute name="type" type="PriceType" default="retail"/>
				</xs:extension>
			</xs:simpleContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="retail">
	 <xs:complexType>
		<xs:simpleContent>
			<xs:extension base="MoneyType">
				<xs:attribute name="type" type="PriceType" fixed="retail"/>
			</xs:extension>
		</xs:simpleContent>
	 </xs:complexType>
	</xs:element>

	<xs:element name="wholesale">
	 <xs:complexType>
		<xs:simpleContent>
			<xs:extension base="MoneyType">
				<xs:attribute name="type" type="PriceType" fixed="wholesale"/>
			</xs:extension>
		</xs:simpleContent>
	 </xs:complexType>
	</xs:element>

	<xs:element name="onsale">
	 <xs:complexType>
		<xs:simpleContent>
			<xs:extension base="MoneyType">
				<xs:attribute name="type" type="PriceType" fixed="sale"/>
			</xs:extension>
		</xs:simpleContent>
	 </xs:complexType>
	</xs:element>

	<xs:element name="inventory">
		<xs:complexType>
			<xs:simpleContent>
				<xs:extension base="xs:integer">
					<xs:attribute name="location" type="LocationType" default="showroom"/>
				</xs:extension>
			</xs:simpleContent>
		</xs:complexType>
	</xs:element>

	<xs:simpleType name="PriceType">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="wholesale"/>
			<xs:enumeration value="sale"/>
			<xs:enumeration value="retail"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="LocationType">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="warehouse"/>
			<xs:enumeration value="showroom"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="GG_SKU">
		<xs:restriction base="xs:string">
			<xs:pattern value="GG\d{3}\w{3}"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="LONG_DESC" mixed="true">
		<xs:sequence>
			<xs:any namespace="http://www.w3.org/1999/xhtml" 
						processContents="skip" minOccurs="0"
						maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="AddressType">
		<xs:attribute name="state"  type="xs:string"/>
		<xs:attribute name="city"   type="xs:string"/>
		<xs:attribute name="zip"    type="xs:decimal"/>
		<xs:attribute name="street" type="xs:string"/>
	</xs:complexType>

	<xs:simpleType name="MoneyType">
		<xs:restriction base="xs:string">
			<xs:pattern value="\p{Sc}?\p{Nd}+(\.\p{Nd}\p{Nd})?"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>