public void Draw_Local_Network(int StartID)
        {
            string SQL, SQLOuter;
            string thisnodename;
            int node_id;
            OleDbCommand aLocal;
            OleDbCommand aLocalOuter;
            OleDbDataReader aReaderLocal;
            OleDbDataReader aReaderOuter;

            int rowcount = 0;

            double looper = 0;
            double xx2, yy2;
            double cx, cy;

            double size;
            double r;
            cx = 725;
            cy = 475;
            r = 33 * 10;
            double inc;

            double fromx, tox, fromy, toy;
            int duration = 1000;

            Repository localengine = new Repository();

            localengine.Open_Repository();

            // Draw the Central Point...
            PadPoint p = new PadPoint();
            p.Render(_FieldBackground, 725, 475, 20, StartID, "CenterName");

            Label nodecenter = new Label();
            nodecenter.Content = "Center";
            nodecenter.Foreground = new SolidColorBrush(Colors.White);
            nodecenter.FontSize = 12;
            _FieldBackground.Children.Add(nodecenter);
            Canvas.SetLeft(nodecenter, 735);
            Canvas.SetTop(nodecenter, 510);

            // How many records...
            SQL = "select n.ID, n.NodeName from edges e, nodes n where e.FromID = " + StartID.ToString() + " and e.ToID = n.ID";
            aLocal = new OleDbCommand(SQL, localengine.RepositoryConnection);
            //create the datareader object to connect to table
            aReaderLocal = aLocal.ExecuteReader();


            //Iterate throuth the database
            while (aReaderLocal.Read())
            {
                rowcount++;
            }
            aReaderLocal.Close();

            // Now, look backward the other way
            SQLOuter = "select n.ID, n.NodeName from edges e, nodes n where e.ToID = " + StartID.ToString() + " and e.FromID = n.ID";
            aLocalOuter = new OleDbCommand(SQLOuter, localengine.RepositoryConnection);
            aReaderOuter = aLocalOuter.ExecuteReader();
            while (aReaderOuter.Read())
            {
                rowcount++;
            }
            aReaderOuter.Close();

            // Base the spacing on the circle with how many relationships we found...
            inc = (6.4 / (rowcount));

            try
            {
                //create the datareader object to connect to table
                aReaderLocal = aLocal.ExecuteReader();


                //Iterate throuth the database
                while (aReaderLocal.Read())
                {
                    node_id = aReaderLocal.GetInt32(0);
                    thisnodename = aReaderLocal.GetString(1);

                    PadPoint p2 = new PadPoint();
                    xx2 = r * Math.Cos(looper);
                    yy2 = r * Math.Sin(looper);
                    xx2 = xx2 + cx;
                    yy2 = yy2 + cy;
                    size = 10;
                    p2.Render(_FieldBackground, 725, 460, size, node_id, thisnodename);

                    fromx = 725;
                    tox = xx2;
                    fromy = 460;
                    toy = yy2;
                    Animator.AnimatePenner(p2.Padback, Canvas.TopProperty, Tween.Equations.CubicEaseIn, fromy, toy, duration, OnAnimationComplete, OnAnimationComplete);
                    Animator.AnimatePenner(p2.Padback, Canvas.LeftProperty, Tween.Equations.CubicEaseIn, fromx, tox, duration, OnAnimationComplete, OnAnimationComplete);

                    Label nodel = new Label();
                    nodel.Content = thisnodename;
                    nodel.Foreground = new SolidColorBrush(Colors.White);
                    nodel.FontSize = 12;
                    _FieldBackground.Children.Add(nodel);
                    fromx = 725;
                    tox = xx2 + (size / 2); ;
                    fromy = 460;
                    toy = yy2 + size +10;
                    Animator.AnimatePenner(nodel, Canvas.LeftProperty, Tween.Equations.CubicEaseIn, fromx, tox, duration, OnAnimationComplete, OnAnimationComplete);
                    Animator.AnimatePenner(nodel, Canvas.TopProperty, Tween.Equations.CubicEaseIn, fromy, toy, duration, OnAnimationComplete, OnAnimationComplete);


                    Line l = new Line();
                    l.X1 = 725 + 10;
                    l.Y1 = 475 + 10;
                    l.X2 = xx2 + (size / 2);
                    l.Y2 = yy2 + (size / 2);
                    l.Stroke = new SolidColorBrush(Colors.Wheat);
                    l.Opacity = 0.4;
                    l.Tag = "EDGE";
                    _FieldBackground.Children.Add(l);

                    fromx = 725;
                    tox = xx2 + (size / 2); ;
                    fromy = 460;
                    toy = yy2 + (size / 2); ;
                    Animator.AnimatePenner(l, Line.X2Property, Tween.Equations.CubicEaseIn, fromx, tox, duration, OnAnimationComplete, OnAnimationComplete);
                    Animator.AnimatePenner(l, Line.Y2Property, Tween.Equations.CubicEaseIn, fromy, toy, duration, OnAnimationComplete, OnAnimationComplete);

                    looper = looper + inc;

                }
                aReaderLocal.Close();
            }
            catch (Exception elocalOutside)
            {
                MessageBox.Show(elocalOutside.Message);

            }

            try
            {
                //create the datareader object to connect to table
                aReaderOuter = aLocalOuter.ExecuteReader();


                //Iterate throuth the database
                while (aReaderOuter.Read())
                {
                    node_id = aReaderOuter.GetInt32(0);
                    thisnodename = aReaderOuter.GetString(1);

                    PadPoint p2 = new PadPoint();
                    xx2 = r * Math.Cos(looper);
                    yy2 = r * Math.Sin(looper);
                    xx2 = xx2 + cx;
                    yy2 = yy2 + cy;
                    size = 10;
                    p2.Render(_FieldBackground, 725, 460, size, node_id, thisnodename);

                    fromx = 725;
                    tox = xx2;
                    fromy = 460;
                    toy = yy2;
                    Animator.AnimatePenner(p2.Padback, Canvas.TopProperty, Tween.Equations.CubicEaseIn, fromy, toy, duration, OnAnimationComplete, OnAnimationComplete);
                    Animator.AnimatePenner(p2.Padback, Canvas.LeftProperty, Tween.Equations.CubicEaseIn, fromx, tox, duration, OnAnimationComplete, OnAnimationComplete);

                    Line l = new Line();
                    l.X1 = 725 + 10;
                    l.Y1 = 475 + 10;
                    l.X2 = xx2 + (size / 2);
                    l.Y2 = yy2 + (size / 2);
                    l.Stroke = new SolidColorBrush(Colors.Wheat);
                    l.Opacity = 0.4;
                    l.Tag = "EDGE";
                    _FieldBackground.Children.Add(l);
                    looper = looper + inc;

                }
                aReaderOuter.Close();
            }
            catch (Exception elocalOuter)
            {
                MessageBox.Show(elocalOuter.Message);

            }
        }
        private void BuildNetwork(object sender, RoutedEventArgs e)
        {
            string cs = "";
            string inserts = "";
            string networkkey = "PAYR";

            Repository localenginecreate = new Repository();
            localenginecreate.Open_Repository();

            // Go grab everything we need, based on the net id
            string DataBaseRoot = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString()).Replace(@"file:\", "") + "\\Friends.db";

            cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Firefly\\List of customers for firefly poc\\List of customers for firefly poc.mdb";
            
            // Node SQL
            string nodeSQL = "select cust_skey, cust_name from cust where cust_type_MDM in ('PLAN', 'PAYR', 'CORP','PHAR', 'UNSP')";
            int nodenameMap;
            int nodeidMap;
            string nodename;
            double nodeid;
            

            


            // Edge SQL
            string edgeSQL = "select from_cust_skey, to_cust_skey from cust_affl WHERE affl_type in ('PLAN_to_PAYR', 'PHAR_to_CORP', 'PAYR_to_CORP', 'CORP_to_CORP')";
            
            int EdgeFromidMap = 0;
            int EdgeToidMap = 1;
            double from;
            double to;
            double nodecount = 0;
            try
            {
                // Set up a network object
                Graph oGraph = new Graph(GraphDirectedness.Directed);
                IVertexCollection oVertices = oGraph.Vertices;
                IEdgeCollection oEdges = oGraph.Edges;

                // connection
                OleDbConnection TestConn = new OleDbConnection(cs);
                TestConn.Open();
                
                OleDbCommand aCommand = new OleDbCommand(nodeSQL, TestConn);

                //create the datareader object to connect to table
                OleDbDataReader aReader = aCommand.ExecuteReader();

                // Get the Nodes!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                nodenameMap = 1;
                nodeidMap = 0;
                while (aReader.Read())
                {
                    nodename = aReader.GetString(nodenameMap);
                    nodeid = aReader.GetDouble(nodeidMap);
                    
                    // Add a node...
                    IVertex oVertexA = oVertices.Add();
                    oVertexA.Name = nodename;
                    oVertexA.Tag = nodeid;

                    nodecount++;
                }
                aReader.Close();

                // Get the Edges!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                OleDbCommand aEdgeCommand = new OleDbCommand(edgeSQL, TestConn);

                //create the datareader object to connect to table
                OleDbDataReader aEdgeReader = aEdgeCommand.ExecuteReader();

                EdgeFromidMap = 0;
                EdgeToidMap = 1;

                while (aEdgeReader.Read())
                {
                    from = aEdgeReader.GetDouble(EdgeFromidMap);
                    to = aEdgeReader.GetDouble(EdgeToidMap);
                    
                    // Add an edge
                    IVertex oFrom = null;
                    IVertex oTo = null;

                    foreach (IVertex oVertex in oVertices)
                    {
                        if (oVertex.Tag.ToString() == from.ToString())
                        {
                            oFrom = oVertex;
                        }

                        if (oVertex.Tag.ToString() == to.ToString())
                        {
                            oTo = oVertex;

                        }


                    }
                    IEdge oEdge1 = oEdges.Add(oFrom, oTo, true);

                }
                aEdgeReader.Close();

                // Perform a layout
                // Apply Layout 
                // ==================================================================

                double xdim;
                double ydim;

                xdim = 5000;
                ydim = xdim;
                string layoutmethod = "Fruchterman/Reingold Layout";
                switch (layoutmethod)
                {
                    case "Circular Layout":
                        ILayout oLayout_cir = new CircleLayout();
                        LayoutContext oLayoutContext_cir = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_cir.LayOutGraph(oGraph, oLayoutContext_cir);
                        break;
                    case "Random Layout":
                        ILayout oLayout_rand = new RandomLayout();
                        LayoutContext oLayoutContext_rand = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_rand.LayOutGraph(oGraph, oLayoutContext_rand);
                        break;
                    case "Sugiyama Layout":
                        ILayout oLayout_Sugi = new SugiyamaLayout();
                        LayoutContext oLayoutContext_Sugi = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_Sugi.LayOutGraph(oGraph, oLayoutContext_Sugi);
                        break;
                    case "Grid Layout":
                        ILayout oLayout_grid = new GridLayout();
                        LayoutContext oLayoutContext_grid = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_grid.LayOutGraph(oGraph, oLayoutContext_grid);
                        break;
                    case "Spiral Layout":
                        ILayout oLayout_spiral = new SpiralLayout();
                        LayoutContext oLayoutContext_spiral = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_spiral.LayOutGraph(oGraph, oLayoutContext_spiral);
                        break;
                    case "Fruchterman/Reingold Layout":
                        ILayout oLayout_Fruch = new FruchtermanReingoldLayout();
                        LayoutContext oLayoutContext_Fruch = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_Fruch.LayOutGraph(oGraph, oLayoutContext_Fruch);
                        break;
                    case "Sinusoid H Layout":
                        ILayout oLayout_SinH = new SinusoidHorizontalLayout();
                        LayoutContext oLayoutContext_SinH = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_SinH.LayOutGraph(oGraph, oLayoutContext_SinH);
                        break;
                    case "Sinusoid V Layout":
                        ILayout oLayout_SinV = new SinusoidVerticalLayout();
                        LayoutContext oLayoutContext_SinV = new LayoutContext(new System.Drawing.Rectangle(0, 0, (int)xdim, (int)ydim));
                        oLayout_SinV.LayOutGraph(oGraph, oLayoutContext_SinV);
                        break;

                }


                // Save the Nodes back out to the Firefly database
                // List the results.
                int xoffset = 0;
                int yoffset = 0;
                int size=10;
                double xx2, yy2,xx,yy;
                
                foreach (IVertex oVertex in oVertices)
                {
                    
                    UniversePadPoint p2 = new UniversePadPoint();

                    p2.PadName = oVertex.Name;
                    xx2 = oVertex.Location.X;
                    yy2 = oVertex.Location.Y;
                    xx2 = xx2 + xoffset;
                    yy2 = yy2 + yoffset;
                 
                    size = 10;
                                       
                    inserts = "insert into Nodes(id, nodename, networkid,x,y,z) values (" + oVertex.Tag.ToString() + ", '" + oVertex.Name.ToString() + "', '" + networkkey + "'," + xx2.ToString() + "," + yy2.ToString() + ",0)";
                    OleDbCommand postnode = new OleDbCommand(inserts, localenginecreate.RepositoryConnection);
                    OleDbDataReader Poster = postnode.ExecuteReader();
                    Poster.Close();

                }

                foreach (IEdge e2 in oEdges)
                {
                    IVertex f1 = e2.BackVertex;
                    IVertex t2 = e2.FrontVertex;
                    xx = f1.Location.X;
                    yy = f1.Location.Y;
                    xx2 = t2.Location.X;
                    yy2 = t2.Location.Y;

                    xx = xx + xoffset;
                    yy = yy + yoffset;
                    xx2 = xx2 + xoffset;
                    yy2 = yy2 + yoffset;

                    inserts = "insert into Edges(fromid, toid, networkid) values (" + f1.Tag.ToString() + ", " + t2.Tag.ToString() + ", '" + networkkey + "')";

                    OleDbCommand postedge = new OleDbCommand(inserts, localenginecreate.RepositoryConnection);
                    OleDbDataReader Poster = postedge.ExecuteReader();
                    Poster.Close();

                }

            }

            //Some usual exception handling
            catch (OleDbException eWriteNodes)
            {
                MessageBox.Show(eWriteNodes.Message);
                
            }
            localenginecreate.Close_Repository();
            MessageBox.Show("Done creating network.");

        }