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

		//create the JPanel for the pop-in
		final JPanel popIn = new JPanel(new BorderLayout());
		popIn.setVisible(false);
		
		//reset the unseenVal so that select/deselect is consistent
		unseenVal = true;
		
		//get the table data
		final ArrayList<Episode> episodes = m.getUnseenEpisodes();
		final Object[][] data = new Object[episodes.size()][5];
		for(int i=0; i<episodes.size(); ++i)
			data[i] = new Object[]{episodes.get(i).show.toString(), episodes.get(i).getSENumber(), episodes.get(i).title(), episodes.get(i).getDate(), true};

		//make a table from the data(overloading the table model to make checkboxes work)
		final JTable jt = new JTable(new DefaultTableModel(data, new String[]{"Show Name", "Episode Number", "Episode Title", "Date Aired", "Download"})
		{
			private static final long serialVersionUID = 1L;
			public Class<?> getColumnClass(int columnIndex)
			{
				if(columnIndex == 4)
					return Boolean.class;
				else
					return String.class;
			}
			public int getColumnCount()
			{
				return columnIdentifiers.size();
			}
			public int getRowCount()
			{
				return dataVector.size();
			}
			public Object getValueAt(int row, int column)
			{
				try
				{
					return ((Vector<?>)dataVector.get(row)).get(column);
				}
				catch(Exception e)
				{
					return -1;
				}
			}
			public boolean isCellEditable(int row, int column)
			{
				if(rl.isLocked())
					return false;
				
				//only allow editing of the checkbox cells
				if(column == 4)//((Vector<?>)dataVector.get(row)).get(column).getClass().equals(Boolean.class))
					return true;
				return false;
			}
		});
		//disable reordering
		jt.getTableHeader().setReorderingAllowed(false);
		//disable multiple selection
		jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//center text strings
		DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
		centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
		jt.setDefaultRenderer(String.class, centerRenderer);
		//create a listener to construct a panel with episode information on row select
		jt.getSelectionModel().addListSelectionListener(new ListSelectionListener()
		{
			public void valueChanged(final ListSelectionEvent event)
			{
				if(!event.getValueIsAdjusting())
				{
					new Thread()
					{
						@SuppressWarnings("deprecation")
						public void run()
						{
							try
							{
								rl.lock();
							
								//if this was a remove operation, just remove the panel and return
								if(jt.getSelectedRow() == -1)
								{
									popIn.removeAll();
									popIn.setVisible(false);
									return;
								}
	
								//quit another paneling operation if one exists
								if(paneler != null)
									paneler.stop();
								paneler = this;
	
								//show the loading panel
								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
								final Episode episode = episodes.get(jt.getSelectedRow());
								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()
											{
												btnLastWatched.setEnabled(false);
												episodes.remove(jt.getSelectedRow());
												((DefaultTableModel)jt.getModel()).removeRow(jt.getSelectedRow());
												episode.setWatched(!episode.isWatched());
											}
										}.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()
											{
												try
												{
													rl.lock();
													btnDownload.setEnabled(false);
													if(episode.download())
													{
														episodes.remove(jt.getSelectedRow());
														((DefaultTableModel)jt.getModel()).removeRow(jt.getSelectedRow());
														episode.setWatched(!episode.isWatched());
													}
													else
													{
														btnDownload.setText("Unavailable");
														if(!((String)jt.getValueAt(jt.getSelectedRow(), jt.getColumn("Date Aired").getModelIndex())).contains(" - unavailable"))
															jt.setValueAt(jt.getValueAt(jt.getSelectedRow(), jt.getColumn("Date Aired").getModelIndex())+" - unavailable", jt.getSelectedRow(), jt.getColumn("Date Aired").getModelIndex());
													}
												}
												finally
												{
													rl.unlock();
												}
											}
										}.start();
									}
								});
								if(((String)jt.getValueAt(jt.getSelectedRow(), jt.getColumn("Date Aired").getModelIndex())).contains(" - unavailable"))
								{
									btnDownload.setEnabled(false);
									btnDownload.setText("Unavailable");
								}
								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();
							}
							finally
							{
								rl.unlock();
							}
						}
					}.start();
				}
			}
		});

		//add the table to the panel
		panel.add(new JScrollPane(jt), BorderLayout.CENTER);

		//set up the buttons panel
		JPanel buttonPanel = new JPanel();
		FlowLayout fl = new FlowLayout(FlowLayout.RIGHT);
		fl.setHgap(0);fl.setVgap(0);
		buttonPanel.setLayout(fl);

		//add the download all button
		final JButton btnDownload = new JButton("Download Selected");
		final JButton btnSelect = new JButton("Select/Deselect All");
		btnDownload.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new Thread()
				{
					public void run()
					{
						try
						{
							rl.lock();
							Main.enableButtons(false);
							jt.clearSelection();
							btnDownload.setText("Downloading Selected");
							btnDownload.setEnabled(false);
							btnSelect.setEnabled(false);
							for(int num=jt.getRowCount()-1; num>=0;--num)
							{
								final Integer i = num;
								new Thread()
								{
									public void run()
									{
										if((Boolean)jt.getValueAt(i, jt.getColumn("Download").getModelIndex()))
										{
											if(episodes.get(i).download())
											{
												episodes.get(i).setWatched(true);
												episodes.remove(i);
												((DefaultTableModel)jt.getModel()).removeRow(i);
											}
											else
												if(!((String)jt.getValueAt(i, jt.getColumn("Date Aired").getModelIndex())).contains(" - unavailable"))
													jt.setValueAt(jt.getValueAt(i, jt.getColumn("Date Aired").getModelIndex())+" - unavailable", i, jt.getColumn("Date Aired").getModelIndex());
										}
									}
								}.start();
							}
							btnDownload.setText("Download Selected");
							btnDownload.setEnabled(true);
							btnSelect.setEnabled(true);
							Main.enableButtons(true);
						}
						finally
						{
							rl.unlock();
						}
					}
				}.start();
			}
		});
		buttonPanel.add(btnDownload);

		//add the select/deselect button
		btnSelect.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new Thread()
				{
					public void run()
					{
						unseenVal = !unseenVal;
						for(int i=0; i<jt.getRowCount(); ++i)
							jt.setValueAt(unseenVal, i, jt.getColumn("Download").getModelIndex());
					}
				}.start();
			}
		});
		buttonPanel.add(btnSelect);

		//add the buttons panel to the panel
		panel.add(buttonPanel, BorderLayout.PAGE_END);

		//add the pop-in panel to the panel
		panel.add(popIn, BorderLayout.LINE_END);

		//revalidate the panel to align the components
		panel.revalidate();
	}