<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>CSS Test: dynamic changes to 'counter-increment'</title>
    <link rel="author" href="http://dbaron.org/" title="L. David Baron">
    <link rel="help" href="http://www.w3.org/TR/CSS21/generate.html#counters">
    <link rel="help" href="http://www.w3.org/TR/CSS21/generate.html#propdef-content">
    <link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#counter">
    <meta content="dom" name="flags">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <style type="text/css">
        body { white-space: nowrap; }
        .reset { counter-reset: c; }
        .increment:before, .use:before { content: counters(c, ".") "-"; }
        .increment { counter-increment: c; }
    </style>
    <script type="text/javascript">
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }

        function run() {
            if (window.testRunner) {
                testElement = document.getElementById("test");
                console = document.getElementById("console");
                spanList = testElement.getElementsByTagName("span")
                for (i = 0; i < spanList.length; ++i ) {
                    newSpanElement = document.createElement("span");
                    newSpanElement.innerText =
                    window.internals.counterValue(document.getElementById(spanList.item(i).getAttribute("id")));
                    if (newSpanElement.innerText.length)
                        newSpanElement.innerText = newSpanElement.innerText + "- ";
                    console.appendChild(newSpanElement);
                }
                testRunner.notifyDone();
            }
        }
    </script>
</head><body onload="setTimeout('run()', 0)">
    <p>The following two lines should have the same content:</p>
    <div id="test">
        <span id="root" class="reset">
            <span id="dummy">
                <span id="reset1" style="counter-reset: c 1"></span>
                <span id="inc" class="increment"></span>
                <span id="user" class="use"></span>
                <span id="reset4" style="counter-reset: c 4"></span>
                <span id="inc2" class="increment"></span>
            </span>
            <span id="interesting" class="increment"></span>
        </span>
    </div>
    <div id="reference">0.2- 0.2- 0.5- 1- </div>
    <hr>
    <div id="console"></div>
</body></html>
