function BezierPathNode() { }

BezierPathNode.MoveTo = 1;
BezierPathNode.LineTo = 2;
BezierPathNode.CurveTo = 3;
BezierPathNode.ClosePath = 4;

function BezierPath3()
{
	this.data = new Array();
	return this;
}

BezierPath3.prototype = new Object;

BezierPath3.prototype.moveTo = function( x, y, z )
{
	this.data.push( BezierPathNode.MoveTo, x, y, z );
}

BezierPath3.prototype.lineTo = function( x, y, z )
{
	this.data.push( BezierPathNode.LineTo, x, y, z );
}

BezierPath3.prototype.curveTo = function( cp1x, cp1y, cp1z, cp2x, cp2y, cp2z, x, y, z )
{
	this.data.push( BezierPathNode.CurveTo, cp1x, cp1y, cp1z, cp2x, cp2y, cp2z, x, y, z );
}

BezierPath3.prototype.copy = function()
{
}

BezierPath3.prototype.transform = function( t )
{
}

BezierPath3.prototype.transformByCopy = function( t )
{
	var rval = new BezierPath3();
	var i = 0;
	while (i < this.data.length)
	{
		var nodeType = this.data[i];
		switch (nodeType)
		{
		case BezierPathNode.MoveTo:
		case BezierPathNode.LineTo:
			var p = t.transform( this.data[i+1], this.data[i+2], this.data[i+3] );
			rval.data.push( nodeType, p.x, p.y, p.z );
			i += 4;
			break;
		case BezierPathNode.CurveTo:
			var p = t.transform( this.data[i+1], this.data[i+2], this.data[i+3] );
			rval.data.push( nodeType, p.x, p.y, p.z );
			p = t.transform( this.data[i+4], this.data[i+5], this.data[i+6] );
			rval.data.push( p.x, p.y, p.z );
			p = t.transform( this.data[i+7], this.data[i+8], this.data[i+9] );
			rval.data.push( p.x, p.y, p.z );
			i += 10;
			break;
		default:
			break;
		}
	}
	return rval;
}

BezierPath3.prototype.toString = function()
{
	// SVG-format string?
}

BezierPath3.prototype.drawToCanvas = function( c )
{
	this.shadedDraw( c );
}

BezierPath3.prototype.singleShotDraw = function( c )
{
	var i = 0;
	c.beginPath();
	while (i < this.data.length)
	{
		var nodeType = this.data[i];
		switch (nodeType)
		{
		case BezierPathNode.MoveTo:
			c.moveTo( this.data[i+1], this.data[i+2] );
			i += 4;
			break;
		case BezierPathNode.LineTo:
			c.lineTo( this.data[i+1], this.data[i+2] );
			i += 4;
			break;
		case BezierPathNode.CurveTo:
			c.curveTo(
				this.data[i+1], this.data[i+2],
				this.data[i+4], this.data[i+5],
				this.data[i+7], this.data[i+8] );
			i += 10;
			break;
		default:
			return;
		}
	}
	c.stroke();
}

BezierPath3.prototype.shadedDraw = function( c )
{
	var i = 0;
	var p = new Object();
	p.x = 0;
	p.y = 0;
	p.z = 0;
	while (i < this.data.length)
	{
		var nodeType = this.data[i];
		var z = (this.data[i+3] + p.z) / 2;
		c.setStroke( 0, 0, 0, (50 * Math.sqrt(2) - z) / (100 * Math.sqrt(2)) );
		switch (nodeType)
		{
		case BezierPathNode.MoveTo:
			c.beginPath();
			c.moveTo( this.data[i+1], this.data[i+2] );
			c.stroke();
			p.x = this.data[i+1]; p.y = this.data[i+2]; p.z = this.data[i+3];
			i += 4;
			break;
		case BezierPathNode.LineTo:
			c.beginPath();
			c.moveTo( p.x, p.y );
			c.lineTo( this.data[i+1], this.data[i+2] );
			c.stroke();
			p.x = this.data[i+1]; p.y = this.data[i+2]; p.z = this.data[i+3];
			i += 4;
			break;
		case BezierPathNode.CurveTo:
			c.beginPath();
			c.moveTo( p.x, p.y );
			c.curveTo(
				this.data[i+1], this.data[i+2],
				this.data[i+4], this.data[i+5],
				this.data[i+7], this.data[i+8] );
			c.stroke();
			p.x = this.data[i+7]; p.y = this.data[i+8]; p.z = this.data[i+9];
			i += 10;
			break;
		default:
			return;
		}
	}
}
