<?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/.                =-->
<!--======================================================================-->
<!-- ===================================================================== -->
<!-- dom-featureString-BE-03.svg                                           -->
<!-- renamed for 1.1 suite to struct-dom-05-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.2 $" testname="struct-dom-05-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-05-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";
		featureStrings[length++] = "uievents	";
		featureStrings[length++] = "mouseevents";
		featureStrings[length++] = "mutationevents";
		featureStrings[length++] = "traversal";
		featureStrings[length++] = "org.w3c.svg";
		featureStrings[length++] = "org.w3c.svg.lang";
		featureStrings[length++] = "org.w3c.svg.dynamic";
		featureStrings[length++] = "org.w3c.svg.static";
		featureStrings[length++] = "org.w3c.dom.svg";
		featureStrings[length++] = "org.w3c.svg";
		*/
		featureStrings[length++] = "org.w3c.dom.svg.static";
		featureStrings[length++] = "org.w3c.dom.svg.animation";
		featureStrings[length++] = "org.w3c.dom.svg.dynamic";
		featureStrings[length++] = "org.w3c.dom.svg.all";
		featureStrings[length++] = "org.w3c.svg.all";
                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, (45 + 40*i));
		}
		}

		function addTextElement(label, value, doc, svg, y){
			var newText = doc.createElementNS(svg_ns, 'text');
			newText.setAttribute('font-size', '30');
			newText.setAttribute('x', '5');
			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', '385');
			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.2 $</text>
	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
</svg>

