import  java.awt.*;
import  java.applet.*;

public class StageCoach extends java.applet.Applet
{
	MapList MapHead;
	public void init()
	{
			
		BuildMap();
		setBackground(Color.white);
	}

	private void BuildMap()
	{
		//new MAPLIST  -------->NAME, xPOS, yPOS
		//addConnection-------->FROM, TO, COST
		//Add each of the nodes and the connections
		MapList NewMapList;
		MapHead = new MapList( "A", 0, 85);
		MapHead.addConnection( "A", "B", 2);
		MapHead.addConnection( "A", "C", 4);

		NewMapList = MapHead.addMapListNode( "B", 100, 0 );
		NewMapList.addConnection( "B", "A", 2 );
		NewMapList.addConnection( "B", "C", 1 );
		NewMapList.addConnection( "B", "D", 3 );
		NewMapList.addConnection( "B", "E", 1 );

		NewMapList = MapHead.addMapListNode( "C", 100, 170 );
		NewMapList.addConnection( "C", "A", 4 );
		NewMapList.addConnection( "C", "B", 1 );
		NewMapList.addConnection( "C", "E", 3 );
		NewMapList.addConnection( "C", "F", 1 );

		NewMapList = MapHead.addMapListNode( "D", 200, 0 );
		NewMapList.addConnection( "D", "B", 3 );
		NewMapList.addConnection( "D", "G", 1 );
		NewMapList.addConnection( "D", "H", 4 );
		
		NewMapList = MapHead.addMapListNode( "E", 200, 85 );
		NewMapList.addConnection( "E", "B", 1 );
		NewMapList.addConnection( "E", "C", 3 );
		NewMapList.addConnection( "E", "H", 4 );
		
		NewMapList = MapHead.addMapListNode( "F", 200, 170 );
		NewMapList.addConnection( "F", "C", 1 );
		NewMapList.addConnection( "F", "H", 2 );
		
		NewMapList = MapHead.addMapListNode( "G", 300, 0 );
		NewMapList.addConnection( "G", "D", 1 );
		NewMapList.addConnection( "G", "H", 1 );
		
		NewMapList = MapHead.addMapListNode( "H", 300, 170 );
		NewMapList.addConnection( "H", "D", 4 );
		NewMapList.addConnection( "H", "E", 4 );
		NewMapList.addConnection( "H", "F", 2 );
		NewMapList.addConnection( "H", "G", 1 );

	}
	private void DrawMap( Graphics g)
	{
		MapList MapNodeToDraw = MapHead;
		ConnectionList ConnectionToDraw;
		MapList MapNodeToDrawTo;
		
		while( MapNodeToDraw != null ){
	  		
			g.fillOval( MapNodeToDraw.xPos, MapNodeToDraw.yPos, 30, 30 );
			ConnectionToDraw = MapNodeToDraw.connections;
			while( ConnectionToDraw != null ){
				MapNodeToDrawTo = MapHead.findMapNode ( ConnectionToDraw.toNode);
				g.drawLine( MapNodeToDraw.xPos + 15, MapNodeToDraw.yPos + 15, MapNodeToDrawTo.xPos + 15, MapNodeToDrawTo.yPos + 15 );
				g.drawString ( Integer.toString( ConnectionToDraw.cost ), ( MapNodeToDraw.xPos + MapNodeToDrawTo.xPos ) / 2 + 15 , ( MapNodeToDraw.yPos + MapNodeToDrawTo.yPos ) / 2 + 15 );
				ConnectionToDraw = ConnectionToDraw.next;
			}
			g.setColor ( Color.white );
			g.drawString ( MapNodeToDraw.name, MapNodeToDraw.xPos + 15, MapNodeToDraw.yPos + 15 );
			g.setColor ( Color.black );
			MapNodeToDraw = MapNodeToDraw.next;
		}

	}

	public void paint ( Graphics g )
	{
		DrawMap( g );
		g.drawString( "SOLVE: " + getParameter( "fromnode" ) + " TO " + getParameter( "tonode" ) , 10, 10);
				
		int LeastCost;
		SolutionList LeastCostPath;
		LeastCostPath = MapHead.Solve( getParameter( "fromnode" ), getParameter( "tonode" ), g, null, MapHead, MapHead.connections );
		showStatus ("Done!");
		if ( LeastCostPath == null ){
			g.drawString( "null  0", 0, 20);
			LeastCost = 0;
		}
		else{
			LeastCost = LeastCostPath.TotalCost();
			g.drawString( "FINISHED!", 10, 20);
			g.drawString( "LEAST COST:" + Integer.toString( LeastCost ), 10, 30);
			g.setColor( Color.green );
			LeastCostPath.drawlist( g, MapHead );
		}
		
	}

}