<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="itop_design">
 <xsd:complexType>
  <xsd:sequence>

   <!-- Classes [0, N] -->
   <xsd:element name="classes" minOccurs="0">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="class" minOccurs="0" maxOccurs="unbounded">
       <xsd:complexType>
        <xsd:sequence>
         <xsd:element name="parent" type="xsd:string" minOccurs="0"/>
         <xsd:element name="properties">
          <xsd:complexType>
           <xsd:sequence>
            <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
            <xsd:element name="is_link" type="xsd:string" minOccurs="0"/>
            <xsd:element name="category" type="xsd:string"/>
            <xsd:element name="abstract" type="xsd:string"/>
            <xsd:element name="key_type" type="xsd:string"/>
            <xsd:element name="db_table" type="xsd:string"/>
            <xsd:element name="db_key_field" type="xsd:string"/>
            <xsd:element name="db_final_class_field" type="xsd:string"/>
            <xsd:element name="naming">
             <xsd:complexType>
              <xsd:sequence>
               <xsd:element name="format" type="xsd:string"/>
               <xsd:element name="attributes" type="ListOfAttributes"/>
              </xsd:sequence>
             </xsd:complexType>
            </xsd:element>
            <xsd:element name="display_template" type="xsd:string"/>
            <xsd:element name="icon" type="xsd:string"/>
            <xsd:element name="reconciliation">
             <xsd:complexType>
              <xsd:sequence>
               <xsd:element name="attributes" type="ListOfAttributes"/>
              </xsd:sequence>
             </xsd:complexType>
            </xsd:element>
            <xsd:element name="order" minOccurs="0">
             <xsd:complexType>
              <xsd:sequence>
               <xsd:element name="columns">
                <xsd:complexType>
                 <xsd:sequence>
                  <xsd:element name="column">
                   <xsd:complexType>
                    <xsd:sequence>
                     <xsd:element name="ascending" type="xsd:string"/>
                    </xsd:sequence>
                    <xsd:attribute name="id" type="xsd:string" use="required"/>
                    <xsd:attribute name="order" type="xsd:string" use="required"/>
                   </xsd:complexType>
                  </xsd:element>
                 </xsd:sequence>
                </xsd:complexType>
               </xsd:element>
              </xsd:sequence>
             </xsd:complexType>
            </xsd:element>
           </xsd:sequence>
          </xsd:complexType>
         </xsd:element>
         <xsd:element name="fields">
          <xsd:complexType>
           <xsd:sequence>
            <xsd:element name="field" type="Attribute" minOccurs="0" maxOccurs="unbounded"/>
           </xsd:sequence>
          </xsd:complexType>
         </xsd:element>
         <xsd:element name="lifecycle" minOccurs="0">
          <xsd:complexType>
           <xsd:sequence>

            <xsd:element name="attribute" type="xsd:string"/>

            <xsd:element name="stimuli">
             <xsd:complexType>
              <xsd:sequence>
               <xsd:element name="stimulus" type="Stimulus" maxOccurs="unbounded"/>
              </xsd:sequence>
             </xsd:complexType>
            </xsd:element>

            <xsd:element name="states">
             <xsd:complexType>
              <xsd:sequence>
               <xsd:element name="state" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                 <xsd:sequence>
                  <xsd:element name="flags">
                   <xsd:complexType>
                    <xsd:sequence>
                     <xsd:element name="attribute" maxOccurs="unbounded">
                      <xsd:complexType>
                       <xsd:sequence>
                        <xsd:element name="mandatory" type="xsd:string" minOccurs="0"/>
                        <xsd:element name="must_prompt" type="xsd:string" minOccurs="0"/>
                        <xsd:element name="must_change" type="xsd:string" minOccurs="0"/>
                        <xsd:element name="hidden" type="xsd:string" minOccurs="0"/>
                        <xsd:element name="read_only" type="xsd:string" minOccurs="0"/>
                       </xsd:sequence>
                       <xsd:attribute name="id" type="xsd:string" use="required"/>
                      </xsd:complexType>
                     </xsd:element>
                    </xsd:sequence>
                   </xsd:complexType>
                  </xsd:element>
                  
                  <xsd:element name="transitions">
                   <xsd:complexType>
                    <xsd:sequence>
                     <xsd:element name="transition" minOccurs="0" maxOccurs="unbounded">
                      <xsd:complexType>
                       <xsd:sequence>
                       <xsd:element name="stimulus" type="xsd:string"/>
                       <xsd:element name="target" type="xsd:string"/>
                        <xsd:element name="actions">
                         <xsd:complexType>
                          <xsd:sequence>
                           <xsd:element name="action" minOccurs="0" maxOccurs="unbounded">
                            <xsd:complexType>
                             <xsd:sequence>
                              <xsd:element name="verb" type="xsd:string"/>
                             </xsd:sequence>
                            </xsd:complexType>
                           </xsd:element>
                          </xsd:sequence>
                         </xsd:complexType>
                        </xsd:element>
                       </xsd:sequence>
                      </xsd:complexType>
                     </xsd:element>
                    </xsd:sequence>
                   </xsd:complexType>
                  </xsd:element>
                 </xsd:sequence>
                 <xsd:attribute name="id" type="xsd:string" use="required"/>
                </xsd:complexType>
               </xsd:element>
              </xsd:sequence>
             </xsd:complexType>
            </xsd:element>

           </xsd:sequence>
          </xsd:complexType>
         </xsd:element>
         <xsd:element name="methods">
          <xsd:complexType>
           <xsd:sequence>
            <xsd:element name="method" minOccurs="0" maxOccurs="unbounded">
             <xsd:complexType mixed="true">
              <xsd:sequence>
               <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
               <xsd:element name="static" type="xsd:string"/>
               <xsd:element name="access" type="xsd:string"/>
               <xsd:element name="type" type="xsd:string"/>
               <xsd:element name="code" type="xsd:string"/>
              </xsd:sequence>
              <xsd:attribute name="id" type="xsd:string" use="required"/>
             </xsd:complexType>
            </xsd:element>
           </xsd:sequence>
          </xsd:complexType>
         </xsd:element>
         <xsd:element name="presentation">
          <xsd:complexType>
           <xsd:all>
            <xsd:element name="details" type="ItemList" minOccurs="0"/>
            <xsd:element name="search" type="ItemList" minOccurs="0"/>
            <xsd:element name="list" type="ItemList" minOccurs="0"/>
           </xsd:all>
          </xsd:complexType>
         </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string" use="required"/>
        <xsd:attribute name="_delta" type="xsd:string"/>
       </xsd:complexType>

      </xsd:element>
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element>

   <!-- Menus [0, N] -->
   <xsd:element name="menus" minOccurs="0">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="menu" type="Menu" minOccurs="0" maxOccurs="unbounded"/>
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element>
   
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>


<!-- ====================================== -->
<!-- Class: Atttributes                     -->
<!-- ====================================== -->
<xsd:complexType name="ListOfAttributes">
 <xsd:sequence>
  <xsd:element name="attribute" minOccurs="0" maxOccurs="unbounded">
  </xsd:element>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Attribute">
 <xsd:sequence>
  <xsd:element name="filter" type="xsd:string" minOccurs="0"/>
  <xsd:element name="values" minOccurs="0">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:element name="value" type="xsd:string" maxOccurs="unbounded"/>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:element>
  <xsd:element name="dependencies" type="ListOfAttributes" minOccurs="0"/>
 </xsd:sequence>
 <xsd:attribute name="id" type="xsd:string" use="required"/>
</xsd:complexType>

<xsd:complexType name="AttributeSql">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="sql" type="xsd:string"/>
    <xsd:element name="default_value" type="xsd:string"/>
    <xsd:element name="is_null_allowed" type="xsd:string"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeBlob">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="is_null_allowed" type="xsd:string" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeScalar">
 <xsd:complexContent>
  <xsd:extension base="AttributeSql">
   <xsd:sequence>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeInteger">
 <xsd:complexContent>
  <xsd:extension base="AttributeScalar">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeString">
 <xsd:complexContent>
  <xsd:extension base="AttributeScalar">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeDate">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeDateTime">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeDeadline">
 <xsd:complexContent>
  <xsd:extension base="AttributeDateTime">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="AttributeText">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeCaseLog">
 <xsd:complexContent>
  <xsd:extension base="AttributeText">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeURL">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
   <xsd:sequence>
    <xsd:element name="target" type="xsd:string"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeIPAddress">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeEnum">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="AttributeExternalKey">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="sql" type="xsd:string"/>
    <xsd:element name="target_class" type="xsd:string"/>
    <xsd:element name="is_null_allowed" type="xsd:string"/>
    <xsd:element name="filter" type="xsd:string" minOccurs="0"/>
    <xsd:element name="on_target_delete" type="xsd:string"/>
    <xsd:element name="jointype" type="xsd:string" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeHierarchicalKey">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="sql" type="xsd:string"/>
    <xsd:element name="is_null_allowed" type="xsd:string"/>
    <xsd:element name="on_target_delete" type="xsd:string"/>
    <xsd:element name="filter" type="xsd:string" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeExternalField">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="extkey_attcode" type="xsd:string"/>
    <xsd:element name="target_attcode" type="xsd:string"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeEmailAddress">
 <xsd:complexContent>
  <xsd:extension base="AttributeString">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeLinkedSet">
 <xsd:complexContent>
  <xsd:extension base="Attribute">
   <xsd:sequence>
    <xsd:element name="linked_class" type="xsd:string"/>
    <xsd:element name="ext_key_to_me" type="xsd:string"/>
    <xsd:element name="count_min" type="xsd:string"/>
    <xsd:element name="count_max" type="xsd:string"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AttributeLinkedSetIndirect">
 <xsd:complexContent>
  <xsd:extension base="AttributeLinkedSet">
   <xsd:sequence>
    <xsd:element name="ext_key_to_remote" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="ext_key_to_remote" type="xsd:string"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<!-- ====================================== -->
<!-- Class: ZList (presentation)            -->
<!-- ====================================== -->

<xsd:complexType name="ItemList">
 <xsd:sequence>
  <xsd:element name="items" type="Items" minOccurs="0"/>
 </xsd:sequence>
</xsd:complexType>


<xsd:complexType name="Items">
 <xsd:sequence>
  <xsd:element name="item" maxOccurs="unbounded">
   <xsd:complexType mixed="true">
    <xsd:sequence>
     <xsd:element name="items" type="Items" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:string"/>
   </xsd:complexType>
  </xsd:element>
 </xsd:sequence>
</xsd:complexType>

<!-- ====================================== -->
<!-- Class: Stimulus                        -->
<!-- ====================================== -->

<xsd:complexType name="Stimulus">
 <xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>

<xsd:complexType name="StimulusUserAction">
 <xsd:complexContent>
  <xsd:extension base="Stimulus">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="StimulusInternal">
 <xsd:complexContent>
  <xsd:extension base="Stimulus">
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<!-- ====================================== -->
<!-- Types for the menus                    -->
<!-- ====================================== -->
<xsd:complexType name="Menu">
 <xsd:sequence>
  <xsd:element name="rank" type="MenuProperty"/>
 </xsd:sequence>
 <xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>

<xsd:complexType name="MenuGroup">
 <xsd:complexContent>
  <xsd:extension base="Menu">
   <xsd:sequence>
    <xsd:element name="enable_class" type="MenuProperty" minOccurs="0"/>
    <xsd:element name="enable_action" type="MenuProperty" minOccurs="0"/>
    <xsd:element name="enable_permission" type="MenuProperty" minOccurs="0"/>
    <xsd:element name="enable_stimulus" type="MenuProperty" minOccurs="0"/>
   </xsd:sequence>
   <xsd:attribute name="type" type="xsd:string" fixed="MenuGroup"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="MenuNode">
 <xsd:complexContent>
  <xsd:extension base="Menu">
   <xsd:sequence>
    <xsd:element name="parent" type="MenuProperty"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="TemplateMenuNode">
 <xsd:complexContent>
  <xsd:extension base="MenuNode">
   <xsd:sequence>
    <xsd:element name="template_file" type="MenuProperty"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="NewObjectMenuNode">
 <xsd:complexContent>
  <xsd:extension base="MenuNode">
   <xsd:sequence>
    <xsd:element name="class" type="MenuProperty"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="SearchMenuNode">
 <xsd:complexContent>
  <xsd:extension base="MenuNode">
   <xsd:sequence>
    <xsd:element name="class" type="MenuProperty"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="OQLMenuNode">
 <xsd:complexContent>
  <xsd:extension base="MenuNode">
   <xsd:sequence>
    <xsd:element name="oql" type="MenuProperty"/>
    <xsd:element name="do_search" type="MenuProperty"/>
    <xsd:element name="auto_reload" type="MenuProperty" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="WebPageMenuNode">
 <xsd:complexContent>
  <xsd:extension base="MenuNode">
   <xsd:sequence>
    <xsd:element name="url" type="MenuProperty"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="MenuProperty">
 <xsd:simpleContent>
  <xsd:extension base="xsd:string">
  </xsd:extension>
 </xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="MenuType">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="MenuGroup"/>
    <xsd:enumeration value="TemplateMenuNode"/>
    <xsd:enumeration value="NewObjectMenuNode"/>
    <xsd:enumeration value="SearchMenuNode"/>
    <xsd:enumeration value="OQLMenuNode"/>
  </xsd:restriction>
</xsd:simpleType>
</xsd:schema>