public void browse()
	{
		//clear the panel
		panel.removeAll();

		//create the tree object
		final JTree tree = new JTree();
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("My Shows");

		//add each show to the root node
		for(Show se : ShowTracker.shows)
		{
			DefaultMutableTreeNode show = new DefaultMutableTreeNode(se);

			//add each season to the show nodes
			for(Season s : se.seasons.values())
			{
				DefaultMutableTreeNode season = new DefaultMutableTreeNode(s);

				//add each episode to the season nodes
				for(Episode episode : s.episodes)
					season.add(new DefaultMutableTreeNode(episode));

				show.add(season);
			}

			root.add(show);
		}

		//create the panel object
		final JPanel popIn = new JPanel(new BorderLayout());

		//build the listener for the node selection event and set the tree
		TreeSelectionListener tsl = new TreeSelectionListener()
		{
			public void valueChanged(TreeSelectionEvent e)
			{
				new Thread()
				{
					@SuppressWarnings("deprecation")
					public void run()
					{
						Object obj = ((DefaultMutableTreeNode)tree.getLastSelectedPathComponent()).getUserObject();
						
						popIn.setVisible(false);
						
						if(obj.getClass().equals(Episode.class))
						{
							final Episode episode = (Episode)obj;

							//quit another paneling operation if one exists
							if(paneler != null)
								paneler.stop();
							paneler = this;

							//show the loading spinner
							popIn.removeAll();
							popIn.add(new JLabel(new ImageIcon(this.getClass().getResource("loading spinner.gif")), SwingConstants.CENTER));
							popIn.setVisible(true);
							popIn.revalidate();

							//create the text section
							JTextArea jta = new JTextArea(episode.getText());
							jta.setEditable(false);
							jta.setLineWrap(true);
							jta.setWrapStyleWord(true);

							//create buttons
							JPanel buttonBox = new JPanel();
							buttonBox.setLayout(new GridBagLayout());

							//last watched button
							final JButton btnLastWatched = new JButton("Set as "+(episode.isWatched() ? "unwatched" : "watched"));
							btnLastWatched.addActionListener(new ActionListener()
							{
								public void actionPerformed(ActionEvent e)
								{
									new Thread()
									{
										public void run()
										{
											episode.setWatched(!episode.isWatched());
											btnLastWatched.setText("Set as "+(episode.isWatched() ? "unwatched" : "watched"));
										}
									}.start();
								}
							});
							GridBagConstraints gbc_btnLastWatched = new GridBagConstraints();
							gbc_btnLastWatched.fill = GridBagConstraints.BOTH;
							gbc_btnLastWatched.gridy = 0;
							buttonBox.add(btnLastWatched, gbc_btnLastWatched);

							//download button
							final JButton btnDownload = new JButton("Download episode");
							btnDownload.addActionListener(new ActionListener()
							{
								public void actionPerformed(ActionEvent e)
								{
									new Thread()
									{
										public void run()
										{
											btnDownload.setEnabled(false);
											if(episode.download())
											{
												episode.setWatched(!episode.isWatched());
												btnLastWatched.setText("Set as "+(episode.isWatched() ? "unwatched" : "watched"));
											}
											else
											{
												btnDownload.setText("Unavailable");
											}
										}
									}.start();
								}
							});
							GridBagConstraints gbc_btnDownload = new GridBagConstraints();
							gbc_btnDownload.fill = GridBagConstraints.BOTH;
							gbc_btnDownload.gridy = 1;
							buttonBox.add(btnDownload, gbc_btnDownload);

							//add the components
							popIn.removeAll();
							popIn.add(new JPanel()
							{
								private static final long serialVersionUID = 1L;
								private ImageIcon image = episode.getImage();
								protected void paintComponent(Graphics g) {
									super.paintComponent(g);
									if(image.getImage() != null)
									{
										int destinationWidth = getWidth(),
												destinationHeight = (int)(image.getIconHeight()/((double)image.getIconWidth()/(double)destinationWidth));

										setPreferredSize(new Dimension(destinationWidth, destinationHeight));
										g.drawImage(getScaledInstance(image, destinationWidth, destinationHeight), 0, 0, null);
										g.dispose();
										popIn.revalidate();
									}
									else
										setVisible(false);
								}
							}, BorderLayout.PAGE_START);
							popIn.add(new JScrollPane(jta), BorderLayout.CENTER);
							popIn.add(buttonBox, BorderLayout.PAGE_END);
						}

						//revalidate to redraw/realign the panel
						popIn.revalidate();
					}
				}.start();
			}
		};

		//configure and add the tree
		tree.addTreeSelectionListener(tsl);
		tree.setModel(new DefaultTreeModel(root));
		panel.add(new JScrollPane(tree), BorderLayout.CENTER);
		panel.add(popIn, BorderLayout.LINE_END);
		panel.revalidate();
	}