<?xml version="1.0" encoding="UTF-8"?>
<!--
  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="500" height="100%" >
	
	<debug oninit="Debug.showInternalProperties = true"/>
	
<class name="drawViewNew" extends="drawview" cachebitmap="false" x="-1" y="-1" >
    
</class>

<drawview>
    
    <handler name="onconstruct">
        <![CDATA[
            //var pStart = {'x':100,'y':100};
            //var pEnd = {'x':200,'y':200};
            
            var p = new flash.geom.Point(100,100);
            var pEnd = new flash.geom.Point(100,200);
            if ($debug) Debug.write("p",p);
            
            var normalizedPoint = new flash.geom.Point(-2, 4);
			if ($debug) Debug.write(normalizedPoint.length); // 5
			if ($debug) Debug.write(normalizedPoint.toString()); // (x=3, y=4)
			normalizedPoint.normalize(10);
			if ($debug) Debug.write(normalizedPoint.length); // 10
			if ($debug) Debug.write(normalizedPoint.toString()); // (x=6, y=8)
            
            
            var normalizedPoint = new flash.geom.Point(2, -4);
            if ($debug) Debug.write(normalizedPoint.length); // 5
            if ($debug) Debug.write(normalizedPoint.toString()); // (x=3, y=4)
            normalizedPoint.normalize(10);
            if ($debug) Debug.write(normalizedPoint.length); // 10
            if ($debug) Debug.write(normalizedPoint.toString()); // (x=6, y=8)
            
            //normalizedPoint.normalize(5);
            //if ($debug) Debug.write(normalizedPoint.length); // 10
            //if ($debug) Debug.write(normalizedPoint.toString()); // (x=3, y=4)

            if ($debug) Debug.write("##################");
            
            var pArrowStart = new flash.geom.Point(100,100);
	        var pArrowEnd = new flash.geom.Point(200,100);
	        
	        var obj = new lz.drawViewNew(canvas);
	        
	        this.drawArrow(obj,pArrowStart,pArrowEnd,4);
        ]]>
    </handler>
    
    <method name="test">
        var p1 = p.normalize(1);
        if ($debug) Debug.write("p1",p1);
        
        var p11 = flash.geom.Point.interpolate(p,pEnd,0.5);
        if ($debug) Debug.write("p11",p11);
        
        
        var p12 = pEnd.subtract(p);
        if ($debug) Debug.write("p12",p12);
        
        
        var pArrowStart = new flash.geom.Point(100,100);
        var pArrowEnd = new flash.geom.Point(200,200);
        
        var obj = new lz.drawViewNew(canvas);
        
        this.drawArrow(obj,pArrowStart,pArrowEnd,4);
        
        pArrowStart = new flash.geom.Point(300,300);
        pArrowEnd = new flash.geom.Point(200,200);
        obj = new lz.drawViewNew(canvas);
        this.drawArrow(obj,pArrowStart,pArrowEnd,20);
        
        pArrowStart = new flash.geom.Point(600,300);
        pArrowEnd = new flash.geom.Point(200,100);
        obj = new lz.drawViewNew(canvas);
        this.drawArrow(obj,pArrowStart,pArrowEnd,20);
        
        var p1 = new flash.geom.Point(-60, -100);
        var p2 = new flash.geom.Point(20, 50);
        var f = 0.5;
        
        var p3 = flash.geom.Point.interpolate(p1,p2,f);
        if ($debug) Debug.write("p3",p3);
    </method>
    
    <method name="drawArrow" args="graphics,start,end,thickness">
        <![CDATA[
    //(graphics:Graphics,
    //            start:Point,end:Point,
    //            style:Object=null):void {
            
            if (start.equals(end)) return;
            
            
            var arrowStyle = {'shaftControlPosition':0.5,
                    'shaftControlSize':0.5,
                    'headLength':thickness*5, //Pixel Length of arrow head
                    'headWidth':thickness*5,//Relative width of arrow head
                    'edgeControlPosition':0.5,
                    'edgeControlSize':0.5,
                    'shaftPosition':0,
                    'shaftThickness':thickness
                    };
            
            var fullVect:Point = end.subtract(start);
            var halfWidth:Number = (arrowStyle.headWidth != -1) ? arrowStyle.headWidth/2 : arrowStyle.headLength/2; 
            
            //Figure out the line start/end points
            var startNorm = new flash.geom.Point(fullVect.y,-fullVect.x);
            startNorm.normalize(arrowStyle.shaftThickness/2);
            var start1 = start.add(startNorm);
            var start2 = start.subtract(startNorm);
            var end1 = end.add(startNorm);
            var end2 = end.subtract(startNorm);
            
            //if ($debug) Debug.write("startNorm: ",startNorm.toString());
            //if ($debug) Debug.write("start1: ",start1.toString());
            //if ($debug) Debug.write("start2: ",start2.toString());
            //if ($debug) Debug.write("end1: ",end1.toString());
            //if ($debug) Debug.write("end2: ",end2.toString());
            
            //figure out where the arrow head starts
            var headPnt = fullVect.clone();
            //if ($debug) Debug.write("headPnt 1: ",headPnt.toString());
            //if ($debug) Debug.write("headPnt.length 1: ",headPnt.length);
            //if ($debug) Debug.write("arrowStyle.headLength 1: ",arrowStyle.headLength);
            headPnt.normalize(headPnt.length-arrowStyle.headLength);
            //if ($debug) Debug.write("headPnt 2: ",headPnt.toString());
            headPnt = headPnt.add(start);
            //if ($debug) Debug.write("headPnt 3: ",headPnt.toString());
            
            //calculate the arrowhead corners
            var headPntNorm = startNorm.clone();
            //if ($debug) Debug.write("headPntNorm ^^: ",headPntNorm.toString());
            //if ($debug) Debug.write("halfWidth ^^: ",halfWidth);
            headPntNorm.normalize(halfWidth);
            //if ($debug) Debug.write("headPntNorm: ",headPntNorm.toString());
            var edge1 = headPnt.add(headPntNorm);
            var edge2 = headPnt.subtract(headPntNorm);
            
            //if ($debug) Debug.write("edge1: ",edge1.toString());
            //if ($debug) Debug.write("edge2: ",edge2.toString());
            
            //Figure out where the arrow connects the the shaft, then calc the intersections
            var shaftCenter = flash.geom.Point.interpolate(end,headPnt,arrowStyle.shaftPosition);
            //if ($debug) Debug.write("end: ",end.toString());
            //if ($debug) Debug.write("headPnt",headPnt.toString());
            //if ($debug) Debug.write("arrowStyle.shaftPosition: ",arrowStyle.shaftPosition);
            //if ($debug) Debug.write("shaftCenter",shaftCenter.toString());
            var inter1 = this.getLineIntersection(start1,end1,shaftCenter,edge1);
            var inter2 = this.getLineIntersection(start2,end2,shaftCenter,edge2);
            
            //if ($debug) Debug.write("inter1: ",inter1.toString());
            //if ($debug) Debug.write("inter2: ",inter2.toString());
            
            //Figure out the control points
            var edgeCenter = flash.geom.Point.interpolate(end,headPnt,arrowStyle.edgeControlPosition);
            var edgeNorm = startNorm.clone();
            edgeNorm.normalize(halfWidth*arrowStyle.edgeControlSize);
            //if ($debug) Debug.write("halfWidth*arrowStyle.edgeControlSize: "+(halfWidth*arrowStyle.edgeControlSize));
            //if ($debug) Debug.write("edgeNorm: "+edgeNorm.toString());
            var edgeCntrl1 = edgeCenter.add(edgeNorm);
            var edgeCntrl2 = edgeCenter.subtract(edgeNorm);

            //if ($debug) Debug.write("edgeCntrl1: ",edgeCntrl1.toString());
            //if ($debug) Debug.write("edgeCntrl2: ",edgeCntrl2.toString());

            //if ($debug) Debug.write("moveTo: ",start1.x,start1.y);
            //if ($debug) Debug.write("lineTo",inter1.x,inter1.y);
            //if ($debug) Debug.write("lineTo",edge1.x,edge1.y);
            //if ($debug) Debug.write("quadraticCurveTo",edgeCntrl1.x,edgeCntrl1.y,end.x,end.y);
            //if ($debug) Debug.write("quadraticCurveTo",edgeCntrl2.x,edgeCntrl2.y,edge2.x,edge2.y);
            //if ($debug) Debug.write("lineTo",inter2.x,inter2.y);
            //if ($debug) Debug.write("lineTo",start2.x,start2.y);
            //if ($debug) Debug.write("lineTo",start1.x,start1.y);
            
            graphics.moveTo(start1.x,start1.y);
            graphics.lineTo(inter1.x,inter1.y);
            graphics.lineTo(edge1.x,edge1.y);
            graphics.quadraticCurveTo(edgeCntrl1.x,edgeCntrl1.y,end.x,end.y);
            graphics.quadraticCurveTo(edgeCntrl2.x,edgeCntrl2.y,edge2.x,edge2.y);
            graphics.lineTo(inter2.x,inter2.y);
            graphics.lineTo(start2.x,start2.y);
            graphics.lineTo(start1.x,start1.y);
            
            graphics.strokeStyle = 0x000000;
            graphics.stroke();

            graphics.fillStyle = 0x000000;
            graphics.fill();
        ]]>
    </method>
    
    <method name="getLineIntersection" args="a1,a2,b1,b2">
        <![CDATA[ 
        
            //calculate directional constants
            var k1 = (a2.y-a1.y) / (a2.x-a1.x);
            var k2 = (b2.y-b1.y) / (b2.x-b1.x);
            
            // if the directional constants are equal, the lines are parallel,
            // meaning there is no intersection point.
            if( k1 == k2 ) return null;
            
            var x = 0;
            var y = 0;
            var m1 = 0;
            var m2 = 0;
            
            //if ($debug) Debug.write("k1",k1);
            //if ($debug) Debug.write("k2",k2);
            
            // an infinite directional constant means the line is vertical
            if( !isFinite(k1) ) {
                
                //if ($debug) Debug.write("k1 ^^ 0");
                //if ($debug) Debug.write("k2",k2,(b2.y-b1.y));
                //if ($debug) Debug.write("b1.getY(): "+b1.y);
                //if ($debug) Debug.write("b2.getY(): "+b2.y);
                // so the intersection must be at the x coordinate of the line
                x = a1.x;
                m2 = b1.y - k2 * b1.x;
                //if ($debug) Debug.write("m2",m2);
                y = k2 * x + m2;
                //if ($debug) Debug.write("y",y);
                
            // same as above for line 2
            } else if ( !isFinite(k2) ) {
                
                //if ($debug) Debug.write("k2 ^ 0");
                
                m1 = a1.y - k1 * a1.x;
                x = b1.x;
                y = k1 * x + m1;

            // if neither of the lines are vertical
            } else {
                
                //if ($debug) Debug.write("neither");
            
                m1 = a1.y - k1 * a1.x;
                m2 = b1.y - k2 * b1.x;              
                x = (m1-m2) / (k2-k1);
                y = k1 * x + m1;
                
            }
            
            return new flash.geom.Point(x,y);
        ]]>
    </method>
    
    <method name="intermediatePoint" args="p1,p2,f">
        <![CDATA[
            
            var d = Math.sqrt( Math.abs(p1.x - p2.x)^2 + Math.abs(p2.y - p2.y)^2 );
        
        ]]>
    </method>
    
</drawview>
  
    
</canvas>
