com.webwoz.wizard.client.WebWOZWizard.java Source code

Java tutorial

Introduction

Here is the source code for com.webwoz.wizard.client.WebWOZWizard.java

Source

package com.webwoz.wizard.client;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.Date;
import java.util.Vector;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.webwoz.wizard.client.DatabaseAccess;
import com.webwoz.wizard.client.wizardlayouts.ChooseLayoutInfoScreen;
import com.webwoz.wizard.client.wizardlayouts.HomeScreen;
import com.webwoz.wizard.client.wizardlayouts.DefaultWizardScreen;
import com.webwoz.wizard.client.wizardlayouts.NoLayoutScreen;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class WebWOZWizard implements EntryPoint, ValueChangeHandler<String> {

    // panels to structure layout
    private VerticalPanel headPanel;
    private HorizontalPanel titlePanel;
    private VerticalPanel contentPanel;
    private VerticalPanel contentWizardPanel;
    private VerticalPanel footPanel;
    private VerticalPanel containerPanel;
    private HorizontalPanel menuPanel;
    private DisclosurePanel menuSettingsPanel;
    private DisclosurePanel menuExperimentsPanel;
    private VerticalPanel wizardScreenPanel;
    private VerticalPanel layoutsPanel;
    private VerticalPanel settingsPanel;
    private VerticalPanel settingsClientOutputPanel;
    private static VerticalPanel settingsClientInputPanel;
    private static VerticalPanel settingsWizardOutputPanel;
    private static VerticalPanel settingsWizardOutMT;
    private HorizontalPanel experimentsPanel;
    private VerticalPanel experimentCollectionPanel;
    private HorizontalPanel loginPanel;
    private static VerticalPanel addExperimentPanel;
    private HorizontalPanel experimentNamePanel;
    private HorizontalPanel experimentLayoutPanel;
    private HorizontalPanel experimentSavePanel;
    private HorizontalPanel experimentMediaStoragePanel;
    private HorizontalPanel experimentUserStorePanel;
    private VerticalPanel userExperimentsCollectionPanel;
    private HorizontalPanel experimentClosePanel;
    private static VerticalPanel registerUserPanel;
    private HorizontalPanel registerUserUserPanel;
    private HorizontalPanel registerUserPassPanel;
    private HorizontalPanel registerUserButtonPanel;
    private VerticalPanel registerUserContainerPanel;
    private HorizontalPanel experimentEditPanel;
    private VerticalPanel experimentUserEditPanel;
    private HorizontalPanel newUserHeadingPanel;
    private HorizontalPanel addNewUserPanel;
    private HorizontalPanel copyExperimentDataPanel;
    private HorizontalPanel errorUserRegistrationPanel;
    private HorizontalPanel errorPrimaryUserPanel;
    private HorizontalPanel errorAdditionalUserPanel;
    private HorizontalPanel noExperimentsPanel;

    // Vectors
    private Vector<HorizontalPanel> userExperimentsPanels;
    private Vector<Label> userExperimentLabels;
    private Vector<Button> userExperimentDelButtons;
    private Vector<Button> userExperimentEditButtons;
    private Vector<HorizontalPanel> experimentUserPanels;
    private Vector<Label> experimentUserUserTextBoxes;
    private Vector<TextBox> experimentUserPassTextBoxes;
    private Vector<Label> experimentUserPassLabels;
    private Vector<Button> experimentUserChangeUserButtons;
    private Vector<Button> experimentUserDeleteUserButtons;

    // list boxes
    private ListBox layoutList;
    private ListBox experimentList;
    private ListBox clientListA;
    private ListBox clientListB;
    private ListBox experimentLayoutList;
    private ListBox experimentDataList;

    // labels
    private Label headingLabel;
    private Label userLabel;
    private Label pwLabel;
    private Label experimentNameLabel;
    private Label experimentLayoutLabel;
    private Label experimentMediaStorageLabel;
    private Label experimentUserStoreHeadingLabel;
    private Label experimentUserStoreNameLabel;
    private Label experimentUserStorePassLabel;
    private Label userExperimentsHeading;
    private Label userNewExperimentHeading;
    private Label registerUserUserLabel;
    private Label registerUserPassLabel;
    private Label newUserStorePassLabel;
    private Label newUserHeadingLabel;
    private Label clientOutputLabel;
    private Label clientInputLabel;
    private Label wizardOutputLabel;
    private Label loginMessage;
    private Label errorUserRegistrationLabel;
    private Label errorPrimaryUserRegistrationLabel;
    private Label errorAdditionalUserRegistrationLabel;
    private Label noExperimentsLabel;
    private Label existingUserHeadingLabel;

    // buttons
    private Button loginButton;
    private Button logoutButton;
    private Button newExperimentButton;
    private Button saveNewExperimentButton;
    private Button cancelNewExperimentButton;
    private Button registerUserRegsiterButton;
    private Button registerUserCloseButton;
    private Button changeExperimentNameButton;
    private Button changeExperimentMediaServerButton;
    private Button changeExperimentLayoutButton;
    private Button cancelChangeExperimentButton;
    private Button addUserButton;
    private Button saveChangeExperimentButton;

    // hyperlinks
    private Hyperlink registerLink;

    // text boxes
    private TextBox userTextBox;
    private PasswordTextBox pwTextBox;
    private TextBox experimentNameTextBox;
    private TextBox experimentMediaStorageTextBox;
    private TextBox experimentUserStoreNameTextBox;
    private TextBox experimentUserStorePassTextBox;
    private TextBox registerUserUserTextBox;
    private TextBox registerUserPassTextBox;
    private TextBox newUserStoreNameTextBox;
    private TextBox newUserStorePassTextBox;

    // Check boxes
    private CheckBox copyExperimentDataCheckBox;
    private CheckBox freeTextTabCheckBox;

    // Popups
    private AddExperimentPopUp addExperimentPopUp;
    private RegisterUserPopUp registerUserPopUp;

    // other variables
    private int[][] components;
    private int[] experimentLayouts;
    private int newExpId;
    private int newUserId;
    private int user;
    private int experiment;
    private int editExpId;
    private String sqlRecording;
    private String sqlTab;
    private String sqlDomainData;
    private String sqlSlot;
    private String sqlDomainDataSlot;
    private String sqlComponents;
    private int[] domaindataNew;
    private int[] oldSlots;
    private int[] newSlots;
    private int slotCountCopy;
    private String[] experimentPaths;
    private String[] experimentSSLangs;
    private String[] experimentMTSrc;
    private String[] experimentMTTrg;
    private String[] experimentMToSrc;
    private String[] experimentMToTrg;
    private String[] experimentASRlangs;
    private String selectedExperimentPath;
    private String selectedSSLang;
    private String selectedMTSrc;
    private String selectedMTTrg;
    private String selectedMToSrc;
    private String selectedMToTrg;
    private String selectedASRlang;
    private Screen wizardInterface;
    private int experimentToCopy;
    private static SettingsMTout mtOut;
    private static SettingsMTin mtIn;
    private static SettingsASR asrIn;
    private static SettingsSS ssOut;
    private int asrMod;
    private int mtCorMod;
    private int mtOutComp;
    private String newUser;
    private String newPwd;
    private Date date;
    private int editExpPanel;

    // RPC
    private DatabaseAccessAsync databaseAccessSvc;
    private ComponentFactoryAsync componentFactorySvc;

    public void onModuleLoad() {
        stopSession();
    }

    @SuppressWarnings("deprecation")
    private void startSession() {
        // instantiate variables

        // main panels
        headPanel = new VerticalPanel();
        titlePanel = new HorizontalPanel();
        contentPanel = new VerticalPanel();
        footPanel = new VerticalPanel();
        contentWizardPanel = new VerticalPanel();
        containerPanel = new VerticalPanel();
        menuPanel = new HorizontalPanel();
        menuSettingsPanel = new DisclosurePanel("Settings");
        menuExperimentsPanel = new DisclosurePanel("Experiments");
        wizardScreenPanel = new VerticalPanel();
        layoutsPanel = new VerticalPanel();
        settingsPanel = new VerticalPanel();
        settingsClientOutputPanel = new VerticalPanel();
        settingsClientInputPanel = new VerticalPanel();
        settingsWizardOutputPanel = new VerticalPanel();
        settingsWizardOutMT = new VerticalPanel();
        experimentsPanel = new HorizontalPanel();
        experimentCollectionPanel = new VerticalPanel();
        loginPanel = new HorizontalPanel();
        addExperimentPanel = new VerticalPanel();
        experimentNamePanel = new HorizontalPanel();
        experimentLayoutPanel = new HorizontalPanel();
        experimentSavePanel = new HorizontalPanel();
        experimentMediaStoragePanel = new HorizontalPanel();
        experimentUserStorePanel = new HorizontalPanel();
        userExperimentsCollectionPanel = new VerticalPanel();
        experimentClosePanel = new HorizontalPanel();
        registerUserPanel = new VerticalPanel();
        registerUserUserPanel = new HorizontalPanel();
        registerUserPassPanel = new HorizontalPanel();
        registerUserButtonPanel = new HorizontalPanel();
        registerUserContainerPanel = new VerticalPanel();
        experimentEditPanel = new HorizontalPanel();
        experimentUserEditPanel = new VerticalPanel();
        newUserHeadingPanel = new HorizontalPanel();
        addNewUserPanel = new HorizontalPanel();
        copyExperimentDataPanel = new HorizontalPanel();
        errorUserRegistrationPanel = new HorizontalPanel();
        errorPrimaryUserPanel = new HorizontalPanel();
        errorAdditionalUserPanel = new HorizontalPanel();
        noExperimentsPanel = new HorizontalPanel();

        // Vectors
        userExperimentsPanels = new Vector<HorizontalPanel>();
        userExperimentLabels = new Vector<Label>();
        userExperimentDelButtons = new Vector<Button>();
        userExperimentEditButtons = new Vector<Button>();
        experimentUserPanels = new Vector<HorizontalPanel>();
        experimentUserUserTextBoxes = new Vector<Label>();
        experimentUserPassTextBoxes = new Vector<TextBox>();
        experimentUserPassLabels = new Vector<Label>();
        experimentUserChangeUserButtons = new Vector<Button>();
        experimentUserDeleteUserButtons = new Vector<Button>();

        // list boxes
        layoutList = new ListBox();
        experimentList = new ListBox();
        clientListA = new ListBox();
        clientListB = new ListBox();
        experimentLayoutList = new ListBox();
        experimentDataList = new ListBox();

        // labels
        headingLabel = new Label();
        userLabel = new Label("User Name: ");
        pwLabel = new Label("Password: ");
        experimentNameLabel = new Label("Experiment Name: ");
        experimentLayoutLabel = new Label("Wizard Interface: ");
        experimentMediaStorageLabel = new Label("Path to Media: ");
        experimentUserStoreHeadingLabel = new Label("(Further users can then be added via 'Edit'!)");
        experimentUserStoreNameLabel = new Label("User Name:");
        experimentUserStorePassLabel = new Label("Password:");
        userExperimentsHeading = new Label("Your Existing Experiments");
        userNewExperimentHeading = new Label("Add a New Experiment");
        registerUserUserLabel = new Label("User Name:");
        registerUserPassLabel = new Label("Password:");
        newUserStorePassLabel = new Label("Password: ");
        newUserHeadingLabel = new Label("Add User: ");
        clientOutputLabel = new Label("Client");
        clientInputLabel = new Label("Input");
        wizardOutputLabel = new Label("Output");
        loginMessage = new Label();
        errorUserRegistrationLabel = new Label();
        errorPrimaryUserRegistrationLabel = new Label();
        errorAdditionalUserRegistrationLabel = new Label();
        noExperimentsLabel = new Label("< Empty >");
        existingUserHeadingLabel = new Label("Experiment Users");

        // buttons
        loginButton = new Button("Login");
        logoutButton = new Button("Logout");
        newExperimentButton = new Button("Organise Experiments");
        saveNewExperimentButton = new Button("Add Experiment");
        cancelNewExperimentButton = new Button("Close");
        registerUserRegsiterButton = new Button("Register");
        registerUserCloseButton = new Button("Cancel");
        changeExperimentNameButton = new Button("Change");
        changeExperimentMediaServerButton = new Button("Change");
        changeExperimentLayoutButton = new Button("Change");
        cancelChangeExperimentButton = new Button("Close");
        saveChangeExperimentButton = new Button("Save Changes");
        addUserButton = new Button("Add");

        // hyperlinks
        registerLink = new Hyperlink("Register...", "1");

        // text boxes
        userTextBox = new TextBox();
        pwTextBox = new PasswordTextBox();
        experimentNameTextBox = new TextBox();
        experimentMediaStorageTextBox = new TextBox();
        experimentUserStoreNameTextBox = new TextBox();
        experimentUserStorePassTextBox = new TextBox();
        registerUserUserTextBox = new TextBox();
        registerUserPassTextBox = new TextBox();
        newUserStoreNameTextBox = new TextBox();
        newUserStorePassTextBox = new TextBox();

        // Check boxes
        copyExperimentDataCheckBox = new CheckBox("Copy utterances and domain data from existing experiment");
        freeTextTabCheckBox = new CheckBox("Include Free-Text tab");

        // Popups
        addExperimentPopUp = null;
        registerUserPopUp = null;
        addExperimentPopUp = new AddExperimentPopUp();
        registerUserPopUp = new RegisterUserPopUp();

        // RPC
        databaseAccessSvc = GWT.create(DatabaseAccess.class);
        componentFactorySvc = GWT.create(ComponentFactory.class);

        // add handler
        loginButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                login();
            }
        });

        logoutButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                logout();
            }
        });

        pwTextBox.addKeyPressHandler(new KeyPressHandler() {
            public void onKeyPress(KeyPressEvent event) {
                if (event.getCharCode() == KeyCodes.KEY_ENTER) {
                    login();
                }
            }

        });

        userTextBox.addKeyPressHandler(new KeyPressHandler() {
            public void onKeyPress(KeyPressEvent event) {
                if (event.getCharCode() == KeyCodes.KEY_ENTER) {
                    login();
                }
            }

        });

        newExperimentButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                date = new Date();
                long userId = (long) (date.getTime());
                loadExperimentLayouts();
                copyExperimentDataCheckBox.setChecked(false);
                experimentNameTextBox.setText("New Experiment");
                experimentMediaStorageTextBox.setText("http://...");
                experimentUserStoreNameTextBox.setText("u" + userId);
                experimentUserStorePassTextBox.setText("Password01");
                addExperimentPopUp.center();
            }
        });

        addUserButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                String newUser = clearHiven(newUserStoreNameTextBox.getText());
                String newPwd = clearHiven(newUserStorePassTextBox.getText());
                checkUserExists(newUser, newPwd, 3);
            }
        });

        saveNewExperimentButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                String newUser = clearHiven(experimentUserStoreNameTextBox.getText());
                String newPwd = clearHiven(experimentUserStorePassTextBox.getText());
                checkUserExists(newUser, newPwd, 2);
            }
        });

        cancelChangeExperimentButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                closeChangeExperiment();
            }
        });

        saveChangeExperimentButton.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                changeExperimentData();
            }

        });

        changeExperimentNameButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                changeExperimentData();
            }

        });

        changeExperimentLayoutButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                changeExperimentData();
            }

        });

        changeExperimentMediaServerButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                changeExperimentData();
            }

        });

        cancelNewExperimentButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                loadExperiments();
                registerUserUserTextBox.setText("");
                registerUserPassTextBox.setText("");
                addExperimentPopUp.hide();

                // change visibility of tabs
                if (wizardInterface != null) {
                    wizardInterface.changeVisibility();
                }
            }
        });

        copyExperimentDataCheckBox.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                boolean checked = ((CheckBox) event.getSource()).isChecked();
                if (checked) {
                    experimentDataList.setVisible(true);
                } else {
                    experimentDataList.setVisible(false);
                }
            }
        });

        menuSettingsPanel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
            public void onClose(CloseEvent<DisclosurePanel> event) {
                changeTabVisibility();
            }

        });

        // Reset History: Application starts with no history
        String initToken = History.getToken();
        if (initToken.length() == 0) {
            History.newItem("0");
        }
        // Add history listener
        History.addValueChangeHandler(this);

        // hide popup
        registerUserPopUp.hide();
        // load register panel
        buildRegisterUserPanel();
        addExperimentPopUp.hide();

        // headPanel
        headPanel.clear();
        String header = "<div id='header'></div>";
        headPanel.add(new HTML(header));

        // titlePanel
        titlePanel.clear();
        headingLabel.setText("Welcome!");
        headingLabel.setWidth("1080px");
        titlePanel.add(headingLabel);
        titlePanel.addStyleName("title");
        titlePanel.add(logoutButton);

        // contentPanel
        contentPanel.clear();
        loginMessage.setText("");
        contentPanel.add(loginPanel);
        loginMessage.setStyleName("loginMessage");
        contentPanel.add(loginMessage);

        // footPanel
        footPanel.clear();
        String foot = "<div style=\"margin-bottom: 15px; margin-top:10px\">&nbsp;</div>";
        footPanel.add(new HTML(foot));
        footPanel.setWidth("1160px");

        // load login screen
        loadLoginScreen();
        RootPanel.get("head").add(headPanel);
        RootPanel.get("title").add(titlePanel);
        RootPanel.get("content").add(contentPanel);
        RootPanel.get("foot").add(footPanel);
    }

    private void stopSession() {

        // stop reload in wizardInterface
        if (wizardInterface != null) {
            wizardInterface.stopReload();
            wizardInterface = null;
        }

        // clear elements
        RootPanel.get("head").clear();
        RootPanel.get("title").clear();
        RootPanel.get("content").clear();
        RootPanel.get("foot").clear();
        RootPanel.get().clear();

        // start new session
        startSession();

    }

    private void login() {

        String sql = "Select * from user where name = '" + userTextBox.getText() + "' and pw = '"
                + pwTextBox.getText() + "' and role = 1";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                if (result != null) {
                    setUser(Integer.parseInt(result[0][0]));
                    loginPanel.clear();
                    registerUserPanel.clear();
                    logoutButton.setVisible(true);
                    loginMessage.setText("");
                    // load wizard screen
                    loadWizardScreen();

                } else {
                    // clear login if no user is found
                    pwTextBox.setText("");
                    userTextBox.setText("");
                    loginMessage.setText("Sorry! Wrong user name or password ");
                }
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    private void logout() {
        stopSession();
    }

    private void loadLoginScreen() {
        loginPanel.clear();
        loginPanel.add(userLabel);
        userLabel.setStyleName("label");
        loginPanel.add(userTextBox);
        userTextBox.setStyleName("text");
        loginPanel.add(pwLabel);
        pwLabel.setStyleName("label");
        loginPanel.add(pwTextBox);
        pwTextBox.setStyleName("text");
        loginPanel.add(loginButton);
        loginButton.setStyleName("button");
        logoutButton.setStyleName("button");
        loginPanel.add(registerLink);

        // deactivate registration in case you want to control the amount of
        // wizards using the system
        // registerLink.setVisible(false);

        registerLink.setStyleName("link");
        logoutButton.setVisible(false);
        loginPanel.setStyleName("loginPanel");
        loginPanel.setVisible(true);
        headingLabel.setText("Welcome!");
        pwTextBox.setText("");
        userTextBox.setText("");
    }

    private void loadWizardScreen() {

        // load experiment edit panel
        loadExperimentEditPanel();

        // load menu
        loadMenu();

        // wizardScreenPanel
        wizardScreenPanel.clear();
        headingLabel.setText("WebWOZ Wizard of Oz Prototyping Platform");
        wizardScreenPanel.add(new HomeScreen().getScreen());

        // containerPanel
        containerPanel.clear();
        containerPanel.add(wizardScreenPanel);
        containerPanel.setWidth("930px");

        // contentWizardPanel
        contentWizardPanel.clear();
        contentWizardPanel.add(menuPanel);
        contentWizardPanel.add(containerPanel);
        contentWizardPanel.addStyleName("contentPanel");

        contentPanel.clear();
        contentPanel.add(contentWizardPanel);

        // wizard layout handler
        layoutList.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                changeLayout();
                menuPanel.setVisible(false);
            }

        });

        // clientA layout handler
        clientListA.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                // changeClient();
            }

        });

        // clientB layout handler
        clientListB.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                // changeClient();
            }

        });

        // experiment handler
        experimentList.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                changeExperiment();
            }

        });

    }

    private void loadMenu() {
        menuSettingsPanel.clear();
        menuSettingsPanel.add(settingsPanel);
        menuSettingsPanel.setOpen(false);
        menuSettingsPanel.setVisible(false);
        menuExperimentsPanel.clear();
        experimentCollectionPanel.clear();
        experimentCollectionPanel.setStyleName("marginBottom");
        experimentCollectionPanel.add(experimentsPanel);
        menuExperimentsPanel.add(experimentCollectionPanel);
        menuExperimentsPanel.setOpen(true);
        menuPanel.clear();
        menuPanel.add(menuExperimentsPanel);
        menuPanel.add(menuSettingsPanel);
        menuPanel.setStyleName("menuPanel");
        menuPanel.setVisible(true);
    }

    private void loadExperiments() {

        String sql = "Select * from experiment where userid = " + user + " order by id asc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                experimentList.clear();

                if (result != null) {
                    experimentLayouts = new int[result.length + 1];
                    experimentPaths = new String[result.length + 1];
                    experimentSSLangs = new String[result.length + 1];
                    experimentMTSrc = new String[result.length + 1];
                    experimentMTTrg = new String[result.length + 1];
                    experimentMToSrc = new String[result.length + 1];
                    experimentMToTrg = new String[result.length + 1];
                    experimentASRlangs = new String[result.length + 1];

                    experimentList.addItem("-", "0");
                    experimentLayouts[0] = 0;
                    experimentSSLangs[0] = "-";
                    experimentPaths[0] = "-";
                    experimentMTSrc[0] = "-";
                    experimentMTTrg[0] = "-";
                    experimentMToSrc[0] = "-";
                    experimentMToTrg[0] = "-";
                    experimentASRlangs[0] = "-";

                    for (int i = 0; i < result.length; i++) {

                        experimentLayouts[i + 1] = Integer.parseInt(result[i][6]);
                        experimentPaths[i + 1] = result[i][5];
                        experimentSSLangs[i + 1] = result[i][8];
                        experimentMTSrc[i + 1] = result[i][9];
                        experimentMTTrg[i + 1] = result[i][10];
                        experimentMToSrc[i + 1] = result[i][11];
                        experimentMToTrg[i + 1] = result[i][12];
                        experimentASRlangs[i + 1] = result[i][13];

                        experimentList.addItem(result[i][1] + " (" + result[i][0] + ")", result[i][0]);

                    }
                    noExperimentsPanel.setVisible(false);
                    userExperimentsCollectionPanel.setVisible(true);

                } else {
                    userExperimentsCollectionPanel.setVisible(false);
                    noExperimentsPanel.setVisible(true);
                    experimentList.addItem("-", "0");
                }
                // add list to panel
                experimentsPanel.clear();
                experimentsPanel.add(experimentList);
                experimentList.setStyleName("list");
                // add possibility to create a new experiment
                experimentsPanel.add(newExperimentButton);
                newExperimentButton.setStyleName("button");
            }

        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void addExperimentDelButton(Button b, final int expid, final int panel) {
        b.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                userExperimentsPanels.get(panel).clear();
                deleteExperiment(expid);
            }
        });

    }

    private void addExperimentEditButton(Button b, final int expid, final int panel) {
        b.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                editExpId = expid;
                editExpPanel = panel;
                getExperimentData();
            }
        });

    }

    private void buildSettingsPanel(final int experimentid) {
        String sql = "Select * from experimentcomponent where experimentid = " + experimentid
                + " order by rank asc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                settingsPanel.clear();
                settingsClientOutputPanel.clear();
                clientOutputLabel.setStyleName("strong");
                settingsClientOutputPanel.setStyleName("marginBottom");
                settingsClientOutputPanel.add(clientOutputLabel);
                settingsClientInputPanel.clear();
                clientInputLabel.setStyleName("strong");
                settingsClientInputPanel.setStyleName("settingsComponentsPanel");
                settingsClientInputPanel.add(clientInputLabel);
                settingsWizardOutputPanel.clear();
                wizardOutputLabel.setStyleName("strong");
                settingsWizardOutputPanel.setStyleName("settingsComponentsPanel");

                settingsWizardOutputPanel.addStyleName("settingsComponentsPanel");
                settingsWizardOutputPanel.add(wizardOutputLabel);
                settingsPanel.add(settingsClientInputPanel);
                settingsPanel.add(settingsWizardOutputPanel);
                settingsPanel.add(settingsClientOutputPanel);

                if (result != null) {

                    // Output
                    settingsClientOutputPanel.add(new SettingsClient(experimentid).getScreen());

                    asrMod = 0;
                    mtCorMod = 0;
                    mtOutComp = 0;

                    for (int i = 0; i < result.length; i++) {
                        switch (Integer.parseInt(result[i][2])) {
                        case 1: // ASR
                            asrIn = new SettingsASR(experimentid, selectedExperimentPath, selectedSSLang,
                                    selectedMTSrc, selectedMTTrg, selectedMToSrc, selectedMToTrg, selectedASRlang,
                                    getUser());

                            settingsClientInputPanel.add(asrIn.getScreen(Integer.parseInt(result[i][3]),
                                    Integer.parseInt(result[i][4]), Integer.parseInt(result[i][5])));
                            asrMod = Integer.parseInt(result[i][4]);
                            break;
                        case 2: // MT in
                            mtIn = new SettingsMTin(experimentid, selectedExperimentPath, selectedSSLang,
                                    selectedMTSrc, selectedMTTrg, selectedMToSrc, selectedMToTrg, selectedASRlang,
                                    getUser());

                            settingsClientInputPanel.add(mtIn.getScreen(Integer.parseInt(result[i][3]),
                                    Integer.parseInt(result[i][4]), Integer.parseInt(result[i][5])));

                            mtCorMod = Integer.parseInt(result[i][4]);
                            break;
                        case 5: // MT out
                            mtOut = new SettingsMTout(experimentid, selectedExperimentPath, selectedSSLang,
                                    selectedMTSrc, selectedMTTrg, selectedMToSrc, selectedMToTrg, selectedASRlang,
                                    getUser());

                            settingsWizardOutMT = mtOut.getScreen(Integer.parseInt(result[i][3]),
                                    Integer.parseInt(result[i][4]), Integer.parseInt(result[i][5]));
                            settingsWizardOutputPanel.add(settingsWizardOutMT);
                            mtOutComp = Integer.parseInt(result[i][3]);
                            break;
                        case 6: // SS
                            ssOut = new SettingsSS(experimentid, selectedExperimentPath, selectedSSLang,
                                    selectedMTSrc, selectedMTTrg, selectedMToSrc, selectedMToTrg, selectedASRlang,
                                    getUser());

                            settingsWizardOutputPanel.add(ssOut.getScreen(Integer.parseInt(result[i][3]),
                                    Integer.parseInt(result[i][4]), Integer.parseInt(result[i][5])));
                            break;
                        default:
                            break;
                        }

                    }

                    if (asrMod > 0) {
                        changeVisiblility(2);
                    } else {
                        changeVisiblility(3);
                    }

                    if (asrMod > 0 | mtCorMod > 0) {
                        changeVisiblility(4);
                    } else {
                        changeVisiblility(5);
                    }

                    if (mtOutComp > 0) {
                        changeVisiblility(6);
                    } else {
                        changeVisiblility(7);
                    }

                    settingsClientInputPanel.add(new HTML("<hr />"));
                    settingsWizardOutputPanel.add(new HTML("<hr />"));
                    menuSettingsPanel.setVisible(true);

                } else {

                }
            }

        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    private void changeLayout() {

        // clear wizard screen and stop reload
        wizardScreenPanel.clear();

        if (wizardInterface != null) {
            wizardInterface.stopReload();
            wizardInterface = null;
        }

        menuSettingsPanel.setVisible(false);

        int i = experimentLayouts[experimentList.getSelectedIndex()];

        switch (i) {

        case 0:
            wizardInterface = new ChooseLayoutInfoScreen();
            wizardScreenPanel.add(wizardInterface.getScreen());
            break;
        case 1:
            wizardInterface = new DefaultWizardScreen(
                    Integer.parseInt(experimentList.getValue(experimentList.getSelectedIndex())), user);
            wizardScreenPanel.add(wizardInterface.getScreen());
            menuExperimentsPanel.setOpen(false);
            menuSettingsPanel.setVisible(true);
            menuSettingsPanel.setOpen(false);
            break;

        // space for more screen layouts

        default:
            wizardInterface = new NoLayoutScreen();
            wizardScreenPanel.add(wizardInterface.getScreen());
            break;
        }

    }

    private void changeExperiment() {

        // set experiment variables
        selectedExperimentPath = experimentPaths[experimentList.getSelectedIndex()];
        selectedSSLang = experimentSSLangs[experimentList.getSelectedIndex()];
        selectedMTSrc = experimentMTSrc[experimentList.getSelectedIndex()];
        selectedMTTrg = experimentMTTrg[experimentList.getSelectedIndex()];
        selectedMToSrc = experimentMToSrc[experimentList.getSelectedIndex()];
        selectedMToTrg = experimentMToTrg[experimentList.getSelectedIndex()];
        selectedASRlang = experimentASRlangs[experimentList.getSelectedIndex()];
        experiment = Integer.parseInt(experimentList.getValue(experimentList.getSelectedIndex()));

        // load layout for experiment
        changeLayout();

        // load LTCs for the experiment
        clearComponents();
        loadLTCs();

        // load LTC settings for experiment
        buildSettingsPanel(experiment);

    }

    private void loadLTCs() {
        String sql = "Select * from experimentcomponent where experimentid = " + experiment + " order by rank asc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                if (result != null) {
                    components = new int[result.length][3];
                    for (int i = 0; i < result.length; i++) {
                        // add components to local array
                        components[i][0] = Integer.parseInt(result[i][2]);
                        components[i][1] = Integer.parseInt(result[i][3]);
                        components[i][2] = Integer.parseInt(result[i][4]);
                    }

                    addComponents();

                } else {
                    // System.out.println("No components defined for this experiment!");
                }

                layoutList.clear();
                layoutsPanel.clear();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void addComponents() {

        // Initialize the service remote procedure call
        if (componentFactorySvc == null) {
            componentFactorySvc = GWT.create(ComponentFactory.class);
        }

        AsyncCallback<Void> callback = new AsyncCallback<Void>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(Void result) {

            }

        };

        componentFactorySvc.pushComponents(components,
                Integer.parseInt(experimentList.getValue(experimentList.getSelectedIndex())),
                selectedExperimentPath, selectedSSLang, selectedMTSrc, selectedMTTrg, selectedMToSrc,
                selectedMToTrg, selectedASRlang, getUser(), callback);

    }

    private void clearComponents() {

        // clear local field
        components = null;

        // Initialize the service remote procedure call
        if (componentFactorySvc == null) {
            componentFactorySvc = GWT.create(ComponentFactory.class);
        }

        AsyncCallback<Void> callback = new AsyncCallback<Void>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(Void result) {

            }

        };

        componentFactorySvc.clearComponents(callback);
    }

    public void saveExperiment(final String us, final String pw) {

        String expName = clearHiven(experimentNameTextBox.getText());
        String expServer = clearHiven(experimentMediaStorageTextBox.getText());

        String sql = "Insert into experiment (name, mediaserver, layout, userid) values ('" + expName + "', '"
                + expServer + "', " + experimentLayoutList.getValue(experimentLayoutList.getSelectedIndex()) + ", "
                + user + ");";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                newExpId = Integer.parseInt(result);
                // System.out.println("Experiment: " + newExpId);
                saveUser(us, pw);
            }

        };

        databaseAccessSvc.storeData(sql, callback);

    }

    public void saveUser(String us, String pw) {

        String sql = "Insert into user (name, pw, role) values ('" + us + "', '" + pw + "', 2);";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                newUserId = Integer.parseInt(result);
                // System.out.println("User: " + newUserId);
                insertExperimentUser();
            }

        };

        databaseAccessSvc.storeData(sql, callback);

    }

    private void insertExperimentUser() {

        String sql = "Insert into experimentuser values (" + newExpId + ", " + newUserId + ");";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            @SuppressWarnings("deprecation")
            public void onSuccess(String result) {
                // System.out.println("ExperimentUser inserted!");
                if (!copyExperimentDataCheckBox.isChecked()) {
                    createNewExperimentEnvironment();
                } else {
                    addExperiment();
                }
            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void loadExperimentLayouts() {

        String sql = "Select * from layout";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                experimentLayoutList.clear();

                if (result != null) {
                    ;
                    for (int i = 0; i < result.length; i++) {
                        experimentLayoutList.addItem(result[i][1], result[i][0]);
                    }
                } else {

                }

            }

        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void setUser(int user) {
        this.user = user;
    }

    public int getUser() {
        return user;
    }

    private static class AddExperimentPopUp extends PopupPanel {
        public AddExperimentPopUp() {
            // Set the dialog box's caption.
            setWidth("430px");
            setHeight("270px");
            // Enable animation.
            setAnimationEnabled(true);
            setGlassEnabled(true);
            setWidget(addExperimentPanel);
        }
    }

    private static class RegisterUserPopUp extends PopupPanel {
        public RegisterUserPopUp() {
            // Set the dialog box's caption.
            setWidth("300px");
            setHeight("100px");
            // Enable animation.
            setAnimationEnabled(true);
            setGlassEnabled(true);
            setWidget(registerUserPanel);
        }
    }

    private void createNewExperimentEnvironment() {
        String sql = " Insert into recording (expid, semkey, section, rank, origtext, origaudiofile, origmmfile, transtext, transaudiofile, transmmfile) values ("
                + newExpId
                + ", 'Welcome', 1, 7, 'Welcome to ABC Bank. To start, please say your account number or say I do not have one.' , 'http://kdeg-vm-14.cs.tcd.ie:8180/mediaexamples/Scenario01_01.mp3', '', '', '', '');";
        sql = sql + " Insert into tab (tabname, exp, rank, notes) values ('Stored Utterances'," + newExpId
                + ", 0, 'Please welcome and identify the customer.');";

        sql = sql
                + " Insert into recording (expid, semkey, section, rank, origtext, origaudiofile, origmmfile, transtext, transaudiofile, transmmfile) values ("
                + newExpId
                + ", 'Correct', 0, 7, 'Is that correct?' , 'http://kdeg-vm-14.cs.tcd.ie:8180/mediaexamples/Scenario02_03.mp3', '', '', '', '');";

        // components
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 0, 0, 0, 0);"; // Wizard
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 1, 1, 0, 0);"; // ASR
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 2, 2, 0, 0);"; // MT in
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 3, 3, 0, 0);"; // NLU
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 4, 4, 0, 0);"; // NLG
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 5, 5, 0, 0);"; // MT out
        sql = sql
                + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                + newExpId + ", 6, 6, 1, 0);"; // SS

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                // System.out.println("Experiment Environment created (Recording, Tab, Standard Experiment Components!");
                addExperiment();
            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void deleteExperiment(int id) {

        String sql = "Delete from recording where expid =" + id + ";";
        sql = sql + " Delete from domaindata where expid =" + id + ";";
        sql = sql + " Delete from tab where exp =" + id + ";";
        sql = sql + " Delete from experimentuser where expid=" + id + ";";
        sql = sql + " Delete from slot where expid =" + id + ";";
        sql = sql + " Delete from experiment where id =" + id + ";";
        sql = sql + " Delete from experimentcomponent where experimentid =" + id + ";";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    @SuppressWarnings("deprecation")
    private void addExperiment() {

        int i = userExperimentsPanels.size();
        userExperimentsPanels.add(i, new HorizontalPanel());
        userExperimentLabels.add(i, new Label(experimentNameTextBox.getText()));
        userExperimentDelButtons.add(i, new Button("Delete"));
        userExperimentEditButtons.add(i, new Button("Edit"));

        addExperimentDelButton(userExperimentDelButtons.get(i), newExpId, i);
        addExperimentEditButton(userExperimentEditButtons.get(i), newExpId, i);
        userExperimentLabels.get(i).setWidth("150px");
        userExperimentDelButtons.get(i).setStyleName("button");
        userExperimentEditButtons.get(i).setStyleName("button");

        userExperimentsPanels.get(i).add(userExperimentLabels.get(i));
        userExperimentsPanels.get(i).add(userExperimentDelButtons.get(i));
        userExperimentsPanels.get(i).add(userExperimentEditButtons.get(i));

        // add them to the collection panel
        userExperimentsCollectionPanel.add(userExperimentsPanels.get(i));
        // end list

        // resest textbox values
        experimentNameTextBox.setText("New Experiment");
        experimentMediaStorageTextBox.setText("http://...");
        experimentLayoutList.setItemSelected(0, true);

        date = new Date();
        long newUserId = (long) (date.getTime());
        experimentUserStoreNameTextBox.setText("u" + newUserId);
        experimentUserStorePassTextBox.setText("Password01");

        noExperimentsPanel.setVisible(false);
        userExperimentsCollectionPanel.setVisible(true);

        if (copyExperimentDataCheckBox.isChecked()) {
            copyRecording();
        } else {

        }
    }

    public void copyRecording() {
        experimentToCopy = Integer.parseInt(experimentDataList.getValue(experimentDataList.getSelectedIndex()));

        String sql = "Select * from recording where expid = " + experimentToCopy + " order by id";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlRecording = "";
                for (int i = 0; i < result.length; i++) {
                    sqlRecording = sqlRecording
                            + " Insert into recording (expid, semkey, section, rank, origtext, origaudiofile, origmmfile, transtext, transaudiofile, transmmfile) values ("
                            + newExpId + ", '" + result[i][2] + "', " + result[i][3] + ", " + result[i][4] + ", '"
                            + result[i][5] + "', '" + result[i][6] + "', '" + result[i][7] + "', '" + result[i][8]
                            + "', '" + result[i][9] + "', '" + result[i][10] + "');";
                }
                System.out.println("Copied recording!");
                copyComponents();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void copyComponents() {
        String sql = "Select * from experimentcomponent where experimentid = " + experimentToCopy;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlComponents = "";
                for (int i = 0; i < result.length; i++) {
                    sqlComponents = sqlComponents
                            + " Insert into experimentcomponent (experimentid, rank, componenttype, component, componentmode) values ("
                            + newExpId + ", " + result[i][1] + ", " + result[i][2] + ", " + result[i][3] + ", "
                            + result[i][4] + ");";
                }
                System.out.println("Copied components!");
                copyTab();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void copyTab() {
        String sql = "Select * from tab where exp = " + experimentToCopy;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            @SuppressWarnings("deprecation")
            public void onSuccess(String[][] result) {
                sqlTab = "";
                for (int i = 0; i < result.length; i++) {
                    sqlTab = sqlTab + " Insert into tab (tabname, exp, rank) values ('" + result[i][1] + "', "
                            + newExpId + ", " + result[i][3] + ");";

                }

                // add free text tab if requested
                if (freeTextTabCheckBox.isChecked()) {

                    sqlTab = sqlTab + " Update experiment set freetext = 1 where id = " + newExpId + ";";
                }

                // System.out.println("Copied tabs!");
                copyDomainData();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void copyDomainData() {
        String sql = "Select * from domaindata where expid = " + experimentToCopy;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlDomainData = "";
                for (int i = 0; i < result.length; i++) {
                    sqlDomainData = sqlDomainData
                            + " Insert into domaindata (expid, semkey, section, rank, origtext, origaudiofile, origmmfile, transtext, transaudiofile, transmmfile) values ("
                            + newExpId + ", '" + result[i][2] + "', " + result[i][3] + ", " + result[i][4] + ", '"
                            + result[i][5] + "', '" + result[i][6] + "', '" + result[i][7] + "', '" + result[i][8]
                            + "', '" + result[i][9] + "', '" + result[i][10] + "');";
                }
                // System.out.println("Copied domain data!");
                copySlot();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void copySlot() {
        String sql = "Select * from slot where expid = " + experimentToCopy;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlSlot = "";
                for (int i = 0; i < result.length; i++) {
                    sqlSlot = sqlSlot + " Insert into slot (expid, name, value, type, rank) values (" + newExpId
                            + ", '" + result[i][2] + "', '" + result[i][3] + "', " + result[i][4] + ", "
                            + result[i][5] + ");";
                }
                // System.out.println("Copied filter!");
                getSlotCount();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    public void getSlotCount() {
        String sql = "Select distinct(name) from slot where expid = " + experimentToCopy;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                setSlotCountCopy(result.length);
                // System.out.println("Slot count to copy: " + slotCountCopy);
                insertDomainData();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    private void insertDomainData() {

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                // System.out.println("Domain data inserted!");
                getNewDomainDataIds();
            }

        };

        databaseAccessSvc.storeData(sqlDomainData, callback);
    }

    public void getNewDomainDataIds() {
        String sql = "Select * from domaindata where expid = " + newExpId + " order by id";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlDomainDataSlot = "";
                domaindataNew = new int[result.length];
                for (int i = 0; i < result.length; i++) {
                    domaindataNew[i] = Integer.parseInt(result[i][0]);
                }
                // System.out.println("New domain data ids retrieved!");
                insertSlotData();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void insertSlotData() {

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                // System.out.println("Filters inserted!");
                getSlotIds();
            }

        };

        databaseAccessSvc.storeData(sqlSlot, callback);
    }

    public void getSlotIds() {
        String sql = "Select * from slot where expid in (" + newExpId + ", " + experimentToCopy + ") order by id";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                oldSlots = new int[result.length / 2];
                newSlots = new int[result.length / 2];
                int x = 0;
                for (int i = 0; i < result.length / 2; i++) {
                    oldSlots[x] = Integer.parseInt(result[i][0]);
                    x++;
                }
                x = 0;
                for (int j = result.length / 2; j < result.length; j++) {
                    newSlots[x] = Integer.parseInt(result[j][0]);
                    x++;
                }
                // System.out.println("Slot comparison created!");
                copyDomainDataSlot();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    public void copyDomainDataSlot() {
        String sql = "Select * from domaindata inner join domaindataslot where domaindata.id = domaindataslot.dataid and domaindata.expid = "
                + experimentToCopy + " order by domaindata.id";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {
                sqlDomainDataSlot = "";
                int k = 0;
                for (int i = 0; i < result.length; i++) {

                    int x = 0;
                    for (int j = 0; j < oldSlots.length; j++) {
                        if (oldSlots[j] == Integer.parseInt(result[i][12])) {
                            x = j;
                        }
                    }

                    sqlDomainDataSlot = sqlDomainDataSlot + " Insert into domaindataslot (dataid, slotid) values ("
                            + domaindataNew[k] + ", " + newSlots[x] + ");";
                    // only got to the next domaindata id if data for all slots
                    // are inserted
                    if ((i + 1) % slotCountCopy == 0) {
                        k++;
                    }

                }
                // System.out.println("Slots copied!");
                insertCopy();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);
    }

    private void insertCopy() {
        String sql = sqlRecording + sqlTab + sqlDomainDataSlot + sqlComponents;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            @SuppressWarnings("deprecation")
            public void onSuccess(String result) {
                System.out.println("Recordings, Tabs, DomaindataSlots and Components inserted!");
                // set check boxes visible true and uncheck them
                copyExperimentDataCheckBox.setVisible(true);
                copyExperimentDataCheckBox.setChecked(false);
                experimentDataList.setVisible(false);
                freeTextTabCheckBox.setVisible(true);
                freeTextTabCheckBox.setChecked(false);

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void buildRegisterUserPanel() {

        registerUserPanel.clear();
        registerUserUserPanel.clear();
        registerUserPassPanel.clear();
        registerUserButtonPanel.clear();
        registerUserContainerPanel.clear();

        registerUserUserPanel.clear();
        registerUserUserPanel.add(registerUserUserLabel);
        registerUserUserLabel.setWidth("100px");
        registerUserUserPanel.add(registerUserUserTextBox);
        registerUserUserTextBox.setWidth("150px");
        registerUserUserPanel.setStyleName("registerUser");

        registerUserPassPanel.clear();
        registerUserPassPanel.add(registerUserPassLabel);
        registerUserPassLabel.setWidth("100px");
        registerUserPassPanel.add(registerUserPassTextBox);
        registerUserPassTextBox.setWidth("150px");
        registerUserPassPanel.setStyleName("registerUser");

        errorUserRegistrationPanel.clear();
        errorUserRegistrationPanel.add(errorUserRegistrationLabel);
        errorUserRegistrationLabel.setStyleName("errorUserRegistrationLabel");
        errorUserRegistrationLabel.setText("");

        registerUserButtonPanel.clear();
        registerUserButtonPanel.add(registerUserCloseButton);
        registerUserCloseButton.setStyleName("button");
        registerUserButtonPanel.add(registerUserRegsiterButton);
        registerUserRegsiterButton.setStyleName("button");
        registerUserButtonPanel.setStyleName("registerUserButtons");

        registerUserContainerPanel.clear();
        registerUserContainerPanel.add(registerUserUserPanel);
        registerUserContainerPanel.add(registerUserPassPanel);
        registerUserContainerPanel.add(errorUserRegistrationPanel);
        registerUserContainerPanel.add(registerUserButtonPanel);

        registerUserContainerPanel.setStyleName("registerUser");

        registerUserPanel.clear();
        registerUserPanel.add(registerUserContainerPanel);

        registerUserCloseButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                History.newItem("0");
                registerUserPopUp.hide();
            }
        });

        registerUserRegsiterButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                History.newItem("0");
                newUser = clearHiven(registerUserUserTextBox.getText());
                newPwd = clearHiven(registerUserPassTextBox.getText());
                checkUserExists(newUser, newPwd, 1);
            }
        });

    }

    public void onValueChange(ValueChangeEvent<String> event) {

        int i = Integer.parseInt(event.getValue());

        switch (i) {
        case 1:
            registerUserUserTextBox.setText("");
            registerUserPassTextBox.setText("");
            registerUserPopUp.center();
            registerUserPopUp.show();
            break;
        default:
            break;
        }
    }

    private void checkUserExists(final String user, final String pwd, final int mode) {
        String sql = "Select * from user where name = '" + user + "';";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                if (result != null) {

                    switch (mode) {
                    case 1:
                        registerUserUserTextBox.setText("");
                        registerUserPassTextBox.setText("");
                        errorUserRegistrationLabel.setText("Error: User Name already exists!");
                        break;
                    case 2:
                        experimentUserStorePassTextBox.setText("");
                        experimentUserStoreNameTextBox.setText("");
                        errorPrimaryUserRegistrationLabel.setText("Error: User Name already exists!");
                        break;
                    case 3:
                        newUserStoreNameTextBox.setText("");
                        newUserStorePassTextBox.setText("");
                        errorAdditionalUserRegistrationLabel.setText("Error: User Name already exists!");
                        break;
                    }

                } else {
                    switch (mode) {
                    case 1:
                        errorUserRegistrationLabel.setText("");
                        registerUser(user, pwd);
                        registerUserPopUp.hide();
                        break;
                    case 2:
                        errorPrimaryUserRegistrationLabel.setText("");
                        saveExperiment(user, pwd);
                        break;
                    case 3:
                        errorAdditionalUserRegistrationLabel.setText("");
                        addUser(user, pwd);
                        break;
                    }

                }
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void registerUser(String user, String pw) {

        String sql = "Insert into user (name, pw, role) values ('" + user + "', '" + pw + "', 1)";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void closeChangeExperiment() {
        userExperimentsCollectionPanel.setVisible(true);
        userExperimentsHeading.setText("Your Existing Experiments");
        userNewExperimentHeading.setVisible(true);

        userExperimentLabels.get(editExpPanel).setText(experimentNameTextBox.getText());

        existingUserHeadingLabel.setVisible(false);
        experimentNameTextBox.setText("New Experiment");
        experimentMediaStorageTextBox.setText("http://...");
        experimentLayoutList.setItemSelected(0, true);
        experimentUserStoreHeadingLabel.setText("(Further users can then be added via 'Edit'!)");
        experimentUserEditPanel.setVisible(false);
        experimentUserStorePanel.setVisible(true);
        experimentSavePanel.setVisible(true);
        experimentClosePanel.setVisible(true);
        experimentEditPanel.setVisible(false);

        errorPrimaryUserPanel.setVisible(true);
        errorAdditionalUserPanel.setVisible(false);

        copyExperimentDataPanel.setVisible(true);

        changeExperimentNameButton.setVisible(false);
        changeExperimentLayoutButton.setVisible(false);
        changeExperimentMediaServerButton.setVisible(false);
        newUserHeadingPanel.setVisible(false);
        addNewUserPanel.setVisible(false);
        saveChangeExperimentButton.setVisible(false);

    }

    @SuppressWarnings("deprecation")
    private void openChangeExperiment() {
        userExperimentsHeading.setText("General Settings");
        userExperimentsCollectionPanel.setVisible(false);
        userNewExperimentHeading.setVisible(false);
        saveChangeExperimentButton.setVisible(true);
        existingUserHeadingLabel.setVisible(true);
        experimentUserStoreHeadingLabel.setVisible(false);
        experimentUserEditPanel.setVisible(true);
        experimentUserStorePanel.setVisible(false);
        experimentSavePanel.setVisible(false);
        experimentClosePanel.setVisible(false);
        experimentEditPanel.setVisible(true);
        errorPrimaryUserPanel.setVisible(false);
        errorAdditionalUserPanel.setVisible(true);
        changeExperimentNameButton.setVisible(true);
        changeExperimentLayoutButton.setVisible(true);
        changeExperimentMediaServerButton.setVisible(true);
        newUserHeadingPanel.setVisible(true);
        addNewUserPanel.setVisible(true);
        copyExperimentDataPanel.setVisible(false);
        if (copyExperimentDataCheckBox.isChecked()) {
            copyExperimentDataCheckBox.setChecked(false);
        }
        experimentDataList.setVisible(false);

        newUserStoreNameTextBox.setText("");
        newUserStorePassTextBox.setText("");
    }

    private void getExperimentData() {

        String sql = "Select * from experiment where id = " + editExpId;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                if (result != null) {

                    // get name and media server
                    experimentNameTextBox.setText(result[0][1]);
                    experimentMediaStorageTextBox.setText(result[0][5]);
                    // get layout
                    for (int i = 0; i < experimentLayoutList.getItemCount(); i++) {
                        if (experimentLayoutList.getValue(i).equals(result[0][6])) {
                            experimentLayoutList.setItemSelected(i, true);
                        }

                    }
                    // get users
                    getExperimentUsers();

                }
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void getExperimentUsers() {

        String sql = "Select * from user inner join experimentuser where user.id = experimentuser.userid and experimentuser.expid = "
                + editExpId + " and role = 2 order by id asc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                experimentUserEditPanel.clear();
                experimentUserPanels.clear();
                experimentUserUserTextBoxes.clear();
                experimentUserPassTextBoxes.clear();
                experimentUserPassLabels.clear();
                experimentUserChangeUserButtons.clear();
                experimentUserDeleteUserButtons.clear();

                if (result != null) {

                    for (int i = 0; i < result.length; i++) {

                        experimentUserPanels.add(i, new HorizontalPanel());

                        experimentUserUserTextBoxes.add(i, new Label());
                        experimentUserUserTextBoxes.get(i).setText(result[i][1]);
                        experimentUserUserTextBoxes.get(i).setStyleName("textleft");
                        experimentUserUserTextBoxes.get(i).setWidth("136px");
                        experimentUserPassLabels.add(i, new Label("Password: "));
                        experimentUserPassLabels.get(i).setStyleName("labelMiddle");
                        experimentUserPassTextBoxes.add(i, new TextBox());
                        experimentUserPassTextBoxes.get(i).setText(result[i][2]);
                        experimentUserPassTextBoxes.get(i).setStyleName("textLeft");

                        experimentUserChangeUserButtons.add(i, new Button("Change"));
                        experimentUserChangeUserButtons.get(i).setStyleName("button");
                        addUserChangeButton(experimentUserChangeUserButtons.get(i), Integer.parseInt(result[i][0]),
                                i);

                        experimentUserDeleteUserButtons.add(i, new Button("Delete"));
                        experimentUserDeleteUserButtons.get(i).setStyleName("button");
                        addUserDelButton(experimentUserDeleteUserButtons.get(i), Integer.parseInt(result[i][0]), i);

                        // turn delete button of for the first user
                        if (i == 0) {
                            experimentUserDeleteUserButtons.get(i).setVisible(false);
                        }

                        experimentUserPanels.get(i).add(experimentUserUserTextBoxes.get(i));
                        experimentUserPanels.get(i).add(experimentUserPassLabels.get(i));
                        experimentUserPanels.get(i).add(experimentUserPassTextBoxes.get(i));
                        experimentUserPanels.get(i).add(experimentUserChangeUserButtons.get(i));
                        experimentUserPanels.get(i).add(experimentUserDeleteUserButtons.get(i));

                        experimentUserEditPanel.add(experimentUserPanels.get(i));

                    }

                    // get free-text tab
                    getExperimentFreeTextTab();

                }
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void getExperimentFreeTextTab() {

        String sql = "Select freetext from experiment where id = " + editExpId;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            @SuppressWarnings("deprecation")
            public void onSuccess(String[][] result) {

                if (result != null) {
                    if (Integer.parseInt(result[0][0]) == 1) {
                        freeTextTabCheckBox.setChecked(true);
                    } else {
                        freeTextTabCheckBox.setChecked(false);
                    }
                }

                openChangeExperiment();
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void addUserDelButton(Button b, final int userid, final int panel) {
        b.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                experimentUserEditPanel.remove(panel);
                deleteUserData(userid);
            }
        });

    }

    private void addUserChangeButton(Button b, final int userid, final int panel) {
        b.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                changeUserData(userid, panel);
            }
        });

    }

    private void changeExperimentData() {

        String expName = clearHiven(experimentNameTextBox.getText());
        String expServer = clearHiven(experimentMediaStorageTextBox.getText());

        String sql = "Update experiment set name = '" + expName + "', mediaserver = '" + expServer + "', layout = "
                + experimentLayoutList.getValue(experimentLayoutList.getSelectedIndex()) + " where id = "
                + editExpId;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                updateFreeTextTab();
            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void changeUserData(int uId, int pId) {

        String sql = "Update user set name = '" + experimentUserUserTextBoxes.get(pId).getText() + "', pw = '"
                + experimentUserPassTextBoxes.get(pId).getText() + "' where id = " + uId;

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void deleteUserData(int uId) {

        String sql = "Delete from user where id = " + uId + ";";
        sql = sql + "Delete from experimentuser where userid = " + uId + ";";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void addUser(String user, String pw) {

        String sql = "Insert into user (name, pw, role) values ('" + user + "', '" + pw + "', 2); ";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                getLastUser();
            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void getLastUser() {

        String sql = "Select id from user order by id desc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                if (result != null) {
                    insertExperimentUser(Integer.parseInt(result[0][0]));
                }
            }
        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    private void insertExperimentUser(final int uId) {

        String sql = "Insert into experimentuser values (" + editExpId + ", " + uId + "); ";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {
                getExperimentUsers();
                addNewUser(uId);
                newUserStoreNameTextBox.setText("");
                newUserStorePassTextBox.setText("");
            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    private void addNewUser(int user) {
        // start experiment list for organizing experiments
        // create elements
        int i = experimentUserPanels.size();

        experimentUserPanels.add(i, new HorizontalPanel());

        experimentUserUserTextBoxes.add(i, new Label());
        experimentUserUserTextBoxes.get(i).setText(newUserStoreNameTextBox.getText());
        experimentUserUserTextBoxes.get(i).setStyleName("textleft");
        experimentUserUserTextBoxes.get(i).setWidth("250px");
        experimentUserPassLabels.add(i, new Label("Password: "));
        experimentUserPassLabels.get(i).setStyleName("labelMiddle");
        experimentUserPassTextBoxes.add(i, new TextBox());
        experimentUserPassTextBoxes.get(i).setText(newUserStorePassTextBox.getText());
        experimentUserPassTextBoxes.get(i).setStyleName("textLeft");

        experimentUserChangeUserButtons.add(i, new Button("Change"));
        experimentUserChangeUserButtons.get(i).setStyleName("button");
        addUserChangeButton(experimentUserChangeUserButtons.get(i), user, i);

        experimentUserDeleteUserButtons.add(i, new Button("Delete"));
        experimentUserDeleteUserButtons.get(i).setStyleName("button");
        addUserDelButton(experimentUserDeleteUserButtons.get(i), user, i);

        experimentUserPanels.get(i).add(experimentUserUserTextBoxes.get(i));
        experimentUserPanels.get(i).add(experimentUserPassLabels.get(i));
        experimentUserPanels.get(i).add(experimentUserPassTextBoxes.get(i));
        experimentUserPanels.get(i).add(experimentUserChangeUserButtons.get(i));
        experimentUserPanels.get(i).add(experimentUserDeleteUserButtons.get(i));

        experimentUserEditPanel.add(experimentUserPanels.get(i));
    }

    public void setSlotCountCopy(int slotCountCopy) {
        this.slotCountCopy = slotCountCopy;
    }

    public int getSlotCountCopy() {
        return slotCountCopy;
    }

    private void loadExperimentEditPanel() {

        String sql = "Select * from experiment where userid = " + user + " order by id asc";

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String[][]> callback = new AsyncCallback<String[][]>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String[][] result) {

                userExperimentsPanels.clear();
                userExperimentLabels.clear();
                userExperimentDelButtons.clear();
                userExperimentEditButtons.clear();
                userExperimentsCollectionPanel.clear();
                experimentDataList.clear();

                if (result != null) {

                    for (int i = 0; i < result.length; i++) {

                        // start experiment list for organizing experiments
                        // create elements
                        userExperimentsPanels.add(i, new HorizontalPanel());
                        userExperimentLabels.add(i, new Label(result[i][1]));
                        userExperimentDelButtons.add(i, new Button("Delete"));
                        userExperimentEditButtons.add(i, new Button("Edit"));
                        // add click handler and style
                        addExperimentDelButton(userExperimentDelButtons.get(i), Integer.parseInt(result[i][0]), i);
                        addExperimentEditButton(userExperimentEditButtons.get(i), Integer.parseInt(result[i][0]),
                                i);
                        userExperimentLabels.get(i).setWidth("150px");
                        userExperimentDelButtons.get(i).setStyleName("button");
                        userExperimentEditButtons.get(i).setStyleName("button");

                        // add them to the panel
                        userExperimentsPanels.get(i).add(userExperimentLabels.get(i));
                        userExperimentsPanels.get(i).add(userExperimentDelButtons.get(i));
                        userExperimentsPanels.get(i).add(userExperimentEditButtons.get(i));

                        // add them to the collection panel
                        userExperimentsCollectionPanel.add(userExperimentsPanels.get(i));
                        // end list

                        // allow copying experiment data
                        experimentDataList.addItem(result[i][1], result[i][0]);
                    }

                }

                experimentNamePanel.clear();
                experimentNamePanel.add(experimentNameLabel);
                experimentNameLabel.setStyleName("label");
                experimentNameLabel.setWidth("120px");
                experimentNamePanel.add(experimentNameTextBox);
                experimentNameTextBox.setStyleName("text");
                changeExperimentNameButton.setStyleName("button");
                changeExperimentNameButton.setVisible(false);
                experimentLayoutPanel.clear();
                experimentLayoutPanel.add(experimentLayoutLabel);
                experimentLayoutLabel.setStyleName("label");
                experimentLayoutLabel.setWidth("120px");
                experimentLayoutPanel.add(experimentLayoutList);
                experimentLayoutList.setStyleName("list");
                changeExperimentLayoutButton.setStyleName("button");
                changeExperimentLayoutButton.setVisible(false);

                experimentMediaStoragePanel.clear();
                experimentMediaStoragePanel.add(experimentMediaStorageLabel);
                experimentMediaStorageLabel.setStyleName("label");
                experimentMediaStorageLabel.setWidth("120px");
                experimentMediaStoragePanel.add(experimentMediaStorageTextBox);
                experimentMediaStorageTextBox.setWidth("221px");
                changeExperimentMediaServerButton.setStyleName("button");
                changeExperimentMediaServerButton.setVisible(false);

                experimentUserStorePanel.clear();
                experimentUserStorePanel.add(experimentUserStoreNameLabel);
                experimentUserStoreNameLabel.setStyleName("label");
                experimentUserStoreNameLabel.setWidth("70px");
                experimentUserStorePanel.add(experimentUserStoreNameTextBox);
                experimentUserStoreNameTextBox.setWidth("100px");
                experimentUserStoreNameTextBox.setStyleName("textLeft");
                experimentUserStorePanel.add(experimentUserStorePassLabel);
                experimentUserStorePassLabel.setStyleName("labelMiddle");
                experimentUserStorePassLabel.setWidth("50px");
                experimentUserStorePanel.add(experimentUserStorePassTextBox);
                experimentUserStorePassTextBox.setWidth("100px");
                experimentUserStorePassTextBox.setStyleName("textLeft");

                errorPrimaryUserPanel.clear();
                errorPrimaryUserPanel.add(errorPrimaryUserRegistrationLabel);
                errorPrimaryUserRegistrationLabel.setStyleName("errorUserRegistrationLabel");
                errorPrimaryUserRegistrationLabel.setText("");

                // add user
                addNewUserPanel.clear();
                addNewUserPanel.add(newUserStoreNameTextBox);
                newUserStoreNameTextBox.setStyleName("text");
                addNewUserPanel.add(newUserStorePassLabel);
                newUserStorePassLabel.setStyleName("labelMiddle");
                addNewUserPanel.add(newUserStorePassTextBox);
                newUserStorePassTextBox.setStyleName("textLeft");
                addNewUserPanel.add(addUserButton);
                addUserButton.setStyleName("button");

                errorAdditionalUserPanel.clear();
                errorAdditionalUserPanel.add(errorAdditionalUserRegistrationLabel);
                errorAdditionalUserRegistrationLabel.setStyleName("errorUserRegistrationLabel");
                errorAdditionalUserRegistrationLabel.setText("");

                errorPrimaryUserPanel.clear();
                errorPrimaryUserPanel.add(errorPrimaryUserRegistrationLabel);
                errorPrimaryUserRegistrationLabel.setStyleName("errorUserRegistrationLabel");
                errorPrimaryUserRegistrationLabel.setText("");

                experimentSavePanel.clear();
                experimentSavePanel.setStyleName("experimentSavePanel");
                experimentSavePanel.add(saveNewExperimentButton);
                saveNewExperimentButton.setStyleName("button");

                experimentEditPanel.clear();
                experimentEditPanel.setStyleName("experimentEditClosePanel");
                cancelChangeExperimentButton.setStyleName("button");
                experimentEditPanel.add(cancelChangeExperimentButton);
                experimentEditPanel.setVisible(false);

                experimentClosePanel.clear();
                experimentClosePanel.setStyleName("experimentClosePanel");
                experimentClosePanel.add(cancelNewExperimentButton);
                cancelNewExperimentButton.setStyleName("button");

                userExperimentsHeading.setStyleName("userExperimentHeading");
                userNewExperimentHeading.setStyleName("userExperimentHeading");

                newUserHeadingPanel.clear();
                newUserHeadingPanel.add(newUserHeadingLabel);

                // copying experiment data
                copyExperimentDataPanel.clear();
                copyExperimentDataPanel.add(copyExperimentDataCheckBox);
                copyExperimentDataPanel.add(experimentDataList);
                experimentDataList.setStyleName("experimentDataList");
                experimentDataList.setVisible(false);

                addExperimentPanel.clear();
                addExperimentPanel.add(userExperimentsHeading);
                addExperimentPanel.add(userExperimentsCollectionPanel);
                userExperimentsCollectionPanel.setStyleName("marginBottom20");
                noExperimentsPanel.add(noExperimentsLabel);
                addExperimentPanel.add(noExperimentsPanel);
                noExperimentsPanel.setStyleName("marginBottom20");
                addExperimentPanel.add(userNewExperimentHeading);
                addExperimentPanel.add(experimentNamePanel);
                experimentNamePanel.setStyleName("marginBottom05");
                addExperimentPanel.add(freeTextTabCheckBox);
                freeTextTabCheckBox.setStyleName("marginBottom05");
                saveChangeExperimentButton.setStyleName("saveChangeExperimentButton");
                addExperimentPanel.add(saveChangeExperimentButton);
                addExperimentPanel.add(experimentUserStorePanel);
                experimentUserStorePanel.setStyleName("marginTop05");
                addExperimentPanel.add(experimentUserStoreHeadingLabel);
                addExperimentPanel.add(existingUserHeadingLabel);
                addExperimentPanel.add(errorPrimaryUserPanel);
                addExperimentPanel.add(experimentUserEditPanel);
                existingUserHeadingLabel.setStyleName("existingUserHeadingLabel");
                addExperimentPanel.add(newUserHeadingPanel);
                addExperimentPanel.add(addNewUserPanel);
                addExperimentPanel.add(errorAdditionalUserPanel);
                addExperimentPanel.add(experimentSavePanel);
                addExperimentPanel.add(experimentClosePanel);
                addExperimentPanel.add(experimentEditPanel);
                addExperimentPanel.setStyleName("addExperimentPanel");

                newUserHeadingPanel.setVisible(false);
                addNewUserPanel.setVisible(false);
                existingUserHeadingLabel.setVisible(false);
                saveChangeExperimentButton.setVisible(false);

                loadExperiments();

            }

        };

        databaseAccessSvc.retrieveData(sql, callback);

    }

    @SuppressWarnings("deprecation")
    private void updateFreeTextTab() {

        String sql = "";

        if (freeTextTabCheckBox.isChecked()) {
            sql = sql + "Update experiment set freetext = 1 where id = " + editExpId;

        } else {
            sql = sql + "Update experiment set freetext = 0 where id = " + editExpId;
        }

        // Initialize the service remote procedure call
        if (databaseAccessSvc == null) {
            databaseAccessSvc = GWT.create(DatabaseAccess.class);
        }

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {

            }

            public void onSuccess(String result) {

            }

        };

        databaseAccessSvc.storeData(sql, callback);
    }

    public static void changeVisiblility(int mode) {
        switch (mode) {
        case 0:
            settingsWizardOutMT.setVisible(false);
            mtOut.turnOffComponent();
            break;
        case 1:
            settingsWizardOutMT.setVisible(true);
            break;
        case 2:
            mtIn.turnOffComponent();
            ssOut.turnOffRecSpeech();
            break;
        case 3:
            mtIn.turnOnVisibility(1);
            ssOut.turnOnRecSpeech();
            break;
        case 4:
            asrIn.turnOffCorrectionMode();
            ssOut.turnOffRecSpeech();
            break;
        case 5:
            asrIn.turnOnCorrVisibility(1);
            ssOut.turnOnRecSpeech();
            break;
        case 6:
            ssOut.turnOffRecSpeech();
            break;
        case 7:
            ssOut.turnOnRecSpeech();
            break;
        }
    }

    public void changeTabVisibility() {
        wizardInterface.changeVisibility();
    }

    private String clearHiven(String source) {
        source = source.replaceAll("\"", "");
        return source.replaceAll("'", " ");
    }

}