protected override void OnWindow(int id)
            {
                // persistent filter for displaying kerbals
                if (filter == null || filter.GetScene() != HighLogic.LoadedScene)
                {
                    this.filter = FinalFrontier.configuration.GetDisplayFilterForSzene(HighLogic.LoadedScene);
                }
                //
                // persistent sorter for displaying kerbals
                if (sorter == null || sorter.GetScene() != HighLogic.LoadedScene)
                {
                    // sorter has changed
                    this.sorter = FinalFrontier.configuration.GetHallOfFameSorterForScene(HighLogic.LoadedScene);
                    HallOfFame.Instance().SetSorter(this.sorter);
                }
                // color of info
                switch (sorter.GetMode())
                {
                case HallOfFameSorter.SORT_MODE.STATISTIC:
                    STYLE_KERBAL_INFO.normal.textColor = HighLogic.Skin.label.normal.textColor;
                    break;

                case HallOfFameSorter.SORT_MODE.SKILL:
                    STYLE_KERBAL_INFO.normal.textColor = Color.cyan;
                    break;
                }
                //
                GUILayout.BeginHorizontal();
                scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(490), GUILayout.Height(STYLE_SCROLLVIEW_HEIGHT));
                GUILayout.BeginVertical();
                int  index             = 0;
                bool expandDetected    = false;
                bool autoexpandEnabled = FinalFrontier.configuration.IsAutoExpandEnabled();

                foreach (HallOfFameEntry entry in HallOfFame.Instance())
                {
                    // autoexpand this entry on mouse hover?
                    bool expandedEntry = autoexpandEnabled && (expandedRibbonAreaIndex == index) && (entry.GetRibbons().Count > Constants.MAX_RIBBONS_PER_AREA);
                    //
                    ProtoCrewMember kerbal            = entry.GetKerbal();
                    String          info              = GetInfo(entry);
                    String          missionTimeInDays = Utils.GameTimeInDaysAsString(entry.TotalMissionTime) + (GameUtils.IsKerbinTimeEnabled() ? " kerbin" : "");
                    if (kerbal != null && filter.Accept(entry) && !entry.GetKerbal().IsTourist())
                    {
                        String buttonTooltip = kerbal.name + ": " + entry.MissionsFlown + " missions, " + missionTimeInDays + " days mission time";
                        GUILayout.BeginHorizontal(STYLE_KERBAL_AREA_EXPANDED); //expandedEntry ? STYLE_KERBAL_AREA_EXPANDED : STYLE_KERBAL_AREA);
                        GUILayout.BeginVertical();
                        GUILayout.BeginHorizontal();
                        // butto to open decoration board
                        if (GUILayout.Button(new GUIContent(entry.GetName(), buttonTooltip), STYLE_KERBAL_BUTTON))
                        {
                            Log.Detail("opening decoration board for kerbal " + entry.GetName());
                            display.SetEntry(entry);
                            display.SetVisible(true);
                        }
                        DrawStatus(kerbal);
                        GUILayout.EndHorizontal();
                        GUILayout.Label(info, STYLE_KERBAL_INFO);
                        GUILayout.EndVertical();
                        DrawRibbons(entry, expandedEntry ? Constants.MAX_RIBBONS_PER_EXPANDED_AREA : Constants.MAX_RIBBONS_PER_AREA);
                        GUILayout.EndHorizontal();
                        //
                        if (Event.current.type == EventType.Repaint)
                        {
                            if (MouseOver(0.0f, scrollPosition.y))
                            {
                                expandedRibbonAreaIndex = index;
                                expandDetected          = true;
                            }
                        }
                    }
                    index++;
                }
                GUILayout.EndVertical();
                GUILayout.EndScrollView();
                GUILayout.BeginVertical();
                if (GUILayout.Button("Close", FFStyles.STYLE_BUTTON))
                {
                    SetVisible(false);
                    ribbonBrowser.SetVisible(false);
                    display.SetVisible(false);
                }
                GUILayout.Label("", FFStyles.STYLE_LABEL);
                if (GUILayout.Button("Ribbons", FFStyles.STYLE_BUTTON))
                {
                    if (!ribbonBrowser.IsVisible())
                    {
                        OpenRibbonBrowser();
                    }
                    else
                    {
                        ribbonBrowser.SetVisible(false);
                    }
                }
                GUILayout.Label("", FFStyles.STYLE_LABEL);
                GUILayout.Label("Filter:", FFStyles.STYLE_LABEL);
                if (GUILayout.Toggle(filter.showDead, "dead", FFStyles.STYLE_TOGGLE))
                {
                    filter.showDead = true;
                }
                else
                {
                    filter.showDead = false;
                }
                if (GUILayout.Toggle(filter.showAssigned, "active", FFStyles.STYLE_TOGGLE))
                {
                    filter.showAssigned = true;
                }
                else
                {
                    filter.showAssigned = false;
                }
                if (GUILayout.Toggle(filter.showAvailable, "available", FFStyles.STYLE_TOGGLE))
                {
                    filter.showAvailable = true;
                }
                else
                {
                    filter.showAvailable = false;
                }
                if (GUILayout.Toggle(filter.showUndecorated, "undecorated", FFStyles.STYLE_TOGGLE))
                {
                    filter.showUndecorated = true;
                }
                else
                {
                    filter.showUndecorated = false;
                }
                if (HighLogic.LoadedScene == GameScenes.FLIGHT)
                {
                    if (GUILayout.Toggle(filter.showFlightOnly, "flight only", FFStyles.STYLE_TOGGLE))
                    {
                        filter.showFlightOnly = true;
                    }
                    else
                    {
                        filter.showFlightOnly = false;
                    }
                }
                GUILayout.Label("", FFStyles.STYLE_LABEL); // fixed space

                // sorter
                GUILayout.FlexibleSpace();
                GUILayout.Label("Sort by:", FFStyles.STYLE_LABEL);
                DrawSorterButtons();
                GUILayout.Label("", FFStyles.STYLE_LABEL); // fixed space

                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Config", FFStyles.STYLE_BUTTON))
                {
                    if (!configWindow.IsVisible())
                    {
                        MoveWindowAside(configWindow);
                    }
                    configWindow.SetVisible(!configWindow.IsVisible());
                }
                if (GUILayout.Button("About", FFStyles.STYLE_BUTTON))
                {
                    about.SetVisible(!about.IsVisible());
                }
                GUILayout.EndVertical();
                GUILayout.EndHorizontal();

                if (Event.current.type == EventType.Repaint && !expandDetected)
                {
                    expandedRibbonAreaIndex = -1;
                }

                DragWindow();
            }