<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <!--======================================================================-->
  <!--=  Copyright 2008 World Wide Web Consortium, (Massachusetts          =-->
  <!--=  Institute of Technology, European Research Consortium for         =-->
  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
  <!--=  All Rights Reserved.                                              =-->
  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
  <!--======================================================================-->
  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="[reviewer]" author="Microsoft" status="created" version="$Revision: 1.4 $" testname="$RCSfile: struct-dom-18-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/struct.html#InterfaceSVGSVGElement">
      <p>
        <!--[[
        The 'SVGSVGElement' supports 'getIntersectionList' and 'getEnclosureList' with all renderable elements.
        ]]-->
      </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
      <p>
        <!--[[
        Markup for an instance of each renderable SVG element is placed in an 'svg' element. The 'getIntersectionList' and 'getEnclosureList'
        methods are called from a reference to the parent 'svg' element. For 'getIntersectionList', an 'SVGRect' is used with 'x', 'y', 'width',
        and 'height' attributes set to intersect each of the renderable elements. For 'getEnclosureList', the same 'SVGRect' is modified to
        completely enclose all of the renderable elements. For both 'getIntersectionList' and 'getEnclosureList', the returned 'NodeList' element
        is iterated through and each element is verified through their respective 'id' attributes. For the 'use' element, the 'correspondingUseElement'
        attribute must be used because an 'SVGElementInstance' reference is obtained via 'getEnclosureList' and 'getIntersectionList'. 
        ]]-->
      </p>
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
        <!--[[
        Test passes if there is no red visible on the page.
        ]]-->
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-18-f.svg,v $</title>
  <defs>
    <font-face
      font-family="SVGFreeSansASCII"
      unicode-range="U+0-7F">
      <font-face-src>
        <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
      </font-face-src>
    </font-face>
  </defs>
  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
    <svg id="testSVG">
        <circle cx="96" cy="96" r="48" id="testCircle" />
        <ellipse cx="96" cy="96" rx="48" ry="48" id="testEllipse" />
        <line x1="10" y1="10" x2="10" y2="100" stroke="black" id="testLine" />
        <path d="M0 10 H 100" stroke-width="5" stroke="black" fill="none" id="testPath" />
        <polyline points="0,0 120,100 120,120" stroke="black" fill="black" id="testPolyline" />
        <polygon points="0,0 100,100" stroke="black" fill="black" id="testPolygon" />
        <rect width="96" height="96" id="testRect" />
        <use xlink:href="#testRect" id="testUse" />
        <image xlink:href="../images/black10x10.png" width="100" height="100" id="testImage" />
        <text x="100" y="100" fill="black" id="testText">Filler text</text>
    </svg>
    <text id="failText" x="350" y="350" font-size="50" fill="red">FAIL</text>
    <script type="text/javascript"><![CDATA[
        try
        {
            var passedCount = 0;
            var expectedIDList = ["testCircle", "testEllipse", "testLine", "testPath", "testPolyline", "testPolygon", "testRect", "testUse", "testImage", "testText"];
            var testSVG = document.getElementById("testSVG");
            var rectElem = testSVG.createSVGRect();

            rectElem.x = 10;
            rectElem.y = 0;
            rectElem.width = 130;
            rectElem.height = 98;

            var intersectionList = testSVG.getIntersectionList(rectElem, null);

            if (null != intersectionList && expectedIDList.length == intersectionList.length)
            {
                passedCount++;
            }

            for (var i = 0; i < intersectionList.length; i++)
            {
                var curIntersection = intersectionList[i];
                var curExpectedId = expectedIDList[i];

                if (curExpectedId == curIntersection.id)
                {
                    passedCount++;
                }
                // Special case for "use" and SVGElementInstance
                else if (null != curIntersection.correspondingUseElement && curExpectedId == curIntersection.correspondingUseElement.id)
                {
                    passedCount++;
                }
            }

            rectElem.x = 0;
            rectElem.y = 0;
            rectElem.width = 200;
            rectElem.height = 200;

            var enclosureList = testSVG.getEnclosureList(rectElem, null);

            if (null != enclosureList && expectedIDList.length == enclosureList.length)
            {
                passedCount++;
            }

            for (var i = 0; i < enclosureList.length; i++)
            {
                var curEnclosure = enclosureList[i];
                var curExpectedId = expectedIDList[i];

                if (curExpectedId == curEnclosure.id)
                {
                    passedCount++;
                }
                // Special case for "use" and SVGElementInstance
                else if (null != curEnclosure.correspondingUseElement && curExpectedId == curEnclosure.correspondingUseElement.id)
                {
                    passedCount++;
                }
            }

            if (22 == passedCount)
            {
                document.getElementById("failText").setAttribute("display", "none");
            }
        }
        catch(ex)
        {
            // alert('ERROR: ' + ex.message);
        }]]>
    </script>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.4 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
  <!-- comment out this watermark once the test is approved -->
  <g id="draft-watermark">
    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
  </g>
</svg>
