# Source: objects/Graph.js

    import {Object2D} from "../Object2D.js";
    import {Vector2} from "../math/Vector2.js";
    import {Box2} from "../math/Box2.js";

    /**
     * Graph object is used to draw simple graph data into the canvas.
     *
     * Graph data is composed of X, Y values.
     *
     * @class
     * @extends {Object2D}
     */
    function Graph()
    {
    	Object2D.call(this);

    	/**
    	 * Graph object containing the size of the object.
    	 */
    	this.box = new Box2(new Vector2(-50, -35), new Vector2(50, 35));

    	/**
    	 * Color of the box border line.
    	 */
    	this.strokeStyle = "rgb(0, 153, 255)";

    	/**
    	 * Line width.
    	 */
    	this.lineWidth = 1;

    	/**
    	 * Background color of the box.
    	 */
    	this.fillStyle = "rgba(0, 153, 255, 0.3)";

    	/**
    	 * Minimum value of the graph.
    	 */
    	this.min = 0;

    	/**
    	 * Maximum value of the graph.
    	 */
    	this.max = 10;

    	/**
    	 * Data to be presented in the graph.
    	 *
    	 * The array should store numeric values.
    	 */
    	this.data = [];
    }

    Graph.prototype = Object.create(Object2D.prototype);
    Graph.prototype.constructor = Graph;
    Graph.prototype.type = "Graph";
    Object2D.register(Graph, "Graph");

    Graph.prototype.isInside = function(point)
    {
    	return this.box.containsPoint(point);
    };

    Graph.prototype.draw = function(context, viewport, canvas)
    {
    	if(this.data.length === 0)
    	{
    		return;
    	}

    	var width = this.box.max.x - this.box.min.x;
    	var height = this.box.max.y - this.box.min.y;

    	context.lineWidth = this.lineWidth;
    	context.strokeStyle = this.strokeStyle;
    	context.beginPath();

    	var step = width / (this.data.length - 1);
    	var gamma = this.max - this.min;

    	context.moveTo(this.box.min.x, this.box.max.y - ((this.data[0] - this.min) / gamma) * height);

    	for(var i = 1, s = step; i < this.data.length; s += step, i++)
    	{
    		context.lineTo(this.box.min.x + s, this.box.max.y - ((this.data[i] - this.min) / gamma) * height);
    	}

    	context.stroke();

    	if(this.fillStyle !== null)
    	{
    		context.fillStyle = this.fillStyle;

    		context.lineTo(this.box.max.x, this.box.max.y);
    		context.lineTo(this.box.min.x, this.box.max.y);
    		context.fill();
    	}
    };

    Graph.prototype.serialize = function(recursive)
    {
    	var data = Object2D.prototype.serialize.call(this, recursive);

    	data.box = this.box.toArray();
    	data.strokeStyle = this.strokeStyle;
    	data.lineWidth = this.lineWidth;
    	data.fillStyle = this.fillStyle;
    	data.min = this.min;
    	data.max = this.max;
    	data.data = this.data;

    	return data;
    };

    Graph.prototype.parse = function(data, root)
    {
    	Object2D.prototype.parse.call(this, data, root);

    	this.box.fromArray(data.box);
    	this.strokeStyle = data.strokeStyle;
    	this.lineWidth = data.lineWidth;
    	this.fillStyle = data.fillStyle;
    	this.min = data.min;
    	this.max = data.max;
    	this.data = data.data;
    };

    export {Graph};