/*
*    Copyright [2011] [wisemapping]
*
*   Licensed under WiseMapping Public License, Version 1.0 (the "License").
*   It is basically the Apache License, Version 2.0 (the "License") plus the
*   "powered by wisemapping" text requirement on every single page;
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the license at
*
*       http://www.wisemapping.org/license
*
*   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.
*/

web2d.peer.svg.ArrowPeer = function()
{
    var svgElement = window.document.createElementNS(this.svgNamespace, 'path');
    web2d.peer.svg.ElementPeer.call(this, svgElement);
    this._style={};
    this._controlPoint=new core.Point();
    this._fromPoint = new core.Point();
};

objects.extend(web2d.peer.svg.ArrowPeer, web2d.peer.svg.ElementPeer);

web2d.peer.svg.ArrowPeer.prototype.setFrom = function(x,y)
{
    this._fromPoint.x = x;
    this._fromPoint.y = y;
    this._redraw();
};

web2d.peer.svg.ArrowPeer.prototype.setControlPoint = function (point)
{
    this._controlPoint = point;
    this._redraw();
};

web2d.peer.svg.ArrowPeer.prototype.setStrokeColor = function (color)
{
    this.setStroke(null,null,color, null);
};

web2d.peer.svg.ArrowPeer.prototype.setStrokeWidth = function(width)
{
    this.setStroke(width);
};

web2d.peer.svg.ArrowPeer.prototype.setDashed = function(isDashed, length, spacing){
    if(core.Utils.isDefined(isDashed) && isDashed && core.Utils.isDefined(length) && core.Utils.isDefined(spacing)){
        this._native.setAttribute("stroke-dasharray",length+","+spacing);
    } else {
        this._native.setAttribute("stroke-dasharray","");
    }
};

web2d.peer.svg.ArrowPeer.prototype._updateStyle = function()
{
    var style = "";
    for(var key in this._style){
        style+=key+":"+this._style[key]+" ";
    }
    this._native.setAttribute("style",style);
};

web2d.peer.svg.ArrowPeer.prototype._redraw = function()
{
    var x,y, xp, yp;
        if(this._controlPoint.y == 0)
            this._controlPoint.y=1;
        var y0 = this._controlPoint.y;
        var x0 = this._controlPoint.x;
        var x2=x0+y0;
        var y2 = y0-x0;
        var x3 = x0-y0;
        var y3 = y0+x0;
        var m = y2/x2;
        var mp = y3/x3;
        var l = 6;
        var pow = Math.pow;
        x = (x2==0?0:Math.sqrt(pow(l,2)/(1+pow(m,2))));
        x *=Math.sign(x2);
        y = (x2==0?l*Math.sign(y2):m*x);
        xp = (x3==0?0:Math.sqrt(pow(l,2)/(1+pow(mp,2))));
        xp *=Math.sign(x3);
        yp = (x3==0?l*Math.sign(y3):mp*xp);

    var path = "M"+this._fromPoint.x+","+this._fromPoint.y+" "
                   +"L"+(x+this._fromPoint.x)+","+(y+this._fromPoint.y)
                   +"M"+this._fromPoint.x+","+this._fromPoint.y+" "
                   +"L"+(xp+this._fromPoint.x)+","+(yp+this._fromPoint.y)
            ;
    this._native.setAttribute("d",path);
};

