<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:foo="http://foo.com" xmlns:bar="http://bar.com" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>XMLSerializer() namespace test</title>
<script>
window.addEventListener("load", function() {
    if (window.testRunner)
        testRunner.dumpAsText();
    
    var xs = new XMLSerializer();
    var content = document.getElementById('content');
    content.firstChild.nodeValue = xs.serializeToString(document.getElementById('input'));

    // Original test
    var d = document.implementation.createDocument("urn:foo-ns", "foo:root", null);
    if (!d.documentElement) {
        // This shouldn't happen, since DomImplementation.createDocument
        // is supposed to create the root element.  But in Safari, it's required.
        d.appendChild(d.createElementNS("urn:foo-ns", "foo:root"));
    }
    var root = d.documentElement;
    root.setAttributeNS("urn:foo-ns", "foo:type", "test")
    
    var c = d.createElementNS(null, "child");
    root.appendChild(c);
    
    c.setAttributeNS("urn:foo-ns", "foo:name", "one");
    c.setAttributeNS("urn:bar-ns", "bar:name", "two");
    var attr = d.createAttributeNS(null, "name");
    var text = d.createTextNode("three");
    attr.appendChild(text);
    c.setAttributeNode(attr);
    
    window.alert("foo:name is " + c.getAttributeNS("urn:foo-ns", "name") + " and should be one");
    window.alert("bar:name is " + c.getAttributeNS("urn:bar-ns", "name") + " and should be two");
    window.alert("name is " + c.getAttributeNS(null, "name") + " and should be three");
    window.alert("node is " + d.getElementsByTagNameNS(null, "child").item(0).nodeName + " and should be child");
    window.alert(xs.serializeToString(d));
}, false);
</script>
</head>
<body>
<pre id="content">foo</pre>
<div id="input">
    <div>
        <foo:node xmlns="http://baz.com" foo:name="foo_name" bar:name="bar_name">
            <node foo:name="foo_name">
                <bar:node xmlns:bar="http://bar2.com"/>
            </node>
        </foo:node>
    </div>
    <bar:node>
        <br />
    </bar:node>
</div>
</body>
</html>
