/*
 * RechercheWeb.java, 3 févr. 2006
 * 
 * This file is part of FilmZ.
 *
 * Copyright © 2006 Johan Cwiklinski
 *
 * File :               RechercheWeb.java
 * Author's email :     johan@x-tnd.be
 * Author's Website :   http://www.x-tnd.be/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 */

/**
 * 
 */
package be.xtnd.films.plugins;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.border.Border;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

import be.xtnd.commons.MessagesCommons;
import be.xtnd.commons.db.Database;
import be.xtnd.commons.gui.EscapeInternalFrame;
import be.xtnd.commons.gui.MainGui;
import be.xtnd.films.Acteur;
import be.xtnd.films.Film;
import be.xtnd.films.Genre;
import be.xtnd.films.JoinClass;
import be.xtnd.films.Origine;
import be.xtnd.films.Realisateur;
import be.xtnd.films.gui.ActeursFilms;
import be.xtnd.films.gui.Films;
import be.xtnd.films.gui.GenresFilms;
import be.xtnd.films.gui.Messages;
import be.xtnd.films.gui.OriginesFilms;
import be.xtnd.films.gui.RealisateursFilms;
import be.xtnd.gui.FilmzMain;

import com.jeta.forms.components.panel.FormPanel;
import com.jeta.forms.components.separator.TitledSeparator;
import com.jgoodies.looks.plastic.PlasticInternalFrameUI;
import com.toedter.calendar.JYearChooser;
import com.toedter.components.JSpinField;

/**
 * @author Johan Cwiklinski
 * @version 0.9
 */
public class RechercheWeb extends Films{
	/** Nom de la fenêtre du résultat de recherche */
	public static final String NAME = "recherche_web";
	/** Nom de la fenêtre de liste des résultats */
	public static final String LIST_NAME = "liste_recherche_web";
	/** Nom de la fenêtre de nouvelle recherche */
	public static final String NEW_WEB_SEARCH = "nouvelle_recherche_web";
	private RecupWeb recup;
	private String search;
	private String site;
	//private static final String SITE_DEFAULT = "Allociné";//"DVDFR";
	//éléments detailwindow
	private JTextField titre_rech, sous_titre_rech, annee_rech, duree_rech, cd_rech;
	private JTextArea resume_rech;
	private String status;
	private Liste liste;

	/**
	 * Affiche la fenêtre d'entrée d'un titre pour recherche
	 *
	 */
	public RechercheWeb(){
		new NewWindow();
	}
	
	/**
	 * Lance une recherche web sur un titre
	 * Cas d'un nouveau film
	 * @param titre titre du film à rechercher
	 */
	public RechercheWeb(String titre){
		this(titre, new Film(), FilmzMain.prefs.getWeb_default() /*SITE_DEFAULT*/, Database.NEW);
	}
	
	/**
	 * Lance une recherche web sur un titre
	 * Cas d'un film existant dans la base
	 * @param titre titre du film à rechercher
	 * @param film film existant dans la base
	 */
	public RechercheWeb(String titre, Film film){
		this(titre, film, FilmzMain.prefs.getWeb_default() /*SITE_DEFAULT*/, Database.MODIF);
	}
	
	/**
	 * Lance une recherche web sur un titre
	 * Cas d'un film existant dans la base
	 * @param titre titre du film à rechercher
	 * @param film film existant dans la base
	 * @param site le site de recherche à utiliser
	 * @param mode de base de données (new ou modif)
	 */
	public RechercheWeb(String titre, Film film, String site, char mode){
		this.search = titre;
		this.film = film;
		System.err.println(site);
		this.site = site;
		this.mode = mode;
		liste = new Liste();
	}
	
    class Liste extends EscapeInternalFrame{
		private static final long serialVersionUID = -1560953082060365129L;
		private JLabel site_label;
		private JTable table;
		private JPopupMenu popup;
		private JButton change_site;
		private JComboBox sites;
		private TitledSeparator titre_label;
				
		/**
		 * Liste de résultats de la recheche web 
		 */
		public Liste(){
			super();
			FormPanel pane = new FormPanel( "be/xtnd/gui/descriptions/search_web_list.jfrm" );
			super.setName(LIST_NAME);
			
	        putClientProperty(
	                PlasticInternalFrameUI.IS_PALETTE,
	                Boolean.TRUE);	        
	        
	        site_label = pane.getLabel("site_label");
	        site_label.setText(Messages.getString("window.movies.labels.sitesearch"));
	        
	        sites = pane.getComboBox("site");
	        ArrayList<String> sites_values = new ArrayList<String>(2);
	        sites_values.add("Allociné");
	        sites_values.add("DVDFR");
	        sites_values.add("CinemAsie");
	        sites_values.add("Cinéfil");
	        commons.buildCombo(sites, sites_values);
	        sites.removeItemAt(0);
	        sites.setSelectedItem(site);
	        
	        titre_label = (TitledSeparator)pane.getComponentByName("title_label");
	        Object[] args = {sites.getSelectedItem(), 0};
	        titre_label.setText(MessageFormat.format(Messages.getString("window.movies.titles.search"), args));
	        
	        change_site = (JButton)pane.getButton("change_site");
	        change_site.setText(Messages.getString("window.movies.buttons.change"));
	        change_site.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					site = sites.getSelectedItem().toString();
					SwingUtilities.invokeLater(new Runnable() {
		                public void run() {
		                	displayResults(site);
		                }
		            });
				}
			});
	        
			table = pane.getTable("liste");
						
			popup = new JPopupMenu();
			popupEntries(popup, "Détails du film","details",null);

			table.add(popup);

			table.addMouseListener(new MouseAdapter(){
				public void mousePressed(MouseEvent e){
			  	  	int nModifier = e.getModifiers();
			    	if ((nModifier & InputEvent.BUTTON3_MASK) != 0) {
						table.changeSelection(table.rowAtPoint(e.getPoint()),0,false,false);
						popup.show((Component)e.getSource(),e.getX(),e.getY());
			      	}
		            if (e.getClickCount() == 2) {// double-click
						String value = table.getValueAt(table.getSelectedRow(),0).toString();
						if(film.getId()!=null)
							film = new Film(film.getId());
						else
							film = new Film();
						//details = new DetailWindow(value);
						showDetails(value);
		            }
				}
			});
			
			displayResults(site);
			
			add(pane);

			this.setMinimumSize(new Dimension(400,400));
			this.setPreferredSize(new Dimension(400,400));
			pack();

			setLocation(MainGui.centerOnDesktop(this.getSize()));
			setMinimumSize(getSize());
			setVisible(true);
			setClosable(true);
			setIconifiable(true);
			setResizable(true);
			MainGui.desktop.add(this, JLayeredPane.POPUP_LAYER);
		}
		
		/**
		 * Affiche les données dans une JTable
		 * @param web site à partir duquel les données sont récupérées.
		 */
		public void displayResults(final String web) {
            site = web;
            Object[] args = {search, site};
            status = MessageFormat.format(
    				Messages.getString("window.search.status.searching"), args);
            MainGui.attente(true,status);
            MainGui.statusBar.setText(status);

			EventQueue.invokeLater(new Runnable() {
				public void run() {
					if(site.equals("Allociné")){
						recup = new Allocine(search);
					}
					if(site.equals("Cinéfil")){
						recup = new Cinefil(search);
					}
					if(site.equals("DVDFR")){
						recup = new Dvdfr(search);
					}
					if(site.equals("CinemAsie")){
						recup = new CinemAsie(search);
					}

			        Object[] args = {sites.getSelectedItem(), recup.getResults()};
			        titre_label.setText(MessageFormat.format(Messages.getString("window.movies.titles.search"), args));

					String[] headers = {"URL", "Film", "Détails"};
					table.setModel(new MyTableModel(
							headers, 
							recup.getListeReponses()));

					table.getTableHeader().setReorderingAllowed(false);
					table.getColumnModel().getColumn(0).setMaxWidth(0);
					table.getColumnModel().getColumn(0).setMinWidth(0);
					table.getColumnModel().getColumn(0).setPreferredWidth(0);
					table.getColumnModel().getColumn(1).setCellRenderer(new ToolTipCellRenderer());
					table.getColumnModel().getColumn(2).setMaxWidth(0);
					table.getColumnModel().getColumn(2).setMinWidth(0);
					table.getColumnModel().getColumn(2).setPreferredWidth(0);

					MainGui.verifUnicite(LIST_NAME, null);
					MainGui.statusBar.setText("");
					MainGui.attente(false);
				}
			});

		}
		
		@Override
		protected void popupActions(ActionEvent event){
			String command = event.getActionCommand();
			if(command.equals("details")){
				String value = table.getValueAt(table.getSelectedRow(),0).toString();
				if(film.getId()!=null)
					film = new Film(film.getId());
				else
					film = new Film();

				//details = new DetailWindow(value);
				showDetails(value);
			}
		}	
    }
    
    private void showDetails(final String url){
		Object[] args1 = {search, site};
        status = MessageFormat.format(
				Messages.getString("window.search.status.loading"), args1);

		MainGui.attente(true,status);
		MainGui.statusBar.setText(status);

		SwingUtilities.invokeLater(new Runnable(){
			public void run() {
				details = new DetailWindow(url);
			}
		});
		
		MainGui.attente(false);
		MainGui.statusBar.setText("");
    }

	private class DetailWindow extends Films.DetailWindow{
		private static final long serialVersionUID = 3950383244493186375L;
		private JButton add_realisateur, del_realisateur, add_genre, del_genre, 
			add_origine, del_origine, okay, cancel, apply, sel_actor, add_actor, del_actor;
		private JLabel titre_label, sous_titre_label, annee_label, duree_label, cd_label, resume_label;
		private JTable acteurs, acteurs_rech, genres, genres_rech, realisateurs, realisateurs_rech, origines, origines_rech;
		private JCheckBox en_titre, en_sous_titre, en_annee, en_realisateur,
			en_genre, en_duree, en_resume, en_origine, en_actors, check_all;
		private JTabbedPane tabbedPane;
		
		DetailWindow(String value){
			super(false);
			
			/*Object[] args1 = {search, site};
            status = MessageFormat.format(
    				Messages.getString("window.search.status.loading"), args1);

			MainGui.attente(true,status);
			MainGui.statusBar.setText(status);*/
	
			recup.loadNewMovie(value);
					
			Object[] args = {search};
			String fen_titre = MessageFormat.format(Messages.getString("window.movies.titles.modif"), args);
			if(mode==Database.NEW){
				this.setTitle(Messages.getString("window.movies.titles.new")+" ("+recup.getTitre()+")");
				this.setName(NEW_NAME);				
			}else{
				this.setTitle(fen_titre);
				this.setName("web_film_"+film.getId());				
			}
					
			FormPanel pane = new FormPanel( "be/xtnd/gui/descriptions/film_recherche_tabbed.jfrm" );
					
			initLabels(pane);
					
	        tabbedPane = pane.getTabbedPane("tabbedPane");
	        tabbedPane.setTitleAt(0, Messages.getString("window.movies.labels.tabgeneral"));
	        tabbedPane.setTitleAt(1, Messages.getString("window.movies.labels.tabdetails"));
		
			titre = pane.getTextField("titre");
			titre.setText(film.getTitre());
				
			titre_rech = pane.getTextField("titre_rech");
			titre_rech.setText(recup.getTitre());
					
			en_titre = pane.getCheckBox("en_titre");
			en_titre.setSelected((film.getTitre().trim().equals("")
					&& !recup.getTitre().trim().equals(""))?true:false);				
		
			sous_titre = pane.getTextField("sous_titre");
			sous_titre.setText(film.getSous_titre());
					
			sous_titre_rech = pane.getTextField("sous_titre_rech");
			sous_titre_rech.setText(recup.getTitreOriginal());
					
			en_sous_titre = pane.getCheckBox("en_sous_titre");
			en_sous_titre.setSelected((film.getSous_titre().trim().equals("") 
					&& !recup.getTitreOriginal().trim().equals(""))?true:false);				
		
			annee = (JYearChooser)pane.getComponentByName("annee");
			annee.setStartYear(0);annee.setEndYear(9999);
			annee.setPreferredSize(new Dimension(60,20));
			annee.setHorizontalAlignment(SwingConstants.RIGHT);
			annee.setValue(film.getAnnee().intValue());
		
			annee_rech = pane.getTextField("annee_rech");
			annee_rech.setText(String.valueOf(recup.getAnneeProduction()));
					
			en_annee = pane.getCheckBox("en_annee");
			en_annee.setSelected((film.getAnnee()==0 
					&& recup.getAnneeProduction()>0)?true:false);				
		
			realisateurs = pane.getTable("realisateurs");
			realisateurs_rech = pane.getTable("realisateurs_rech");
		
			drawTable(realisateurs,film.getRealisateurs());
			drawRechTable(realisateurs_rech,recup.getRealisateurs());
		
			sel_realisateur = (JButton)pane.getButton("sel_realisateur");
			sel_realisateur.setText(Messages.getString("window.movies.labels.director"));
			sel_realisateur.setToolTipText(Messages.getString("window.movies.buttons.directors"));
			sel_realisateur.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					new RealisateursFilms(film, mode, null);
				}
			});
					
			add_realisateur = (JButton)pane.getButton("add_director");
			add_realisateur.setToolTipText(Messages.getString("window.movies.labels.adddirector"));
			add_realisateur.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = realisateurs_rech.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							Realisateur re = new Realisateur(realisateurs_rech.getValueAt(rows[i],0).toString());
							if(re.getId()==null)
								re.enregistrer(true);
							film.ajouteRealisateur(re);
							//acteurs_rech.remove(rows[i]);
						}
						drawTable(realisateurs, film.getRealisateurs());
					}
				}				
			});
					
			del_realisateur = (JButton)pane.getButton("del_director");
			del_realisateur.setToolTipText(Messages.getString("window.movies.labels.deldirector"));
			del_realisateur.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = realisateurs.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							film.supprimeRealisateur(new Integer(
								realisateurs.getValueAt(rows[i],0).toString()
								));
						}
						drawTable(realisateurs, film.getRealisateurs());
					}
				}				
			});
	
			en_realisateur = pane.getCheckBox("en_realisateur");
			en_realisateur.setSelected(((film.getRealisateurs().get(0).getId()==Realisateur.UNKNOWN
					|| film.getRealisateurs().size()==0)
					&& recup.getRealisateurs().size()>0)?true:false);			
		
			genres = pane.getTable("genres");
			genres_rech = pane.getTable("genres_rech");
					
			drawTable(genres, film.getGenres());
			drawRechTable(genres_rech,recup.getGenres());
					
			sel_genre = (JButton)pane.getButton("sel_genre");
			sel_genre.setText(Messages.getString("window.movies.labels.type"));
			sel_genre.setToolTipText(Messages.getString("window.movies.buttons.types"));
			sel_genre.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					new GenresFilms(film, mode, null);
				}
			});
		
			add_genre = (JButton)pane.getButton("add_type");
			add_genre.setToolTipText(Messages.getString("window.movies.labels.addtype"));
			add_genre.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = genres_rech.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							Genre ge = new Genre(genres_rech.getValueAt(rows[i],0).toString());
							if(ge.getId()==null)
								ge.enregistrer(true);
							film.ajouteGenre(ge);
						}
						drawTable(genres, film.getGenres());
					}
				}				
			});
					
			del_genre = (JButton)pane.getButton("del_type");
			del_genre.setToolTipText(Messages.getString("window.movies.labels.deltype"));
			del_genre.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = genres.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							film.supprimeGenre(new Integer(
								genres.getValueAt(rows[i],0).toString()
								));
						}
						drawTable(genres, film.getGenres());
					}
				}				
			});
		
			en_genre = pane.getCheckBox("en_genre");
			en_genre.setSelected(((film.getGenres().get(0).getId()==Genre.UNKNOWN
					|| film.getGenres().size()==0)
					&& recup.getGenres().size()>0)?true:false);			
					
			duree = (JSpinField)pane.getComponentByName("duree");
			duree.setPreferredSize(new Dimension(60,20));
			duree.setValue(film.getDuree());
		
			duree_rech = pane.getTextField("duree_rech");
			duree_rech.setText(String.valueOf(recup.getDuree()));
					
			en_duree = pane.getCheckBox("en_duree");
			en_duree.setSelected((film.getDuree()==0 
					&& recup.getDuree()>0)?true:false);				
		
			cd = (JSpinField)pane.getComponentByName("cd");
			cd.setPreferredSize(new Dimension(60,20));
			cd.setValue(film.getCd().intValue());
					
			cd_rech = pane.getTextField("cd_rech");
			cd_rech.setText("1");
							
			resume = (JTextArea)pane.getComponentByName("resume");
			resume.setText(film.getResume());
					
			resume_rech = (JTextArea)pane.getComponentByName("resume_rech");
			resume_rech.setText(recup.getSynopsis());
					
			en_resume = pane.getCheckBox("en_resume");
			en_resume.setSelected((film.getResume().trim().equals("") 
					&& !recup.getSynopsis().trim().equals(""))?true:false);				
				
			origines = pane.getTable("origines");
			origines_rech = pane.getTable("origines_rech");
					
			drawTable(origines,film.getOrigines());
			drawRechTable(origines_rech,recup.getOrigines());
							
			sel_origine = (JButton)pane.getButton("sel_origine");
			sel_origine.setText(Messages.getString("window.movies.labels.origin"));
			sel_origine.setToolTipText(Messages.getString("window.movies.buttons.origins"));
			sel_origine.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					new OriginesFilms(film, mode, null);
				}
			});
		
			add_origine = (JButton)pane.getButton("add_origin");
			add_origine.setToolTipText(Messages.getString("window.movies.labels.addorigin"));
			add_origine.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = origines_rech.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							Origine or = new Origine(origines_rech.getValueAt(rows[i],0).toString());
							if(or.getId()==null)
								or.enregistrer(true);
							film.ajouteOrigine(or);
						}
						drawTable(origines, film.getOrigines());
					}
				}				
			});
					
			del_origine = (JButton)pane.getButton("del_origin");
			del_origine.setToolTipText(Messages.getString("window.movies.labels.delorigin"));
			del_origine.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = origines.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							film.supprimeOrigine(new Integer(
								origines.getValueAt(rows[i],0).toString()
								));
						}
						drawTable(origines, film.getOrigines());
					}
				}				
			});

			en_origine = pane.getCheckBox("en_origine");
			en_origine.setSelected(((film.getOrigines().get(0).getId()==Origine.UNKNOWN
					|| film.getOrigines().size()==0)
					&& recup.getOrigines().size()>0)?true:false);			
			
			acteurs = pane.getTable("acteurs");		
			acteurs_rech = pane.getTable("acteurs_rech");

			drawTable(acteurs,film.getActeurs());
			drawRechTable(acteurs_rech,recup.getActeurs());

			sel_actor = (JButton)pane.getButton("sel_acteurs");
			sel_actor.setText(Messages.getString("window.movies.buttons.actors"));
			sel_actor.setToolTipText(Messages.getString("window.movies.buttons.origins"));
			sel_actor.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					new ActeursFilms(film, mode,null);
				}
			});

			add_actor = (JButton)pane.getButton("add_actor");
			add_actor.setToolTipText(Messages.getString("window.movies.labels.addactor"));
			add_actor.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = acteurs_rech.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							Acteur ac = new Acteur(acteurs_rech.getValueAt(rows[i],0).toString());
							if(ac.getId()==null)
								ac.enregistrer(true);
							film.ajouteActeur(ac);
						}
						drawTable(acteurs, film.getActeurs());
					}
				}				
			});
			
			del_actor = (JButton)pane.getButton("del_actor");
			del_actor.setToolTipText(Messages.getString("window.movies.labels.delactor"));
			del_actor.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					int[] rows = acteurs.getSelectedRows();
					if(rows.length>0){
						for(int i = 0 ; i < rows.length ; i++){
							film.supprimeActeur(new Integer(
								acteurs.getValueAt(rows[i],0).toString()
								));
						}
						drawTable(acteurs, film.getActeurs());
					}
				}				
			});
			        
			en_actors = pane.getCheckBox("en_actors");
			en_actors.setSelected((film.getActeurs().size()==0 
					&& recup.getActeurs().size()>0)?true:false);				

			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			setClosable(true);
			setMaximizable(true);
			setIconifiable(true);
			
			add(pane);
			
			okay = (JButton)pane.getButton("okay");
			okay.setText(MessagesCommons.getString("window.buttons.okay"));
			okay.addActionListener(new OkayEvent());
			
			apply = (JButton)pane.getButton("apply");
			apply.addActionListener(new ApplyEvent());
			apply.setText(MessagesCommons.getString("window.buttons.apply"));
			
			cancel = (JButton)pane.getButton("cancel");
			cancel.addActionListener(new CancelEvent());
			cancel.setText(MessagesCommons.getString("window.buttons.cancel"));

			check_all = pane.getCheckBox("check_all");
			check_all.setSelected((
					en_titre.isSelected() &&
					en_sous_titre.isSelected() &&
					en_annee.isSelected() &&
					en_realisateur.isSelected() &&
					en_genre.isSelected() &&
					en_duree.isSelected() &&
					en_resume.isSelected() &&
					en_origine.isSelected() &&
					en_actors.isSelected())?true:false);
			check_all.setToolTipText(Messages.getString("window.movies.labels.selectall"));
			check_all.addActionListener(new SelectAllEvent());
			
			//loadValue(value);
			
			pack();
			setSize(new Dimension(500, getHeight()));
			setResizable(true);
			setVisible(true);
			setLocation(MainGui.centerOnDesktop(getSize()));
			MainGui.desktop.add(this,JLayeredPane.POPUP_LAYER);
			try {
				setSelected(true);
			} catch (PropertyVetoException e) {}	
		}
		
		private void drawTable(JTable table, ArrayList<?> list){
			String[] headers = {"id", "Nom"};
			Object[][] data;
			
			data = new Object[list.size()][];
			JoinClass joined;
			for(int i = 0; i<list.size() ; i++){
				joined = (JoinClass)list.get(i);
				Object[] tmp = {joined.getId(), joined.getValeur()};
				data[i] = tmp;
			}
			table.setModel(new MyTableModel(
					headers, 
					data));
			
	        TableColumnModel columnModel = table.getColumnModel();
	        columnModel.getColumn(0).setPreferredWidth(0);
	        columnModel.getColumn(0).setMinWidth(0);
	        columnModel.getColumn(0).setMaxWidth(0);
			table.setTableHeader(null);
			table.setDragEnabled(false);
		}

		private void drawRechTable(JTable table, ArrayList<String> list){
			String[] headers = {"Nom"};
			Object[][] data;

			data = new Object[list.size()][];
			for(int i = 0 ;  i < list.size() ; i++){
				data[i] = new Object[1];
				data[i][0] = list.get(i);
			}
			table.setModel(new MyTableModel(
					headers, 
					data));
			table.setTableHeader(null);
			table.setDragEnabled(false);
		}
		
		private void initLabels(FormPanel pane){
			titre_label = pane.getLabel("titre_label"); 
			titre_label.setText(Messages.getString("window.movies.labels.title"));
			
			sous_titre_label = pane.getLabel("sous_titre_label"); 
			sous_titre_label.setText(Messages.getString("window.movies.labels.sub_title"));
			
			annee_label = pane.getLabel("annee_label");
			annee_label.setText(Messages.getString("window.movies.labels.year"));
			
			duree_label = pane.getLabel("duree_label");
			duree_label.setText(Messages.getString("window.movies.labels.length"));
			
			cd_label = pane.getLabel("cd_label");
			cd_label.setText(Messages.getString("window.movies.labels.cd"));
			
			resume_label = pane.getLabel("resume_label");
			resume_label.setText(Messages.getString("window.movies.labels.summary"));
		}
		
		private void recupWebValues(){
			//titre
			if(en_titre.isSelected())
				titre.setText(titre_rech.getText());
			//sous titre
			if(en_sous_titre.isSelected())
				sous_titre.setText(sous_titre_rech.getText());
			//année
			if(en_annee.isSelected())
				annee.setValue(new Integer(annee_rech.getText()));
			//réalisateur(s)
			if(en_realisateur.isSelected()){
				film.supprimeRealisateurs();
				Iterator it = recup.getRealisateurs().iterator();
				while(it.hasNext()){
					String name = (String)it.next();
					Realisateur rea = new Realisateur(name);
					if(rea.getId()==null)
						rea.enregistrer(true);
					film.ajouteRealisateur(rea);
				}
				drawTable(realisateurs, film.getRealisateurs());
			}
			//genre(s)
			if(en_genre.isSelected()){
				film.supprimeGenres();
				Iterator it = recup.getGenres().iterator();
				while(it.hasNext()){
					String name = (String)it.next();
					Genre ge = new Genre(name);
					if(ge.getId()==null)
						ge.enregistrer(true);
					film.ajouteGenre(ge);
				}
				drawTable(genres, film.getGenres());
			}
			//durée
			if(en_duree.isSelected())
				duree.setValue(new Integer(duree_rech.getText()));
			//résumé
			if(en_resume.isSelected())
				resume.setText(resume_rech.getText());
			//origine(s)
			if(en_origine.isSelected()){
				ArrayList<Origine> original = new ArrayList<Origine>();
				Iterator it = film.getOrigines().iterator();
				//enregistre la liste actuelle pour réaffichage ultérieur
				while(it.hasNext()){
					Origine o = (Origine)it.next();
					original.add(o);
				}
				film.supprimeOrigines();
				it = recup.getOrigines().iterator();
				while(it.hasNext()){
					String name = (String)it.next();
					Origine or = new Origine(name);
					if(or.getId()==null){
						Object[] args = {or.getOrigine()};
						
						Object[] options = {
								Messages.getString("window.web.buttons.save"),
								Messages.getString("window.web.buttons.relation"),
								Messages.getString("window.web.buttons.cancel")};
						
						int n = JOptionPane.showOptionDialog(MainGui.desktop,
								MessageFormat.format(Messages.getString("window.web.messages.weborigin"), args),
								Messages.getString("window.web.messages.weborigin.title"),
								JOptionPane.YES_NO_CANCEL_OPTION,
								JOptionPane.QUESTION_MESSAGE,
								null,     //don't use a custom Icon
								options,  //the titles of buttons
								options[1]); //default button title

						switch(n){
							case JOptionPane.YES_OPTION:
								or.enregistrer(true);
								film.ajouteOrigine(or);
								break;
							case JOptionPane.NO_OPTION:
								Object[] values = or.listing().toArray();
								String s = (String)JOptionPane.showInputDialog(
								                    MainGui.desktop,
								                    MessageFormat.format(Messages.getString("window.web.messages.weborigin.select"), args),
								                    Messages.getString("window.web.messages.weborigin.title"),
								                    JOptionPane.QUESTION_MESSAGE,
								                    null,
								                    values,
								                    values[0]);
								
								System.err.println("origines : "+film.getOrigines().size()+" ; hasnext? "+it.hasNext());
								
								if(s!=null){
									or = or.createRelation(s);
									film.ajouteOrigine(or);
								}else if(!it.hasNext() && film.getOrigines().size()==0){
									System.err.println("raz origines");
									//dernière itération et origines supprimées
									//ré - affichage valeurs enregistrées
									Iterator ito = original.iterator();
									while(ito.hasNext()){
										Origine o = (Origine)ito.next();
										film.ajouteOrigine(o);
									}
								}
								break;
						}
					}else{
						film.ajouteOrigine(or);						
					}
				}
				drawTable(origines, film.getOrigines());
			}
			//acteur(s)
			if(en_actors.isSelected()){
				film.supprimeActeurs();
				Iterator it = recup.getActeurs().iterator();
				while(it.hasNext()){
					String name = (String)it.next();
					Acteur ac = new Acteur(name);
					if(ac.getId()==null)
						ac.enregistrer(true);
					film.ajouteActeur(ac);
				}
				drawTable(acteurs, film.getActeurs());
			}
		}
		
		class SelectAllEvent implements ActionListener{
			/**
			 * @param e
			 */
			public void actionPerformed(ActionEvent e){
				boolean select = (check_all.isSelected())?true:false;
				en_titre.setSelected(select);
				en_sous_titre.setSelected(select);
				en_annee.setSelected(select);
				en_realisateur.setSelected(select);
				en_genre.setSelected(select);
				en_duree.setSelected(select);
				en_resume.setSelected(select);
				en_origine.setSelected(select);	
				en_actors.setSelected(select);
			}
		}

		class ApplyEvent implements ActionListener{
			/**
			 * @param e
			 */
			public void actionPerformed(ActionEvent e){
				recupWebValues();
			}
		}
		
		class OkayEvent implements ActionListener{
			/**
			 * @param e ActionEvent
			 */
			public void actionPerformed(ActionEvent e) {
				recupWebValues();
				if(verifEntrees()){
					queries();
					liste.dispose();
					JInternalFrame[] frames = MainGui.desktop.getAllFrames();
					
					int i = 0;
					while(i < frames.length){
						if(frames[i].getName().equals(Films.LIST_NAME)){
							Films.Liste l = (Films.Liste)frames[i]; 

							String qry = "";
							try {
								qry = l.constructQuery();
							} catch (Exception e2) {e2.printStackTrace();}
				        	l.storeSort = l.sorter.getSortingColumns();
							l.displayQueryResults(qry);

							l.toFront();
							try {
								l.setSelected(true);
							} catch (PropertyVetoException e1) {}
							break;
						}
						i++;
					}

				}
			}		
		}

		class CancelEvent implements ActionListener{
			/**
			 * @param e
			 */
			public void actionPerformed(ActionEvent e){
				dispose();
			}
		}

	}

	private class NewWindow extends EscapeInternalFrame{
		private static final long serialVersionUID = 4948232372458782070L;
		JLabel label;
		JTextField textfield;
		
		NewWindow(){
			super();
			super.setName(NEW_WEB_SEARCH);
			super.setTitle(Messages.getString("window.movies.titles.newsearch"));
			
			FormPanel pane = new FormPanel( "be/xtnd/gui/descriptions/simple.jfrm" );
			
			label = pane.getLabel("label");
			label.setText(Messages.getString("window.movies.labels.title"));
			
			textfield = pane.getTextField("textfield");
			
			add(pane);
			commons.createButtonBar(this, new OkayEvent());

			pack();
			setVisible(true);
			setLocation(MainGui.centerOnDesktop(getSize()));
			MainGui.desktop.add(this,JLayeredPane.MODAL_LAYER);
			try {
				setSelected(true);
			} catch (PropertyVetoException e) {}			
		}
		
		class OkayEvent implements ActionListener{
			/**
			 * @param e ActionEvent
			 */
			public void actionPerformed(ActionEvent e) {
				if(!textfield.getText().equals("")){
					dispose();
					new RechercheWeb(textfield.getText());
				}
			}		
		}
		
	} 
	
	class MyTableModel extends AbstractTableModel {
		private static final long serialVersionUID = -6563418675769600827L;

		private String[] columnNames;

		private Object[][] data;

		MyTableModel(String[] colNames, Object[][] rowsDatas) {
			this.columnNames = colNames;
			this.data = rowsDatas;
		}
		
		/**
		 * @return int
		 */
		public int getColumnCount() {
			return columnNames.length;
		}

		/**
		 * @return int
		 */
		public int getRowCount() {
			return data.length;
		}

		/**
		 * @param col
		 * @return String
		 */
		public String getColumnName(int col) {
			return columnNames[col];
		}

		/**
		 * @param row
		 * @param col
		 * @return Object
		 */
		public Object getValueAt(int row, int col) {
			return data[row][col];
		}

		/**
		 * @param c
		 * @return Class
		 */
		public Class<?> getColumnClass(int c) {
			return getValueAt(0, c).getClass();
		}

		/**
		 * @param row
		 * @param col
		 * @return boolean
		 */
		public boolean isCellEditable(int row, int col) {
			return false;
		}

		/**
		 * @param value
		 * @param row
		 * @param col
		 */
		public void setValueAt(Object value, int row, int col) {
		}

	}

    class ToolTipCellRenderer extends JLabel implements TableCellRenderer {
		private static final long serialVersionUID = -6619549428564518579L;
	    Border unselectedBorder = null;
	    Border selectedBorder = null;
	    boolean isBordered = true;
	    
	    /**
	     * 
	     */
	    public ToolTipCellRenderer() {
	        setOpaque(true);
	    }
		
		/**
		 * getTableCellRendererComponent
		 * @param table
		 * @param value
		 * @param isSelected
		 * @param hasFocus
		 * @param rowIndex
		 * @param vColIndex
		 * @return Component
		 */
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
    
            setBackground(table.getBackground());
        	setForeground(table.getForeground());
            if(isSelected){
            	setBackground(table.getSelectionBackground());
            	setForeground(table.getSelectionForeground());
            }
            setText(value.toString());
            setToolTipText((String)table.getValueAt(rowIndex, vColIndex+1));
            return this;
        }
        
        // The following methods override the defaults for performance reasons
        /**
         * 
         */
        @Override
        public void validate() {}
        /**
         * 
         */
        @Override
        public void revalidate() {}
        /**
         * @param propertyName
         * @param oldValue
         * @param newValue
         */
        @Override
        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
        /**
         * @param propertyName
         * @param oldValue
         * @param newValue
         */
        @Override
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    }
}

