<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://www.salesforce.com/cgcloud/xsds"
           xmlns="https://www.salesforce.com/cgcloud/xsds" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="PrintLayout" type="PrintLayoutType">
  </xs:element>

  <xs:complexType name="DataDeclarationType">
    <xs:attribute type="xs:string" name="name" use="required"/>
    <xs:attribute type="xs:string" name="type" use="required"/>
    <xs:attribute type="xs:string" name="mimeType" use="optional"/>
    <xs:attribute type="xs:string" name="imageId" use="optional"/>
  </xs:complexType>

  <xs:complexType name="DeclarationsType">
    <xs:sequence>
      <xs:element name="DataDeclaration" type="DataDeclarationType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="sumType">
    <xs:attribute name="table" type="xs:string" use="required"/>
    <xs:attribute name="col" type="xs:unsignedInt" use="required"/>
    <xs:attribute name="numberFormat" type="numberFormatType"/>
  </xs:complexType>

  <xs:complexType name="tdType" mixed="true">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element type="pageNumberType" name="pageNumber" minOccurs="0" maxOccurs="1"/>
        <xs:element type="imageType" name="img" minOccurs="0" maxOccurs="1"/>
        <xs:element type="sumType" name="sum" minOccurs="0"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="width" type="xs:string" use="optional"/>
    <xs:attribute name="alignment" type="alignmentType" use="optional" />
    <xs:attribute name="bold" type="xs:boolean" use="optional" />
    <xs:attribute name="italics" type="xs:boolean" use="optional" />
    <xs:attribute name="colSpan" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="rowSpan" type="xs:unsignedInt" use="optional" />
  </xs:complexType>

  <xs:complexType name="trTypeTableBody">
    <xs:sequence>
      <xs:element name="td" type="tdType" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="thType" mixed="true">
    <xs:sequence>
      <xs:element name="pageNumber" type="pageNumberType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="sum" type="sumType" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="width" type="xs:string" use="required"/>
    <xs:attribute name="colSpan" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="rowSpan" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="alignment" type="alignmentType" use="optional" />
    <xs:attribute name="bold" type="xs:boolean" use="optional" />
    <xs:attribute name="italics" type="xs:boolean" use="optional" />
  </xs:complexType>

  <xs:complexType name="trTypeTableHead">
    <xs:sequence>
      <xs:element name="th" type="thType" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="pageNumberType">
  </xs:complexType>

  <xs:complexType name="footerType" mixed="true">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element type="tableType" name="table"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="headerType">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element type="imageType" name="img" minOccurs="0" maxOccurs="1"/>
      <xs:element type="tableType" name="table"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="theadType">
    <xs:sequence>
      <xs:element type="trTypeTableHead" name="tr" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="tbodyType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element type="trTypeTableBody" name="tr"/>
      <xs:element type="eachType" name="each"/>
    </xs:choice>
  </xs:complexType>

  <!-- >>> each spec -->
  <xs:complexType name="eachType">
    <xs:all minOccurs="0" maxOccurs="1">
      <xs:element type="filtersType" name="filters" minOccurs="0" maxOccurs="1"/>
      <xs:element type="correlationType" name="correlation" minOccurs="0" maxOccurs="1" />
      <xs:element type="orderCriteriaType" name="orderCriteria" minOccurs="0" maxOccurs="1"/>
      <xs:element type="trTypeEach" name="tr" minOccurs="1" maxOccurs="1"/>
    </xs:all>
    <xs:attribute type="xs:string" name="name" use="required"/>
    <xs:attribute type="xs:string" name="value" use="required"/>
  </xs:complexType>

  <xs:complexType name="trTypeEach">
    <xs:sequence>
      <xs:element name="td" type="tdTypeEach" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="tdTypeEach" mixed="true">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element type="pageNumberType" name="pageNumber" minOccurs="0" maxOccurs="1"/>
        <xs:element type="imageType" name="img" minOccurs="0" maxOccurs="1"/>
        <xs:element type="sumType" name="sum" minOccurs="0"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="width" type="xs:string" use="optional"/>
    <xs:attribute name="alignment" type="alignmentType" use="optional" />
    <xs:attribute name="bold" type="xs:boolean" use="optional" />
    <xs:attribute name="italics" type="xs:boolean" use="optional" />
    <xs:attribute name="colSpan" type="xs:unsignedInt" use="optional" />
  </xs:complexType>
  <!-- <<< each spec -->

  <xs:complexType name="correlationType">
    <xs:all>
      <xs:element name="filters" type="filtersType" minOccurs="0" maxOccurs="1"/>
      <xs:element type="trTypeEach" name="tr" minOccurs="1" maxOccurs="1"/>
    </xs:all>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="value" type="xs:string" use="required" />
    <xs:attribute name="key" type="xs:string" use="required" />
    <xs:attribute name="correlationKey" type="xs:string" use="required" />
  </xs:complexType>

  <!-- >>> each filter spec -->
  <xs:complexType name="filtersType">
    <xs:sequence>
      <xs:element type="filterType" name="filter" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="filterType">
    <xs:attribute type="xs:string" name="fieldName" use="required"/>
    <xs:attribute type="operatorType" name="operator" use="required"/>
    <xs:attribute type="xs:string" name="value" use="required"/>
    <xs:attribute type="compareModeType" name="compareMode" use="optional"/>
  </xs:complexType>

  <xs:simpleType name="operatorType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="EQ" />
      <xs:enumeration value="NE" />
      <xs:enumeration value="GT" />
      <xs:enumeration value="GE" />
      <xs:enumeration value="LT" />
      <xs:enumeration value="LE" />
    </xs:restriction>
  </xs:simpleType>
  <!-- <<< each filter spec -->

  <!-- >>> each order spec -->
   <xs:complexType name="orderCriteriaType">
    <xs:sequence>
      <xs:element type="orderCriterionType" name="orderCriterion" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="orderCriterionType">
    <xs:attribute type="xs:string" name="fieldName" use="required"/>
    <xs:attribute type="directionType" name="direction" use="required"/>
    <xs:attribute type="compareModeType" name="compareMode" use="optional"/>
  </xs:complexType>

  <xs:simpleType name="directionType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ASC" />
      <xs:enumeration value="DESC" />
    </xs:restriction>
  </xs:simpleType>
  <!-- <<< each order spec -->

  <!-- >>> each filter / order shared types -->
  <xs:simpleType name="compareModeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="STRING" />
      <xs:enumeration value="NUMBER" />
    </xs:restriction>
  </xs:simpleType>
  <!-- <<< each filter / order shared types -->

  <xs:simpleType name="numberFormatType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d{1,2}\.\d{1,2}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="alignmentType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="left" />
      <xs:enumeration value="center" />
      <xs:enumeration value="right" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="pageSizeType">
    <!-- page size can be either one of enum values or [int, int/auto]-->
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="A4" />
          <xs:enumeration value="A5" />
          <xs:enumeration value="EXECUTIVE" />
          <xs:enumeration value="FOLIO" />
          <xs:enumeration value="LEGAL" />
          <xs:enumeration value="LETTER" />
          <xs:enumeration value="TABLOID" />
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="\s*\[\s*\d+\s*,\s*(\d+|auto)\s*\]\s*"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:simpleType name="marginsType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\s*\[\s*\d+\s*,\s*\d+\s*((\s*,\s*\d+\s*){2})?\]\s*"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="tableLayoutType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="noBorders" />
      <xs:enumeration value="headerLineOnly" />
      <xs:enumeration value="lightHorizontalLines" />
      <xs:enumeration value="lightHorizontalLinesMainItemsOnly" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="tableType">
    <xs:sequence>
      <xs:element type="theadType" name="thead" minOccurs="0" maxOccurs="1"/>
      <xs:element type="tbodyType" name="tbody" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="required"/>
    <xs:attribute type="tableLayoutType" name="tableLayout"/>
    <xs:attribute type="xs:boolean" name="dontBreakRows"/>
  </xs:complexType>

  <xs:complexType name="headingType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <!--xs:attribute type="xs:string" name="name"/>
        <xs:attribute type="xs:string" name="type"/-->
        <xs:attribute name="alignment" type="alignmentType" use="optional" />
        <xs:attribute name="bold" type="xs:boolean" use="optional" />
        <xs:attribute name="italics" type="xs:boolean" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="paragraphType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <!--xs:attribute type="xs:string" name="name"/>
        <xs:attribute type="xs:string" name="type"/-->
        <xs:attribute name="alignment" type="alignmentType" use="optional" />
        <xs:attribute name="bold" type="xs:boolean" use="optional" />
        <xs:attribute name="italics" type="xs:boolean" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="imageType">
    <xs:attribute name="src" type="xs:string" use="required"/>
    <xs:attribute name="alignment" type="alignmentType" use="optional"/>
    <xs:attribute name="width">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-9]+"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="height" >
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-9]+"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="fit" >
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-9]+,[0-9]+"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="ReportLayoutType">
    <xs:sequence>
      <xs:element type="stylesType" name="styles" minOccurs="0" maxOccurs="1"/>
      <xs:element type="headerType" name="header" minOccurs="0" maxOccurs="1"/>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element type="headingType" name="h1" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="divType" name="div" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element type="imageType" name="img" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element type="headingType" name="h2" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="paragraphType" name="p" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="tableType" name="table" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element maxOccurs="unbounded" name="lineFeed" />
        <xs:element maxOccurs="unbounded" name="rule" />
      </xs:choice>
      <xs:element type="footerType" name="footer" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="pageSize"  type="pageSizeType" />
    <xs:attribute name="pageMargins"  type="marginsType" />
  </xs:complexType>

  <xs:complexType name="divType">
    <xs:sequence>
      <xs:element type="visibilityType" name="visibility" minOccurs="0" maxOccurs="1"/>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element type="headingType" name="h1" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="imageType" name="img" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element type="headingType" name="h2" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="paragraphType" name="p" minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="tableType" name="table" minOccurs="0" maxOccurs="unbounded"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="visibilityType">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element type="visibilityBindingType" name="visibilityBinding" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element type="visibilityConditionType" name="visibilityCondition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="visibilityBindingType">
    <xs:attribute name="binding" type="xs:string" use="required" />
    <xs:attribute name="value" type="xs:string" use="required" />
    <xs:attribute type="operatorType" name="operator" use="required"/>
    <xs:attribute type="compareModeType" name="compareMode" use="optional"/>
  </xs:complexType>

  <xs:complexType name="visibilityConditionType">
    <xs:attribute name="eachName" type="xs:string" use="required" />
    <xs:attribute name="value" type="xs:string" use="required" />
    <xs:attribute type="operatorType" name="operator" use="required"/>
  </xs:complexType>

  <xs:complexType name="PropertyType">
    <xs:attribute name="key" type="xs:string" use="required" />
    <xs:attribute name="value" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="DocumentPropertiesType">
    <xs:sequence>
      <xs:element type="PropertyType" name="Property" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PrintLayoutType">
    <xs:sequence>
      <xs:element type="DeclarationsType" name="Declarations"/>
      <xs:element type="DocumentPropertiesType" name="DocumentProperties" minOccurs="0" maxOccurs="1" />
      <xs:element type="ReportLayoutType" name="ReportLayout">
      </xs:element>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name"/>
  </xs:complexType>

  <xs:complexType name="stylesType">
    <xs:sequence>
      <xs:element ref="style" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="style">
    <xs:complexType>
      <xs:attribute name="name" type="styleNameType" use="required"/>
      <xs:attribute name="fontSize" type="xs:int" use="optional"/>
      <xs:attribute name="margin" type="marginsType" use="optional"/>
      <xs:attribute name="bold" type="xs:boolean" use="optional"/>
      <xs:attribute name="italics" type="xs:boolean" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="styleNameType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="paragraph"/>
      <xs:enumeration value="tableBody"/>
      <xs:enumeration value="tableHeader"/>
      <xs:enumeration value="heading1"/>
      <xs:enumeration value="heading2"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
