<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000802//EN"
"http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd">

<!--

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

-->
<!-- ====================================================================== -->
<!-- Modification of text children                                          -->
<!--                                                                        -->
<!-- @author nicolas.socheleau@bitflash.com                                 -->
<!-- @version $Id$                                                          -->
<!-- ====================================================================== -->

<?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>  

<svg id="body" width="450" height="500" viewBox="0 0 450 500">
    <title>&lt;text&gt; children updates 'onload'</title>

    <text x="50%" y="45" class="title">&lt;text&gt; children in 'onload'</text>

    <script type="text/ecmascript">

    function text_append(evt, text) {
        var elt = evt.target;
        var textNode = elt.getFirstChild();

        textNode.appendData(text);
    }
    function text_delete(evt, offset, count) {
        var elt = evt.target;
        var textNode = elt.getFirstChild();

        textNode.deleteData(offset,count);
    }
    function text_insert(evt, offset, text) {
        var elt = evt.target;
        var textNode = elt.getFirstChild();

        textNode.insertData(offset,text);
    }
    function text_replace(evt, offset,count,text) {
        var elt = evt.target;
        var textNode = elt.getFirstChild();

        textNode.replaceData(offset,count,text);
    }

    </script>

    <g id="test-content">
        <g style="text-anchor:middle;font-size:24;stroke:none;fill:crimson" >

          <text x="100" y="155" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             xml:space="preserve" onload="text_append(evt,' the end')" >append at</text>
          <text x="100" y="355" dy="0 -2 5 -5 5 -5 5 -5 5 -2"
             xml:space="preserve" onload="text_delete(evt,7,4)" >delete any words</text>
          <text x="325" y="155" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             xml:space="preserve" onload="text_insert(evt,6,' between')" >insert words</text>
          <text x="325" y="355" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             xml:space="preserve" onload="text_replace(evt,10,8,'string')" >replace a sentence</text>

        </g>

        <g style="stroke:black; fill:none; stroke-width:1 ;text-anchor:middle; font-size:24">
          <text x="100" y="155" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             >append at the end</text>
          <text x="100" y="355" dy="0 -2 5 -5 5 -5 5 -5 5 -2"
             >delete words</text>
          <text x="325" y="155" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             >insert between words</text>
          <text x="325" y="355" dy="0 -2 5 -5 5 -5 5 -5 5 -5 5 -5 5 -2"
             >replace a string</text>
        </g>

        <g style="fill:black; stroke:none; text-anchor:middle">
                <text x="100" y="230" >TEXT_NODE.append</text>
                <text x="100" y="430" >TEXT_NODE.delete</text>
                <text x="325" y="230" >TEXT_NODE.insert</text>
                <text x="325" y="430" >TEXT_NODE.replace</text>
        </g>
    </g>
</svg>
