/*
 * MainGUIApp.java
 *
 * Created on August 2, 2006, 8:02 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ebay.client;

/**
 *
 * @author Elancheran
 */
import ebay.apis.*;
import javax.xml.ws.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Properties;
import java.io.*;
import java.util.List;
import java.util.Vector;
import ebay.client.handler.RequesterCredentials;
import javax.xml.ws.handler.Handler;

public class MainGUIApp extends javax.swing.JFrame{

    private static final String baseURL = "https://api.ebay.com/wsapi?";

    private static final String localURL = "http://localhost:7070/Ebay";

    private static final String sandboxURL = "https://api.sandbox.ebay.com/wsapi?";
    private static Properties props = new Properties();
    private static CustomSecurityHeaderType header;


    private java.awt.image.BufferedImage image = null;
    private String itemDetailString;
    private String itemId;
    private String[] details = new String[5];
    private String[] values = new String[5];
    private String desc;

    private boolean multiTabView = false;


     /** Creates a new instance of MainGUIApp */
    public MainGUIApp() {
        super("Web Services Ebay Client");
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            if(System.getProperty("http.proxyHost") != null &&
                    System.getProperty("http.proxyPort") != null)
            {
                this.proxyHostString = System.getProperty("http.proxyHost");
                this.proxyPortString = System.getProperty("http.proxyPort");
            }

        }catch(Exception e) {
        }

        initComponents();
    }

    public static ItemType getItem(String endpointToUse, String itemId) {
      boolean error = false;
      String endpointURL = "";
      EBayAPIInterfaceService svc = new EBayAPIInterfaceService();
      EBayAPIInterface port = svc.getEBayAPI();


        BindingProvider bp = (BindingProvider) port;
        if (endpointToUse.equalsIgnoreCase("ebay")) {
            endpointURL =  baseURL + "callname=GetItem&siteid=0&appid=" +
                          (String)props.get("appID") + "&version=455&Routing=new";
            List<Handler> handlerChain = new Vector();
            handlerChain.add(new RequesterCredentials());
            bp.getBinding().setHandlerChain(handlerChain);
        }
        else if(endpointToUse.equalsIgnoreCase("local")) {
            endpointURL = localURL;
        }
        else {
            System.exit(1);
        }
        bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                                   endpointURL);
        GetItemRequestType itemRequest = new GetItemRequestType();
        itemRequest.setVersion("455");

        itemRequest.setItemID(itemId);
        itemRequest.setErrorLanguage("en_US");
        GetItemResponseType itemResponse = null;
        try {
            itemResponse = port.getItem(itemRequest);
        }catch (Exception e) {
            error = true;
        }
        if (error) {
            return null;
        }
        else
            return itemResponse.getItem();

    }

    public static void setProxyHost(String proxyHost){
        proxyHostString = proxyHost;
    }

    public static void setProxyPort(String proxyPort){
        proxyPortString = proxyPort;
    }

    public static String getProxyPort() {
        return proxyPortString;
    }

    public static String getProxyHost() {
        return proxyHostString;
    }

    private void initComponents() {
        jPanel2 = new javax.swing.JPanel();
        jPanel2.setBackground(new java.awt.Color(236,233,216));
        jTextField1 = new javax.swing.JTextField();
        jComboBox1 = new javax.swing.JComboBox();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jPanel3.setBackground(new java.awt.Color(236,233,216));
        jButton1 = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);
        getContentPane().setBackground(new java.awt.Color(236, 233, 216));

        jComboBox1.setFont(new java.awt.Font("Verdana", 0, 12));
        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Ebay Server", "Local Server" }));
        jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));
        jLabel1.setText("Item Id");
        jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));
        jLabel2.setText("Server");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jComboBox1, 0, 113, Short.MAX_VALUE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 113, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(23, 23, 23)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(15, 15, 15)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(22, Short.MAX_VALUE))
        );

        jButton1.setFont(new java.awt.Font("Verdana", 0, 12));
        jButton1.setText("Get Details");
        jButton1.setMnemonic('G');
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGap(164, 164, 164)
                .addComponent(jButton1)
                .addContainerGap(164, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addContainerGap(86, Short.MAX_VALUE))
        );

        jMenu1.setText("File");
        jMenu1.setMnemonic('F');

        jMenuItem1.setText("Exit");
        jMenu1.add(jMenuItem1);
        jMenuItem1.setMnemonic('x');

        jMenuItem1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae) {
                exitApplication();
            }
        });

        jMenuBar1.add(jMenu1);

        jMenu3.setText("Edit");
        jMenu3.setMnemonic('E');
        jMenuItem2.setText("Preferences");
        jMenuItem2.setMnemonic('P');
        jMenuItem2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae){
                showPreferencesDialog();
            }
        });
        jMenu3.add(jMenuItem2);
        jMenuBar1.add(jMenu3);
        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(76, 76, 76)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(93, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(80, 80, 80)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        pack();
    }// </editor-fold>

   public static void showMessageDialog(final java.awt.Container parent,
            final String msg, final String title) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run(){
                javax.swing.JOptionPane.showMessageDialog(parent, msg, title,
                        javax.swing.JOptionPane.WARNING_MESSAGE);
            }
        });
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        String currency = null;

        java.lang.Object source = evt.getSource();
        if( source == jButton1 ) {
            String str = (String) jComboBox1.getSelectedItem();
            if( str.equals("Ebay Server")){
                if( this.proxyHostString != null && this.proxyPortString != null ){
                    System.setProperty("http.proxyHost", this.proxyHostString);
                    System.setProperty("http.proxyPort", this.proxyPortString);
                    System.setProperty("https.proxyHost", this.proxyHostString);
                    System.setProperty("https.proxyPort", this.proxyPortString);
                }
            }

            String itemId = jTextField1.getText();
            if(itemId == null || itemId.equals("")) {
                showMessageDialog(jPanel2, "Please enter the ItemId...", "ItemId Required...");
            } else {
                this.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
                if(str.equals("Ebay Server"))
                    str = "ebay";
                else
                    str = "local";

                ItemType item = getItem(str, itemId.trim());
                if (item == null) {
                    showMessageDialog(jPanel2, "Sorry there is no item found...", "Item Not Found...");
                } else {
                    new ViewItemDetails(itemId, item);
                    jTextField1.setText("");
                }
                this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
            }
        }
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainGUIApp().setVisible(true);
            }
        });
    }

    public void exitApplication() {
        dispose();
        System.exit(0);
    }

    public void showPreferencesDialog() {
        SwingUtilities.invokeLater(new Runnable() {
                public void run(){
                    new SettingsDialog().setVisible(true);
                }
            });
     }

     class SettingsDialog extends javax.swing.JDialog
            implements ActionListener {

        public SettingsDialog() {
            super((JFrame)MainGUIApp.this, "Preferences...", true);
            setLocationRelativeTo((JFrame)MainGUIApp.this);
            initComponents();
            createGUI();
        }

        private void initComponents(){

            jTabbedPane1 = new javax.swing.JTabbedPane();
            proxySettingsPanel = new javax.swing.JPanel();
            directRadioButton = new javax.swing.JRadioButton();
            proxyRadioButton = new javax.swing.JRadioButton();
            proxyHostLabel = new javax.swing.JLabel();
            proxyHostTxtField = new javax.swing.JTextField();
            proxyPortLabel = new javax.swing.JLabel();
            proxyPortTxtField = new javax.swing.JTextField();

            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            setResizable(false);

            proxyHostLabel.setFont(new java.awt.Font("Verdana", 0, 12));
            proxyPortLabel.setFont(new java.awt.Font("Verdana", 0, 12));
            directRadioButton.setFont(new java.awt.Font("Verdana", 0, 12));
            proxyRadioButton.setFont(new java.awt.Font("Verdana", 0, 12));

            if(MainGUIApp.getProxyHost() != null
                    && MainGUIApp.getProxyPort() != null) {
                proxyRadioButton.setSelected(true);
                proxyHostTxtField.setText(MainGUIApp.getProxyHost());
                proxyPortTxtField.setText(MainGUIApp.getProxyPort());
            } else {
                directRadioButton.setSelected(true);
                proxyPortTxtField.setEnabled(false);
                proxyHostTxtField.setEnabled(false);
            }

            jTabbedPane1.setToolTipText("Proxy Settings...");
            jTabbedPane1.setName("Network");
            directRadioButton.setText("Direct Internet Connection");
            //directRadioButton.setSelected(true);
            directRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
            directRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
            directRadioButton.addActionListener(this);

            proxyRadioButton.setText("User Network HTTP Proxy Settings");
            proxyRadioButton.setToolTipText("Network Proxy Required...");
            proxyRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
            proxyRadioButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
            proxyRadioButton.setName("proxyRadioButton");
            proxyRadioButton.addActionListener(this);

            ButtonGroup networkButtonGroup = new ButtonGroup();
            networkButtonGroup.add(directRadioButton);
            networkButtonGroup.add(proxyRadioButton);

            proxyHostLabel.setText("Proxy Host");

            proxyPortLabel.setText("Port");

            bottomPanel = new javax.swing.JPanel();
            cancel = new javax.swing.JButton();
            ok = new javax.swing.JButton();
            cancel.setText("Cancel");
            cancel.setMnemonic('C');
            ok.setText("Ok");
            ok.setMnemonic('O');

            ok.addActionListener(this);
            cancel.addActionListener(this);

        }

        private void createGUI() {

            javax.swing.GroupLayout proxySettingsPanelLayout = new javax.swing.GroupLayout(proxySettingsPanel);
            proxySettingsPanel.setLayout(proxySettingsPanelLayout);
            proxySettingsPanelLayout.setHorizontalGroup(
                    proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(proxySettingsPanelLayout.createSequentialGroup()
                    .addGap(38, 38, 38)
                    .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(proxySettingsPanelLayout.createSequentialGroup()
                    .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(proxyPortLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(proxyHostLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(proxyPortTxtField, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(proxyHostTxtField, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(proxyRadioButton)
                    .addComponent(directRadioButton))
                    .addContainerGap(54, Short.MAX_VALUE))
                    );
            proxySettingsPanelLayout.setVerticalGroup(
                    proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(proxySettingsPanelLayout.createSequentialGroup()
                    .addGap(19, 19, 19)
                    .addComponent(directRadioButton)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(proxyRadioButton)
                    .addGap(18, 18, 18)
                    .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(proxyHostTxtField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(proxyHostLabel))
                    .addGap(14, 14, 14)
                    .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(proxyPortTxtField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(proxyPortLabel))
                    .addContainerGap(38, Short.MAX_VALUE))
                    );
            jTabbedPane1.addTab("Network", proxySettingsPanel);

            getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);
            jTabbedPane1.getAccessibleContext().setAccessibleName("Widnow Settings");

            javax.swing.GroupLayout bottomPanelLayout = new javax.swing.GroupLayout(bottomPanel);
            bottomPanel.setLayout(bottomPanelLayout);
            bottomPanelLayout.setHorizontalGroup(
                    bottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, bottomPanelLayout.createSequentialGroup()
                    .addContainerGap(175, Short.MAX_VALUE)
                    .addComponent(ok)
                    .addGap(14, 14, 14)
                    .addComponent(cancel)
                    .addContainerGap())
                    );
            bottomPanelLayout.setVerticalGroup(
                    bottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(bottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ok, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cancel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
                    );
            getContentPane().add(bottomPanel, java.awt.BorderLayout.SOUTH);
            pack();
        }// </editor-fold>

        public void actionPerformed(ActionEvent ae) {
            Object source = ae.getSource();
            if(ok == source && proxyRadioButton.isSelected()) {
                String hostName = proxyHostTxtField.getText();
                String port = proxyPortTxtField.getText();
                if( hostName.equals("") || port.equals("")) {
                    MainGUIApp.showMessageDialog(this,
                            "Enter the proxy host/port properly...",
                            "Proxy Details Required...");
                } else {
                    MainGUIApp.setProxyHost(hostName.trim());
                    MainGUIApp.setProxyPort(port.trim());
                    System.setProperty("http.proxyHost", hostName.trim());
                    System.setProperty("http.proxyPort", port.trim());
                    System.setProperty("https.proxyHost", hostName.trim());
                    System.setProperty("https.proxyPort", port.trim());
                    dispose();
                }
                //dispose();
            } else if( source == ok) {
                dispose();
            }

            if( cancel == source ) {
                dispose();
            }
            if(source == directRadioButton) {
                proxyPortTxtField.setEnabled(false);
                proxyHostTxtField.setEnabled(false);
                System.setProperty("http.proxyHost", "");
                System.setProperty("http.proxyPort", "");
            }

            if(source == proxyRadioButton){
                proxyPortTxtField.setEnabled(true);
                proxyHostTxtField.setEnabled(true);
            }

        }
        //Settings Dialog Variables
        private javax.swing.JRadioButton directRadioButton;
        private javax.swing.JPanel proxySettingsPanel;
        private javax.swing.JTabbedPane jTabbedPane1;
        private javax.swing.JLabel proxyHostLabel;
        private javax.swing.JTextField proxyHostTxtField;
        private javax.swing.JLabel proxyPortLabel;
        private javax.swing.JTextField proxyPortTxtField;
        private javax.swing.JRadioButton proxyRadioButton;
        private javax.swing.JPanel bottomPanel;
        private javax.swing.JButton cancel;
        private javax.swing.JButton ok;

    }
     // Variables declaration - do not modify
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration

    private static String proxyHostString = null;
    private static String proxyPortString = null;

}
