void summary_update()
        {
            bool  temp;
            Point cur;

            double level4avg  = 0.0;
            bool   level4pass = true;
            double level5avg  = 0.0;
            bool   level5pass = true;
            double level6avg  = 0.0;
            bool   level6pass = true;
            int    a          = 0;
            int    b          = 0;

            List <double> level5sorted = new List <double>();
            List <double> level6sorted = new List <double>();

            foreach (SummaryModuleGroup smg in level4SummaryGroups)
            {
                smg.removeControls();
            }
            level4SummaryGroups.Clear();

            Module[] level4modules = course.getModules(Level.LEVEL_4);
            cur = new Point(0, 0);
            foreach (Module mod in level4modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_4, mod, level4sum);
                smg.addControls(cur, out cur);
                level4SummaryGroups.Add(smg);
                level4avg += mod.score(out temp) * (double)mod.getCredit();
                level4pass = level4pass && !temp;
            }
            level4avg /= (double)Course.sumModuleCredit(level4modules);
            if (level4modules.Count() < 1)
            {
                level4avg = 0;
            }

            marklevel4.Text = "Calculated Average : " + Math.Round(level4avg, 2) + "%";
            passfail4.Text  = level4pass ? "Pass" : "Fail";

            foreach (SummaryModuleGroup smg in level5SummaryGroups)
            {
                smg.removeControls();
            }
            level5SummaryGroups.Clear();

            Module[] level5modules = course.getModules(Level.LEVEL_5);
            cur = new Point(0, 0);
            foreach (Module mod in level5modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_5, mod, level5sum);
                smg.addControls(cur, out cur);
                level5SummaryGroups.Add(smg);

                double scr  = mod.score(out temp);
                int    cred = mod.getCredit();
                level5avg += scr * (double)cred;
                level5pass = level5pass && !temp;

                if (cred == 30)
                {
                    level5sorted.Add(scr);
                }
                level5sorted.Add(scr);
            }

            foreach (SummaryModuleGroup smg in level6SummaryGroups)
            {
                smg.removeControls();
            }
            level6SummaryGroups.Clear();

            Module[] level6modules = course.getModules(Level.LEVEL_6);
            cur = new Point(0, 0);
            foreach (Module mod in level6modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_6, mod, level6sum);
                smg.addControls(cur, out cur);
                level6SummaryGroups.Add(smg);

                double scr  = mod.score(out temp);
                int    cred = mod.getCredit();
                level6avg += scr * (double)cred;
                level6pass = level6pass && !temp;

                if (cred == 30)
                {
                    level6sorted.Add(scr);
                }
                level6sorted.Add(scr);
            }

            if (level6sorted.Count() < 1)
            {
                Awardlabel.Text = "Degree Award : Insufficient Data";
                level6avg       = 0;
                level5avg      /= (double)Course.sumModuleCredit(level5modules);
            }
            else
            {
                if (level5sorted.Count() < 1)
                {
                    level5avg = 0;
                }

                level6sorted.Sort();
                level5sorted.Add(level6sorted[0]);
                if (level6sorted.Count() > 1)
                {
                    level6sorted.RemoveAt(0);
                }

                level6avg = level6sorted.Average();
                level5sorted.Sort();
                if (level5sorted.Count() > 1)
                {
                    level5sorted.RemoveAt(0);
                }
                level5avg = level5sorted.Average();

                if (level6avg >= 70.0)
                {
                    a = 1;
                }
                else if (level6avg >= 60.0)
                {
                    a = 2;
                }
                else if (level6avg >= 50.0)
                {
                    a = 3;
                }
                else if (level6avg <= 50.0)
                {
                    a = 4;
                }

                /* split */
                if (level5avg >= 60.0)
                {
                    b = 1;
                }
                else if (level5avg >= 50.0)
                {
                    b = 2;
                }
                else if (level5avg >= 40.0)
                {
                    b = 3;
                }
                else if (level5avg <= 40.0)
                {
                    b = 4;
                }

                switch (Math.Max(a, b))
                {
                case 1:
                    Awardlabel.Text = "Degree Award : First";
                    break;

                case 2:
                    Awardlabel.Text = "Degree Award : Upper Second";
                    break;

                case 3:
                    Awardlabel.Text = "Degree Award : Lower Second";
                    break;

                default:
                    if ((level5avg + level6avg) / 2.0 >= 40.0)
                    {
                        Awardlabel.Text = "Degree Award : Third";
                    }
                    else
                    {
                        Awardlabel.Text = "Degree Award : Fail";
                    }
                    break;
                }
            }


            marklevel6.Text = "Calculated Average : " + Math.Round(level6avg, 2) + "%";
            passfail6.Text  = level6pass ? "Pass" : "Fail";

            marklevel5.Text = "Calculated Average : " + Math.Round(level5avg, 2) + "%";
            passfail5.Text  = level5pass ? "Pass" : "Fail";
        }
        void summary_update()
        {
            bool temp;
            Point cur;

            double level4avg = 0.0;
            bool level4pass = true;
            double level5avg = 0.0;
            bool level5pass = true;
            double level6avg = 0.0;
            bool level6pass = true;
            int a = 0;
            int b = 0;

            List<double> level5sorted = new List<double>();
            List<double> level6sorted = new List<double>();

            foreach (SummaryModuleGroup smg in level4SummaryGroups)
            {
                smg.removeControls();
            }
            level4SummaryGroups.Clear();

            Module[] level4modules = course.getModules(Level.LEVEL_4);
            cur = new Point(0, 0);
            foreach (Module mod in level4modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_4, mod, level4sum);
                smg.addControls(cur, out cur);
                level4SummaryGroups.Add(smg);
                level4avg += mod.score(out temp) * (double)mod.getCredit();
                level4pass = level4pass && !temp;

            }
            level4avg /= (double)Course.sumModuleCredit(level4modules);
            if (level4modules.Count() < 1)
            {
                level4avg = 0;
            }

            marklevel4.Text = "Calculated Average : " + Math.Round(level4avg, 2) + "%";
            passfail4.Text = level4pass ? "Pass" : "Fail";

            foreach (SummaryModuleGroup smg in level5SummaryGroups)
            {
                smg.removeControls();
            }
            level5SummaryGroups.Clear();

            Module[] level5modules = course.getModules(Level.LEVEL_5);
            cur = new Point(0, 0);
            foreach (Module mod in level5modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_5, mod, level5sum);
                smg.addControls(cur, out cur);
                level5SummaryGroups.Add(smg);

                double scr = mod.score(out temp);
                int cred = mod.getCredit();
                level5avg += scr * (double)cred;
                level5pass = level5pass && !temp;

                if(cred == 30)
                {
                    level5sorted.Add(scr);
                }
                level5sorted.Add(scr);
            }

            foreach (SummaryModuleGroup smg in level6SummaryGroups)
            {
                smg.removeControls();
            }
            level6SummaryGroups.Clear();

            Module[] level6modules = course.getModules(Level.LEVEL_6);
            cur = new Point(0, 0);
            foreach (Module mod in level6modules)
            {
                SummaryModuleGroup smg = new SummaryModuleGroup(Level.LEVEL_6, mod, level6sum);
                smg.addControls(cur, out cur);
                level6SummaryGroups.Add(smg);

                double scr = mod.score(out temp);
                int cred = mod.getCredit();
                level6avg += scr * (double)cred;
                level6pass = level6pass && !temp;

                if(cred == 30)
                {
                    level6sorted.Add(scr);
                }
                level6sorted.Add(scr);
            }

            if (level6sorted.Count() < 1)
            {
                Awardlabel.Text = "Degree Award : Insufficient Data";
                level6avg = 0;
                level5avg /= (double)Course.sumModuleCredit(level5modules);
            }
            else
            {
                if (level5sorted.Count() < 1)
                {
                    level5avg = 0;
                }

                level6sorted.Sort();
                level5sorted.Add(level6sorted[0]);
                if (level6sorted.Count() > 1)
                {
                    level6sorted.RemoveAt(0);
                }

                level6avg = level6sorted.Average();
                level5sorted.Sort();
                if (level5sorted.Count() > 1)
                {
                level5sorted.RemoveAt(0);
                }
                level5avg = level5sorted.Average();

                if (level6avg >= 70.0)
                {
                    a = 1;
                }
                else if (level6avg >= 60.0)
                {
                    a = 2;
                }
                else if (level6avg >= 50.0)
                {
                    a = 3;
                }
                else if (level6avg <= 50.0)
                {
                    a = 4;
                }

                /* split */
                if (level5avg >= 60.0)
                {
                    b = 1;
                }
                else if (level5avg >= 50.0)
                {
                    b = 2;
                }
                else if (level5avg >= 40.0)
                {
                    b = 3;
                }
                else if (level5avg <= 40.0)
                {
                    b = 4;
                }

                switch(Math.Max(a, b))
                    {
                    case 1:
                        Awardlabel.Text = "Degree Award : First";
                        break;
                    case 2:
                        Awardlabel.Text = "Degree Award : Upper Second";
                        break;
                    case 3:
                        Awardlabel.Text = "Degree Award : Lower Second";
                        break;
                    default:
                        if ((level5avg + level6avg) / 2.0 >= 40.0)
                        {
                            Awardlabel.Text = "Degree Award : Third";
                        }
                        else
                        {
                            Awardlabel.Text = "Degree Award : Fail";
                        }
                        break;
                }
            }

            marklevel6.Text = "Calculated Average : " + Math.Round(level6avg, 2) + "%";
            passfail6.Text = level6pass ? "Pass" : "Fail";

            marklevel5.Text = "Calculated Average : " + Math.Round(level5avg, 2) + "%";
            passfail5.Text = level5pass ? "Pass" : "Fail";
        }