private void initComponents() {

        this.setBackground(Color.GRAY);
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        //TODO: setup video panel
        this.videoPanel = new VideoHolder(false);
        this.videoPanel.setBackground(Color.BLACK);
        this.videoPanel.setBorder(null);
        this.videoPanel.setLayout(new GridLayout(1,1));

        this.add(this.videoPanel);
        this.stagesMap = new HashMap();
        this.stageNumber = new HashMap();
        
        this.add(Box.createVerticalStrut(2));
        
        this.instructionPanel = new InstructionsPanel();
        this.instructionPanel.setBackground(new Color(120,120,120));
        this.add(this.instructionPanel);

        this.add(Box.createVerticalStrut(5));
        
        //initiallized fitted scroll pane for stage panels
        this.scrollPane = new PanelsScrollPane(true);
        this.add(this.scrollPane);

        int i = 0;
        //add all stage panels of application
        for (StagePanel stagePanel : this.stages) {
            JPanel stagePanelNav = new JPanel(new GridLayout(1, 1));
            stagePanelNav.setLayout(new BorderLayout());
            stagePanelNav.setBorder(new LineBorder(Color.BLACK));

            //setup text area inside navigation panels
            NavigationOption option = new NavigationOption(stagePanel);
            this.options.add(option);

            this.stagesMap.put(option, stagePanel);

            this.stageNumber.put(option, i++);

            if (stagePanel.isFinished()) {
                this.lastUnlocked = i;
            }
            //creating title for stage
            stagePanelNav.add(option);
            stagePanelNav.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("clicked this");
                }
            });

            this.scrollPane.appendPanel(stagePanelNav);
        }
        if (test) {
            this.lastUnlocked = this.stages.size() - 1;
        }

        i = 0;
        for (NavigationOption option : this.options) {
            if (test == false) {
                if (i < this.lastUnlocked) {
                    option.setType(NavigationOptionType.Finished);
                } else if (i == this.lastUnlocked) {
                    option.setType(NavigationOptionType.StartedButNotFinished);
                    StagePanel stage = (StagePanel)this.stagesMap.get(option);
                    this.reciever.receivePanel(stage, null);
                    this.setVideoPanel(i);
                } else {
                    option.setType(NavigationOptionType.Locked);
                }
            } else {
                if (option.getStagePanel().isFinished()) {
                    option.setType(NavigationOptionType.Finished);
                } else {
                    option.setType(NavigationOptionType.StartedButNotFinished);
                }
            }
            i++;
        }

        this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                //resize the video panel accordingly
                int parentWidth = getSize().width;
                int parentHeight = getSize().height;
                int videoHeight = (int) (((float) parentWidth) / aspectRatio);
                //System.out.println("video height: "+videoHeight+" aspect: "+aspectRatio);
                float videoToScrollHeightRatio = (((float) videoHeight) / ((float) parentHeight));
                if (videoToScrollHeightRatio < 0.75f) {
                    videoPanel.setMinimumSize(new Dimension(parentWidth, videoHeight));
                    videoPanel.setPreferredSize(new Dimension(parentWidth, videoHeight));
                    videoPanel.setMaximumSize(new Dimension(parentWidth, videoHeight));
                    videoPanel.repaint();
                    int restHeight = parentHeight - videoHeight;
                    instructionPanel.setPreferredSize(new Dimension(parentWidth, ((int)0.4f*restHeight)-10));
                    instructionPanel.getjScrollPane1().getViewport().setViewPosition(new Point(0,0));
                    scrollPane.setPreferredSize(new Dimension(parentWidth, ((int)0.6f*restHeight)-10));
                    
                    //System.out.println(instructionPanel);
                    //System.out.println(scrollPane);
                    revalidate();
                } else {
                    //don't allow the user to resize more than this
                }
            }
        });
        this.setPreferredSize(preferedDimension);
        this.setMinimumSize(minDimension);
        this.setMaximumSize(maxDimension);
        
        this.scrollPane.getViewport().setViewPosition(new Point(0,0));
    }