


Graphics = new function()
{
  var _pre = null;
	
	var _post = null;
	
  var _canvas = null;
	
	var Color1 = "61AEF1";
			
	var Color2 = "9B9B9B";
	
	var isClear = false;

	
  return{
	

	
	  ClearGraphics: function()
		{
		  try{
			
	      _pre.clear();
  			_post.clear();
				isClear = true;
				
			}catch(err){ Log.Add("Graphics.ClearGraphics", err, LogType.Error);}				
		},
		
		
		Initialize: function(PreProcessCanvasDivID, PostProcessCanvasDivID)
		{
		  try{
		  
  			_pre = PrepareCanvas(PreProcessCanvasDivID);
	 		
  	    _post = PrepareCanvas(PostProcessCanvasDivID);

			}catch(err){ Log.Add("Graphics.Initialize", err, LogType.Error);}				
		},

		
    Point: function(X, Y)
    {
      this.X = X;
      this.Y = Y;
    },
		
		
		ReDraw: function()
		{
		  try{
			
			  if(RulesMaker.GetSelected().length > 0)
				{
				  if(!isClear)
					  Graphics.ClearGraphics();

				  return;
				}


  			
  			// draw white between old entry and exit
  			var ctrl = IconMover.Ctrl;
  		  
  			var Lines = new Array();
  
  			var i = 0;
  			
  			if(IconMover.From != null)
  			{
  			  var c = (IconMover.FromJ1 ? Color1 : Color2);
  			  Lines[i] = new Line(IconMover.From, ctrl.OldEntry);
  				i++;
  			}
  				
  			if(IconMover.J1 != null)
        {
  			  Lines[i] = new Line(ctrl.OldExit, IconMover.J1);
  				i++;
  			}
  			
  			if(IconMover.J2 != null)
        {
  			  Lines[i] = new Line(ctrl.OldExit, IconMover.J2);
  				i++;
  			}		
  			
  			DrawLines(Lines, "white");
  			
  			// reset old points draw the new lines
  			ctrl.OldEntry = ctrl.GetIcon().GetEntryPoint();
  
  			ctrl.OldExit = ctrl.GetIcon().GetExitPoint();
  
  			var Lines = new Array();
  			var i = 0;
  			
  			if(IconMover.From != null)
  			{
  			  var c = (IconMover.FromJ1 ? Color1 : Color2);			
  			  Lines[i] = new Line(IconMover.From, ctrl.OldEntry, c);
  				i++;
  			}
  				
  			if(IconMover.J1 != null)
        {
  			  Lines[i] = new Line(ctrl.OldExit, IconMover.J1, Color1);
  				i++;
  			}
  			
  			if(IconMover.J2 != null)
        {
  			  Lines[i] = new Line(ctrl.OldExit, IconMover.J2, Color2);
  				i++;
  			}	
  			
  			DrawLines(Lines);	
  			
  			_canvas.paint();						
			
			}catch(err){ Log.Add("Graphics.ReDraw", err, LogType.Error);}			
		},
		
		

		Refresh: function()
    {
		  try{
			
			  if(_canvas == null)
				{
				  Log.Add("Graphics.Refresh", "Attempting to refresh a null canvas", LogType.Warning);
					return;
				}
				
				if(RuleXML.CurrentProcess == null || RuleXML.CurrentProcess == "")
				  return;

				AlignCanvas(RuleXML.CurrentProcess);
				
				_canvas.clear();
				
				var Lines = new Array();
				
				$("#" + RuleXML.CurrentProcess).find(".icon").each(function(){
				 
				  var id = $(this).attr("id");
					
					var ctrl = RuleStorage.GetComponent(id);

					GetLines(ctrl, Lines);
				});
				
				DrawLines(Lines);
				
				_canvas.paint();		  

			}catch(err){ Log.Add("Graphics.Refresh", err, LogType.Error);}
    },
		
		
		// called from RulesMaker SetCurrentProcess method which is called when the pre or post tab is clicked
		SetCurrentProcess: function(CurrentProcessDivID)
		{
		  try{
			
  		  if(CurrentProcessDivID == "preproc")
  			  _canvas = _pre;
  		  else
  			  _canvas = _post;
  				
  			setTimeout("Graphics.Refresh()", 100); // gives the div time to display and refreshes once ready 

 			}catch(err){ Log.Add("Graphics.SetCurrentProcess", err, LogType.Error);}
		}


  }
	
	// draws lines without diagonals
	function DrawLines(Lines, Color)
	{
	  try{
		
		  isClear = false;

		  if(Color != null)
    		_canvas.setColor(Color);
				
      _canvas.setStroke(2);	
							
    	var arm = 10;	
			
			var d = arm;
				
  		var tr = 4;				
  	
  	  for(var i = 0; i<Lines.length; i++)
  		{
  		  var Line = Lines[i];
  			
				if(Line.Color != null)
  				_canvas.setColor(Line.Color);
				
				// A - B				
				_canvas.drawLine(Line.Start.X, Line.Start.Y, Line.Start.X, Line.Start.Y + arm);
 
        var factor = (Line.Stop.X - Line.Start.X) / 2;
				
				if((factor == 0) && (Line.Stop.Y <= Line.Start.Y ))
				  factor = -20;

 				// B - C
				_canvas.drawLine(Line.Start.X, Line.Start.Y + arm, Line.Start.X + factor, Line.Start.Y + arm );
				
				// C - D
				_canvas.drawLine(Line.Start.X + factor, Line.Start.Y + arm, Line.Start.X + factor, Line.Stop.Y - arm );
				
				// D - E
				_canvas.drawLine(Line.Start.X + factor, Line.Stop.Y - arm, Line.Stop.X, Line.Stop.Y - arm );

				// E - F				
				_canvas.drawLine(Line.Stop.X, Line.Stop.Y - arm, Line.Stop.X, Line.Stop.Y );										
				
				// arrows
				var x = [Line.Stop.X, Line.Stop.X - tr, Line.Stop.X + tr, Line.Stop.X]; 
				
				var y = [Line.Stop.Y, Line.Stop.Y - tr, Line.Stop.Y - tr, Line.Stop.Y];
				
				_canvas.fillPolygon(x, y);
				
  		}
		
  	}catch(err){ Log.Add("Graphics.DrawLines", err, LogType.Error);}	
  }

	// draws lines using diagonals
	function DiagonalDrawLines(Lines, Color)
	{
	  try{

		  if(Color != null)
    		_canvas.setColor(Color);
				
      _canvas.setStroke(2);	
							
    	var arm = 10;	
			
			var d = arm;
				
  		var tr = 4;				
  	
  	  for(var i = 0; i<Lines.length; i++)
  		{
  		  var Line = Lines[i];
  			
				if(Line.Color != null)
  				_canvas.setColor(Line.Color);
								
				_canvas.drawLine(Line.Start.X, Line.Start.Y, Line.Start.X, Line.Start.Y + arm);				// arm down from bottom
				
				_canvas.drawLine(Line.Start.X, Line.Start.Y + arm, Line.Stop.X, Line.Stop.Y - arm);   // the main length
				
				_canvas.drawLine(Line.Stop.X, Line.Stop.Y - arm, Line.Stop.X, Line.Stop.Y - tr);			// arm up from top
				
				var x = [Line.Stop.X, Line.Stop.X - tr, Line.Stop.X + tr, Line.Stop.X];								// arrow 
				
				var y = [Line.Stop.Y, Line.Stop.Y - tr, Line.Stop.Y - tr, Line.Stop.Y];								// arrow
				
				_canvas.fillPolygon(x, y);
				
  		}
		
  	}catch(err){ Log.Add("Graphics.DrawLines", err, LogType.Error);}	
  }


	// called during initialize to prepare the canvas
	function PrepareCanvas(ContainerID)
	{
	  try{
		
      var _canvas = new jsGraphics(ContainerID + "canvas");
  
  	  _canvas.clear();
  		
  		return _canvas;
		
    }catch(err){ Log.Add("Graphics.PrepareCanvas", err, LogType.Error);}
	  
	}
	
	function AlignCanvas(ContainerID)
	{
	  try{
		
			if(ContainerID == null || ContainerID == "")
			  return;
		
  		var _componentDiv = $("#" + ContainerID);
  
  		var _canvasDiv = $("#" + ContainerID + "canvas");
  		
			if(_canvasDiv.height() == null)
			  return;
			
  		_componentDiv.css("margin-top", (Utilities.ToNumber(_canvasDiv.height()) * -1) );
			
    }catch(err){ Log.Add("Graphics.AlignCanvas", err, LogType.Error);}			
	}
	
	
	function GetLines(Component, Lines)
	{
	  try{
		
		  if(!Component.GetJ1)
			  return;
		
		  var j = new Array();
			j[0] = Component.GetJ1();
	
			if(Component.GetJ2 != null)
  			j[1] = Component.GetJ2();
		
      for(i=0; i<2; i++)
			{
  			if(j[i] != "")
  			{
  
  			  var called = RuleStorage.GetComponent(parseInt(j[i]));
					
					if(called != null)
  				{
    				var start = Component.GetIcon().GetExitPoint();
  				
    				var stop = called.GetIcon().GetEntryPoint();
  				
		  			var color = (i==0 ? Color1 : Color2);
					
			  		Lines[Lines.length] = new Line(start, stop, color);

					}
  			}
			}
			
    }catch(err){ Log.Add("Graphics.GetLines", err, LogType.Error);}

	}
	
	
	
	function Line(Start, Stop, Color)
	{
	  this.Start = Start;
		this.Stop = Stop;
		this.Color = Color;
	}

	
	



}
