/*
 * sierpinski_triangle.js
 *
 * Copyright (C) 2009
 * Packetizer, Inc.
 *
 */

function DrawPoint(canvas, x, y, color)
{
    var point = document.createElement("div");

    // Make sure the point is on the canvas
    if ((x < 0) || (y < 0) ||
        (x > canvas.clientWidth - 1) || (y > canvas.clientHeight - 1))
    {
        return;
    }

    point.style.left = x + "px";
    point.style.top = y + "px";
    point.style.position = "absolute";
    point.style.width = "1px";
    point.style.height = "1px";
    point.style.borderTop = "1px solid";
    point.style.borderTopColor = color;
    canvas.appendChild(point);
}

/*
 * DrawNextSierpinskiTrianglePoint
 *
 * This routine will draw a single point in the triangle.
 */
function DrawNextSierpinskiTrianglePoint(triangle)
{
    var i;

    i = Math.floor(Math.random()*6)+1;  // Random number in range 1..6

    switch(i)
    {
        case 1:
        case 2:
            triangle.x = (triangle.x + (triangle.canvas.clientWidth/2)) / 2;
            triangle.y = triangle.y / 2;
            break;
        case 3:
        case 4:
            triangle.x = triangle.x / 2;
            triangle.y = (triangle.y + triangle.canvas.clientHeight) / 2;
            break;
        case 5:
        case 6:
            triangle.x = (triangle.x + triangle.canvas.clientWidth) / 2;
            triangle.y = (triangle.y + triangle.canvas.clientHeight) / 2;
    }

    DrawPoint(triangle.canvas, triangle.x, triangle.y, triangle.color);
}

/*
 * DrawSierpinskiTriangle
 *
 * This function will initiate the drawing routine.  It accepts the ID
 * of a <div> into which the triangle is drawn.  The <div> must have
 * appropriate height and width assignments.  The <div> must also
 * have a 'position' property of something other than 'static'.
 */
function DrawSierpinskiTriangle(canvas_name, points, color)
{
    var canvas = null;

    canvas = document.getElementById(canvas_name);
    if (canvas != null)
    {
        var triangle = new Object();
        triangle.canvas = canvas;
        triangle.initial_points = points;
        triangle.points = points;
        triangle.color = color;
        triangle.x = canvas.clientWidth / 2;
        triangle.y = 0;
        triangle.DrawNextPoint = function()
        {
            var i;
            for(i=0; i<30; i++)
            {
                DrawNextSierpinskiTrianglePoint(triangle);
                if (triangle.points-- == 0)
                {
                    // Triangle is drawn... let's start over :-)
                    canvas.innerHTML = "";
                    triangle.points = triangle.initial_points;
                    break;
                }
            }
        }
        triangle.interval = setInterval(triangle.DrawNextPoint, 200);
    }
}

