<!--
  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.
  
-->
<canvas debug="true" width="1000" height="800">

    <debug x="250" height="500" /> 

    <drawview width="200" height="100">
        
        <handler name="oninit">
            this.drawBody(this,0,0,this.width,this.height,0xff3300,2);
        </handler>
        
        <handler name="onclick">
            this.drawBody(this,0,0,this.width,this.height,0xff3300,2);
        </handler>
        
        <method name="drawBody" args="targetObj,x1,y1,x2,y2,fill,lineWidth">
        <![CDATA[
            
            if ($debug) Debug.write("drawBody: ",targetObj,lineWidth);
        
            targetObj.lineWidth = lineWidth;
            targetObj.beginPath();
            targetObj.moveTo(x1,y1);
            targetObj.lineTo(x1,y2);
            targetObj.lineTo(x2,y2);
            targetObj.lineTo(x2,y1);
            targetObj.lineTo (x1,y1);
            targetObj.closePath();

            targetObj.fillStyle = fill;
            targetObj.fill();
            
        ]]>   
    </method>   
        
    </drawview>

</canvas>
