<?xml version="1.0"?>

<xs:schema 	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
			targetNamespace="http://schema.hogfour.com/Fixture"
			xmlns:fn="http://schema.hogfour.com/FunctionNames"
			xmlns:mn="http://schema.hogfour.com/ManufacturerNames"
			xmlns:pr="http://schema.hogfour.com/Protocols"
			xmlns:fe="http://schema.hogfour.com/FeatureNames"
            xmlns:dn="http://schema.hogfour.com/DiscreteNames"
			xmlns:fx="http://schema.hogfour.com/Fixture"
			elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:import schemaLocation="./function_names.xsd" namespace="http://schema.hogfour.com/FunctionNames"/>
<xs:import schemaLocation="./manufacturer_names.xsd" namespace="http://schema.hogfour.com/ManufacturerNames"/>
<xs:import schemaLocation="./protocols.xsd" namespace="http://schema.hogfour.com/Protocols"/>
<xs:import schemaLocation="./feature_names.xsd" namespace="http://schema.hogfour.com/FeatureNames"/>
<xs:import schemaLocation="./discrete_names.xsd" namespace="http://schema.hogfour.com/DiscreteNames"/>

        <xs:simpleType name="AnyDecimalValue">
            <xs:restriction base="xs:decimal"/>
        </xs:simpleType>

        <xs:simpleType name="RealWorldValue">
            <xs:union memberTypes="dn:DiscreteName fx:AnyDecimalValue"/>
        </xs:simpleType>

		<!-- release status enum -->
		<xs:simpleType name="ReleaseStatus">
			<xs:restriction base="xs:string">
				<xs:enumeration value="Alpha"/>
				<xs:enumeration value="Beta"/>
				<xs:enumeration value="Release"/>
				<xs:enumeration value="User"/>
                <xs:enumeration value="Disabled"/> <!-- prevent from appearing in a library -->
			</xs:restriction>
		</xs:simpleType>

        <xs:simpleType name="UUID">
            <xs:restriction base="xs:string">
                <xs:length value="36"/>
                <xs:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"/>
            </xs:restriction>
        </xs:simpleType>

		<!-- Icon size enums -->
		<xs:simpleType name="IconSize">
			<xs:restriction base="xs:string">
				<xs:enumeration value="small"/>
				<xs:enumeration value="medium"/>
				<xs:enumeration value="large"/>
                <xs:enumeration value="extra large"/>
                <xs:enumeration value="extra extra large"/>
			</xs:restriction>
		</xs:simpleType>

		<!-- Icon type enums --> 
		<xs:simpleType name="IconType">
			<xs:restriction base="xs:string">

				<xs:enumeration value="profile 1"/>
				<xs:enumeration value="profile 2"/>
				<xs:enumeration value="profile 3"/>
				<xs:enumeration value="profile 4"/>

				<xs:enumeration value="par 1"/>
				<xs:enumeration value="par 2"/>
				<xs:enumeration value="wash"/>
				<xs:enumeration value="scoop"/>

				<xs:enumeration value="strobe"/>
				<xs:enumeration value="media"/>
				<xs:enumeration value="effect"/>
				<xs:enumeration value="fog"/>

				<xs:enumeration value="circle"/>
				<xs:enumeration value="rect"/>
				<xs:enumeration value="square"/>
				<xs:enumeration value="triangle"/>
				<xs:enumeration value="trapezoid"/>
				<xs:enumeration value="strip"/>

				<xs:enumeration value="moving wash"/>
				<xs:enumeration value="moving oct"/>
				<xs:enumeration value="moving rect"/>
				<xs:enumeration value="moving mirror"/>

				<xs:enumeration value="moving oval"/>
				<xs:enumeration value="moving circle"/>
				<xs:enumeration value="moving rounded"/>

                <xs:enumeration value="diamond"/>
                <xs:enumeration value="rounded square"/>
                <xs:enumeration value="rounded rect"/>
                <xs:enumeration value="hexagon"/>
                <xs:enumeration value="laser"/>
                <xs:enumeration value="cross"/>
                <xs:enumeration value="arrow"/>
                <xs:enumeration value="camera"/>
                <xs:enumeration value="projector"/>
                <xs:enumeration value="male"/>
                <xs:enumeration value="female"/>

			</xs:restriction>
		</xs:simpleType>

		<!-- ********************* -->
		<!-- element definitions -->
		<!-- ********************* -->

		<!-- Creator -->
		<xs:complexType name="CreatorElement">
			<xs:attribute name="name" type="xs:string" use="required"/>
			<xs:attribute name="version" type="xs:string" use="required"/>
		</xs:complexType>

		<!-- Notes -->
		<xs:simpleType name="NotesElement">
			<xs:restriction base="xs:string">
        	</xs:restriction>
		</xs:simpleType>

		<!-- Icon -->
		<xs:complexType name="IconElement">
			<xs:attribute name="type" type="fx:IconType" use="required"/>
			<xs:attribute name="size" type="fx:IconSize" use="required"/>
		</xs:complexType>

		<!-- Interchange -->
		<xs:complexType name="GroupElement">
			<xs:attribute name="name" type="xs:string" use="required"/>
			<xs:attribute name="id" type="xs:string" use="required"/>	
		</xs:complexType>

		<xs:complexType name="InterchangeElement">
			<xs:sequence>
                <xs:element name="Group" type="fx:GroupElement" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
		</xs:complexType>

		<!-- Default -->
		<xs:complexType name="DefaultFunctionFeatureElement">
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
			<xs:attribute name="feature" type="fe:FeatureName" use="required"/>
			<xs:attribute name="value" type="xs:string" />
			<xs:attribute name="offset" type="xs:string"/> <!-- not present for Slots -->
		</xs:complexType>

		<!-- Virtuals -->
		<xs:complexType name="AffectedVirtualElement">
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
			<xs:attribute name="feature" type="fe:FeatureName" use="required"/>	
		</xs:complexType>

		<xs:complexType name="VirtualElement">
			<xs:sequence>
				<xs:element name="Affected" type="fx:AffectedVirtualElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
            <xs:attribute name="feature" type="fe:FeatureName" use="required"/> 
			<xs:attribute name="start" type="xs:string" />     	
			<xs:attribute name="end" type="xs:string" />     
		</xs:complexType>

		<xs:complexType name="VirtualElements">
			<xs:sequence>
				<xs:element name="Virtual" type="fx:VirtualElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="DefaultsElement">
			<xs:sequence>
				<xs:element name="Default" type="fx:DefaultFunctionFeatureElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="QualifierElement">
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
            <xs:attribute name="feature" type="fe:FeatureName" use="required"/>
            <xs:attribute name="start" type="fx:RealWorldValue"/>
			<xs:attribute name="end" type="xs:string"/>
		</xs:complexType>

		<xs:simpleType name="QualifierMatchType">
            <xs:restriction base="xs:string">
                <xs:enumeration value="any"/>
                <xs:enumeration value="all"/>
            </xs:restriction>
        </xs:simpleType>

		<xs:complexType name="QualifiersElement">
			<xs:sequence>
				<xs:element name="Qualifier" type="fx:QualifierElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="match" type="fx:QualifierMatchType" use="required"/>
        </xs:complexType>

		<xs:complexType name="EscapeElement">
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
			<xs:attribute name="feature" type="fe:FeatureName" use="required"/>
			<xs:attribute name="start" type="xs:string"/>
			<xs:attribute name="end" type="xs:string"/>
		</xs:complexType>

		<xs:complexType name="EscapesElement">
			<xs:sequence>
				<xs:element name="Escape" type="fx:EscapeElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
        </xs:complexType>

        <xs:simpleType name="DmxStart">
            <xs:union>
                <xs:simpleType>
                    <xs:restriction base="xs:unsignedInt"/>
                </xs:simpleType>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="NOVALUE"/>
                        <xs:enumeration value="DISALLOWED"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:union>
        </xs:simpleType>

		<!-- Dmxelement -->
		<xs:complexType name="RangeElement">
			<xs:sequence>
				<xs:element name="Qualifiers" type="fx:QualifiersElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Escapes" type="fx:EscapesElement" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="dmxstart" type="fx:DmxStart" use="required"/>
			<xs:attribute name="dmxend" type="xs:unsignedInt"/>
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
			<xs:attribute name="feature" type="fe:FeatureName"/>
			<xs:attribute name="wrap" type="xs:boolean"/>
			<xs:attribute name="start" type="fx:RealWorldValue"/>
			<xs:attribute name="end" type="xs:string"/>
		</xs:complexType>	

		<xs:complexType name="RangesElement">
			<xs:sequence>
				<xs:element name="Range" type="fx:RangeElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="AttachedChannelsElement">
			<xs:sequence>
				<xs:element name="AttachedChannel" type="xs:unsignedShort" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<!-- Channel -->
		<xs:complexType name="ChannelElement">
			<xs:sequence>
				<xs:element name="AttachedChannels" type="fx:AttachedChannelsElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Ranges" type="fx:RangesElement" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>

			
			<xs:attribute name="number" type="xs:unsignedShort" use="required"/>
			<xs:attribute name="unused" type="xs:boolean"/>
            <xs:attribute name="constant" type="xs:unsignedShort"/>
		</xs:complexType>

		<!-- Channels -->
		<xs:complexType name="ChannelsElement">
			<xs:sequence>
				<xs:element name="Channel" type="fx:ChannelElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<!-- dmxfootprint -->
		<xs:complexType name="DmxFootprint">
			<xs:attribute name="size" type="xs:unsignedShort" use="required"/>
			<xs:attribute name="patchpoint" type="xs:unsignedShort"/>
		</xs:complexType>

		<!-- PersonalityIdElement -->
		<xs:complexType name="PersonalityIdElement">
			<xs:attribute name="name" type="xs:string" use="required"/>
		</xs:complexType>

		<xs:complexType name="OutputsElement">
            <xs:attribute name="number" type="xs:unsignedShort" use="required"/>
        </xs:complexType>

		<!-- Protocol -->
		<xs:complexType name="ProtocolElement">
			<xs:sequence>
				<xs:element name="Personalityid" type="fx:PersonalityIdElement" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Outputs" type="fx:OutputsElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Dmxfootprint" type="fx:DmxFootprint" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Channels" type="fx:ChannelsElement" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="name" type="pr:ProtocolName" use="required"/>
		</xs:complexType>

		<xs:complexType name="ProtocolsElement">
			<xs:sequence>
				<xs:element name="Protocol" type="fx:ProtocolElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="FuncRefElement">
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
			<xs:attribute name="feature" type="fe:FeatureName" use="required"/>
		</xs:complexType>

		<xs:complexType name="PreviewDef">
			<xs:sequence>
				<xs:element name="Funcref" type="fx:FuncRefElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string"/> 
		</xs:complexType>

		<xs:complexType name="PreviewEntry">
			<xs:sequence>
                <xs:element name="Entry" type="fx:PreviewEntry" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
			<xs:attribute name="value" type="fx:RealWorldValue"/>
			<xs:attribute name="name" type="xs:string"/>   
			<xs:attribute name="thumbnail" type="xs:string"/>
		</xs:complexType>

		<xs:complexType name="FuncPreview">
			<xs:sequence>
				<xs:element name="Definition" type="fx:PreviewDef" minOccurs="1" maxOccurs="1"/>
				<xs:element name="Entry" type="fx:PreviewEntry" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="PreviewPackageElement">
			<xs:sequence>
				<xs:element name="Funcpreview" type="fx:FuncPreview" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string" use="required"/>
		</xs:complexType>

		<xs:complexType name="PreviewPackagesElement">
			<xs:sequence>
				<xs:element name="Package" type="fx:PreviewPackageElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="HistoryElement">
			<xs:attribute name="revision" type="xs:integer" use="required"/>
			<xs:attribute name="author" type="xs:string" use="required"/>
			<xs:attribute name="date" type="xs:date" use="required"/>
			<xs:attribute name="comment" type="xs:string" use="required"/>
		</xs:complexType>

		<!-- START COLOR -->
		<xs:simpleType name="ColourMatcherType">
            <xs:restriction base="xs:string">
                <xs:enumeration value="slotted"/>
                <xs:enumeration value="additive"/>
            </xs:restriction>
        </xs:simpleType>

		<xs:simpleType name="ColourMatcherQuality">
            <xs:restriction base="xs:string">
                <xs:enumeration value="estimated"/>
                <xs:enumeration value="chromaticity"/>
				<xs:enumeration value="spectralpower"/>
            </xs:restriction>
        </xs:simpleType>

		<xs:simpleType name="DimCurveValue">
            <xs:restriction base="xs:float">
                <xs:minInclusive value="0"/>
                <xs:maxExclusive value="100"/>
            </xs:restriction>
        </xs:simpleType>

		<xs:complexType name="DimCurveElement">
			<xs:attribute name="control" type="fx:DimCurveValue" use="required"/>
			<xs:attribute name="power" type="fx:DimCurveValue" use="required"/>
		</xs:complexType>

		<xs:simpleType name="UVValue">
			<xs:restriction base="xs:float">
				<xs:minInclusive value="0"/>
				<xs:maxExclusive value=".63"/>
			</xs:restriction>
		</xs:simpleType>

		<xs:simpleType name="XYZValue">
            <xs:restriction base="xs:float">
                <xs:minInclusive value="0"/>
                <xs:maxExclusive value="100"/>
            </xs:restriction>
        </xs:simpleType>

		<xs:complexType name="SlotColorElement">
			<xs:attribute name="value" type="xs:string" use="required"/>
			<xs:attribute name="u" type="fx:UVValue"/>
            <xs:attribute name="v" type="fx:UVValue"/>
            <xs:attribute name="l" type="fx:UVValue"/>
			<xs:attribute name="x" type="fx:XYZValue"/>
			<xs:attribute name="y" type="fx:XYZValue"/>
			<xs:attribute name="z" type="fx:XYZValue"/>
		</xs:complexType>

		<xs:complexType name="ColourMatcherFuncRefElement">
			<xs:sequence>
				<xs:element name="dimcurve" type="fx:DimCurveElement" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="entry" type="fx:SlotColorElement" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="function" type="fn:FunctionName" use="required"/>
            <xs:attribute name="feature" type="fe:FeatureName" use="required"/>
			<xs:attribute name="u" type="fx:UVValue"/>
			<xs:attribute name="v" type="fx:UVValue"/>
			<xs:attribute name="l" type="fx:UVValue"/>
			<xs:attribute name="x" type="fx:XYZValue"/>
            <xs:attribute name="y" type="fx:XYZValue"/>
            <xs:attribute name="z" type="fx:XYZValue"/>
		</xs:complexType>

		<xs:complexType name="ColourMatcherElement">
			<xs:sequence>
				<xs:element name="funcref" type="fx:ColourMatcherFuncRefElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="type" type="fx:ColourMatcherType" use="required"/>
			<xs:attribute name="quality" type="fx:ColourMatcherQuality" use="required"/>
		</xs:complexType>
		<!-- END COLOR -->

        <xs:simpleType name="OriginElement">
            <xs:restriction base="xs:string"/>
        </xs:simpleType>

		<xs:complexType name="TypeElement">
			<xs:sequence>
				<xs:element name="History" type="fx:HistoryElement" minOccurs="1" maxOccurs="unbounded"/>
                <xs:element name="Origin" type="fx:OriginElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Icon" type="fx:IconElement" minOccurs="1" maxOccurs="1"/>
				<xs:element name="Interchange" type="fx:InterchangeElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Notes" type="fx:NotesElement" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Defaults" type="fx:DefaultsElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Virtuals" type="fx:VirtualElements" minOccurs="0" maxOccurs="1"/>
				<xs:element name="ColourMatcher" type="fx:ColourMatcherElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Protocols" type="fx:ProtocolsElement" minOccurs="1" maxOccurs="1"/>
				<xs:element name="Previewpackages" type="fx:PreviewPackagesElement" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="mode" type="xs:string"/>
            <xs:attribute name="part" type="xs:string"/>
			<xs:attribute name="revisionid" type="xs:integer"   use="required" />
            <xs:attribute name="status" type="fx:ReleaseStatus" use="required" />
            <xs:attribute name="uuid" type="fx:UUID" use="required" />
		</xs:complexType>

		<xs:complexType name="PartElement">
			<xs:attribute name="number" type="xs:decimal"    use="required" />
			<xs:attribute name="type" type="xs:string" use="required" />
			<xs:attribute name="plotX" type="xs:decimal"    use="required" />
			<xs:attribute name="plotY" type="xs:decimal"    use="required" />
		</xs:complexType>

		<xs:complexType name="PartsElement">
			<xs:sequence>
				<xs:element name="Part" type="fx:PartElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="CompoundTypeElement">
			<xs:sequence>
                <xs:element name="History" type="fx:HistoryElement" minOccurs="1" maxOccurs="unbounded"/>
                <xs:element name="Origin" type="fx:OriginElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Icon" type="fx:IconElement" minOccurs="1" maxOccurs="1"/>
                <xs:element name="Interchange" type="fx:InterchangeElement" minOccurs="0" maxOccurs="1"/>
				<xs:element name="Parts" type="fx:PartsElement" minOccurs="1" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="mode" type="xs:string" use="required"/>
			<xs:attribute name="revisionId" type="xs:unsignedShort" use="required"/>
            <xs:attribute name="uuid" type="fx:UUID" use="required" />
		</xs:complexType>

		<xs:complexType name="CompoundTypesElement">
			<xs:sequence>
				<xs:element name="CompoundType" type="fx:CompoundTypeElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="TypesElement">
			<xs:sequence>
				<xs:element name="Type" type="fx:TypeElement" minOccurs="1" maxOccurs="unbounded">
                    <xs:key name="ModeOrPartPresent">
                        <xs:selector xpath="."/>
                        <xs:field xpath="@mode | @part"/>
                    </xs:key>
                </xs:element>
			</xs:sequence>
		</xs:complexType>

		<xs:complexType name="ProductElement">
			<xs:sequence>
                <xs:element name="Types" type="fx:TypesElement" minOccurs="1" maxOccurs="1"/>
                <xs:element name="CompoundTypes" type="fx:CompoundTypesElement" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
			<xs:attribute name="name" type="xs:string" use="required"/>
		</xs:complexType>

		<xs:complexType name="ManufacturerElement">
			<xs:sequence>
                <xs:element name="Product" type="fx:ProductElement" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="name" type="mn:ManufacturerName" use="required"/>
		</xs:complexType>

		<xs:complexType name="LibraryElement">
			<xs:sequence>
				<xs:element name="Manufacturer" type="fx:ManufacturerElement" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>

        <xs:simpleType name="Base64Element">
            <xs:restriction base="xs:string"/>
        </xs:simpleType>
		<xs:complexType name="CipherElement">
			<xs:sequence>
				<xs:element name="CipherValue" type="fx:Base64Element" minOccurs="1" maxOccurs="1"/>
			</xs:sequence>
		</xs:complexType>
		<xs:complexType name="EncryptedElement">
			<xs:sequence>
				<xs:element name="CipherData" type="fx:CipherElement" minOccurs="1" maxOccurs="1"/>
			</xs:sequence>
		</xs:complexType>

	<!-- ************************************************  -->
	<!-- all elements and enums defined, so layout the doc -->
	<!-- ************************************************* -->
	<xs:element name="Hog">
		<xs:complexType>

			<xs:sequence>
				<xs:element name="Creator" type="fx:CreatorElement" minOccurs="0" maxOccurs="1"/>
				<xs:choice>
					<xs:element name="Library" type="fx:LibraryElement" minOccurs="1" maxOccurs="1"/>
					<xs:element name="EncryptedData" type="fx:EncryptedElement" minOccurs="1" maxOccurs="1"/>
				</xs:choice>
			</xs:sequence>

		</xs:complexType>
	</xs:element>

</xs:schema>
