<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
  version         = "1.0"
  xmlns:xs        = "http://www.w3.org/2001/XMLSchema"
  targetNamespace = "http://www.nrao.edu/namespaces/sss"
  xmlns:sss       = "http://www.nrao.edu/namespaces/sss"
  elementFormDefault = "qualified">
  
  <xs:include schemaLocation="commons.xsd"/>

  <!-- ================================================== -->
  <!-- ||||||||||||||||  COMPLEX TYPES  ||||||||||||||||| -->
  <!-- ================================================== -->

  <xs:complexType name="angle">
    <xs:attribute name="value" type="xs:double"    use="required"/>
    <xs:attribute name="units" type="sss:arcUnits" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="latitude">
    <xs:attribute name="value"              type="xs:double"    use="required"/>
    <xs:attribute name="units"              type="sss:arcUnits" use="required"/>
    <xs:attribute name="increasesNorthward" type="xs:boolean"   use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="longitude">
    <xs:attribute name="value"             type="xs:double"    use="required"/>
    <xs:attribute name="units"             type="sss:arcUnits" use="required"/>
    <xs:attribute name="increasesEastward" type="xs:boolean"   use="optional"/>
  </xs:complexType>

  <xs:complexType name="angularVelocity">
    <xs:attribute name="value" type="xs:double"                use="required"/>
    <xs:attribute name="units" type="sss:angularVelocityUnits" use="required"/>
  </xs:complexType>

  <xs:complexType name="distance">
    <xs:attribute name="value" type="xs:double"         use="required"/>
    <xs:attribute name="units" type="sss:distanceUnits" use="required"/>
  </xs:complexType>

  <xs:complexType name="nonNegativeDistance">
    <xs:attribute name="value" type="sss:nonNegativeDouble" use="required"/>
    <xs:attribute name="units" type="sss:distanceUnits"     use="required"/>
  </xs:complexType>

  <xs:complexType name="fluxDensity">
    <xs:attribute name="value" type="xs:double"            use="required"/>
    <xs:attribute name="units" type="sss:fluxDensityUnits" use="required"/>
  </xs:complexType>

  <!--  TODO: create nonNegativeFrequency, as was done for distance, above? -->
  <xs:complexType name="frequency">
    <xs:attribute name="value" type="xs:double"          use="required"/>
    <xs:attribute name="units" type="sss:frequencyUnits" use="required"/>
  </xs:complexType>

  <xs:complexType name="frequencyRange">
    <xs:all>
      <xs:element name="lowFrequency"  type="sss:frequency"/>
      <xs:element name="highFrequency" type="sss:frequency"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="linearVelocity">
    <xs:attribute name="value" type="xs:double"               use="required"/>
    <xs:attribute name="units" type="sss:linearVelocityUnits" use="required"/>
  </xs:complexType>

  <xs:complexType name="timeDuration">
    <xs:attribute name="value" type="sss:nonNegativeDouble" use="required"/>
    <xs:attribute name="units" type="sss:timeUnits"         use="required"/>
  </xs:complexType>

  <xs:complexType name="timeInterval">
    <xs:attribute name="start" type="xs:dateTime" use="required"/>
    <xs:attribute name="end"   type="xs:dateTime" use="required"/>
  </xs:complexType>

  <xs:complexType name="timeOfDayInterval">
    <xs:all>
      <xs:element name="start" type="sss:timeOfDay"/>
      <xs:element name="end"   type="sss:timeOfDay"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="timeOfDay">
    <xs:attribute name="secondsSinceMidnight" type="sss:nonNegativeDouble" use="required"/>
    <xs:attribute name="secondsPerDay"        type="sss:nonNegativeDouble" use="optional"/>
  </xs:complexType>
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  SIMPLE TYPES  |||||||||||||||||| -->
  <!-- ================================================== -->
  
  <xs:simpleType name="degreesLatitude">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="-90.0"/>
      <xs:maxInclusive value="90.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="degreesLongitude">
    <xs:restriction base="xs:double">
      <xs:minExclusive value="-360.0"/>
      <xs:maxExclusive value="360.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="positiveDegreesLongitude">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0"/>
      <xs:maxExclusive value="360.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  ENUMERATIONS  |||||||||||||||||| -->
  <!-- ================================================== -->

  <xs:simpleType name="arcUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MILLI_ARC_SECOND"/>
      <xs:enumeration value="ARC_SECOND"/>
      <xs:enumeration value="ARC_MINUTE"/>
      <xs:enumeration value="SECOND"/>
      <xs:enumeration value="MINUTE"/>
      <xs:enumeration value="HOUR"/>
      <xs:enumeration value="PERCENT"/>
      <xs:enumeration value="RADIAN"/>
      <xs:enumeration value="DEGREE"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="angularVelocityUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MILLI_ARC_SECONDS_PER_YEAR"/>
      <xs:enumeration value="ARC_SECONDS_PER_DAY"/>
      <xs:enumeration value="d/y"/>
      <xs:enumeration value="d/w"/>
      <xs:enumeration value="d/d"/>
      <xs:enumeration value="d/h"/>
      <xs:enumeration value="d/m"/>
      <xs:enumeration value="d/s"/>
      <xs:enumeration value="d/ms"/>
      <xs:enumeration value="d/µs"/>
      <xs:enumeration value="d/ns"/>
      <xs:enumeration value="rad/y"/>
      <xs:enumeration value="rad/w"/>
      <xs:enumeration value="rad/d"/>
      <xs:enumeration value="rad/h"/>
      <xs:enumeration value="rad/m"/>
      <xs:enumeration value="rad/s"/>
      <xs:enumeration value="rad/ms"/>
      <xs:enumeration value="rad/µs"/>
      <xs:enumeration value="rad/ns"/>
      <xs:enumeration value="%/y"/>
      <xs:enumeration value="%/w"/>
      <xs:enumeration value="%/d"/>
      <xs:enumeration value="%/h"/>
      <xs:enumeration value="%/m"/>
      <xs:enumeration value="%/s"/>
      <xs:enumeration value="%/ms"/>
      <xs:enumeration value="%/µs"/>
      <xs:enumeration value="%/ns"/>
      <xs:enumeration value="h/y"/>
      <xs:enumeration value="h/w"/>
      <xs:enumeration value="h/d"/>
      <xs:enumeration value="h/h"/>
      <xs:enumeration value="h/m"/>
      <xs:enumeration value="h/s"/>
      <xs:enumeration value="h/ms"/>
      <xs:enumeration value="h/µs"/>
      <xs:enumeration value="h/ns"/>
      <xs:enumeration value="m/y"/>
      <xs:enumeration value="m/w"/>
      <xs:enumeration value="m/d"/>
      <xs:enumeration value="m/h"/>
      <xs:enumeration value="m/m"/>
      <xs:enumeration value="m/s"/>
      <xs:enumeration value="m/ms"/>
      <xs:enumeration value="m/µs"/>
      <xs:enumeration value="m/ns"/>
      <xs:enumeration value="s/y"/>
      <xs:enumeration value="s/w"/>
      <xs:enumeration value="s/d"/>
      <xs:enumeration value="s/h"/>
      <xs:enumeration value="s/m"/>
      <xs:enumeration value="s/s"/>
      <xs:enumeration value="s/ms"/>
      <xs:enumeration value="s/µs"/>
      <xs:enumeration value="s/ns"/>
      <xs:enumeration value="'/y"/>
      <xs:enumeration value="'/w"/>
      <xs:enumeration value="'/d"/>
      <xs:enumeration value="'/h"/>
      <xs:enumeration value="'/m"/>
      <xs:enumeration value="'/s"/>
      <xs:enumeration value="'/ms"/>
      <xs:enumeration value="'/µs"/>
      <xs:enumeration value="'/ns"/>
      <xs:enumeration value="&quot;/y"/>
      <xs:enumeration value="&quot;/w"/>
      <xs:enumeration value="&quot;/d"/>
      <xs:enumeration value="&quot;/h"/>
      <xs:enumeration value="&quot;/m"/>
      <xs:enumeration value="&quot;/s"/>
      <xs:enumeration value="&quot;/ms"/>
      <xs:enumeration value="&quot;/µs"/>
      <xs:enumeration value="&quot;/ns"/>
      <xs:enumeration value="mas/y"/>
      <xs:enumeration value="mas/w"/>
      <xs:enumeration value="mas/d"/>
      <xs:enumeration value="mas/h"/>
      <xs:enumeration value="mas/m"/>
      <xs:enumeration value="mas/s"/>
      <xs:enumeration value="mas/ms"/>
      <xs:enumeration value="mas/µs"/>
      <xs:enumeration value="mas/ns"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="distanceUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MILE"/>
      <xs:enumeration value="PARSEC"/>
      <xs:enumeration value="KILOPARSEC"/>
      <xs:enumeration value="MEGAPARSEC"/>
      <xs:enumeration value="LIGHT_SECOND"/>
      <xs:enumeration value="LIGHT_MINUTE"/>
      <xs:enumeration value="LIGHT_YEAR"/>
      <xs:enumeration value="ASTRONOMICAL_UNIT"/>
      <xs:enumeration value="ANGSTROM"/>
      <xs:enumeration value="NANOMETER"/>
      <xs:enumeration value="MICROMETER"/>
      <xs:enumeration value="MILLIMETER"/>
      <xs:enumeration value="CENTIMETER"/>
      <xs:enumeration value="KILOMETER"/>
      <xs:enumeration value="METER"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="fluxDensityUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="YOTTAJANSKY"/>
      <xs:enumeration value="ZETTAJANSKY"/>
      <xs:enumeration value="EXAJANSKY"/>
      <xs:enumeration value="PETAJANSKY"/>
      <xs:enumeration value="TERAJANSKY"/>
      <xs:enumeration value="GIGAJANSKY"/>
      <xs:enumeration value="MEGAJANSKY"/>
      <xs:enumeration value="KILOJANSKY"/>
      <xs:enumeration value="HECTOJANSKY"/>
      <xs:enumeration value="DECAJANSKY"/>
      <xs:enumeration value="JANSKY"/>
      <xs:enumeration value="DECIJANSKY"/>
      <xs:enumeration value="CENTIJANSKY"/>
      <xs:enumeration value="MILLIJANSKY"/>
      <xs:enumeration value="MICROJANSKY"/>
      <xs:enumeration value="NANOJANSKY"/>
      <xs:enumeration value="PICOJANSKY"/>
      <xs:enumeration value="FEMTOJANSKY"/>
      <xs:enumeration value="ATTOJANSKY"/>
      <xs:enumeration value="ZEPTOJANSKY"/>
      <xs:enumeration value="YOCTOJANSKY"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="frequencyUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="YOTTAHERTZ"/>
      <xs:enumeration value="ZETTAHERTZ"/>
      <xs:enumeration value="EXAHERTZ"/>
      <xs:enumeration value="PETAHERTZ"/>
      <xs:enumeration value="TERAHERTZ"/>
      <xs:enumeration value="GIGAHERTZ"/>
      <xs:enumeration value="MEGAHERTZ"/>
      <xs:enumeration value="KILOHERTZ"/>
      <xs:enumeration value="HECTOHERTZ"/>
      <xs:enumeration value="DECAHERTZ"/>
      <xs:enumeration value="HERTZ"/>
      <xs:enumeration value="DECIHERTZ"/>
      <xs:enumeration value="CENTIHERTZ"/>
      <xs:enumeration value="MILLIHERTZ"/>
      <xs:enumeration value="MICROHERTZ"/>
      <xs:enumeration value="NANOHERTZ"/>
      <xs:enumeration value="PICOHERTZ"/>
      <xs:enumeration value="FEMTOHERTZ"/>
      <xs:enumeration value="ATTOHERTZ"/>
      <xs:enumeration value="ZEPTOHERTZ"/>
      <xs:enumeration value="YOCTOHERTZ"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="linearVelocityUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MILES_PER_HOUR"/>
      <xs:enumeration value="Z"/>
      <xs:enumeration value="KILOMETERS_PER_SECOND"/>
      <xs:enumeration value="m/y"/>
      <xs:enumeration value="m/w"/>
      <xs:enumeration value="m/d"/>
      <xs:enumeration value="m/h"/>
      <xs:enumeration value="m/m"/>
      <xs:enumeration value="m/s"/>
      <xs:enumeration value="m/ms"/>
      <xs:enumeration value="m/µs"/>
      <xs:enumeration value="m/ns"/>
      <xs:enumeration value="km/y"/>
      <xs:enumeration value="km/w"/>
      <xs:enumeration value="km/d"/>
      <xs:enumeration value="km/h"/>
      <xs:enumeration value="km/m"/>
      <xs:enumeration value="km/s"/>
      <xs:enumeration value="km/ms"/>
      <xs:enumeration value="km/µs"/>
      <xs:enumeration value="km/ns"/>
      <xs:enumeration value="cm/y"/>
      <xs:enumeration value="cm/w"/>
      <xs:enumeration value="cm/d"/>
      <xs:enumeration value="cm/h"/>
      <xs:enumeration value="cm/m"/>
      <xs:enumeration value="cm/s"/>
      <xs:enumeration value="cm/ms"/>
      <xs:enumeration value="cm/µs"/>
      <xs:enumeration value="cm/ns"/>
      <xs:enumeration value="mm/y"/>
      <xs:enumeration value="mm/w"/>
      <xs:enumeration value="mm/d"/>
      <xs:enumeration value="mm/h"/>
      <xs:enumeration value="mm/m"/>
      <xs:enumeration value="mm/s"/>
      <xs:enumeration value="mm/ms"/>
      <xs:enumeration value="mm/µs"/>
      <xs:enumeration value="mm/ns"/>
      <xs:enumeration value="µm/y"/>
      <xs:enumeration value="µm/w"/>
      <xs:enumeration value="µm/d"/>
      <xs:enumeration value="µm/h"/>
      <xs:enumeration value="µm/m"/>
      <xs:enumeration value="µm/s"/>
      <xs:enumeration value="µm/ms"/>
      <xs:enumeration value="µm/µs"/>
      <xs:enumeration value="µm/ns"/>
      <xs:enumeration value="nm/y"/>
      <xs:enumeration value="nm/w"/>
      <xs:enumeration value="nm/d"/>
      <xs:enumeration value="nm/h"/>
      <xs:enumeration value="nm/m"/>
      <xs:enumeration value="nm/s"/>
      <xs:enumeration value="nm/ms"/>
      <xs:enumeration value="nm/µs"/>
      <xs:enumeration value="nm/ns"/>
      <xs:enumeration value="Å/y"/>
      <xs:enumeration value="Å/w"/>
      <xs:enumeration value="Å/d"/>
      <xs:enumeration value="Å/h"/>
      <xs:enumeration value="Å/m"/>
      <xs:enumeration value="Å/s"/>
      <xs:enumeration value="Å/ms"/>
      <xs:enumeration value="Å/µs"/>
      <xs:enumeration value="Å/ns"/>
      <xs:enumeration value="au/y"/>
      <xs:enumeration value="au/w"/>
      <xs:enumeration value="au/d"/>
      <xs:enumeration value="au/h"/>
      <xs:enumeration value="au/m"/>
      <xs:enumeration value="au/s"/>
      <xs:enumeration value="au/ms"/>
      <xs:enumeration value="au/µs"/>
      <xs:enumeration value="au/ns"/>
      <xs:enumeration value="ly/y"/>
      <xs:enumeration value="ly/w"/>
      <xs:enumeration value="ly/d"/>
      <xs:enumeration value="ly/h"/>
      <xs:enumeration value="ly/m"/>
      <xs:enumeration value="ly/s"/>
      <xs:enumeration value="ly/ms"/>
      <xs:enumeration value="ly/µs"/>
      <xs:enumeration value="ly/ns"/>
      <xs:enumeration value="lm/y"/>
      <xs:enumeration value="lm/w"/>
      <xs:enumeration value="lm/d"/>
      <xs:enumeration value="lm/h"/>
      <xs:enumeration value="lm/m"/>
      <xs:enumeration value="lm/s"/>
      <xs:enumeration value="lm/ms"/>
      <xs:enumeration value="lm/µs"/>
      <xs:enumeration value="lm/ns"/>
      <xs:enumeration value="ls/y"/>
      <xs:enumeration value="ls/w"/>
      <xs:enumeration value="ls/d"/>
      <xs:enumeration value="ls/h"/>
      <xs:enumeration value="ls/m"/>
      <xs:enumeration value="ls/s"/>
      <xs:enumeration value="ls/ms"/>
      <xs:enumeration value="ls/µs"/>
      <xs:enumeration value="ls/ns"/>
      <xs:enumeration value="pc/y"/>
      <xs:enumeration value="pc/w"/>
      <xs:enumeration value="pc/d"/>
      <xs:enumeration value="pc/h"/>
      <xs:enumeration value="pc/m"/>
      <xs:enumeration value="pc/s"/>
      <xs:enumeration value="pc/ms"/>
      <xs:enumeration value="pc/µs"/>
      <xs:enumeration value="pc/ns"/>
      <xs:enumeration value="kpc/y"/>
      <xs:enumeration value="kpc/w"/>
      <xs:enumeration value="kpc/d"/>
      <xs:enumeration value="kpc/h"/>
      <xs:enumeration value="kpc/m"/>
      <xs:enumeration value="kpc/s"/>
      <xs:enumeration value="kpc/ms"/>
      <xs:enumeration value="kpc/µs"/>
      <xs:enumeration value="kpc/ns"/>
      <xs:enumeration value="Mpc/y"/>
      <xs:enumeration value="Mpc/w"/>
      <xs:enumeration value="Mpc/d"/>
      <xs:enumeration value="Mpc/h"/>
      <xs:enumeration value="Mpc/m"/>
      <xs:enumeration value="Mpc/s"/>
      <xs:enumeration value="Mpc/ms"/>
      <xs:enumeration value="Mpc/µs"/>
      <xs:enumeration value="Mpc/ns"/>
      <xs:enumeration value="mi/y"/>
      <xs:enumeration value="mi/w"/>
      <xs:enumeration value="mi/d"/>
      <xs:enumeration value="mi/h"/>
      <xs:enumeration value="mi/m"/>
      <xs:enumeration value="mi/s"/>
      <xs:enumeration value="mi/ms"/>
      <xs:enumeration value="mi/µs"/>
      <xs:enumeration value="mi/ns"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="timeUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MICROSECOND"/>
      <xs:enumeration value="MILLISECOND"/>
      <xs:enumeration value="SECOND"/>
      <xs:enumeration value="MINUTE"/>
      <xs:enumeration value="HOUR"/>
      <xs:enumeration value="DAY"/>
      <xs:enumeration value="WEEK"/>
      <xs:enumeration value="TROPICAL_YEAR"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

