<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">
<!--======================================================================-->
<!--=  Copyright 2000 World Wide Web Consortium, (Massachusetts          =-->
<!--=  Institute of Technology, Institut National de Recherche en        =-->
<!--=  Informatique et en Automatique, Keio University). All Rights      =-->
<!--=  Reserved. See http://www.w3.org/Consortium/Legal/.                =-->
<!--======================================================================-->
<!-- ===================================================================== -->
<!-- struct-dom-02-f                                                       -->
<!-- split for 1.1 suite to struct-dom-02-b    -->
<!-- dom-featureString-BE-03.svg                                           -->
<!-- renamed for 1.1 suite to struct-dom-02-b                              -->
<!-- Author : Vincent Hardy  06-08-2000                                    -->
<!-- Revised for 1.1 : Chris Lilley, 15-Mar-2002                           -->
<!-- Revised for 1.1 : Darryl Fuller, 27-Jun-2002                          -->
<!--======================================================================-->
<svg version="1.1" baseProfile="basic" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" onload="domTest(evt)">
    <SVGTestCase xmlns="http://www.w3.org/2000/02/svg/testsuite/description/">
		<OperatorScript version="$Revision: 1.1 $" testname="struct-dom-02-b.svg">
			<Paragraph>Verify the basic capability to handle the hasFeature DOMImplementation method. 
			The DOMImplementation instance is retreived from the Document instance. Then,
			its hasFeature method is invoked on the various SVG feature strings.
                	</Paragraph>
			<Paragraph>The test displays the set of SVG feature strings and, next to them, a text
			string that shows whether the feature is supported or not.
                	</Paragraph>
			<Paragraph>Note that the test passes whether or not the feature is supported (i.e., true or
			false are valid). The test fails if no value (true or false) appears next to the feature string
			value.
                	</Paragraph>
			<Paragraph>Note that this test uses the 'onload' event on the root svg element.
                	</Paragraph>
			<Paragraph>The rendered picture should match the reference image, except for the yes and
			no values which may differ depending on the implementation.
    			</Paragraph>
		</OperatorScript>
	</SVGTestCase>
	<title id="test-title">struct-dom-02-b</title>
	<desc id="test-desc">Checks if DOM/ECMA Script binding is supported. Checks support for the
hasFeature method on the DOMImplementation.
</desc>
	<!--======================================================================-->
	<!--Content of Test Case follows...                  =====================-->
	<!--======================================================================-->
	<g id="test-body-content">
		<script type="text/ecmascript"><![CDATA[
		
    var featureStrings = new Array();
		var length = 0;
		featureStrings[length++] = "xml";
		featureStrings[length++] = "stylesheets";
		featureStrings[length++] = "views";
		featureStrings[length++] = "css2";
		featureStrings[length++] = "events";
                var svg_ns = "http://www.w3.org/2000/svg" 
    function domTest(evt) {
		// Get Document
		var target = evt.target;
		var doc = target.ownerDocument;

    // Get DOMImplementation
	  var domImpl = doc.implementation;

		// 
		// Iterate through the feature strings
		//
		for(var i=0; i<featureStrings.length; i++){
			var supports = domImpl.hasFeature(featureStrings[i], '2.0');
			//
			// if time, pretty up by putting xml to traveral in a left column and 
			// org.w3c.svg to org.w3c.dom.svg.all in a right column; add an extra 
			// parameter to addTextElemen t for x coord, and test if i &lt; 9
			//
			addTextElement(featureStrings[i], supports, doc, target, (55 + 55*i));
		}
		}

		function addTextElement(label, value, doc, svg, y){
			var newText = doc.createElementNS(svg_ns, 'text');
			newText.setAttribute('font-size', '30');
			newText.setAttribute('x', '10');
			newText.setAttribute('y', y);
			var textValue = label;
			var textContent = doc.createTextNode(textValue);
		      newText.appendChild(textContent);
			svg.appendChild(newText);

			newText = doc.createElementNS(svg_ns, 'text');
			newText.setAttribute('font-size', '30');
			newText.setAttribute('x', '340');
			newText.setAttribute('y', y);
			textValue =  value;
			textContent = doc.createTextNode(textValue);
			newText.appendChild(textContent);
			svg.appendChild(newText);
		}
		
	]]></script>
	</g>
	<text id="revision" x="10" y="340" font-size="30" stroke="none" fill="black">$Revision: 1.1 $</text>
	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
</svg>

