var RADDEG = Math.PI/180.0;

var Diameter = 12.0;
var Length   = 18.0;
var Width    = 15.0;
var Height   = 12.0;
var Segments = 16;
var Angle = 0.0;
var Radius = Diameter / 2.0;

var Xcircle = new Array ();    // Points around circle
var Ycircle = new Array ();    // Points around circle
var Xflat = new Array ();    // Points around arc
var Yflat = new Array ();    // Points around arc
var Xcorner = new Array ();
var Ycorner = new Array ();
var StepAng = 22.5;

function doit(){
	var SegLen = 0;
	var side1 = 0.0;
	var side2 = 0.0;
	var angle1 = 0.0;
	var angle2 = 0.0;
	var angle3 = 0.0;
	var Xcnr = new Array ();
	var Ycnr = new Array ();
	var i, j;

	Diameter=document.Transition.Diameter.value;
	Length=document.Transition.Length.value;
	Width=document.Transition.Width.value;
	Height=document.Transition.Height.value;
	Segments=document.Transition.nsides.value;
	Radius = Diameter / 2.0;
	Xcnr[1] = Length/2.0;
	Ycnr[1] = Width/2.0;
	Xcnr[2] = -Length/2.0;
	Ycnr[2] = Width/2.0;
	Xcnr[3] = -Length/2.0;
	Ycnr[3] = -Width/2.0;
	Xcnr[4] = Length/2.0;
	Ycnr[4] = -Width/2.0;

	// Calculate points around the circle
	StepAng = 360.0/Segments;
	Angle = 0.0;
	for (i=1; i<=Segments; i++) 
	{
		Xcircle[i] = Radius * Math.cos(Angle*RADDEG);
		Ycircle[i] = Radius * Math.sin(Angle*RADDEG);
		Angle = Angle + StepAng;
	}

	// Calculate length of segments
	SegLen=linelength(Xcircle[1], Ycircle[1], 0, Xcircle[2], Ycircle[2], 0);

	// Find points of the flat
	Xcorner[1] = Xcnr[1];
	Ycorner[1] = 0.0;

	// Top point of first triangle.
	Xflat[1] = 0.0;
	Yflat[1] = linelength(0.0, Height, Ycnr[1], 0.0, 0.0, Ycircle[Segments/4.0+1.0]);

	side1 = linelength(Xcnr[1], -Ycnr[1], Height, Xcircle[Segments*0.75+1.0], Ycircle[Segments*0.75+1.0], 0.0);
	angle1 = Math.acos(Xcnr[1]/side1)/RADDEG;

	//Points around the first corner
	for (i=2; i<=Segments/4+1; i++)
	{
		if(i == Segments/4+1)
			side2 = linelength(Xcnr[1], -Ycnr[1], Height, Xcircle[1], Ycircle[1], 0.0);
		else
			side2 = linelength(Xcnr[1], -Ycnr[1], Height, Xcircle[Segments*0.75+i], Ycircle[Segments*0.75+i], 0.0);
		angle2 = Math.acos(((side1*side1 + side2*side2 - SegLen*SegLen)/ (2.0 * side1 * side2)))/RADDEG;
		Xflat[i] = Xcnr[1]-side2*Math.cos((angle1+angle2)*RADDEG);
		Yflat[i] = side2*Math.sin((angle1+angle2)*RADDEG);
		angle1 = angle1 + angle2;
		side1 = side2;
	}

	//Calculate the end point of second large triangle
	angle3 = Math.acos(Width*Width/ (2.0 * side1 * Width))/RADDEG;
	Xcorner[2] = Xcnr[1] + Width * Math.cos((180-(angle1+angle3))*RADDEG);
	Ycorner[2] = Width * Math.sin((180-(angle1+angle3))*RADDEG);

	angle1 = angle1 + angle3 - (180 - angle3);

	//Points around the second corner
	for (i=Segments/4+2; i<=Segments/2+1; i++)
	{
		side2 = linelength(Xcnr[1], Ycnr[1], Height, Xcircle[(i-Segments/4)], Ycircle[(i-Segments/4)], 0.0);
		angle2 = Math.acos(((side1*side1 + side2*side2 - SegLen*SegLen)/ (2.0 * side1 * side2)))/RADDEG;
		Xflat[i] = Xcorner[2]-side2*Math.cos((angle1+angle2)*RADDEG);
		Yflat[i] = Ycorner[2]+side2*Math.sin((angle1+angle2)*RADDEG);
		angle1 = angle1 + angle2;
		side1 = side2;
	}

	//Calculate outside corner point
	angle3 = Math.acos(Xcnr[1]/side1)/RADDEG;
	Xcorner[3] = Xcorner[2] + Xcnr[1] * Math.cos((180-(angle1+angle3))*RADDEG);
	Ycorner[3] = Ycorner[2] + Xcnr[1] * Math.sin((180-(angle1+angle3))*RADDEG);

	// Write the DXF file
	var w = window.frames.w;
	if( !w )
	{
		w = document.createElement( 'iframe' );
		w.id = 'w';
		w.style.display = 'none';
		document.body.insertBefore( w );
		w = window.frames.w;
		if( !w )
		{
			w = window.open( '', '_temp', 'width=100,height=100' );
			if( !w )
			{
				window.alert( 'Sorry, could not create file.' ); return false;
			}
		}
	}

	var d = w.document,
	ext = "utf-8",//  ext = "utf-8",
	name = "transition.txt";

	d.open( 'text/plain', 'replace' );
	d.charset = ext;

	// Write header data to file
	d.write( "  0\nSECTION\n  2\nHEADER\n  0\nENDSEC\n  0\nSECTION\n  2\nTABLES\n  0\nENDSEC\n  0\nSECTION\n  2\nBLOCKS\n  0\nENDSEC\n  0\nSECTION\n  2\nENTITIES\n" );

	// Write lines around circle to file
	for (i=1; i<=Segments; i++) 
	{
		d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+Xcircle[i]+"\n 20\n"+Ycircle[i]+"\n 30\n"+Height+"\n" );
		if(i == Segments)
		{
			d.write( " 11\n"+Xcircle[1]+"\n 21\n"+Ycircle[1]+"\n 31\n"+Height+"\n" );
		}
		else
		{
			d.write( " 11\n"+Xcircle[i+1]+"\n 21\n"+Ycircle[i+1]+"\n 31\n"+Height+"\n" );
		}
	}

	//Write four lines around the base
	d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcnr[1]+"\n 20\n"+Ycnr[1]+"\n 30\n0.0\n" );
	d.write( " 11\n"+Xcnr[2]+"\n 21\n"+Ycnr[2]+"\n 31\n0.0\n" );

	d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcnr[2]+"\n 20\n"+Ycnr[2]+"\n 30\n0.0\n" );
	d.write( " 11\n"+Xcnr[3]+"\n 21\n"+Ycnr[3]+"\n 31\n0.0\n" );

	d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcnr[3]+"\n 20\n"+Ycnr[3]+"\n 30\n0.0\n" );
	d.write( " 11\n"+Xcnr[4]+"\n 21\n"+Ycnr[4]+"\n 31\n0.0\n" );

	d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcnr[4]+"\n 20\n"+Ycnr[4]+"\n 30\n0.0\n" );
	d.write( " 11\n"+Xcnr[1]+"\n 21\n"+Ycnr[1]+"\n 31\n0.0\n" );

	//Write the bend lines
	for (i=1; i<5; i++)
	{
		for (j=1+(i-1)*Segments/4; j<=i*Segments/4+1; j++)
		{
			d.write( "  0\nLINE\n  8\n3D Model\n  6\nCONTINUOUS\n 62\n1\n" );
			d.write( " 10\n"+Xcnr[i]+"\n 20\n"+Ycnr[i]+"\n 30\n0.0\n" );
			if (j == (1.0*Segments+1.0))
			{
				d.write( " 11\n"+Xcircle[1]+"\n 21\n"+Ycircle[1]+"\n 31\n"+Height+"\n" );
			}
			else
			{
				d.write( " 11\n"+Xcircle[j]+"\n 21\n"+Ycircle[j]+"\n 31\n"+Height+"\n" );
			}
		}
	}

	//Write the flat pattern

	// Bottom of Front Triangle
	d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcorner[1]+"\n 20\n"+Ycorner[1]+"\n 30\n0.0\n" );
	d.write( " 11\n"+(-Xcorner[1])+"\n 21\n"+Ycorner[1]+"\n 31\n0.0\n" );

	// Bottom edges
	for (i=1; i<3; i++)
	{
		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+Xcorner[i]+"\n 20\n"+Ycorner[i]+"\n 30\n0.0\n" );
		d.write( " 11\n"+Xcorner[i+1]+"\n 21\n"+Ycorner[i+1]+"\n 31\n0.0\n" );

		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+(-Xcorner[i])+"\n 20\n"+Ycorner[i]+"\n 30\n0.0\n" );
		d.write( " 11\n"+(-Xcorner[i+1])+"\n 21\n"+Ycorner[i+1]+"\n 31\n0.0\n" );
	}

	//Write Bend Lines
	for (i=1; i<=Segments/4+1; i++)
	{
		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+Xcorner[1]+"\n 20\n"+Ycorner[1]+"\n 30\n0.0\n" );
		d.write( " 11\n"+Xflat[i]+"\n 21\n"+Yflat[i]+"\n 31\n0.0\n" );

		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+(-Xcorner[1])+"\n 20\n"+Ycorner[1]+"\n 30\n0.0\n" );
		d.write( " 11\n"+(-Xflat[i])+"\n 21\n"+Yflat[i]+"\n 31\n0.0\n" );
	}

	for (i=Segments/4+1; i<=Segments/2+1; i++)
	{
		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+Xcorner[2]+"\n 20\n"+Ycorner[2]+"\n 30\n0.0\n" );
		d.write( " 11\n"+Xflat[i]+"\n 21\n"+Yflat[i]+"\n 31\n0.0\n" );

		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+(-Xcorner[2])+"\n 20\n"+Ycorner[2]+"\n 30\n0.0\n" );
		d.write( " 11\n"+(-Xflat[i])+"\n 21\n"+Yflat[i]+"\n 31\n0.0\n" );
	}

	//Write lines around the arc
	for (i=1; i<=Segments/2; i++)
	{
		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+Xflat[i]+"\n 20\n"+Yflat[i]+"\n 30\n0.0\n" );
		d.write( " 11\n"+Xflat[i+1]+"\n 21\n"+Yflat[i+1]+"\n 31\n0.0\n" );

		d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
		d.write( " 10\n"+(-Xflat[i])+"\n 20\n"+Yflat[i]+"\n 30\n0.0\n" );
		d.write( " 11\n"+(-Xflat[i+1])+"\n 21\n"+Yflat[i+1]+"\n 31\n0.0\n" );
	}

	// Close the ends of the flat
	d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+Xcorner[3]+"\n 20\n"+Ycorner[3]+"\n 30\n0.0\n" );
	d.write( " 11\n"+Xflat[Segments/2+1]+"\n 21\n"+Yflat[Segments/2+1]+"\n 31\n0.0\n" );

	d.write( "  0\nLINE\n  8\nFlat Pattern\n  6\nCONTINUOUS\n 62\n1\n" );
	d.write( " 10\n"+(-Xcorner[3])+"\n 20\n"+Ycorner[3]+"\n 30\n0.0\n" );
	d.write( " 11\n"+(-Xflat[Segments/2+1])+"\n 21\n"+Yflat[Segments/2+1]+"\n 31\n0.0\n" );

	//Write end of file codes
	d.write( "  0\nENDSEC\n  0\nEOF\n" );
	d.close();

	if( d.execCommand( 'SaveAs', null, name ) )
	{
		window.alert( 'The file has been saved.\n\nPlease rename it to .DXF' );
	}
	else 
	{
		window.alert( 'The file has not been saved.\nIs there a problem?' );
	}
	w.close();

}

function numcheck(fieldValue, str) {
	<!--checking that the values are numbers--> 
	var numCheck = isNaN (fieldValue); 
	if (numCheck==true) { 
		alert(str); 
		return false; 
	} 
} 

function linelength(X1, Y1, Z1, X2, Y2, Z2)
{
	//Calculate the length of a 3d line
	return Math.sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)+(Z1-Z2)*(Z1-Z2));
}
