<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://services.nextraq.com/v2009_1/"
        targetNamespace="http://services.nextraq.com/v2009_1/"
        elementFormDefault="qualified"
        attributeFormDefault="unqualified"
        version="V1">
  <complexType name="Mobile" abstract="true">
    <sequence>
      <element name="Name"               type="string"   minOccurs="1" maxOccurs="1" nillable="false" />
      <element name="VIN"                type="string"   minOccurs="0" maxOccurs="1" nillable="true" />
      <element name="Notes"              type="string"   minOccurs="0" maxOccurs="1" nillable="true" />
      <element name="ActivationDateTime" type="dateTime" minOccurs="0" maxOccurs="1" nillable="true" />
      <element name="MapColor"           type="string"   minOccurs="0" maxOccurs="1" nillable="true" />
      <element name="DeviceMan"          type="string"   minOccurs="1" maxOccurs="1" nillable="false" />
      <element name="DeviceType"         type="short"    minOccurs="0" maxOccurs="1" nillable="true" />
      <element name="Msisdn"             type="string"   minOccurs="0" maxOccurs="1" nillable="true" />
    </sequence>
  </complexType>
  <complexType name="MobileWithOutId">
    <complexContent>
      <extension base="tns:Mobile">
      </extension>
    </complexContent>
  </complexType>
  <complexType name="MobileWithId">
    <complexContent>
      <extension base="tns:Mobile">
        <sequence>
          <element name="Id" type="string" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <complexType name="WSMobile">
    <complexContent>
      <extension base="tns:MobileWithId">
        <sequence>
          <element name="CurrentOdometer"            type="int"       minOccurs="0" maxOccurs="1" nillable="true"/>
          <element name="CurrentOdometerDateTime"    type="dateTime"  minOccurs="0" maxOccurs="1" nillable="true"/>
          <element name="CurrentEngineHours"         type="double"    minOccurs="0" maxOccurs="1" nillable="true"/>
          <!--  This field must be required to prevent Unique Particle Attribution (UPA) http://en.wikipedia.org/wiki/Unique_Particle_Attribution -->
          <element name="CurrentEngineHoursDateTime" type="dateTime"  minOccurs="1" maxOccurs="1" nillable="true"/>
          <any     id="AdditionalFields" namespace="##any"             minOccurs="0" maxOccurs="unbounded" processContents="lax" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <complexType name="Location" abstract="true">
    <sequence>
      <element name="Name" minOccurs="1" maxOccurs="1" nillable="false">
        <simpleType>
          <restriction base="string">
            <maxLength value="50" />
          </restriction>
        </simpleType>
      </element>
      <element name="CenterLat"         type="double"   minOccurs="1" maxOccurs="1" nillable="false" />
      <element name="CenterLon"         type="double"   minOccurs="1" maxOccurs="1" nillable="false" />
      <element name="UtcExpirationDate" type="dateTime" minOccurs="0" maxOccurs="1" nillable="true" />
    </sequence>
  </complexType>
  <complexType name="LocationWithOutId">
    <complexContent>
      <extension base="tns:Location">
      </extension>
    </complexContent>
  </complexType>
  <complexType name="LocationWithId">
    <complexContent>
      <extension base="tns:Location">
        <sequence>
          <element name="Id" type="string" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="UserInfo">
    <sequence>
      <element name="Username"    type="string" nillable="false" minOccurs="1" maxOccurs="1" />
      <element name="FirstName"   type="string" nillable="false" minOccurs="1" maxOccurs="1" />
      <element name="LastName"    type="string" nillable="false" minOccurs="1" maxOccurs="1" />
      <element name="AccountName" type="string" nillable="false" minOccurs="1" maxOccurs="1" />
    </sequence>
  </complexType>
  <complexType name="Address">
    <sequence>
      <element name="Number" type="string" nillable="true" minOccurs="0" maxOccurs="1" />
      <element name="Street" type="string" nillable="true" minOccurs="1" maxOccurs="1" />
      <element name="City"   type="string" nillable="true" minOccurs="0" maxOccurs="1" />
      <!-- State values must be valid PS abbrev
      http://www.usps.com/ncsc/lookups/usps_abbreviations.html#states
      http://www.canadapost.ca/tools/pg/manual/PGaddress-e.asp#1382088
      -->
      <element name="StateProvince" nillable="true" minOccurs="0" maxOccurs="1">
        <simpleType>
          <restriction base="string">
            <maxLength value="20" />
          </restriction>
        </simpleType>
      </element>
      <!-- Country value must be valid ISO 3166 Country code http://www.iso.org/iso/country_codes  -->
      <element name="Country" nillable="true" minOccurs="1" maxOccurs="1">
        <simpleType>
          <restriction base="string">
            <maxLength value="2" />
            <minLength value="2" />
          </restriction>
        </simpleType>
      </element>
      <element name="Intersection" type="string" nillable="true" minOccurs="0" maxOccurs="1" />
      <element name="PostalCode"   type="string" nillable="true" minOccurs="0" maxOccurs="1" />
    </sequence>
  </complexType>
  <simpleType name="DistanceUnits">
    <restriction base="string">
      <enumeration value="FEET" />
      <enumeration value="MILES" />
      <enumeration value="YARDS" />
      <enumeration value="METERS" />
      <enumeration value="KILOMETERS" />
      <enumeration value="RADIANS" />
    </restriction>
  </simpleType>
  <complexType name="Point">
    <sequence>
      <element name="x" type="double" />
      <element name="y" type="double" />
    </sequence>
  </complexType>
  <complexType name="PointCandidate">
    <sequence>
      <element name="Address"     type="tns:Address" nillable="true" />
      <element name="Description" type="string"      nillable="true" minOccurs="0" />
      <element name="Point"       type="tns:Point"   nillable="true" />
    </sequence>
  </complexType>
  <complexType name="Driver">
    <sequence>
      <element name="FirstName"    type="string" nillable="true" minOccurs="1" maxOccurs="1" />
      <element name="LastName"     type="string" nillable="true" minOccurs="1" maxOccurs="1" />
      <element name="EmailAddress" type="string" nillable="true" minOccurs="1" maxOccurs="1" />
      <element name="PhoneNumber"  type="string" nillable="true" minOccurs="1" maxOccurs="1" />
      <element name="KeyFobId"     type="string" nillable="true" minOccurs="0" />
    </sequence>
  </complexType>

  <complexType name="TransactionDetail">
    <sequence>
      <element name="TransactionID" type="int" minOccurs="0" />
      <element name="Timestamp"     type="dateTime" minOccurs="0" />
    </sequence>
  </complexType>
  <complexType name="Track">
    <sequence>
      <element name="Id"               type="string" />
      <element name="TimeStamp"        type="dateTime" />
      <element name="HardwareId"       type="string" />
      <element name="MobileName"       type="string" />
      <element name="Lat"              type="double" />
      <element name="Lon"              type="double" />
      <element name="Heading"          type="short" />
      <element name="Speed"            type="short" />
      <element name="GPSLock"          type="boolean" />
      <element name="Old"              type="boolean" />
      <element name="Ping"             type="boolean" />
      <element name="Motion"           type="boolean" />
      <element name="Speeding"         type="boolean" />
      <element name="Ignition"         type="boolean" />
      <element name="IgnitionStatus"   type="string" />
      <element name="Street"           type="string" nillable="true" />
      <element name="City"             type="string" nillable="true" />
      <element name="StateProvince"    type="string" nillable="true" />
      <element name="PostalCode"       type="string" nillable="true" />
      <element name="County"           type="string"/>
      <element name="Rssi"             type="short" />
      <element name="Sats"             type="short" />
      <element name="TimeZone"         type="int" />
      <element name="Sensor1"          type="boolean" />
      <element name="Sensor2"          type="boolean" />
    </sequence>
  </complexType>
  <complexType name="TrackWithDistanceTraveled">
    <complexContent>
      <extension base="tns:Track">
        <sequence>
          <element name="DistanceTraveled" type="int" minOccurs="0" maxOccurs="1" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="TrackWithDistanceTraveledV2">
    <complexContent>
      <extension base="tns:TrackWithDistanceTraveled">
        <sequence>
          <element name="InsertedDate" type="dateTime" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <complexType name="MobileWithLocation">
    <sequence>
      <element name="Mobile"   type="tns:MobileWithId" minOccurs="0" maxOccurs="1" />
      <element name="Location" type="tns:PointCandidate" />
      <element name="Distance" type="double" />
    </sequence>
  </complexType>
  <complexType name="AccountUser">
    <sequence>
      <element name="Id"           type="string" nillable="false" />
      <element name="LastName"     type="string" />
      <element name="FirstName"    type="string" />
      <element name="EmailAddress" type="string" />
      <element name="UserID"       type="int" />
      <element name="UserName"     type="string" />
    </sequence>
  </complexType>
  <complexType name="AlertEvent">
    <sequence>
      <element name="Id"                   type="string"   nillable="false" />
      <element name="DateTime"             type="dateTime" nillable="false" />
      <element name="MobileUnitId"         type="string"   nillable="false" />
      <element name="MobileName"           type="string" />
      <element name="TrackId"              type="string" />
      <element name="AlertId"              type="string"   nillable="false" />
      <element name="AlertType"            type="long" />
      <element name="AlertTypeDescription" type="string" />
    </sequence>
  </complexType>
  <complexType name="AlertType">
    <sequence>
      <element name="Type" type="int" nillable="false" />
      <element name="Description" type="string" />
    </sequence>
  </complexType>
  <complexType name="FleetWithId">
    <sequence>
      <element name="Id" type="string" nillable="false" />
      <element name="Name"     type="string" minOccurs="1" maxOccurs="1" nillable="false" />
      <element name="MapColor" type="string" minOccurs="0" maxOccurs="1" nillable="false" />
    </sequence>
  </complexType>
  <complexType name="MileageByState">
    <sequence>
      <element name="MobileId"   type="string" nillable="false" />
      <element name="MobileName" type="string" />
      <element name="Date"       type="dateTime" />
      <element name="State"      type="string" />
      <element name="Mileage"    type="double" />
    </sequence>
  </complexType>

  	<complexType name="FilterCriteria">
		<annotation>
			<documentation>Search Criteria used to limit the number of results</documentation>
		</annotation>
		<sequence>
			<element name="FilterKey" type="string" >
				<annotation>
					<documentation>Key used to identify the field to apply the SearchTerm to.</documentation>
				</annotation>
			</element>
			<element name="SearchTerm" type="string">
				<annotation>
					<documentation>Search Term used to limit the number of results.
					Applies to the field specified in by the FilterKey</documentation>
				</annotation>
			</element>
		</sequence>
	</complexType>

<complexType name="AdditionalAttributes">
  	<annotation>
  		<documentation>Object used to return additional attributes for a parent object. This object
  		will be populated with a list of key/value pairs.  Each key will have only one value of any given type.</documentation>
  	</annotation>
  	<sequence>
	  	<element name="key" type="string" nillable="false" minOccurs="1" maxOccurs="1">
	  		<annotation>
	  			<documentation>Key that will be used to reference a given value.</documentation>
	  		</annotation>
	  	</element>
	  	<sequence minOccurs="1" maxOccurs="1">
	  		<element name="IntValue" type="int" minOccurs="0"/>
	  		<element name="DoubleValue" type="double" minOccurs="0"/>
	  		<element name="BooleanValue" type="boolean" minOccurs="0"/>
	  		<element name="LongValue" type="long" minOccurs="0"/>
			<element name="StringValue" type="string" minOccurs="0"/>
			<element name="DateTimeValue" type="dateTime" minOccurs="0"/>
			<element name="ObjectValue" type="anyType" minOccurs="0">
				<annotation>
		  			<documentation>This value can be populated with any previously defined object. The value will be returned as
		  			an Object and will need to be cast to the appropriate object.</documentation>
		  		</annotation>
			</element>
		</sequence>
  	</sequence>
  </complexType>


	<complexType name="MobilePlusAttributes">
		<complexContent>
			<extension base="tns:MobileWithId">
				<sequence minOccurs="0" maxOccurs="unbounded">
					<element name="Attributes" type="tns:AdditionalAttributes" nillable="true"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>


	<complexType name="GForce">
		<annotation>
			<documentation>Type for encapsulating GForce and sensitivity values.</documentation>
		</annotation>
		<sequence>
			<element name="X" type="double">
				<annotation>
					<documentation>Forward/reverse G-force component for vehicle. Positive values indicate acceleration; negative values deceleration.</documentation>
				</annotation>
			</element>
			<element name="Y" type="double">
				<annotation>
					<documentation>Left/right lateral acceleration/deceleration G-force component for vehicle. Positive values indicate acceleration; negative values deceleration.
					</documentation>
				</annotation>
			</element>
			<element name="Z" type="double">
				<annotation>
					<documentation>Up/down vertical acceleration/deceleration G-force component for vehicle. Positive values indicate acceleration; negative values deceleration.
					</documentation>
				</annotation>
			</element>
			<element name="Sensitivity" type="double"/>
		</sequence>
	</complexType>


    <complexType name="AccelerometerEvent">
        <sequence>
	        <element name="Timestamp" type="dateTime"/>
	        <element name="MobileId" type="string">
                <annotation>
                    <documentation>Hardware identifier</documentation>
                </annotation>
	        </element>
	        <element name="Vin" type="string">
	            <annotation>
	                <documentation>Vehicle VIN identifier</documentation>
	            </annotation>
	        </element>
	        <element name="Type">
		        <simpleType>
		            <restriction base="string">
		                <enumeration value="ACCEL" />
		                <enumeration value="DECEL" />
		                <enumeration value="LATERAL" />
		            </restriction>
		        </simpleType>
	        </element>
            <element name="Point"    type="tns:Point"   nillable="true" />
            <element name="Address"  type="tns:Address" nillable="true" />
	        <element name="TzOffset" type="int">
	            <annotation>
	                <documentation>Local time zone offset from UTC in minutes.</documentation>
	            </annotation>
	        </element>
	        <element name="GForce" type="tns:GForce" />
	        <element name="Speed" type="short">
	            <annotation>
	                <documentation>Speed in MPH.</documentation>
	            </annotation>
	        </element>
	        <element name="Heading" type="short">
	            <annotation>
	                <documentation>Compass heading in degrees.</documentation>
	            </annotation>
	        </element>
        </sequence>
    </complexType>

  <complexType name="EventType">
    <sequence>
      <element name="Name" type="string" />
    </sequence>
  </complexType>

  <complexType name="Event">
    <sequence>
      <element name="Id" type="long" />
      <element name="Name" type="string" />
      <element name="UtcEventDate" type="dateTime" />
      <element name="UtcInsertedDate" type="dateTime" />
      <element name="EventDateDisplay" type="string" />
      <element name="Address" type="tns:Address" />
      <element name="EntityType" type="tns:EventType" />
      <element name="EntityId" type="long" />
    </sequence>
  </complexType>

  <complexType name="EventWithAttrs">
    <complexContent>
      <extension base="tns:Event">
        <sequence>
          <element name="EventId" type="string" />
          <sequence minOccurs="0" maxOccurs="unbounded">
            <element name="Attributes" type="tns:AdditionalAttributes" nillable="true" />
          </sequence>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
</schema>
