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

<!--Mike Straus-->
<!--CSCI 2962 - Programming XML in Java-->
<!--Homework 1-->

<!--Schema file for address book-->

<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
	
	<xsd:element name="AddressBook">
		<xsd:annotation>
			<xsd:documentation>Root Element, describes a address book of and unbounded number of people and businesses</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:choice minOccurs="1" maxOccurs="unbounded">
				<xsd:element ref="Person"/>
				<xsd:element ref="Business"/>
			</xsd:choice>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Person">
		<xsd:annotation>
			<xsd:documentation>Represents a person and its contact information</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Name"/>
				<xsd:element ref="Age" minOccurs="0"/>
				<xsd:element ref="Gender" minOccurs="0"/>
				<xsd:element ref="Phone" minOccurs="0" maxOccurs="10"/>
				<xsd:element ref="email"  minOccurs="0" maxOccurs="10"/>
				<xsd:element ref="HomePage" minOccurs="0"/>
				<xsd:element ref="Address" minOccurs="0"/>
				<xsd:element ref="AIM" minOccurs="0" maxOccurs="5"/>
				<xsd:element ref="ICQ" minOccurs="0"/>
			</xsd:sequence>	
			<xsd:attribute name="Person_ID" type="xsd:ID" use="required"/>		
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Business">
		<xsd:annotation>
			<xsd:documentation>Represents a Business and its contact information</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Name"/>
				<xsd:element ref="ContactPerson" minOccurs="0"/>
				<xsd:element ref="Phone" minOccurs="0" maxOccurs="10"/>
				<xsd:element ref="email"  minOccurs="0" maxOccurs="10"/>
				<xsd:element ref="WebSite" minOccurs="0"/>
				<xsd:element ref="Address" minOccurs="0"/>
			</xsd:sequence>			
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Name">
		<xsd:annotation>
			<xsd:documentation>Represents the name of a person or of a business</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:choice>
				<xsd:element ref="BusName"/>
				<xsd:group ref="PersonNameGroup"/>
			</xsd:choice>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:group name="PersonNameGroup">
		<xsd:annotation>
			<xsd:documentation>Group of elements that make up a persons name</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element ref="First" minOccurs="1" maxOccurs="1"/>
			<xsd:element ref="Middle" minOccurs="0" maxOccurs="1"/>
			<xsd:element ref="Last" minOccurs="1" maxOccurs="1"/>
		</xsd:sequence>
	</xsd:group>
	
	<xsd:element name="First" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>A persons First Name</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="Middle" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>A persons Middle Name</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
		
	<xsd:element name="Last" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>A persons Last Name</xsd:documentation>
		</xsd:annotation>
	</xsd:element>	
	
	<xsd:element name="BusName" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>A business' Name</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="Age">
		<xsd:annotation>
			<xsd:documentation>Age of a person.  Integer value greater then zero</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:integer">
				<xsd:minInclusive value="0"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="Gender">
		<xsd:annotation>
			<xsd:documentation>Gender of a person. Can either be M for male, or F for female (sorry, no hermaphrodites/unisex)</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:string">
				<xsd:enumeration value="M"/>
				<xsd:enumeration value="F"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="Phone">
		<xsd:annotation>
			<xsd:documentation>Represents a phone number of some type (voice, fax, cell, pager, data) and optionaly an extension</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Number"/>
				<xsd:element ref="Extension" minOccurs="0" maxOccurs="1"/>
			</xsd:sequence>
			<xsd:attribute name="type" use="default" value="voice">
				<xsd:annotation>
					<xsd:documentation>Attribute for "type" of phone number.  Options are: voice, fax, cell, pager, data</xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="fax"/>
						<xsd:enumeration value="cell"/>
						<xsd:enumeration value="voice"/>
						<xsd:enumeration value="pager"/>
						<xsd:enumeration value="data"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="voicemail" use="default" value="N">
				<xsd:annotation>
					<xsd:documentation>Attribute for voicemail, says if there is voicemail/messageing at this phone number.  Can be Y for yes, or N for no</xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="Y"/>
						<xsd:enumeration value="N"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Number">
		<xsd:annotation>
			<xsd:documentation>actual phone number in the format xxx-xxx-xxxx</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:string">
				<xsd:pattern value="\d{3}-\d{3}-\d{4}"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="Extension">
		<xsd:annotation>
			<xsd:documentation>phone Extension, an integer 0-99999</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:integer">
				<xsd:minInclusive value="0"/>
				<xsd:maxInclusive value="99999"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="email" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds an email address</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="HomePage" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds a persons home page URL</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="WebSite" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds a business' Web site URL</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="AIM">
		<xsd:annotation>
			<xsd:documentation>Holds a persons AIM screenname, which is a string 3-16 characters long</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:string">
				<xsd:minLength value="3"/>
				<xsd:maxLength value="16"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="ICQ">
		<xsd:annotation>
			<xsd:documentation>ICQ number, an integer 1-999999999</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:integer">
				<xsd:minInclusive value="1"/>
				<xsd:maxInclusive value="999999999"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>
	
	<xsd:element name="ContactPerson">
		<xsd:annotation>
			<xsd:documentation>a contact person for a business.  Holds a string for their name</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:simpleContent>
				<xsd:restriction base="xsd:string">
					<xsd:attribute name="title" type="xsd:string" use="optional">	
						<xsd:annotation>
							<xsd:documentation>Attribute to specify type of contact (manager, sales rep, etc).  String with no restrictions</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="Person_ID" type="xsd:IDREF" use="optional">	
						<xsd:annotation>
							<xsd:documentation>Attribute to specify type of contact (manager, sales rep, etc).  String with no restrictions</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
				</xsd:restriction>
			</xsd:simpleContent>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Address">
		<xsd:annotation>
			<xsd:documentation>holds the address of a person or business</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Street" minOccurs="1" maxOccurs="3"/>
				<xsd:element ref="City"/>
				<xsd:element ref="State"/>
				<xsd:element ref="Zip"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="Street" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds a line of a street address</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="City" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds a City name</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="State" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Holds a State as a string (abrev or spelled out)</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="Zip">
		<xsd:annotation>
			<xsd:documentation>Holds a Zip code as a string (alows begin with 0), so 5 or 9 digit zip code up to 10 chars with dash allowed.  no validty checks</xsd:documentation>
		</xsd:annotation>
		<xsd:simpleType>
			<xsd:restriction base="xsd:string">
				<xsd:minLength value="5"/>
				<xsd:maxLength value="10"/>
			</xsd:restriction>
		</xsd:simpleType>
	</xsd:element>

</xsd:schema>
