package view.vueFacture;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import language.Francais;
import language.Language;
import view.Formulaire;
import view.tool.JScrollList.JScrollList;
import view.tool.dateField.DateField;
import view.tool.inputField.JValidScrollTextArea;
import view.tool.inputField.JValidTextField;
import view.tool.jEasyTable.JEasyScrollTable;
import view.tool.moneyField.JMoneyField;
import view.vuePopup.PopupFacturePaiement;
import view.vuePopup.PopupFacturePaiement.paiement;
import controler.Message;
import database.dataset.Article;

public class VueFacture extends Formulaire implements DocumentListener, ItemListener{
	
	private int facture_id;
	
	private List<Integer> vente_id;

	private List<Integer> reservation_id;
	private List<Integer> reservationVente_id;

	/**
	 * 
	 */
	private static final long serialVersionUID = -4982201878223519734L;
	
	private PopupFacturePaiement popup;

	private JPanel 				 panelClient,
								 panelParticularite,
								 panelFields,
								 panelTableau,
								 panelTableauReservation,
								 panelTableauVente,
								 panelContent;

	private GridBagConstraints 	 constraint;
	
	private JLabel       labelReservation,
						 labelVente,
						 labelAdresse,
						 labelVille,
						 labelPays,
						 labelProvince,
						 labelPrenom,
						 labelNom,
						 labelCodePostal,
						 labelTelephone,
						 labelCommentaire,
						 labelParticularite,
						 labelTotal,
						 labelTextPrenom,
						 labelTextNom,
						 labelTextCodePostal,
						 labelTextAdresse,
						 labelTextVille,
						 labelTextPays,
						 labelTextProvince;
	
	private DefaultListModel<String> listModel;
	private JScrollList<String>  listTelephone;
	
	private JValidScrollTextArea textAreaCommentaire,
								 textAreaParticularite;
	
	private JEasyScrollTable 	 tableReservation,
							 	 tableVente;
	
	private Language lang;
	private boolean allowDataChangeListener = true;
	
	private String numericRegex = "[0-9]";
	
	public VueFacture(Language lang, Message messageDataChanged) throws Exception
	{
		super(messageDataChanged);
		initVariable(lang);
		initComponents();
		initListener();
		setMnemonic();
	}
	
	/**
	* initialise tout les variable
	 * @throws Exception 
	*/
	private void initVariable(Language lang) throws Exception
	{
		this.lang = lang;
		
		popup = new PopupFacturePaiement(lang);
		
		vente_id = new ArrayList<Integer>();
		reservation_id = new ArrayList<Integer>();
		reservationVente_id = new ArrayList<Integer>();
		
		constraint 		 		= new GridBagConstraints();
		
		labelAdresse 	 		= new JLabel(lang.getFactureAdresse());
		labelVille 		 		= new JLabel(lang.getFactureVille());
		labelPays 		 		= new JLabel(lang.getFacturePays());
		labelProvince	 		= new JLabel(lang.getFactureProvince());
		
		labelCommentaire 		= new JLabel(lang.getFactureCommentaire());
		labelPrenom 	 		= new JLabel(lang.getFacturePrenom());
		labelNom 	     		= new JLabel(lang.getFactureNom());
		labelTelephone			= new JLabel(lang.getFactureTelephone());
		labelCodePostal     	= new JLabel(lang.getFactureCodePostal());
		labelReservation		= new JLabel(lang.getFactureReservation());
		labelVente				= new JLabel(lang.getFactureVente());
		labelTotal				= new JLabel(lang.getFactureTotal()+" 0.00$");
		labelParticularite  	= new JLabel(lang.getFactureParticularite().replaceAll("%", ""));
		
		labelTextPrenom 		= new JLabel("");
		labelTextNom 			= new JLabel("");
		labelTextCodePostal 	= new JLabel("");
		labelTextAdresse 		= new JLabel("");
		labelTextVille 			= new JLabel("");
		labelTextPays 			= new JLabel("");
		labelTextProvince 		= new JLabel("");
		
		textAreaCommentaire 	= JValidScrollTextArea.JValidTextFieldWithoutText(4);
		textAreaCommentaire.setEnabled(false);
		
		textAreaParticularite	= JValidScrollTextArea.JValidTextFieldWithoutText(4);
		
		panelFields 			= new JPanel(new GridBagLayout());
		panelClient				= new JPanel(new GridBagLayout());
		panelTableau 			= new JPanel(new GridBagLayout());
		panelParticularite 		= new JPanel(new GridBagLayout());
		panelContent            = new JPanel(new GridBagLayout());
		panelTableauReservation = new JPanel(new GridBagLayout());
		panelTableauVente       = new JPanel(new GridBagLayout());
		
		panelTableau.setLayout(new GridLayout(2,1));
		
		panelClient.setBorder(BorderFactory.createTitledBorder(lang.getFactureFieldClient().replaceAll("%", "")));
		
		listModel 				= new DefaultListModel<String>();
		listTelephone 			= new JScrollList<String>(listModel);
		listTelephone.setVisibleRowCount(3);
		listTelephone.setEnabled(false);
		
		tableReservation  		= new JEasyScrollTable(lang.getFactureColumn1());
		tableVente  			= new JEasyScrollTable(lang.getFactureColumn2());
		
		setEnabled(false);
	}
	
	private void initListener(){
		textAreaParticularite.getDocument().addDocumentListener(this);
	}
	
	/**
	* initialise tout les components
	*/
	private void initComponents()
	{
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		constraint.insets  = new Insets(0, 3, 0, 3);
		panelClient.add(labelPrenom, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 1;
		constraint.gridy = 0;
		panelClient.add(labelTextPrenom, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 2;
		constraint.gridy = 0;
		panelClient.add(labelAdresse, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 3;
		constraint.gridy = 0;
		panelClient.add(labelTextAdresse, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.anchor = GridBagConstraints.WEST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		panelClient.add(labelNom, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 1;
		constraint.gridy = 1;
		panelClient.add(labelTextNom, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 2;
		constraint.gridy = 1;
		panelClient.add(labelVille, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 3;
		constraint.gridy = 1;
		panelClient.add(labelTextVille, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 2;
		panelClient.add(labelCodePostal, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 1;
		constraint.gridy = 2;
		panelClient.add(labelTextCodePostal, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 2;
		constraint.gridy = 2;
		panelClient.add(labelPays, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 3;
		constraint.gridy = 2;
		panelClient.add(labelTextPays, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 3;
		panelClient.add(labelTelephone, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 1;
		constraint.gridy = 3;
		panelClient.add(listTelephone, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 2;
		constraint.gridy = 3;
		panelClient.add(labelProvince, constraint);
		
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 3;
		constraint.gridy = 3;
		panelClient.add(labelTextProvince, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 4;
		panelClient.add(labelCommentaire, constraint);
		
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridheight = 1;
		constraint.gridwidth = 4;
		constraint.gridx = 0;
		constraint.gridy = 5;
		panelClient.add(textAreaCommentaire, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelParticularite.add(labelParticularite, constraint);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		constraint.gridwidth = 2;
		constraint.gridheight = 1;
		panelParticularite.add(textAreaParticularite, constraint);

		constraint.anchor = GridBagConstraints.NORTHWEST;
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets = new Insets(0, 0, 0, 0);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		constraint.gridheight = 1;
		constraint.gridwidth = 4;
		panelFields.add(panelClient, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(0, 0, 0, 0);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelFields.add(panelParticularite, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelTableauReservation.add(labelReservation,constraint);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 1;
		constraint.gridx = 0;
		constraint.gridy = 1;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelTableauReservation.add(tableReservation,constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelTableauVente.add(labelVente,constraint);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 1;
		constraint.gridx = 0;
		constraint.gridy = 1;
		constraint.gridheight = 1;
		constraint.gridwidth = 1;
		panelTableauVente.add(tableVente,constraint);

		panelTableau.add(panelTableauReservation);
		panelTableau.add(panelTableauVente);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(0, 0, 0, 0);
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		panelContent.add(panelFields, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(0, 0, 0, 0);
		constraint.weightx = 1;
		constraint.weighty = 1;
		constraint.gridx = 0;
		constraint.gridy = 1;
		panelContent.add(panelTableau, constraint);
		
		constraint.fill = GridBagConstraints.VERTICAL;
		constraint.anchor = GridBagConstraints.NORTHEAST;
		constraint.insets = new Insets(0, 5, 5, 5);
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 2;
		panelContent.add(labelTotal, constraint);
		
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.anchor = GridBagConstraints.CENTER;
		constraint.insets = new Insets(0, 0, 0, 0);
		constraint.weightx = 1;
		constraint.weighty = 1;
		constraint.gridx = 0;
		constraint.gridy = 0;
		add(panelContent,constraint);
	}
	
	private void setMnemonic()
	{
		labelParticularite.setDisplayedMnemonic(lang.getFactureParticularite().charAt(lang.getFactureParticularite().indexOf('%')+1));	//rend le label sensible au ALT+L
		labelParticularite.setLabelFor(textAreaParticularite);		//fais que label va mettre le focuse sur le field au ALT+L
	}
	
	public void setPrenom(String txtPrenom) {
		this.labelTextPrenom.setText(txtPrenom);
	}
	
	public void setTxtNom(String txtNom) {
		this.labelTextNom.setText(txtNom);
	}
	
	public void setTxtAdresse(String txtAdresse) {
		this.labelTextAdresse.setText(txtAdresse);
	}
	
	public void setVille(String txtVille) {
		this.labelTextVille.setText(txtVille);
	}
	
	public void setCodePostal(String text)
	{
		this.labelTextCodePostal.setText(text);
	}
	
	public void setTelephone(String txtTelephone) {
		this.listModel.addElement(txtTelephone);
		listTelephone.setModel(listModel);
	}
	
	public String getAreaCommentaire() {
		return textAreaCommentaire.getText();
	}
	
	public void setAreaCommentaire(String areaParticularite) {
		this.textAreaCommentaire.setText(areaParticularite);
	}
	
	public void setAreaParticularite(String areaParticularite) {
		this.textAreaParticularite.setText(areaParticularite);
	}
	
	public String getAreaParticularite() {
		return this.textAreaParticularite.getText();
	}
	
	public void setPays(String txtPays) {
		this.labelTextPays.setText(txtPays);
	}
	
	public void setProvince(String txtProvince) {
		this.labelTextProvince.setText(txtProvince);
	}
	
	public void setTotal(BigDecimal total){
		this.labelTotal.setText(lang.getFactureTotal()+" "+total.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}

	public void setFacture_id(int facture_id) {
		this.facture_id = facture_id;
	}
	
	/*
	 * ICI il faut modifier ces deux methodes
	 * une table doit être peupler par des appel successif
	 * de addRownomtable(...)
	 * les arguments sont de type et de nom qui refletent chaques colonnes de la table dans l'ordre
	 * 
	 * nous avons également besoin de la méthode clearnomtable() qui vide le tableau 
	 * et getSelectedNomtable() qui peut retourner une indice ou un tableau d'indice selont la possiblité de sélectionner de multiple valeur
	 * */
	
	
	public void add_ReservationVenteId(int id)
	{
		reservationVente_id.add(id);
	}
	
	public int get_ReservationVenteIdItem(int i)
	{
		return reservationVente_id.get(i);
	}
	
	public void add_VenteId(int id)
	{
		vente_id.add(id);
	}

	public int get_VenteIdItem(int i)
	{
		return vente_id.get(i);
	}
	
	public void add_ReservationId(int id)
	{
		reservation_id.add(id);
	}
	
	public int get_ReservationIdItem(int i)
	{
		return reservation_id.get(i);
	}
	
	public int getSize_VenteId()
	{
		return vente_id.size();
	}
	
	public int getSize_ReservationId()
	{
		return reservation_id.size();
	}
	
	public int getSize_ReservationVenteId()
	{
		return reservationVente_id.size();
	}
	
	public void addRowTableReservation(String[] data) throws Exception
	{
		allowDataChangeListener = false;
		
		if(data.length != lang.getFactureColumn1().length - 5)
			throw new Exception("Size of array not valid, should be "+(lang.getFactureColumn1().length - 5));
		JComponent[] row = new JComponent[lang.getFactureColumn1().length];
		/*0*/
		DateField dateFieldStart = DateField.fromString(data[0]);
		dateFieldStart.getDocument().addDocumentListener(this);
		row[0] = dateFieldStart;
		/*1*/
		DateField dateFieldEnd = DateField.fromString(data[1]);
		dateFieldEnd.getDocument().addDocumentListener(this);
		row[1] = dateFieldEnd;
		/*2*/
		JValidTextField numberoChambre = JValidTextField.JValidTextFieldWithTextAllowCertainCharacter(numericRegex, data[2], 16);
		numberoChambre.getDocument().addDocumentListener(this);
		row[2] = numberoChambre;
		/*3*/
		JComboBox comboPromotion = new JComboBox();
		comboPromotion.addItemListener(this);
		row[3] = comboPromotion;
		/*4*/
		JMoneyField fieldPrix = new JMoneyField(16);
		fieldPrix.getDocument().addDocumentListener(this);
		row[4] = fieldPrix;
		/*5*/
		row[5] = new JLabel("0.00$");
		/*6*/
		row[6] = new JLabel("0.00$");
		/*7*/
		row[7] = new JLabel("0.00$");
		/*8*/
		row[8] = new JCheckBox();

		tableReservation.addRow(row);
		
		allowDataChangeListener = true;
	}
	
	public void addRowTableVente(String date) throws Exception
	{
		allowDataChangeListener = false;
		JComponent[] row = new JComponent[lang.getFactureColumn2().length];
		/*0*/
		row[0] = DateField.fromString(date);
		/*1*/
		row[1] = new JComboBox();
		/*2*/
		row[2] = new JMoneyField(16);
		/*3*/
		row[3] = JValidTextField.JValidTextFieldAllowCertainCharacter(numericRegex, 16);
		/*4*/
		row[4] = new JLabel("0.00$");
		/*5*/
		row[5] = new JLabel("0.00$");
		/*6*/
		row[6] = new JLabel("0.00$");
		/*7*/
		row[7] = new JLabel("0.00$");
		
		tableVente.addRow(row);
		
		allowDataChangeListener = true;
	}
	
	public void addRowTableVenteWithArticle(String date, List<Article> article, int selectionne) throws Exception
	{
		allowDataChangeListener = false;
		
		JComboBox<String> comboArticle = new JComboBox<String>();
		
		for(int i=0;i<article.size();i++)
		{
			comboArticle.addItem(article.get(i).getArticle_code());
		}
		
		comboArticle.setSelectedIndex(selectionne);
		comboArticle.addItemListener(this);
		
		JComponent[] row = new JComponent[lang.getFactureColumn2().length];
		/*0*/
		DateField dateVente = DateField.fromString(date);
		dateVente.getDocument().addDocumentListener(this);
		row[0] = dateVente;
		/*1*/
		row[1] = comboArticle;
		/*2*/
		JMoneyField fieldPrix = new JMoneyField(16);
		fieldPrix.getDocument().addDocumentListener(this);
		row[2] = fieldPrix;
		/*3*/
		JValidTextField fieldNombre = JValidTextField.JValidTextFieldAllowCertainCharacter(numericRegex, 16);
		fieldNombre.getDocument().addDocumentListener(this);
		row[3] = fieldNombre;
		/*4*/
		row[4] = new JLabel("0.00$");
		/*5*/
		row[5] = new JLabel("0.00$");
		/*6*/
		row[6] = new JLabel("0.00$");
		/*7*/
		row[7] = new JLabel("0.00$");
		
		tableVente.addRow(row);
		
		allowDataChangeListener = true;
	}
	
	public int getFacture_id() {
		return facture_id;
	}
	

	public Date getDateDebutValueAtTableReservation(int row){
		return ((DateField)tableReservation.getComponentAt(0, row)).getDate();
	}
	
	public Date getDateFinValueAtTableReservation(int row){
		return ((DateField)tableReservation.getComponentAt(1, row)).getDate();
	}
	
	public int getChambreValueAtTableReservation(int row){
		return Integer.parseInt(((JValidTextField)tableReservation.getComponentAt(2, row)).getText());
	}
	
	public String getPromotionValueAtTableReservation(int row){
		return ((JComboBox)tableReservation.getComponentAt(3, row)).getSelectedItem().toString();
	}
	
	public BigDecimal getPrixValueAtTableReservation(int row){
		String text = ((JValidTextField)tableReservation.getComponentAt(4, row)).getText();
		return new BigDecimal(text.substring(0,text.length()-1));
	}
	
	public boolean getCheckBoxValueAtTableReservation(int row){
		return ((JCheckBox)tableReservation.getComponentAt(8, row)).isSelected();
	}
	
	public void setDateDebutValueAtTableReservation(int row, String date) throws ParseException, Exception{
		allowDataChangeListener = false;
		((DateField)tableReservation.getComponentAt(0, row)).setDate(date);
		allowDataChangeListener = true;
	}
	
	public void setDateFinValueAtTableReservation(int row, String date) throws ParseException, Exception{
		allowDataChangeListener = false;
		((DateField)tableReservation.getComponentAt(1, row)).setDate(date);
		allowDataChangeListener = true;
	}
	
	public void setChambreValueAtTableReservation(int row, int chambre) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JValidTextField)tableReservation.getComponentAt(2, row)).setText(String.valueOf(chambre));
		allowDataChangeListener = true;
	}
	
	public void setPromotionValueAtTableReservation(int row, String promotion) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JComboBox)tableReservation.getComponentAt(3, row)).setSelectedItem(promotion);
		allowDataChangeListener = true;
	}
	
	public void addPromotionValueAtTableReservation(int row, String promotion) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JComboBox)tableReservation.getComponentAt(3, row)).addItem(promotion);
		allowDataChangeListener = true;
	}
	
	public void setPrixValueAtTableReservation(int row, BigDecimal prix) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JMoneyField)tableReservation.getComponentAt(4, row)).setText(prix.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
		allowDataChangeListener = true;
	}
	
	public void setTPSValueAtTableReservation(int row, BigDecimal tps) throws ParseException, Exception{
		((JLabel)tableReservation.getComponentAt(5, row)).setText(tps.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}
	
	public void setTVQValueAtTableReservation(int row, BigDecimal TVQ) throws ParseException, Exception{
		((JLabel)tableReservation.getComponentAt(6, row)).setText(TVQ.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}
	
	public void setTotalValueAtTableReservation(int row, BigDecimal total) throws ParseException, Exception{
		((JLabel)tableReservation.getComponentAt(7, row)).setText(total.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}
	
	public String getDateValueAtTableVente(int row){
		return ((DateField)tableVente.getComponentAt(0, row)).getDate().toString();
	}
	
	public String getArticleSelectedAtTableVente(int row){
		return ((JComboBox<String>)tableVente.getComponentAt(1, row)).getSelectedItem().toString();
	}
	
	public BigDecimal getPrixValueAtTableVente(int row){
		String text = ((JMoneyField)tableVente.getComponentAt(2, row)).getText();
		return new BigDecimal(text.substring(0,text.length()-1));
	}
	
	public int getNombreAtTableVente(int row){
		return Integer.parseInt(((JValidTextField)tableVente.getComponentAt(3, row)).getText());
	}
	
	public void setDateValueAtTableVente(int row, String date) throws ParseException, Exception{
		allowDataChangeListener = false;
		((DateField)tableVente.getComponentAt(0, row)).setDate(date);
		allowDataChangeListener = true;
	}
	
	public void setArticleValueAtTableVente(int row, String article) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JComboBox)tableVente.getComponentAt(1, row)).setSelectedItem(article);
		allowDataChangeListener = true;
	}
	
	public void addArticleValueAtTableVente(int row, String article) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JComboBox)tableVente.getComponentAt(1, row)).addItem(article);
		allowDataChangeListener = true;
	}
	
	public void setPrixValueAtTableVente(int row, BigDecimal prix) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JMoneyField)tableVente.getComponentAt(2, row)).setText(prix.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
		allowDataChangeListener = true;
	}
	
	public void setNombreValueAtTableVente(int row, int nombre) throws ParseException, Exception{
		allowDataChangeListener = false;
		((JValidTextField)tableVente.getComponentAt(3, row)).setText(String.valueOf(nombre));
		allowDataChangeListener = true;
	}
	
	public void setSousTotalValueAtTableVente(int row, BigDecimal sousTotal) throws ParseException, Exception{
		((JLabel)tableVente.getComponentAt(4, row)).setText(sousTotal.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}
	
	public void setTPSValueAtTableVente(int row, BigDecimal TPS) throws ParseException, Exception{
		((JLabel)tableVente.getComponentAt(5, row)).setText(TPS.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}

	public void setTVQValueAtTableVente(int row, BigDecimal TVQ) throws ParseException, Exception{
		((JLabel)tableVente.getComponentAt(6, row)).setText(TVQ.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}

	public void setTotalValueAtTableVente(int row, BigDecimal total) throws ParseException, Exception{
		((JLabel)tableVente.getComponentAt(7, row)).setText(total.setScale(2,BigDecimal.ROUND_UP).toString()+"$");
	}
	
	public paiement getMontantNewPaiement(BigDecimal montantPresent, BigDecimal montantRestant, BigDecimal montantTotal,String[] modePaiement){
		return popup.getMoneyAmmount(montantPresent,montantRestant,montantTotal,modePaiement);
	}
	
	public void ClearTableReservation(){
		tableReservation.clear();
	}
	
	public void ClearTableVente(){
		tableVente.clear();
	}	
	
	@Override
	public void changedUpdate(DocumentEvent e) {
		try {
			if(allowDataChangeListener && messageDataChanged != null)
				messageDataChanged.trigger(this);
		} catch (SQLException e1) {
			e1.printStackTrace();
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	@Override
	public void insertUpdate(DocumentEvent e) {
		try {
			if(allowDataChangeListener && messageDataChanged != null)
				messageDataChanged.trigger(this);
		} catch (SQLException e1) {
			e1.printStackTrace();
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	@Override
	public void removeUpdate(DocumentEvent e) {
		try {
			if(allowDataChangeListener && messageDataChanged != null)
				messageDataChanged.trigger(this);
		} catch (SQLException e1) {
			e1.printStackTrace();
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	@Override
	public void itemStateChanged(ItemEvent arg0) {
		try {
			if(allowDataChangeListener && messageDataChanged != null)
				messageDataChanged.trigger(this);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void setEnabled(boolean enabled){
		super.setEnabled(enabled);
		textAreaParticularite.setEnabled(enabled);
	}
	
	public static void main(String[] args) throws Exception {
		JFrame a = new JFrame("window");
		VueFacture norme = new VueFacture(Francais.getInstance(),null);
		
		
		//norme.getObservable().addObserver(new Controleur());
		a.add(norme);
		
		
		//norme.setTableReservation(labels);
		//norme.setTableVente(labels2);
		a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		a.pack();
		
		for(int i =0; i < 50; i++)
		{
			norme.addRowTableReservation(new String[]{"2013-12-31","2013-12-31","2","3","CheckIn"});
			norme.addRowTableVente("2013-12-31");
		}
		a.setVisible(true);
	}
}