<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema targetNamespace="http://schemas.cybozu.co.jp/address/2008"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:base="http://schemas.cybozu.co.jp/base/2008"
            xmlns="http://schemas.cybozu.co.jp/address/2008"
            elementFormDefault="qualified" >

  <xsd:import namespace="http://schemas.cybozu.co.jp/base/2008" schemaLocation="base.xsd" />

  <xsd:element name="address_book">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="books" minOccurs="0" maxOccurs="1" />
        <xsd:element ref="cards" minOccurs="0" maxOccurs="1" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="book" type="BookType" minOccurs="0" maxOccurs="unbounded" />
        <xsd:element ref="base:acl" minOccurs="0" maxOccurs="unbounded" />
        <xsd:element name="my_address_groups_for_user" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="my_address_group" type="MyAddressGroupType" minOccurs="0" maxOccurs="unbounded" />
              <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
            </xsd:sequence>
            <xsd:attribute name="version" type="base:VersionType" use="required" />
            <xsd:attribute name="owner_id" type="base:IDType" use="required" />
            <xsd:anyAttribute processContents="lax" />
          </xsd:complexType>
        </xsd:element>
        <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:anyAttribute processContents="lax" />
    </xsd:complexType>
    <xsd:key name="book_key">
      <xsd:selector xpath="book" />
      <xsd:field xpath="@key" />
    </xsd:key>
    <xsd:key name="form_key">
      <xsd:selector xpath="form" />
      <xsd:field xpath="@key" />
    </xsd:key>
    <xsd:key name="my_address_group_key">
      <xsd:selector xpath="my_address_groups_for_user/my_address_group" />
      <xsd:field xpath="@id" />
    </xsd:key>
  </xsd:element>

  <xsd:complexType name="BookType">
    <xsd:annotation>
      <xsd:documentation xml:lang="en">
        If "user_id" is assigned, the book is private book. Otherwise, the book
        is shared book.

        "type" attribute can be "defualt" or "ldap".

        The "books/acl" element stands for use permission.

        When you describe User Listing(ユーザー名簿), use this element.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="form" type="FormConfigType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="cards">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="card" minOccurs="0" maxOccurs="unbounded">
              <xsd:complexType>
                <xsd:attribute name="id" type="base:IDType" use="required" />
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element ref="base:acl" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="privilege" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="target" type="xsd:string" use="required" />
          <xsd:attribute name="target_type" type="xsd:string" use="required" />
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="key" type="base:IDType" use="required" />
    <xsd:attribute name="book_id" type="base:IDType" use="required" />
    <xsd:attribute name="name" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="type" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="version" type="base:VersionType" use="required" />
    <xsd:attribute name="user_id" type="base:IDType" use="optional" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:element name="cards">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="card" type="CardType" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
    </xsd:complexType>
    <xsd:key name="card_key">
      <xsd:selector xpath="cards/card" />
      <xsd:field xpath="@id" />
    </xsd:key>
  </xsd:element>

  <xsd:complexType name="FormConfigType">
    <xsd:sequence>
      <xsd:element name="subject"          type="FieldConfigType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="personal_name"    type="NameFieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="personal_reading" type="NameFieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="company_name"     type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="company_reading"  type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="section"          type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="zip_code"         type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="physical_address" type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="map"              type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="route"            type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="company_tel"      type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="company_fax"      type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="url"              type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="post"             type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="personal_tel"     type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="email"            type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="image"            type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="description"      type="FieldConfigType" minOccurs="0" maxOccurs="1"  />
      <xsd:element name="custom" minOccurs="0" maxOccurs="1">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:choice minOccurs="1" maxOccurs="unbounded">
              <xsd:element name="string"  type="StringFieldConfigType" />
              <xsd:element name="text"    type="TextFieldConfigType" />
              <xsd:element name="url"     type="UrlFieldConfigType" />
              <xsd:element name="file"    type="FileFieldConfigType" />
              <xsd:element name="email"   type="EMailFieldConfigType" />
              <xsd:element name="ipphone" type="IPPhoneFieldConfigType" />
              <xsd:element name="menu"    type="MenuFieldConfigType" />
            </xsd:choice>
            <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
          </xsd:sequence>
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="key" type="base:IDType" use="required" />
    <xsd:attribute name="version" type="base:VersionType" use="required" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="FieldConfigType">
    <xsd:attribute name="name" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="using" type="xsd:boolean" use="optional" />
    <xsd:attribute name="public" type="xsd:boolean" use="optional" />
    <xsd:attribute name="listing" type="xsd:boolean" use="optional" />
    <xsd:attribute name="necessary" type="xsd:boolean" use="optional" />
    <xsd:attribute name="allow_modification" type="xsd:boolean" use="optional" />
    <xsd:attribute name="sso_id" type="xsd:string" use="optional" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="NameFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:attribute name="number_of_parts" type="xsd:positiveInteger" default="2" />
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="StringFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="TextFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="UrlFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:attribute name="image" type="xsd:boolean" default="false" />
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="FileFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="EMailFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="IPPhoneFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="MenuFieldConfigType">
    <xsd:complexContent>
      <xsd:extension base="FieldConfigType">
        <xsd:sequence>
          <xsd:element name="item" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
          <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CardType">
    <xsd:sequence>
      <xsd:element name="creator" type="base:ChangeLogType" minOccurs="1" maxOccurs="1" />
      <xsd:element name="modifier" type="base:ChangeLogType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="subject"          type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="personal_name"    type="NameFieldValueType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="personal_reading" type="NameFieldValueType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="company_name"     type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="company_reading"  type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="section"          type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="zip_code"         type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="physical_address" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="map"              type="xsd:anyURI" minOccurs="0" maxOccurs="1" />
      <xsd:element name="route"            type="RouteFieldValueType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="company_tel"      type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="company_fax"      type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="url"              type="xsd:anyURI" minOccurs="0" maxOccurs="1" />
      <xsd:element name="post"             type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="personal_tel"     type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="email"            type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="image"            type="FileFieldValueType" minOccurs="0" maxOccurs="1" />
      <xsd:element name="description"      type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="custom" minOccurs="0" maxOccurs="1">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:choice minOccurs="1" maxOccurs="unbounded">
              <xsd:element name="string">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="StringFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="text">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="TextFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="url">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="UrlFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="file">
                <xsd:complexType>
                  <xsd:complexContent>
                    <xsd:extension base="FileFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:complexContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="email">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="EMailFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="ipphone">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="IPPhoneFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="menu">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="MenuFieldValueType">
                      <xsd:attribute name="field_code" type="base:NonBlankStringType" use="required" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
            <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
          </xsd:sequence>
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="book_id" type="base:IDType" use="required" />
    <xsd:attribute name="id" type="base:IDType" use="required" />
    <xsd:attribute name="version" type="base:VersionType" use="required" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="NameFieldValueType">
    <xsd:sequence>
      <xsd:element name="part" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="RouteFieldValueType">
    <xsd:sequence>
      <xsd:element name="path" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="time" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="fare" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="StringFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="TextFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="UrlFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:anyURI">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <!--<xsd:complexType name="FileFieldValueType">
    <xsd:complexContent>
      <xsd:extension base="base:FileType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>-->

  <xsd:complexType name="FileFieldValueType">
    <xsd:attribute name="name" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="file_id" type="base:IDType" use="required" />
    <xsd:attribute name="mime_type" type="xsd:string" use="optional" />
    <xsd:attribute name="size" type="xsd:unsignedLong" use="optional" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="EMailFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="IPPhoneFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="base:IPPhoneURIType">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="MenuFieldValueType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:anyAttribute processContents="lax" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="BookUsePermissionType">
    <xsd:sequence>
      <xsd:element name="acl" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="target" type="base:NonBlankStringType" use="required" />
          <xsd:attribute name="target_type" type="TargetType" use="required" />
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

  <xsd:simpleType name="TargetType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="user" />
      <xsd:enumeration value="group" />
      <xsd:enumeration value="role" />
      <xsd:enumeration value="dynamic_role" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:complexType name="MyAddressGroupType">
    <xsd:sequence>
      <xsd:element name="user" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="key" type="base:IDType" use="required" />
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="card" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="key" type="base:IDType" use="required" />
          <xsd:attribute name="type" use="required">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:enumeration value="private" />
                <xsd:enumeration value="shared" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:anyAttribute processContents="lax" />
        </xsd:complexType>
      </xsd:element>
      <xsd:any namespace="##local" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="id" type="base:IDType" use="required" />
    <xsd:attribute name="version" type="base:VersionType" use="required" />
    <xsd:attribute name="name" type="base:NonBlankStringType" use="required" />
    <xsd:attribute name="description" type="xsd:string" use="optional" />
    <xsd:anyAttribute processContents="lax" />
  </xsd:complexType>

</xsd:schema>
